-
Постов
928 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Новости
Статьи
Мемы
Видео
Форумы
Блоги
Загрузки
Магазин
Галерея
Весь контент Takirell
-
@Pimple03, еще, как вариант, можно попробовать NPCRef.PlayGroup Idle, 1. В некоторых модах с анимациями, можно найти анимку под названием Reset.kf. Я так понимаю, она как раз-таки и служит для сброса старой анимации и восстановления нормальной. Тоже можно ее попробовать.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Update3D, как вариант.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Хы, никогда не ковырял этот мод и лишь слышал о его существовании. Прикольно, буду иметь ввиду, что моя догадка на счет реализации через перекрестие вполне себе работоспособная.
-
По классике - ставят кричера на место активатора и по его скрипту считывают удары. Можно попробовать использовать триггер, хотя я так никогда не делал. Есть еще мысль через GetCrosshairRef считывать объект в перекрестии игрока, затем проверять анимацию атаки через AnimPathIncludes и уже по полученным результатам считать хиты. Сам я такой скрипт не писал, концепция давно вынашивается в голове, но реализовывать не пробовал, т.к не было надобности. На нексусе где-то был мод, типа NPC Box, который, якобы, ловил удары. По этой схеме был построен локальный урон по актерам. Мод не разбирал, хз, как он досконально устроен.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Все верно, эти блоки не работают на активаторах. Игра реагирует только на прожектали (магические снаряды и стрелы, т.к они, походу, чуть иначе обрабатываются).
-
- 63 комментария
-
- мод
- companions combat engine
- (и ещё 3 )
-
- 63 комментария
-
- мод
- companions combat engine
- (и ещё 3 )
-
Этот текст также должен быть где-то прописан, возможно, что в каком-то из XML-файлов интерфейса или же - это игровая настройка.
-
Либо TES4Gecko, который в 2 клика объединяет плагины.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Хотелось бы увидеть сам скрипт. И я не очень понимаю - зачем Вам привязка к игровому времени, когда задавать скорость можно с помощью переменной-множителя?
-
- 663 комментария
-
- 663 комментария
-
Чессказать, я вообще не очень понимаю назначение этих маркеров, т.к не шибко заморачивался тем, в какую сторону будет расположен интерьер (это мало кого волнует в процессе игры). А если ячейку сбросить с помощью функции ResetCell?
-
Да, я знаю об этом. Просто нужно переменные авто-обновлять в зависимости от статуса всех светильников. Мб позже я подумаю, как это сделать.
-
Итого, что у меня получилося... Основной универсальный скрипт светильников был дополнен и чуть оптимизирован, теперь это чудовище выглядит вот так: scn TestCandleScript Short sLoad Short sValue Short sSwitch Float fDefPos Float fNewPos Ref rSwitch Ref rFlame Begin OnActivate if (sLoad > 0) if (IsActionRef rSwitch == 0) if (sLoad == 1) Let sLoad := 2 Else Let sLoad := 1 Endif Let sSwitch := 1 Else ;Т.к команда об активации была получена от основного рубильника, нам нужно понять - в каком именно положении он находится. Для этого считываем у него переменную sFlag Let sValue := rSwitch.GetVariable "sFlag" if (sValue == 0) && (sLoad != 2) Let sSwitch := 1 Let sLoad := 2 Elseif (sValue == 1) && (sLoad != 1) Let sSwitch := 1 Let sLoad := 1 Endif Endif Endif Return End Begin GameMode ;Инициализация if (sLoad == 0) if (IsFormValid rFlame == 0) Let rFlame := GetNthChildRef 0 Return Else Let fDefPos := rFlame.GetStartingPos z Let fNewPos := (fDefPos - 30000) Let sLoad := 1 Return Endif Else ;Инициализируем выключатель if (IsFormValid rSwitch == 0) Let rSwitch := GetParentRef Return Endif ;Блок, отвечающий за включение\выключение огня и света (объединенный) if (sSwitch > 0) if (sLoad == 1) rFlame.SetPos z fDefPos if (HasFlames == 0) AddFlames Endif Elseif (sLoad == 2) rFlame.SetPos z fNewPos if (HasFlames > 0) RemoveFlames Endif Endif rFlame.Update3D Let sSwitch := 0 Return Endif Endif ;Авто-фикс позиций и огней if ((GetGameLoaded || GetGameRestarted) && sLoad > 0) Let sSwitch := 1 Return Endif End А вот скрипт на выключателе (я использовал модельку рычага с EDID RFSwitchLever01): scn TestLightSwitchScript Short sCount Short sFlag Ref rChild Ref rMe Begin OnActivate if (IsAnimPlaying == 0) if (sFlag == 0) PlayGroup Forward, 1 Let sFlag := 1 Else PlayGroup Backward, 1 Let sFlag := 0 Endif ;Находим и активируем все дочерние светильники, привязанные к этому рычагу if (IsFormValid rMe == 0) Let rMe := GetSelf Endif Let sCount := GetNumChildRefs while (sCount >= 0) Let sCount -= 1 Let rChild := GetNthChildRef sCount ;На всякий случай пропускаем "битые" ссылки (если они есть) if (IsFormValid rChild == 0) || (IsRefDeleted rChild) continue Endif rChild.Activate rMe, 1 loop Return Endif End Собсна, чтобы все это работало, нужно разместить нужное кол-во светильников в помещении и каждый из них привязать через ParentRef к рычагу. Все остальное самостоятельно схватится и должно работать. Само собой, каждый светильник можно включать\выключать по желанию, вне зависимости от положения главного рубильника. P.S Есть еще парочка вариантов реализации задумки, но, как мне кажется, что приведенный выше метод - наиболее прост в исполнении. Ну, как по мне :D
- 3 846 ответов
-
- 2
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Зачем? Я чуть покумекаю и рожу готовый вариант, есть пара мыслей.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Можешь по аналогии переформатировать и без него, но тогда могут быть (и будут) косяки, о которых я писал выше. Просто эта чудесная игра не может нормально работать и вечно приходится костылить даже в, казалось бы, элементарных вещах. Это нормально написанный скрипт и игру грузить не будет, уж поверь. Игра больше будет лагать из-за источников света, чем от скриптов.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
@Ed101, Короче, наколдовал я такое универсальное дрыгало: scn TestCandleScript Short sLoad Float fDefPos Float fNewPos Ref rFlame Begin OnActivate if (sLoad > 0) if (sLoad == 1) rFlame.SetPos z fNewPos RemoveFlames Let sLoad := 2 Else rFlame.SetPos z fDefPos AddFlames Let sLoad := 1 Endif rFlame.Update3D Endif Return End Begin GameMode ;Инициализация if (sLoad == 0) if (IsFormValid rFlame == 0) Let rFlame := GetNthChildRef 0 Return Else Let fDefPos := rFlame.GetStartingPos z Let fNewPos := (fDefPos - 30000) Let sLoad := 1 Return Endif Endif ;Авто-фикс позиций и огней if ((GetGameLoaded || GetGameRestarted) && sLoad > 0) if (sLoad == 1) rFlame.SetPos z fDefPos if (HasFlames == 0) AddFlames Endif Elseif (sLoad == 2) rFlame.SetPos z fNewPos if (HasFlames > 0) RemoveFlames Endif Endif rFlame.Update3D Return Endif End Блок с авто-фиксом огней можно и убрать, в принципе, только вот если без него отключить огни и сразу же загрузится на сейв, где они включены - огней не будет. Приходится вручную перетыкивать) Убрал еще вообще блок OnLoad, т.к он не всегда выполняется корректно и тогда, когда это нужно. Ну и снес Ref-указатель на сам подсвечник, он банально не нужен и может вообще путать игру.
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Да я понял сразу, т.к источники света с моделью, которые сами по себе светятся.
-
Благодарочка, ща у себя намучу и скину свой вариант скрипта.
-
Хмм... скажи, а какую модель ты используешь в качестве подсвечника? Лучше EDID дай, я у себя тоже сделаю и чуть доработаю твой вариант скрипта.
-
Практически все, что могут менять OBSE-функции (имена, пути к моделям\текстурам, какие-то параметры освещения\погоды\рас, шейдера и так далее) - все это не хранится в сейвах и требует возвращения значений на исходные. НО! Это не применимо к новым базовым объектам, созданных функцией CloneForm. Ну и CreateFullActorCopy. Иными словами, в редакторе и в плагинах нет объектов, созданных скриптом, они существуют только в сохранениях, как динамические объекты. Следовательно - игре просто неоткуда взять какие-то исходные параметры объекта из того же мастер-файла, т.к объекта в нем просто нет. Но тут стоит понимать, что если установлен плагин EngineBugFixes, то все объекты, созданные функцией CloneForm будут удалены в случае, если они не задействованы (не находятся в мире\контейнере\инвентаре игрока\или не используются в данный момент где-либо).
-
Как вариант. И возвращать на исходные координаты, когда это необходимо. Проверить стоит, дело может выгореть)
-
@Ed101, дружище, а мы с тобой по другому можем сделать) Раз нельзя отключить дочерний источник света без отключения родителя, его ведь всегда можно перенести за пределы ячейки с помощью SetPos и обновить его координаты через Update3D) А есть еще один вариант - с помощью OBSE-функций управлять самим источником света, в нужный момент загоняя радиус свечения в 0, что должно полностью его отключить. Но тут есть несколько проблем, одна из которых - отсутствие сохранения внесенных изменений в сейв игры, как и возврат в исходное. Это еще +геморрой и лишний код.
-
Задан неверный формат. Попробуй дебажить так: PrintToConsole "Значение - %g" a. Скорее всего, там все ок с назначением переменных, просто консоль не то значение выводится. Сам по себе блок OnLoad срабатывает отлично в случае, если ты через PlaceAtMe размещаешь объект или же сам объект, на котором висит скрипт, впервые загружается в ячейке. Важно, чтобы тебя в ней не было на момент его появления там. Данный блок не всегда работает так, как хочется. Как инициализатор, можно использовать условие-ограничитель типа: Short sLoad Begin GameMode if (sLoad == 0) Let sLoad := 5 Return Endif End Begin OnActivate PrintToConsole "Значение - %g" sLoad End