Модератор форума: КсюXa, ApeX  
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)

Скрипты
a3apbi4  Offline  Сообщение №1 написано: 7 декабря 2010, 18:01



11
Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.




OldFrag1488  Offline  Сообщение №1681 написано: 1 июня 2019, 17:02



2
привет всем, решил запилить фикс на IWS, один из багов связан со спауном роботов, скрипт спаунит роботов в хатке у робота торговца оружейников и тот не работает, видел на нексусе коментарий что спаунищиеся роботы в робко ломает локальный квест (поднимается тревога). после крашей игры при переходах между локами находил странные трупы роботов.
И внимание тупой вопрос, скрипт не сохраняется, измененный (ошибок не выдавал) не сохраняется и неизмененный тоже не сохраняется (щелкнул в форму, он пометился как измененный), сохранить и перекомпилировать скрипты тоже не закрывает окно скрипта. Может как то можно выдрать скрипт из модуля отредактировать минуя гек?

ApeX  Offline  Сообщение №1682 написано: 1 июня 2019, 19:00



Если IWS - это, то в требованиях NVSE. То есть GECK необходимо запускать через него. Для этого 
Как запустить GECK вместе с NVSE?
Нужно запускать nvse_loader.exe с параметром "-editor". Для этого надо отредактировать существующий ярлык GECK'а на рабочем
столе. Зайдите в свойства ярлыка и в поле "Объект" после закрывающей
кавычки допишите "-editor". Например: "C:\Games\Fallout New Vegas\nvse_loader.exe" -editor.

OldFrag1488  Offline  Сообщение №1683 написано: 1 июня 2019, 21:17



2
ApeX да этот мод, чет я не подумал что библиотеки НВСЕ в гек не подгружаются, хотя догадался если бы исходный скрипт не скомплировался с ошибкой. Отрезал в этом моде спаун роботов и ошибкок с оружейниками и робко больше нет.
Спасибо. thanks

Stea1ch  Offline  Сообщение №1684 написано: 15 июня 2019, 21:32 | Отредактировано: Stea1ch - 19 июня 2019, 08:31



180
Как заставить скриптом непися нажать на спусковой крючек и перезарядить оружие перед этим?

Вопрос снят: создаешь AI Package со стрельбой и включаешь его в скрипте с помощью RefID.AddScriptPackage

Добавлено (19 Июня 2019, 02:35)
---------------------------------------------
Такой вопрос по функциям enable/disable в скриптах: мне надо, чтобы предмет не появлялся в игре до определенной стадии квеста. Я вешаю на объект скрипт такого плана: 


Затем в квесте я прописываю на нужной стадии диалога DLC05AuralStealthSuitUpgrade1Ref.Enable - по идее все должно работать, ан нет. Объект не появляется... ЧЯДНТ?

И опять вопрос снят. Не надо скриптом делать Disable - достаточно поставить галку в свойствах референта и делать Enable когда надо любым доступным способом.


Человек человеку - волк, а зомби зомби - зомби.
Void_flame  Offline  Сообщение №1685 написано: 7 октября 2019, 19:52



98
Доброго времени суток. Никак не могу найти максимально оптимизированный путь для решения своей проблемы. У меня есть 32 заранее расставленных объекта с флажком Disabled. Названия различаются только цифрами 01-32. Скрипт должен проверять количество конкретных айтемов в контейнере (в моём случае это золотые слитки из Dead Money) и включать столько объектов, сколько этих айтемов в контейнере. Если я забираю несколько, то столько же рефов снова выключается.
Пытался сделать это простейшим образом через кучу условий и проверок. Работает, но получается очень много и наверняка совершенно неэффективно. Буду благодарен, если кто-нибудь на примере хотя бы 3-5 объектов покажет, как можно сделать это покрасивее.

JupiterJour  Offline  Сообщение №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'ом другой ссылки, которая уже размещается где угодно. В этом случае активаторами служат обычные триггеры, а появляющиеся и исчезающие объекты могут быть любого типа.


