Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
привет всем, решил запилить фикс на IWS, один из багов связан со спауном роботов, скрипт спаунит роботов в хатке у робота торговца оружейников и тот не работает, видел на нексусе коментарий что спаунищиеся роботы в робко ломает локальный квест (поднимается тревога). после крашей игры при переходах между локами находил странные трупы роботов. И внимание тупой вопрос, скрипт не сохраняется, измененный (ошибок не выдавал) не сохраняется и неизмененный тоже не сохраняется (щелкнул в форму, он пометился как измененный), сохранить и перекомпилировать скрипты тоже не закрывает окно скрипта. Может как то можно выдрать скрипт из модуля отредактировать минуя гек?
Если IWS - это, то в требованиях NVSE. То есть GECK необходимо запускать через него. Для этого
Как запустить GECK вместе с NVSE? Нужно запускать nvse_loader.exe с параметром "-editor". Для этого надо отредактировать существующий ярлык GECK'а на рабочем столе. Зайдите в свойства ярлыка и в поле "Объект" после закрывающей кавычки допишите "-editor". Например: "C:\Games\Fallout New Vegas\nvse_loader.exe" -editor.
ApeX да этот мод, чет я не подумал что библиотеки НВСЕ в гек не подгружаются, хотя догадался если бы исходный скрипт не скомплировался с ошибкой. Отрезал в этом моде спаун роботов и ошибкок с оружейниками и робко больше нет. Спасибо.
Изменение репутации для пользователя Stea1ch
Stea1chOffline
Сообщение №1684
написано: 15 июня 2019, 21:32
| Отредактировано: Stea1ch - 19 июня 2019, 08:31
Как заставить скриптом непися нажать на спусковой крючек и перезарядить оружие перед этим?
Вопрос снят: создаешь AI Package со стрельбой и включаешь его в скрипте с помощью RefID.AddScriptPackage
Добавлено (19 Июня 2019, 02:35) --------------------------------------------- Такой вопрос по функциям enable/disable в скриптах: мне надо, чтобы предмет не появлялся в игре до определенной стадии квеста. Я вешаю на объект скрипт такого плана:
Код
scn DLC05AuralStealthSuitUpgrade1AddScript
Begin GameMode; Short once; DLC05AuralStealthSuitUpgrade1Ref.Disable; отключает этот объект
end;
Begin OnAdd; Short once; player.AddNote DLC05AuralStealthSuitUpgrade1; SetStage DLC05HolotapeHunt 40; DLC05AlienShieldUpgrade2Ref.Enable; включает второй квестовый объект при взятии
Removeme; end;
Затем в квесте я прописываю на нужной стадии диалога DLC05AuralStealthSuitUpgrade1Ref.Enable - по идее все должно работать, ан нет. Объект не появляется... ЧЯДНТ?
И опять вопрос снят. Не надо скриптом делать Disable - достаточно поставить галку в свойствах референта и делать Enable когда надо любым доступным способом.
Доброго времени суток. Никак не могу найти максимально оптимизированный путь для решения своей проблемы. У меня есть 32 заранее расставленных объекта с флажком Disabled. Названия различаются только цифрами 01-32. Скрипт должен проверять количество конкретных айтемов в контейнере (в моём случае это золотые слитки из Dead Money) и включать столько объектов, сколько этих айтемов в контейнере. Если я забираю несколько, то столько же рефов снова выключается. Пытался сделать это простейшим образом через кучу условий и проверок. Работает, но получается очень много и наверняка совершенно неэффективно. Буду благодарен, если кто-нибудь на примере хотя бы 3-5 объектов покажет, как можно сделать это покрасивее.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1686
написано: 7 октября 2019, 21:08
| Отредактировано: Joopeeter - 7 октября 2019, 21:22
Предлагаю такую схему. 32 объекта делаются в виде активатора и последовательно соединяются линками: первый со вторым, второй с третьим и т.д. Первому даём RefID. Создаётся квест, на нём скрипт, в нём две переменные short. Первая для подсчёта предметов, вторая для подсчёта появившихся активаторов. Квестовый скрипт проверяет количество предметов в контейнере, записывает его в первую переменную, обнуляет вторую и активирует первый в цепочке активатор с указанием выполнить блок OnActivate. А в блоке OnActivate каждый активатор сам решает, появляться ему или исчезать, и если решит появиться, увеличивает на единичку вторую квестовую переменную. После всего этого он в свою очередь активирует следующий в цепочке активатор с указанием выполнить блок OnActivate. Вместо квестового скрипта можно использовать объектный скрипт на каком-нибудь стоящем рядышком триггере, например.
Скрипты примерно такие. На квесте (или на объекте рядом с активаторами)
short ThingsCount short EnabledActivatorsCount
Begin GameMode
set ThingsCount to ContainerRef.GetItemCount [штуковины, которые считаем] if ThingsCount != EnabledActivatorsCount set EnabledActivatorsCount to 0 ActivatorRef.Activate player 1 endif
End
На активаторе
ref MyLink
Begin OnActivate
set MyLink to GetLinkedRef if zzQuest.EnabledActivatorsCount < zzQuest.ThingsCount ; допустим, внешние переменные у нас в квесте zzQuest if GetDisabled Enable endif set zzQuest.EnabledActivatorsCount to zzQuest.EnabledActivatorsCount + 1 else if GetDisabled ; else Disable endif endif MyLink.Activate player 1
End
Добавлено (08 Октября 2019, 15:07) --------------------------------------------- Забыл пояснить. Схема сработает только если вся цепочка активаторов находится в загруженной области. Если нет, то активаторы всё равно размещаются рядом, но при этом каждый из них служит Enable Parent'ом другой ссылки, которая уже размещается где угодно. В этом случае активаторами служат обычные триггеры, а появляющиеся и исчезающие объекты могут быть любого типа.
Квест, не квест - это тут вопрос чисто технический и второстепенный. Смысл предложенного способа в том, чтобы записать куда-нибудь количество штуковин и количество видимых объектов таким образом, чтобы каждый из объектов мог туда поглядеть и сам решить, надо ему появиться сейчас или исчезнуть. Просто я привык в квестовые переменные записывать, а так можно хоть на тот же контейнер скрипт повесить и там объявить эти переменные.
Пока что не могу заставить работать. Скрипт повесил в итоге на контейнер, но смущает одна строка:
short ThingsCount short EnabledActivatorsCount
Begin GameMode
set ThingsCount to ContainerRef.GetItemCount [штуковины, которые считаем] if ThingsCount != EnabledActivatorsCount set EnabledActivatorsCount to 0 ;Она разве не будет обнулять переменную каждый раз, не давая ей прибавляться? ActivatorRef.Activate player 1 endif
End
Планирую попробовать обнулять её, когда обе переменные будут равны, но не уверен, хороший ли это вариант.
Добавлено (10 Октября 2019, 21:50) --------------------------------------------- Так, они стали появляться. Осталось сделать их активацию игроком невозможной. В идеале без невидимых стенок и кубов.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1692
написано: 10 октября 2019, 19:13
| Отредактировано: Joopeeter - 10 октября 2019, 19:22
Хм, да. Странно, что у меня работало, когда проверял принципиальную работоспособность такой цепочки активации. Вероятно, скрипты GameMode и OnActivate срабатывали в другом порядке. Да, ты прав, надо понадёжнее разделить цепочки срабатывания активаторов. В смысле предотвратить запуск новой цепочки, пока не закончится текущая. Не только обнуление предотвратить, но и активацию первого активатора.
Добавлено (10 Октября 2019, 22:17) --------------------------------------------- А, уже заработало. Вот и хорошо, а то я что-то уже сам запутался, пытаясь разобраться, в каком порядке будут работать 32 штуки OnActivate'ов и гейммод в придачу. А игрок, насколько я помню, не может активировать безымянные активаторы, то есть когда в поле Name ничего не указано.
Это да, но проблема в том, что скрипт их тоже не активирует, когда там ничего не указано. В общем-то так я и заставил его работать. Просто заполнил Name.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1694
написано: 10 октября 2019, 19:36
| Отредактировано: Joopeeter - 10 октября 2019, 19:45
скрипт их тоже не активирует, когда там ничего не указано.
Век живи - век учись. Не знал. Ну, можно активирующим рефом назначить не игрока, а его папу, допустим. А в скрипт дописать проверку IsActionRef player == 0. Это, конечно, не избавит от самой надписи, предлагающей игроку активировать при наведении прицела.
Добавлено (10 Октября 2019, 22:40) --------------------------------------------- Либо как предлагалось выше, можно скрипт повесить на триггер, а триггер назначить Enable Parent'ом для неактивируемого объекта.
Изменение репутации для пользователя djsave
djsaveOffline
Сообщение №1695
написано: 6 ноября 2019, 20:03
| Отредактировано: djsave - 6 ноября 2019, 20:09
Доброго времячка. Столкнулся тут давеча с интересным глюком и вот думаю а может это я не прав. Вижу у вас тут недетская дискуссия по поводу какого квеста, не смогу принять участия в его обсуждении, но вот свой скриптик покажу. Код
В 2х словах, предмет появляется в мире и на нем висит этот крипт. После появления предмета начинается отсчет в 20сек, после чего на место этого предмета респится другой, а сам предмет отключается и удаляется. И все работает как часы...китайские.... Почему то PlaceAtMe отрабатывает дважды, тоесть появляется 2 предмета а не как должно 1 и в консоле 2 записи подряд, тоесть блок как я понимаю отрабатывает дважды.... (непереводимый национальный диалект)... почему ?
Всем привет, делюсь своей проблемой. При сохранении скрипта ГЭКК спрашивает, желаю ли я сохранить текущий скрипт, выбираю ответ "да" и в итоге ничего не происходит, скрипт не сохраняется. Что делать?
Teovil_Elf, как мне помнится, тут 2 варианта: 1) В скрипте используются расширенные команды из NVSE, а ГЕКК запущен не через NVSE-loader для ГЕККа; 2) Не загружен мастер/плагин, рефы/предметы/персонажи/etc из которого используются в скрипте.
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Поставить GECK Power up, он же "глюкоисправитель". Тогда ГЭКК начнёт, как ему и положено, при ошибке в скрипте говорить, что это за ошибка и в какой она строке. Тогда уже и яснее станет, что делать.
Возможно ли с помощью скрипта сделать так, чтобы при выборе оружия с ЛЦУ, перекрестие на экране автоматически выключалось, а при выборе ствола без ЛЦУ-снова включалось?
Изменение репутации для пользователя YikxX
YikxXOffline
Сообщение №1706
написано: 6 мая 2020, 23:25
| Отредактировано: YikxX - 7 мая 2020, 02:58
Как правильно получить RefID непися (через GetSelf вроде как не прокатит в этом случае), для использования очистки рефа взрыва, чтобы сейвы не загаживались?
ref placedObject ... set placedObject to RefID.PlaceAtMe AWGrenadePlasmaExplosion 1
И еще, placedObject должна иметь уникальное название или в разных скриптах можно использовать одно название, по аналогии с DoOnce?
Да, Fallout 3 если что, просто там в мастерской темы по скриптам нет от слова совсем.
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Изменение репутации для пользователя Spalny_Vagon
Spalny_VagonOffline
Сообщение №1707
написано: 7 мая 2020, 12:32
| Отредактировано: Spalny_Vagon - 7 мая 2020, 12:33
Если скрипт висит на том, чей реф нужен, то 100-500% должно прокатить.
Код
ref myself ;объявить еще одну ref-переменную --------------- set myself to getself ; "самоиндификация", достаточно воткнуть куда-нибудь один раз. ---------------- set placedObject to myself.PlaceAtMe AWGrenadePlasmaExplosion 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
Изменение репутации для пользователя YikxX
YikxXOffline
Сообщение №1708
написано: 7 мая 2020, 12:38
| Отредактировано: YikxX - 7 мая 2020, 12:42
Spalny_Vagon, ага, вроде действительно работает. Сравнил 2 сейва: без очистки и с очисткой - с очисткой Save Cleaner нашел на 4 REFR меньше. Хотя странно, неписей то я убил 3 Однако, почему-то не изменилось кол-во Dynamic REFRs - 5 было, 5 и осталось. Я думал, что плэйсед взрыв - это как раз динамический реф
Действия, естественно, производились одни и те же в обоих случаях - зашел, открыл 1 дверь, убил 3-х неписей в одинаковом порядке.
А насчет сомнений о прокатит - вроде как в гекковики написано, что при использовании рефа полученного через GetSelf как раз конструкция set placedObject to RefID.PlaceAtMe objectToPlace 1 не может получить правильную реф-ссылку. То есть дизейблится и помечается для удаления потом непойми что. Как-то так...
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Spalny_Vagon, но ведь далее написано, для чего именно этот RefID нужен, разве нет?
Все-таки непонятно. GetSelf используется для получения Ref-a именно непися. На неписях он работает нормально, это мы выяснили. А далее реф уже не получается, а используется уже полученный ранее, а именно myself в вашем примере.
Или в процессе выполнения set placedObject to myself.PlaceAtMe objectToPlace 1 еще раз запрашивается RefID непися через GetSelf. Нет же? Или да? Что-то я не пойму, как эта хрень работает. Взрыв точно создается, значит myself.PlaceAtMe objectToPlace 1 отрабатывает корректно и на том, на ком нужно...
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...