Перейти к содержанию

Takirell

Модмейкер
  • Постов

    928
  • Зарегистрирован

  • Посещение

Весь контент Takirell

  1. @Pimple03, еще, как вариант, можно попробовать NPCRef.PlayGroup Idle, 1. В некоторых модах с анимациями, можно найти анимку под названием Reset.kf. Я так понимаю, она как раз-таки и служит для сброса старой анимации и восстановления нормальной. Тоже можно ее попробовать. 
  2. Хы, никогда не ковырял этот мод и лишь слышал о его существовании. Прикольно, буду иметь ввиду, что моя догадка на счет реализации через перекрестие вполне себе работоспособная.
  3. По классике - ставят кричера на место активатора и по его скрипту считывают удары. Можно попробовать использовать триггер, хотя я так никогда не делал. Есть еще мысль через GetCrosshairRef считывать объект в перекрестии игрока, затем проверять анимацию атаки через AnimPathIncludes и уже по полученным результатам считать хиты. Сам я такой скрипт не писал, концепция давно вынашивается в голове, но реализовывать не пробовал, т.к не было надобности. На нексусе где-то был мод, типа NPC Box, который, якобы, ловил удары. По этой схеме был построен локальный урон по актерам. Мод не разбирал, хз, как он досконально устроен.
  4. Все верно, эти блоки не работают на активаторах. Игра реагирует только на прожектали (магические снаряды и стрелы, т.к они, походу, чуть иначе обрабатываются).
  5. Necron, Странный дефект. Можете записать его на видео? Просто там особо нечему не работать.
  6. Necron, Приветствую. Ну так он появляется только при наведении на НПС, а не на постоянной основе.
  7. Этот текст также должен быть где-то прописан, возможно, что в каком-то из XML-файлов интерфейса или же - это игровая настройка.
  8. Хотелось бы увидеть сам скрипт. И я не очень понимаю - зачем Вам привязка к игровому времени, когда задавать скорость можно с помощью переменной-множителя?
  9. Takirell

    Лилит Мерунес

    taradez, Мне самому нужно уже будет лезть в ее скрипты и смотреть, что за что отвечает. Как надумаю что - отпишусь.
  10. Takirell

    Лилит Мерунес

    taradez, Отдать ей приказ "Передохнуть" пробовали, а затем снова приказать следовать? Это должно будет обновить статус (хотя я не знаю, что могло бы его сбить).
  11. Чессказать, я вообще не очень понимаю назначение этих маркеров, т.к не шибко заморачивался тем, в какую сторону будет расположен интерьер (это мало кого волнует в процессе игры). А если ячейку сбросить с помощью функции ResetCell?
  12. Да, я знаю об этом. Просто нужно переменные авто-обновлять в зависимости от статуса всех светильников. Мб позже я подумаю, как это сделать.
  13. Итого, что у меня получилося... Основной универсальный скрипт светильников был дополнен и чуть оптимизирован, теперь это чудовище выглядит вот так: 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
  14. Можешь по аналогии переформатировать и без него, но тогда могут быть (и будут) косяки, о которых я писал выше. Просто эта чудесная игра не может нормально работать и вечно приходится костылить даже в, казалось бы, элементарных вещах. Это нормально написанный скрипт и игру грузить не будет, уж поверь. Игра больше будет лагать из-за источников света, чем от скриптов.
  15. @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-указатель на сам подсвечник, он банально не нужен и может вообще путать игру.
  16. Да я понял сразу, т.к источники света с моделью, которые сами по себе светятся.
  17. Хмм... скажи, а какую модель ты используешь в качестве подсвечника? Лучше EDID дай, я у себя тоже сделаю и чуть доработаю твой вариант скрипта.
  18. Практически все, что могут менять OBSE-функции (имена, пути к моделям\текстурам, какие-то параметры освещения\погоды\рас, шейдера и так далее) - все это не хранится в сейвах и требует возвращения значений на исходные. НО! Это не применимо к новым базовым объектам, созданных функцией CloneForm. Ну и CreateFullActorCopy. Иными словами, в редакторе и в плагинах нет объектов, созданных скриптом, они существуют только в сохранениях, как динамические объекты. Следовательно - игре просто неоткуда взять какие-то исходные параметры объекта из того же мастер-файла, т.к объекта в нем просто нет. Но тут стоит понимать, что если установлен плагин EngineBugFixes, то все объекты, созданные функцией CloneForm будут удалены в случае, если они не задействованы (не находятся в мире\контейнере\инвентаре игрока\или не используются в данный момент где-либо).
  19. Как вариант. И возвращать на исходные координаты, когда это необходимо. Проверить стоит, дело может выгореть)
  20. @Ed101, дружище, а мы с тобой по другому можем сделать) Раз нельзя отключить дочерний источник света без отключения родителя, его ведь всегда можно перенести за пределы ячейки с помощью SetPos и обновить его координаты через Update3D) А есть еще один вариант - с помощью OBSE-функций управлять самим источником света, в нужный момент загоняя радиус свечения в 0, что должно полностью его отключить. Но тут есть несколько проблем, одна из которых - отсутствие сохранения внесенных изменений в сейв игры, как и возврат в исходное. Это еще +геморрой и лишний код.
  21. Задан неверный формат. Попробуй дебажить так: PrintToConsole "Значение - %g" a. Скорее всего, там все ок с назначением переменных, просто консоль не то значение выводится. Сам по себе блок OnLoad срабатывает отлично в случае, если ты через PlaceAtMe размещаешь объект или же сам объект, на котором висит скрипт, впервые загружается в ячейке. Важно, чтобы тебя в ней не было на момент его появления там. Данный блок не всегда работает так, как хочется. Как инициализатор, можно использовать условие-ограничитель типа: Short sLoad Begin GameMode if (sLoad == 0) Let sLoad := 5 Return Endif End Begin OnActivate PrintToConsole "Значение - %g" sLoad End
×
×
  • Создать...