Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Как сделать терминал одноразовым? То есть - активировал терминал, прошёлся по нескольким суб-меню, долез до нужной по квесту кнопки в терминале (допустим - "включить самоунитожение"), вышел из терминала, активировал его снова, а там вместо предыдущего меню что-нибудь типа "терминал заблокирован". Как это сделать?
Как вариант это можно сделать через квест и его стадии. Мне было нужно сделать, что бы после второго нажатия кнопки, вместо Руки Смерти в зону забрасывалась Крыса. Sergey_Ros с сайта «Лабортории Mod-Tec» посоветовал мне сделать через квест. Создать квест, в котором только две стадии - 1 и 2 На нужной кнопке в терминале в Item Condition сделать условие на стадии квеста GetStage (Имя квеста) == 1 Создать дубликат кнопки в которой сделать условием GetStage (Имя квеста) == 2 (Терминал заблокирован) Получится, что при стадии квеста 1 будет показываться одна кнопка, а при стадии квеста 2 другая. Стадии можно поменять, каким нибудь событием, или попробовать в Item Result Script первой кнопки добавить SetStage (ID квеста) 2 У меня стадия менялась после убийства Руки Смерти скриптом на ней.
Пока.
Мы вышли из дома, когда во всех... Поздно вышли!
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №843
написано: 21 октября 2012, 02:25
| Отредактировано: Joopeeter - 21 октября 2012, 02:28
А чего с квестом-то мудрить? Можно на том самом терминале объявить переменную, значение которой меняется в результ-скрипте нужной кнопки, и условие - GetScriptVariable. Только надо будет отметить галку Persistent Reference на копии и дать ей RefID. Хотя в вопросе было
Цитата Cleric
долез до нужной по квесту кнопки
так что да, раз квест со стадиями всё равно уже есть... Или так:
scn zzScript
short Blocked
Begin OnActivate
if Blocked==0 Activate else ShowMessage zzMessage; типа "Всё, доигрался" endif
End
А в результ-скрипте будет
set [RefID терминала].Blocked to 1
zzMessage надо создать заранее.
Изменение репутации для пользователя Spalny_Vagon
Spalny_VagonOffline
Сообщение №844
написано: 21 октября 2012, 05:59
| Отредактировано: Spalny_Vagon - 21 октября 2012, 09:25
Для реализма можно добавить в скрипт блок gamemode, в котором после взрыва происходила замена работающего терминала на поломанный:
Code
float timer short blocked
begin onactivate if Blocked==0 Activate else ShowMessage zzMessage; типа "Всё, доигрался" set timer to 1 endif End
begin gamemode if blocked == 1 if timer < 0 set blocked to 2 placeatme GrenadePulseExplosion TerminalDeskHulk01.enable ;модель настольная, настенных, на сколько я помню, в игре нет. disable else set timer to timer - getsecondspassed endif endif end
Если время до подрыва достаточно большое, то можно было бы еще и на экран таймер вывести, который бы секунды в левом углу отсчитывал (5, 4, 3, 2, 1... ).
====================== Мод "Нью-Йорк" на русском: https://modgames.net/load/fallout3/addon/new-york-bolshoe-yabloko/34-1-0-1294 Мод "Нью-Йорк" на английском: https://modgames.net/load/fallout3/kvesty/the-big-apple/23-1-0-19771
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №845
написано: 21 октября 2012, 07:00
| Отредактировано: Joopeeter - 21 октября 2012, 07:17
Вот у меня по этому скрипту вопрос. Он фурычит, спору нет, но... можно ли его: а) привязать к одному терминалу (который идёт как суб-меню), а результ-скрипт присвоить другому терминалу (который оригинальный)? Или тупо RefID указать оригинального терминала? б) Если в результ-скрипте у меня уже
Joopeeter, значит, если я результ-скрипт повешу на суб-меню, указав Ref оригинального терминала, а сам скрипт повешу на оригинальный терминал, то оригинальный терминал отключится, только после взимодействия с суб-меню, верно? А если неверно, то как сделать именно вышеописанное?
В качестве отключения терминала можно на финальной стадии так же использовать команду SetDestroyed 1 После этого терминал превратится в статичный объект, т.е. его уже не активировать.
***********************
У меня назрела парочка вопросов:
- если функции подобной GetActiveMunuSelection не существует, есть ли возможность как-то выделить в скрипте предмет, относящийся к разделу MiscItem? Можно было бы использовать тип блока Begin OnEquip для этих целей, но в отличии от былых времен, этот тип блока уже не работает для MiscItem, а переводить предмет в раздел Armor или Weapon как-то совсем неохота, сам предмет по стилистике для этих разделов вовсе не годится. Использовать функцию GetItemCount тоже не то, она просто отмечает предмет в интвентаре, но не дает возможности работать конкретно с ним. - как корректно изменить тип иконки для Message? Дело в том, что я пробовал изменять ее в списке самого сообщения, и даже редактировал в разделе Menu Icon, но на деле в игре продолжает отображаться улыбчивая ряшка. Особенно несуразно это выглядит когда г.г. с потрохами рвется на мине, и подобная иконка сообщает об этом.
есть ли возможность как-то выделить в скрипте предмет, относящийся к разделу MiscItem? Можно было бы использовать тип блока Begin OnEquip для этих целей, но в отличии от былых времен, этот тип блока уже не работает для MiscItem, а переводить предмет в раздел Armor или Weapon как-то совсем неохота, сам предмет по стилистике для этих разделов вовсе не годится. Использовать функцию GetItemCount тоже не то, она просто отмечает предмет в интвентаре, но не дает возможности работать конкретно с ним
Ну, раз его не выцепишь снаружи, можно подобраться изнутри. Вот эта конструкция работает с одним "но": после использования предмет исчезает и заново появляется в инвентаре только после закрытия пип-боя.
set Btn to GetButtonPressed if Btn==0 ; тут делаем что надо player.AddItem zzItem 1 1; zzItem - это тот предмет. Disable MarkForDelete endif
End
Как видим, "активация" правым кликом. И как это ни странно, при замене гейммода на менюмод конструкция работает всё с тем же самым "но". Поведение в инвентаре сразу нескольких зизиайтемов не проверялось.
Но вообще-то это, конечно, извращение. Размещение активируемых предметов в "Помощи" - действительно общая практика, так что все уже привыкли, что книги, таблетки и бутерброды там в одной куче.
Но вообще-то это, конечно, извращение. Размещение активируемых предметов в "Помощи" - действительно общая практика
Ну может все уже и действительно привыкли к этому. Но на мой взгляд извращение то, что герой из этого раздела ест (или пьет) провода, токсичные жидкости, радиостанции, сковородки и прочие вещи которым там вовсе не место, т.к. насколько я понял, этот раздел посвящен исключительно еде, напиткам и медицине. Вот и хотелось что-то изменить в этом.
Смотрю на свой скрипт, смотрю на твой, э-э-э... неужели проще? Ладно, но одну вещь необходимо в него добавить: MarkForDelete, потому что надо "думать, как динозавр" окончательно избавляться от использованных MiscItem'ов.
Проще в том, что не нужно постоянно давать подтверждение (я писал об этом). Т.е. если НЕ нажимаем left Shift, то предмет просто удаляется, если нажимаем, то активируем его в обязательном порядке. Кстати, если ключевых предметов >= 2, то закрывать/листать пипбой уже не требуется, т.к. предметы визуально не удаляются.
Посмотрел чуть внимательней и вот стало интересно: а без переменной stAr будет работать? Просто я раз видел подобную конструкцию (с IsKeyPressed и переменной, реагирующей на нажатие/отпускание кнопки) в блоке GameMode. Она там была, как выяснилось, для того, чтобы скрипт при нажатии срабатывал однократно, а тут вроде OnDrop и так прогоняется всего один раз. Это так, из любопытства вопрос, сам-то я ФОСЕ не пользуюсь.
Цитата Demolir
предметы визуально не удаляются.
Главное, чтоб наоборот, не дублировались. А то сталкивался с таким глюком при манипуляциях с заскриптованными предметами в инвентаре.
Изменение репутации для пользователя Demolir
DemolirOffline
Сообщение №857
написано: 24 октября 2012, 22:48
| Отредактировано: Demolir - 24 октября 2012, 22:49
Если скрипт слишком длинный (while-циклы с исп.nvse), чтобы исполниться внутри фрейма, он ,вероятно, продолжается в следующем (не перезапускается же)? А если это квест-скрипт, и частота активации квеста выше скорости исполнения скрипта - скрипт перезапустится? (понятно, что это оч.нежелательно)
Каковы для фнв-движка ограничения на размер скрипта (в печатном виде и\или компилированом)? У меня компилир.(см. фнв-едитом) часть порядка 12к, я видел у людей бОльшие, но чрезв.редко. Где про это можно почитать (английский нормально)? (нагуглил) IIRC the script size limit is 16KB compiled, 32KB uncompiled.
Другое: как правильнее - playerREF или просто player? (в скрипт-эффекте, на произвольном нпц, в конструкции вида buddy.getdetected player)
Изменение репутации для пользователя meosen
meosenOffline
Сообщение №859
написано: 7 ноября 2012, 10:43
| Отредактировано: meosen - 7 ноября 2012, 10:50
Другое: как правильнее - playerREF или просто player? (в скрипт-эффекте, на произвольном нпц, в конструкции вида buddy.getdetected player)
Пишется просто Player, без REF. По личному опыту знаю что так правильно и по WIKI от Бетезды, по ГЕККУ.
Для НПС всегда нужно делать REF то есть должно у вас выглядеть так: buddyREF.getdetected player)
2) У меня проблема с моим любительским собачьим модом. https://modgames.net/load/107-1-0-12601 Все время происходит один и тот же неприятный собачий глюк. А именно: собака вдруг, безо всякой причины, берет и садится на свою собачью пятую точку, и не двигается. Сдвинуть с места помогает только смена стилей движения (ближе-дальше) или присутствие врага. Происходит такое бывает то через каждые 5 мниут реального времени, то за час ниразу не сядет. Но глюк известый и проявляется не только у меня, но и удргих пользователей моего мода. Глюк конечно не смертельный, но неприятный.
Очень хотелось бы услышать мнения человека разбирающегося в скриптах и распологающим небольшим количеством времени для теста.
скрипт собаки.
scn MyhtarBetaScript
short CombatStyleRanged short CombatStyleMelee short IsFollowingDefault short IsFollowingShort short IsFollowingLong short FollowerSwitchAggressive Short CombatRunaway Short CombatRunaway2 Short CombatRunaway3 Short WAITNoAttak short Waiting short DoOnce short Sneak; оно даже крадется! short MyhtarBetaDead short MyhtarBetaL38 ; Short GoToNewHomeMarker Short GoToDocMithelHomeMarker short MyhtarBetaAvailable short MyhtarBetaResurrekt
short MyhtarBetaHired; short MyhtarBetaFired; short Find ;0 = ничего не нашел 1 = идет поиск, 2 = нашел и теперь возвращается обратно. short FindAmmo; искать патроны short FindChems; искать химию short FindFood; искать еду short FindArmor ; Short FindWeapon; Short FindMiskItem ; short FindMinenTroopers short FindMinenPoroh short FindMinenPlasma short FindMinenImpylse short FindMinenKrishroMinen
Begin GameMode
MyhtarBetaRef.IgnoreCrime 1
end
begin onStartCombat ; if HasMagicEffect MyhtarRegenerationEffect == 1; RemoveSpell MyhtarBetaRegenerationEffect ; endif end
begin onCombatEnd; фуф закончилась битва if GetPlayerTeammate == 1 && HasMagicEffect MyhtarRegenerationEffect == 0 ; проверим жив ли компаньон и есть ли на нем спелл. AddSpell MyhtarBetaRegenerationEffect; endif end
Player.RemovePerk MyhtarDogPerk set MyhtarBetaRef.MyhtarBetaHired to 0 set MyhtarBetaRef.MyhtarBetaFired to 1 set MyhtarBetaRef.MyhtarBetaResurrekt to 1 MyhtarBetaRef.SetPlayerTeammate 0 MyhtarBetaRef.RemoveFromFaction FollowerFaction MyhtarBetaRef.SetAV Assistance 0
ShowMessage MyhtarRessurektedDeath
endif end;
"Выше закона может быть только любовь, выше права - лишь милость, и выше справедливости - лишь прощение.” (Патриарх Алексий II)"
Учить детей - это очень весело...нет, правда! Главное все делать с душой.
"Мы любим не за что то, а потому что любовь - это образ Божий в человеке!"
0) насчёт "разбирающегося" - это не про меня. Своё состояние я бы охарактеризовал как замедленное протрезвение от нубского восторженного заблуждения, что "скрипты - это просто!".
1) по поводу (не совсем). На скрипт я посмотрел, единственное, что (не по делу) подумалось - раз он прямо на собаке, я бы не стал каждый фрейм в гейммоде "долбать" этот ignoreCrime. Наверняка же есть управляющий "делами вообще" квест-скрипт, та же заявка на ресуррект куда-то предназначается же ж. Хотя личного опыта за актуальность освежения ignoreCrime у меня нет.
1) (ближе к делу) что же до самовольного поведения псины, я бы наверное полез в её - общесобачий, да? - набор анимаций. И либо прописал бы в условиях идла "сидение на эопе" правило "для всех кроме Мухтара" (любительский мод, кому какое дело до "потроганой" анимации), либо, что хлопотнее, вынес бы Мухтара в отдельный вид существ с копией собачьего набора анимаций - но только для него. И там уже раздавал бы условия как душе угодно (напр, "сидеть разрешается только если сидит хозяин"). Обливионская компаньонша Соня ,кстати, умиляла тем, что (вне боя) старательно обезьянничала действия РС, в т.ч. и садилась.
Но это совет примитивный - подозреваю, что знающие предложили бы что-то из области ai-packages (чтоб собачка была постоянно занята каким-то делом, и с убранными галками "idles").
1) (ближе к делу) что же до самовольного поведения псины, я бы наверное полез в её - общесобачий, да? - набор анимаций. И либо прописал бы в условиях идла "сидение на эопе" правило "для всех кроме Мухтара" (любительский мод, кому какое дело до "потроганой" анимации), либо, что хлопотнее, вынес бы Мухтара в отдельный вид существ с копией собачьего набора анимаций - но только для него. И там уже раздавал бы условия как душе угодно (напр, "сидеть разрешается только если сидит хозяин").
Все бы хорошо, да только никак не могу найти где редактировать енту Idle анимацию. Точнее я нашел где удалить эту анимацию, но тогда все игровые соабки перестанут сидеть. Это конечно не смертельно но нихт гут.
"Выше закона может быть только любовь, выше права - лишь милость, и выше справедливости - лишь прощение.” (Патриарх Алексий II)"
Учить детей - это очень весело...нет, правда! Главное все делать с душой.
"Мы любим не за что то, а потому что любовь - это образ Божий в человеке!"
Интересный вопрос. Дело в том, что PlayerRef многократно использовали сами разработчики (например, в скрипте боксерских бинтов), но там есть одна особенность: почти всегда PlayerRef есть в условиях "если цель игрок/не игрок".
Ref BoxingTapeTarget Set BoxingTapeTarget to GetOwnerLastTarget
If (BoxingTapeTarget != PlayerRef) endif
Еще встречается в некоторых специфических триггерах begin OnTriggerEnter playerRef . Видимо,в некоторых случаях, окончание Ref все-таки нужно указывать.
Еще встречается в некоторых специфических триггерах begin OnTriggerEnter playerRef
Можете, если не трудно, привести пример когда и в каком случае использовался данный скрипт? Я просто сколько со скриптами не работал и по ВИКИ ГеКК овской не лазил то везде было просто; begin OnTriggerEnter player (без REF)
"Выше закона может быть только любовь, выше права - лишь милость, и выше справедливости - лишь прощение.” (Патриарх Алексий II)"
Учить детей - это очень весело...нет, правда! Главное все делать с душой.
"Мы любим не за что то, а потому что любовь - это образ Божий в человеке!"
А всё-таки, пипл! Самое интересное я так и не осознал:
Цитата emo877
Если скрипт слишком длинный (while-циклы с исп.nvse), чтобы исполниться внутри фрейма, он ,вероятно, продолжается в следующем (не перезапускается же)? А если это квест-скрипт, и частота активации квеста выше скорости исполнения скрипта - скрипт перезапустится? (понятно, что это оч.нежелательно)
Нашёл англ. обсуждение проблемы, с утверждением [по моему ощущению, весьма знающего человека]: Any function that takes longer than the time allocated to the script will cause the script to exit, and start over at the top the next time it is scheduled to run. Мой перевод: если функция требует для исполнения время большее чем отведено [в фрейме] для скрипта, скрипт будет прерван и в следующий раз запущен с начала. Из чего следует его совет "затяжные" функции помещать в самом конце скрипта и не расчитывать на то, что что-то дальнейшее будет исполнено. ссылка на архив треда Atomicity
ps. а ещё у меня очень долго чудовищно непредсказуемо работал скрипт из-за того, что я не знал, что значения вычисляемых меток ограничены байтом (0..255). Библия.
Изменение репутации для пользователя valambar
valambarOffline
Сообщение №868
написано: 9 декабря 2012, 17:10
| Отредактировано: valambar - 9 декабря 2012, 17:13
Конкретно - функции проверки потребности в сне - голода - жажды.
На сколько я знаю, там ничего и не проверяется. Есть актор-эффекты (пять степеней голода, жажды и бессонницы), на худ выводится информация о текущем значении. Как только потрбность в чем-либо достигает величины 200, 400, 600, 800 или 1000, включается соответствующий актор-эффект, который убирает силу, выносливость и т.д. Например, если на ГГ висит starvation200 (первая степень голода), то у него уменьшается сила на 1, а если starvation600, то сила -3, выносливость -1, харизма -2. Движок с течением времени постоянно добавляет голод, жажду и сонливость, а вода, кровати и ingestible имеют эффекты, которые их уменьшают, вот и все. Наличие же воздействия конкретного актор-эффекта проверяется функцией IsSpellTarget [magicID]
====================== Мод "Нью-Йорк" на русском: https://modgames.net/load/fallout3/addon/new-york-bolshoe-yabloko/34-1-0-1294 Мод "Нью-Йорк" на английском: https://modgames.net/load/fallout3/kvesty/the-big-apple/23-1-0-19771
На сколько я знаю, там ничего и не проверяется. Есть актор-эффекты (пять степеней голода, жажды и бессонницы), на худ выводится информация о текущем значении. Как только потрбность в чем-либо достигает величины 200, 400, 600, 800 или 1000, включается соответствующий актор-эффект, который убирает силу, выносливость и т.д.
То есть получается, что надо проверить на наличие актор-эффекта? А как такая функция звучит?