Void_flame  Offline  Сообщение №1687 написано: 8 октября 2019, 12:56



98
Огромное спасибо. Попробую разобраться, что к чему. Раньше никогда не пользовался квестами. Настал момент попробовать.

JupiterJour  Offline  Сообщение №1688 написано: 8 октября 2019, 17:01


_


Квест, не квест - это тут вопрос чисто технический и второстепенный. Смысл предложенного способа в том, чтобы записать куда-нибудь количество штуковин и количество видимых объектов таким образом, чтобы каждый из объектов мог туда поглядеть и сам решить, надо ему появиться сейчас или исчезнуть. Просто я привык в квестовые переменные записывать, а так можно хоть на тот же контейнер скрипт повесить и там объявить эти переменные.

Void_flame  Offline  Сообщение №1689 написано: 10 октября 2019, 17:51



98
Я полагаю, конструкция

    if GetDisabled
        ;
    else
        Disable
    endif

равна

    if GetDisabled == 0
        Disable
    endif

Типа если включено, то выключить. Или всё же есть какие-то различия в затрачиваемых ресурсах?

JupiterJour  Offline  Сообщение №1690 написано: 10 октября 2019, 18:24


_


Да, это одно и то же. Так написалось.

Void_flame  Offline  Сообщение №1691 написано: 10 октября 2019, 18:34



98
Пока что не могу заставить работать. Скрипт повесил в итоге на контейнер, но смущает одна строка:

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:41)
---------------------------------------------
Почему-то отказываются появляться активаторы. Странно.

Добавлено (10 Октября 2019, 21:50)
---------------------------------------------
Так, они стали появляться. Осталось сделать их активацию игроком невозможной. В идеале без невидимых стенок и кубов.


JupiterJour  Offline  Сообщение №1692 написано: 10 октября 2019, 19:13 | Отредактировано: Joopeeter - 10 октября 2019, 19:22


_


Хм, да. Странно, что у меня работало, когда проверял принципиальную работоспособность такой цепочки активации. Вероятно, скрипты GameMode и OnActivate срабатывали в другом порядке. Да, ты прав, надо понадёжнее разделить цепочки срабатывания активаторов. В смысле предотвратить запуск новой цепочки, пока не закончится текущая. Не только обнуление предотвратить, но и активацию первого активатора.

Добавлено (10 Октября 2019, 22:17)
---------------------------------------------
А, уже заработало. Вот и хорошо, а то я что-то уже сам запутался, пытаясь разобраться, в каком порядке будут работать 32 штуки OnActivate'ов и гейммод в придачу.
А игрок, насколько я помню, не может активировать безымянные активаторы, то есть когда в поле Name ничего не указано.

Void_flame  Offline  Сообщение №1693 написано: 10 октября 2019, 19:25



98
Это да, но проблема в том, что скрипт их тоже не активирует, когда там ничего не указано. В общем-то так я и заставил его работать. Просто заполнил Name.

JupiterJour  Offline  Сообщение №1694 написано: 10 октября 2019, 19:36 | Отредактировано: Joopeeter - 10 октября 2019, 19:45


_


Цитата Void_flame

скрипт их тоже не активирует, когда там ничего не указано.



Век живи - век учись. Не знал.
Ну, можно активирующим рефом назначить не игрока, а его папу, допустим. А в скрипт дописать проверку IsActionRef player == 0. Это, конечно, не избавит от самой надписи, предлагающей игроку активировать при наведении прицела.

Добавлено (10 Октября 2019, 22:40)
---------------------------------------------
Либо как предлагалось выше, можно скрипт повесить на триггер, а триггер назначить Enable Parent'ом для неактивируемого объекта.

djsave  Offline  Сообщение №1695 написано: 6 ноября 2019, 20:03 | Отредактировано: djsave - 6 ноября 2019, 20:09


