Здесь задавать вопросы по плагиностроению для Обливиона.
Тема по Обливиону. Тема по Морровинду тут.
Вопросы по плагиностроению
#3281
Отправлено
Сила - способность улыбаться © Белльмере-сан "One Piece"<img src="http://www.kolobok.u...zer/pirate.gif" border="0" class="linked-sig-image" />
#3285
Отправлено
Благодарочка, ща у себя намучу и скину свой вариант скрипта.
Перечитай сообщение, я исправил модель. Хотя это не принципиально, какая именно модель, главное чтобы была приписка fake. У них есть огни, но сами по себе они не излучают свет.
Сообщение отредактировал Ed101: 17 октября 2021 - 11:04
#3286
Отправлено
Перечитай сообщение, я исправил модель. Хотя это не принципиально, какая именно модель, главное чтобы была приписка fake. У них есть огни, но сами по себе они не излучают свет.
Да я понял сразу, т.к источники света с моделью, которые сами по себе светятся.
#3287
Отправлено
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-указатель на сам подсвечник, он банально не нужен и может вообще путать игру.
- EdMSL это нравится
#3289
Отправлено
Неплохо он так оброс. Но я, правда, надеялся, что обойдется без onGameMode, чтобы он постоянно не обрабатывался.
Можешь по аналогии переформатировать и без него, но тогда могут быть (и будут) косяки, о которых я писал выше. Просто эта чудесная игра не может нормально работать и вечно приходится костылить даже в, казалось бы, элементарных вещах.
Это нормально написанный скрипт и игру грузить не будет, уж поверь. Игра больше будет лагать из-за источников света, чем от скриптов.
- Pimple03 это нравится
#3290
Отправлено
Игра больше будет лагать из-за источников света, чем от скриптов.
Тут да, согласен. Хорошо, теперь надо решить вторую проблему)
В комнате есть общий выключатель. Сейчас в скрипте на каждый светильник и свет отдельная запись. Цель та же)
Полагаю, надо задействовать массивы.
Сообщение отредактировал Ed101: 17 октября 2021 - 12:37
#3292
Отправлено
Итого, что у меня получилося... Основной универсальный скрипт светильников был дополнен и чуть оптимизирован, теперь это чудовище выглядит вот так:
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
#3294
Отправлено
P.S Есть еще парочка вариантов реализации задумки, но, как мне кажется, что приведенный выше метод - наиболее прост в исполнении. Ну, как по мне :D
Не совсем идеально, но работает хорошо. Для моих целей более чем достаточно.
Есть маленькая проблемка. Если включить или выключить вручную все светильники после того, как ты активировал общий рубильник, то общий рубильник срабатывает только со второго раза.
#3295
Отправлено
Не совсем идеально, но работает хорошо. Для моих целей более чем достаточно.
Есть маленькая проблемка. Если включить или выключить вручную все светильники после того, как ты активировал общий рубильник, то общий рубильник срабатывает только со второго раза.
Да, я знаю об этом. Просто нужно переменные авто-обновлять в зависимости от статуса всех светильников. Мб позже я подумаю, как это сделать.
#3296
Отправлено
Еще немного доработал скрипт. Но это, скорее, для моих нужд.
Begin OnActivate if (IsActionRef Player // поставил проверку на запуск от игрока if (IsFormValid rMe == 0) Let rMe := GetSelf Endif Let sCount := GetNumChildRefs while (sCount > 0)// было >= 0, поэтому была лишняя проверка с индексом -1. Ошибка ловится, но зачем, когда можно избежать Let sCount -= 1 Let rChild := GetNthChildRef sCount if (IsFormValid rChild == 0) || (IsRefDeleted rChild) continue Endif rChild.Activate rMe, 1 loop ; Перенес в конец, т.к. изначально весь свет включен и рубильник срабатывал со второго раза. ; Убрал анимацию, просто не нужна. if (sFlag == 0) Let sFlag := 1 Else Let sFlag := 0 Endif Return Endif End
Сообщение отредактировал Ed101: 17 октября 2021 - 17:55
#3298
Отправлено
Можно ли переориентировать по сторонам света ранее загруженную внутреннюю ячейку? К примеру я могу задать Reference для NorthMarker'а, а затем через скрипт и команду SerAngle Z изменить его положение. Но в результате изменится только отображение ячейки на миникарте, при этом маркеры дверей останутся на прежнем месте, а показания компаса и соответственно положение маркера игрока на карте никак не поменяются. Команда ResetInterior не помогает.
#3301
Отправлено
Маркер то есть, но манипуляции с ним ничего кроме перечисленного выше не дают, если ячейка уже была однажды загружена.
Чессказать, я вообще не очень понимаю назначение этих маркеров, т.к не шибко заморачивался тем, в какую сторону будет расположен интерьер (это мало кого волнует в процессе игры). А если ячейку сбросить с помощью функции ResetCell?
Темы с аналогичным тегами как создать торговца, oblivion cs торговец, cs как создать торговца, oblivion, моделирование
Моддинг →
Моддинг Oblivion →
Какие файлы в моде отвечают за изменение лиц и заставку в меню игры Oblivion?Автор AlexisUmbra, 06 апр 2024 oblivion, tes 4, tes 4 oblivion и 5 еще... |
|
|||
The Elder Scrolls →
Oblivion →
Моды Oblivion →
Каковы правила загрузки модов на сайт?Автор AlexisUmbra, 04 мар 2024 моды, обливион, tes и 2 еще... |
|
|||
The Elder Scrolls →
Oblivion →
Моды Oblivion →
Где можно заказать сборку?Автор KiritoSwords, 03 апр 2023 сборка на заказ и 2 еще... |
|
|||
The Elder Scrolls →
Oblivion →
Обсуждение Oblivion →
Чемпион Сиродила между TES4 и TES5Автор PavelIks, 26 янв 2022 oblivion, tes и 1 еще... |
|
|||
The Elder Scrolls →
Oblivion →
Обсуждение Oblivion →
ШРИФТЫ ИЗ ИГРЫАвтор ALexid, 20 дек 2021 шрифт, oblivion |
|
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 скрытых