Вверх Вниз


Модератор форума: Ipatow, КсюXa, ApeX  
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)
Скрипты
a3apbi4  Offline Сообщение №1 написано: 07 Декабря 2010 в 21:01


Странник


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




OldFrag1488  Offline Сообщение №1681 написано: 01 Июня 2019 в 20:02


Странник


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

ApeX  Offline Сообщение №1682 написано: 01 Июня 2019 в 22:00



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

Ab altero expectes, alteri quod feceris
Коммерческие заказы НЕ выполняю!
OldFrag1488  Offline Сообщение №1683 написано: 02 Июня 2019 в 00:17


Странник


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

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


Обращённый


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

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

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


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

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


Лучше по утру искать на GoogleEarth ГДЕ ты пил, чем на Youtube КАК!
Человек человеку - волк, а зомби зомби - зомби!
Void_flame  Offline Сообщение №1685 написано: 07 Октября 2019 в 22:52


Обращённый


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

JupiterJour  Offline Сообщение №1686 написано: 08 Октября 2019 в 00:08 | Отредактировано: Joopeeter - Вторник, 08 Октября 2019, 00:22


_


1037
Предлагаю такую схему.
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 написано: 08 Октября 2019 в 15:56


Обращённый


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

JupiterJour  Offline Сообщение №1688 написано: 08 Октября 2019 в 20:01


_


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

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


Обращённый


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

    if GetDisabled
        ;
    else
        Disable
    endif

равна

    if GetDisabled == 0
        Disable
    endif

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

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


_


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

Void_flame  Offline Сообщение №1691 написано: 10 Октября 2019 в 21: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 в 22:13 | Отредактировано: Joopeeter - Четверг, 10 Октября 2019, 22:22


_


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

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

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


Обращённый


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

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


_


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


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

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

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


=TMG= TeamModingGames


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

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 написано: 07 Ноября 2019 в 00:41


_


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

djsave  Offline Сообщение №1697 написано: 11 Ноября 2019 в 00:14 | Отредактировано: djsave - Понедельник, 11 Ноября 2019, 20:33


=TMG= TeamModingGames


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

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

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


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


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

Я шаурму в ларьках на улице не покупаю. Делаю дома сама. Получается как настоящая. Даже траванулась пару раз.
JupiterJour  Offline Сообщение №1699 написано: 27 Декабря 2019 в 19:23


_


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

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


Странник


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

YikxX  Offline Сообщение №1701 написано: 07 Января 2020 в 15:51


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


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

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...

«Перед тем как начать писать, некоторое время читал». © В. Шендерович
JupiterJour  Offline Сообщение №1702 написано: 07 Января 2020 в 16:46


_


1037
Цитата Teovil_Elf ()
Что делать?

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

КсюXa  Offline Сообщение №1703 написано: 03 Февраля 2020 в 16:12


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


1142
Цитата Joopeeter ()
Да, тут где-то...
Осталось мне вспомнить, чего я хотела-то... unsure

Я шаурму в ларьках на улице не покупаю. Делаю дома сама. Получается как настоящая. Даже траванулась пару раз.
JupiterJour  Offline Сообщение №1704 написано: 03 Февраля 2020 в 21:50 | Отредактировано: Joopeeter - Понедельник, 03 Февраля 2020, 21:53


_


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

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



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

YikxX  Offline Сообщение №1706 написано: 07 Мая 2020 в 02:25 | Отредактировано: YikxX - Четверг, 07 Мая 2020, 05:58


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


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

Код
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 написано: 07 Мая 2020 в 15:32 | Отредактировано: Spalny_Vagon - Четверг, 07 Мая 2020, 15:33





941
Цитата YikxX ()
через GetSelf вроде как не прокатит в этом случае
Если скрипт висит на том, чей реф нужен, то 100-500% должно прокатить.

Код
ref myself ;объявить еще одну ref-переменную
---------------
set myself to getself ; "самоиндификация", достаточно воткнуть куда-нибудь один раз.
----------------
set placedObject to myself.PlaceAtMe AWGrenadePlasmaExplosion 1

Мод "Нью-Йорк" на русском:
Мод "Нью-Йорк" на английском:
YikxX  Offline Сообщение №1708 написано: 07 Мая 2020 в 15:38 | Отредактировано: YikxX - Четверг, 07 Мая 2020, 15:42


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


2625
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 написано: 07 Мая 2020 в 17:32





941
Цитата YikxX ()
А насчет сомнений о прокатит - вроде как в гекковики написано, что при использовании рефа полученного через GetSelf как раз конструкция set placedObject to RefID.PlaceAtMe objectToPlace 1 не может получить правильную реф-ссылку.
Да, на динамически созданных объектах getself возвращает 0, но ведь в первом вопросе речь шла не о них.
Цитата YikxX ()
Как правильно получить RefID непися

Мод "Нью-Йорк" на русском:
Мод "Нью-Йорк" на английском:
YikxX  Offline Сообщение №1710 написано: 07 Мая 2020 в 18:59


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


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

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

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

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...

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