=TMG= TeamModingGames


505
Доброго времячка. Столкнулся тут давеча с интересным глюком и вот думаю а может это я не прав. Вижу у вас тут недетская дискуссия по поводу какого квеста, не смогу принять участия в его обсуждении, но вот свой скриптик покажу.
Код

scn CBFlayerLiteSCPT
;скрипт отключения Флайеров
float fTimer
int iRelise
Begin GameMode
if fTimer < 20
set fTimer to fTimer + GetSecondsPassed
else
if iRelise != 1
set iRelise to 1
PlaceAtMe CBFlayerEmptyBottle
printc "Bottle Spawned"
endif
Disable
MarkForDelete
endif
END


В 2х словах, предмет появляется в мире и на нем висит этот крипт. После появления предмета начинается отсчет в 20сек, после чего на место этого предмета респится другой, а сам предмет отключается и удаляется. И все работает как часы...китайские.... Почему то PlaceAtMe отрабатывает дважды, тоесть появляется 2 предмета а не как должно 1 и в консоле 2 записи подряд, тоесть блок как я понимаю отрабатывает дважды.... (непереводимый национальный диалект)... почему ? dash

=TMG= Team Moding Games
JupiterJour  Offline  Сообщение №1696 написано: 6 ноября 2019, 21:41


_


Placed Impact Object'ы никаким боком не задействованы? Они, помню, появлялись парами, если взрыву не был назначен меш.

djsave  Offline  Сообщение №1697 написано: 10 ноября 2019, 21:14 | Отредактировано: djsave - 11 ноября 2019, 17:33


=TMG= TeamModingGames


505
Цитата Joopeeter

Placed Impact Object'ы никаким боком не задействованы? Они, помню, появлялись парами, если взрыву не был назначен меш.

Хм а вот это интересно, я видно не туда копаю.... надо будет глянуть.

UPD: Да, действительно не было назначено арт файла. Назначил и все стало работать как и было задумано.

=TMG= Team Moding Games
КсюXa  Offline  Сообщение №1698 написано: 26 декабря 2019, 16:07


Гид по Мастерской


Joopeeter, аууууу! Нужен совет мастера по скриптам. Вы еще тут?

Ой, всё...
JupiterJour  Offline  Сообщение №1699 написано: 27 декабря 2019, 16:23


_


Да, тут где-то...

Teovil_Elf  Offline  Сообщение №1700 написано: 7 января 2020, 07:44



5
Всем привет, делюсь своей проблемой. При сохранении скрипта ГЭКК спрашивает, желаю ли я сохранить текущий скрипт, выбираю ответ "да" и в итоге ничего не происходит, скрипт не сохраняется. Что делать?

YikxX  Offline  Сообщение №1701 написано: 7 января 2020, 12:51


Местный Дон Кихот Ламанчский


Teovil_Elf, как мне помнится, тут 2 варианта: 1) В скрипте используются расширенные команды из NVSE, а ГЕКК запущен не через NVSE-loader для ГЕККа; 2) Не загружен мастер/плагин, рефы/предметы/персонажи/etc из которого используются в скрипте.

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
JupiterJour  Offline  Сообщение №1702 написано: 7 января 2020, 13:46


_


Цитата Teovil_Elf

Что делать?


Поставить GECK Power up, он же "глюкоисправитель". Тогда ГЭКК начнёт, как ему и положено, при ошибке в скрипте говорить, что это за ошибка и в какой она строке. Тогда уже и яснее станет, что делать.

КсюXa  Offline  Сообщение №1703 написано: 3 февраля 2020, 13:12


Гид по Мастерской


Цитата Joopeeter

Да, тут где-то...

Осталось мне вспомнить, чего я хотела-то... unsure

Ой, всё...
JupiterJour  Offline  Сообщение №1704 написано: 3 февраля 2020, 18:50 | Отредактировано: Joopeeter - 3 февраля 2020, 18:53


_


Дык надо было изложить вопрос и тут его оставить - кто-нибудь да подобрал бы. А то ау-ау... smile2

Bulbyan  Offline  Сообщение №1705 написано: 10 февраля 2020, 04:44



Возможно ли с помощью скрипта сделать так, чтобы при выборе оружия с ЛЦУ, перекрестие на экране автоматически выключалось, а при выборе ствола без ЛЦУ-снова включалось?

YikxX  Offline  Сообщение №1706 написано: 6 мая 2020, 23:25 | Отредактировано: YikxX - 7 мая 2020, 02:58


Местный Дон Кихот Ламанчский


На неписе висит скрипт, в нем такая конструкция:

Код
elseif RandomDisintegrate < 50
    CIOS PlasmaEffect
    PlaceAtMe AWGrenadePlasmaExplosion
endif


Неписей несколько, с разными ID.

Как правильно получить RefID непися (через GetSelf вроде как не прокатит в этом случае), для использования очистки рефа взрыва, чтобы сейвы не загаживались?

ref placedObject
...
set placedObject to RefID.PlaceAtMe AWGrenadePlasmaExplosion 1

И еще, placedObject должна иметь уникальное название или в разных скриптах можно использовать одно название, по аналогии с DoOnce?

Да, Fallout 3 если что, просто там в мастерской темы по скриптам нет от слова совсем.

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Spalny_Vagon  Offline  Сообщение №1707 написано: 7 мая 2020, 12:32 | Отредактировано: Spalny_Vagon - 7 мая 2020, 12:33


Мастер


Цитата YikxX

через GetSelf вроде как не прокатит в этом случае

Если скрипт висит на том, чей реф нужен, то 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  Offline  Сообщение №1708 написано: 7 мая 2020, 12:38 | Отредактировано: YikxX - 7 мая 2020, 12:42


Местный Дон Кихот Ламанчский


Spalny_Vagon, ага, вроде действительно работает. Сравнил 2 сейва: без очистки и с очисткой - с очисткой Save Cleaner нашел на 4 REFR меньше. Хотя странно, неписей то я убил 3 :) Однако, почему-то не изменилось кол-во Dynamic REFRs - 5 было, 5 и осталось. Я думал, что плэйсед взрыв - это как раз динамический реф unsure

Действия, естественно, производились одни и те же в обоих случаях - зашел, открыл 1 дверь, убил 3-х неписей в одинаковом порядке.

А насчет сомнений о прокатит - вроде как в гекковики написано, что при использовании рефа полученного через GetSelf как раз конструкция set placedObject to RefID.PlaceAtMe objectToPlace 1 не может получить правильную реф-ссылку. То есть дизейблится и помечается для удаления потом непойми что. Как-то так...

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Spalny_Vagon  Offline  Сообщение №1709 написано: 7 мая 2020, 14:32


Мастер


Цитата YikxX

Как правильно получить RefID непися


======================
Мод "Нью-Йорк" на русском: 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  Offline  Сообщение №1710 написано: 7 мая 2020, 15:59


Местный Дон Кихот Ламанчский


Spalny_Vagon, но ведь далее написано, для чего именно этот RefID нужен, разве нет?

Все-таки непонятно. GetSelf используется для получения Ref-a именно непися. На неписях он работает нормально, это мы выяснили. А далее реф уже не получается, а используется уже полученный ранее, а именно myself в вашем примере.

Или в процессе выполнения set placedObject to myself.PlaceAtMe objectToPlace 1 еще раз запрашивается RefID непися через GetSelf. Нет же? Или да? Что-то я не пойму, как эта хрень работает. Взрыв точно создается, значит myself.PlaceAtMe objectToPlace 1 отрабатывает корректно и на том, на ком нужно...

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)
Поиск:





Ответ на жалобу смотрите в разделе жалоб