Надо всего лишь посмотреть, как сделан взрывающийся транспорт и сделать так же, только подставить нужные числа, нужный взрыв и нужные разрушенные модели.
Добавлено (23 Марта 2018, 12:03) ---------------------------------------------
Цитата КсюXa
А можно ли в Вегасе как-то отказаться от колеса компаньона?
Если по-хорошему отвязываться не хочет, то можно навесить на компаньона скрипт OnActivate.
Такое ощущение, что по замыслу крышки должны выпадать из игрока при его смерти...
Если всё же не из игрока, то я бы сделал на манер ушей и пальцев, через добавление посмертно форм-листа (или там левел-лист?) Добавлял бы заскриптованный предмет, а он уж пусть хоть крышки выбрасывает, хоть что.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1083
| Тема: ВОПРОСЫ по моддингу
написано: 29 марта 2018, 13:19
| Отредактировано: Joopeeter - 29 марта 2018, 13:30
А как анимация сможет выбрасывать настоящие крышки? Тем более когда актёр валяется в виде дохлого рэгдолла без головы, он всё равно уже никакие анимации не может. Проще, по-моему, просто приподнять точку выброса крышек и подсунуть по неё маленький невидимый взрыв, чтоб летели куда попало. Хотя у КсюХи вон сами разлетаются и ложатся в кружочек. Только подозреваю, что для такого эффекта нужно спрессовать ну ооочень много крышек в одну точку.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1084
| Тема: ВОПРОСЫ по моддингу
написано: 29 марта 2018, 15:33
| Отредактировано: Joopeeter - 29 марта 2018, 15:38
Посмертная вещь ведь не выкидывается "наружу", она просто появляется в инвентаре у трупа.
А ей и не надо быть снаружи, чтобы гонять гейммод Но наружный объект всё равно потребуется, чтобы не подбрасывать крышки воздух по одной. А подбрасывать их надо, потому что хотя PlaceAtMe и работает из инвентаря, но используются при этом координаты контейнера. В данном случае контейнер - непись, и его координаты находятся на полу, а значит, предметы, особенно маленькие, помещённые в эти координаты, сразу провалятся сквозь поверхность. Можно даже использовать тот же самый предмет, чтобы не плодить лишних объектов. Вот так работает:
Код
scn zzScript
short DoOnce short Z
ref MyDead ref MyOuterItem
Begin OnLoad PlaceAtMe caps001 zzGlobal; как нетрудно догадаться, глобальная или квестовая переменная типа short должна быть создана заранее Disable MarkForDelete End
Begin GAmeMode
if DoOnce == 0 if GetRandomPercent <= ( player.GetAV luck); к примеру set MyDead to GetContainer if MyDead set Z to GetPos z + 100; эпицентр крышек в 100 единицах над полом set zzGlobal to ( MyDead.GetAV barter ); к примеру if MyDead.IsLimbGone 1; мертвец без первой головы set MyOuterItem to PlaceAtMe zzItem; помещаем внешний заскриптованный предмет в координаты контейнера, т.е. непися MyOuterItem.SetPos z Z; приподнимаем endif endif endif set DoOnce to 1 endif
End
Даже взрыв не нужен, крышки и так разлетаются со звоном по округе.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1085
| Тема: ВОПРОСЫ по моддингу
написано: 29 марта 2018, 16:18
| Отредактировано: Joopeeter - 29 марта 2018, 16:23
Перк по образу и подобию Ло-брингера и Контракт-киллера из трёшки, забыл как они в игре называются... Эти перки имеют свой собственный Entry point: добавление посмертного левел-листа жертвам носителя перка (игрока то есть). В Вегасе такой Entry point тоже есть, я поглядел. В левел-листе один предмет, Chance none == 0. Предмет заскриптован. Материализовавшись, он смотрит, в контейнере ли он (а контейнером не может быть ничто кроме непися, убитого игроком). Если да, в контейнере, то предмет смотрит, есть ли у контейнера голова (тут у меня ошибка в скрипте, надо сначала смотреть голову, а потом случайный процент). Если головы нет, предмет задаёт значение внешней переменной в зависимости от навыка бартера жертвы. Если жертва не должна никак участвовать в вычислении количества крышек, то внешняя переменная не нужна. Потом предмет материализует снаружи контейнера другой предмет (в данном случае реф-копию себя же). Потом, по идее, в скрипт надо дописать удаление заскриптованного предмета из инвентаря. Если предмет материализовался снаружи, а не в контейнере, срабатывает OnLoad, предмет материализует возле себя сколько-то крышек и самоустраняется.
Это странно. Вот прямо взял, и прямо проверил прямо в Вегасе прямо вот этот вот скрипт:
Код
scn zzScript
short DoOnce short Z
ref MyDead ref MyOuterItem
Begin OnLoad PlaceAtMe caps001 zzGlobal Disable MarkForDelete End
Begin GameMode
if DoOnce == 0 set MyDead to GetContainer if MyDead set Z to GetPos z + 100 set zzGlobal to ( MyDead.GetAV barter ) if MyDead.IsLimbGone 1 if GetRandomPercent <= 99;( player.GetAV luck) set MyOuterItem to PlaceAtMe zzItem MyOuterItem.SetPos z Z endif endif endif set DoOnce to 1 endif
End
Это работает как должно. Единственное, что заметил, это что некоторая часть крышек куда-то проваливается, наверное всё же под пол. Собрать удаётся всегда меньше, чем у жертвы был навык бартера. Работать перестаёт, когда дописываю удаление заскриптованного предмета. По-видимому, предмету в инвентаре нужно какое-то время, чтобы разместить внешний предмет. Ввожу задержку перед удалением 10 оборотов - работает снова:
Код
scn zzScript
short DoOnce short Z
ref MyDead ref MyOuterItem
Begin OnLoad PlaceAtMe caps001 zzGlobal Disable MarkForDelete End
Begin GAmeMode
if DoOnce == 0 set MyDead to GetContainer if MyDead set Z to GetPos z + 100 set zzGlobal to ( MyDead.GetAV barter ) if MyDead.IsLimbGone 1 if GetRandomPercent <= 99;( player.GetAV luck) set MyOuterItem to PlaceAtMe zzItem MyOuterItem.SetPos z Z endif endif endif set DoOnce to 1 elseif DoOnce > 0 && MyDead set DoOnce to DoOnce + 1 endif
if DoOnce >= 10 ShowMessage GenericDebugMsg set DoOnce to -1 RemoveMe endif
Да нет, почему не надо, надо. Это всё свистелки, принцип-то работы в другом...
Добавлено (02 Апреля 2018, 15:46) --------------------------------------------- Проверь, гейммод вообще работает? Ну то есть я привык, что всегда гейммод работает в инвентаре обычным образом и никогда не сталкивался с ситуацией, чтобы он там не работал, но мало ли, может, от каких-то настроек зависит Тогда, естественно, всё пойдёт прахом.
Возможно, надо дать предмету больше времени, чтобы осмотреться и понять, что он в инвентаре:
Код
scn zzScript
short DoOnce short Z
ref MyDead ref MyOuterItem
Begin OnLoad PlaceAtMe caps001 zzGlobal Disable MarkForDelete End
Begin GAmeMode
if DoOnce == 10 set MyDead to GetContainer if ( MyDead != 0 ) set Z to ( GetPos z + 100 ) set zzGlobal to ( MyDead.GetAV barter ) if MyDead.IsLimbGone 1 if GetRandomPercent <= 99;( player.GetAV luck) set MyOuterItem to PlaceAtMe zzItem MyOuterItem.SetPos z Z endif endif endif endif
if ( DoOnce >= 0 ) && ( DoOnce < 20 ) set DoOnce to ( DoOnce + 1 ) else set DoOnce to -1 RemoveMe endif
Как сказал бы Каин, учу! Это как вставлять переменные в сообщения, только проще. Например, есть у тебя в скрипте переменная Var типа float и надо узнать c точностью два знака после запятой, какое же она приняла значение в каком-то месте скрипта. Пишем в этом месте: PrintToConsole "Var == %.2f" Var Когда скрипт дойдёт досюда, в консоли само напишется: Var == [тут будет значение Var с точностью два знака после запятой] В кавычках можно писать всё что угодно любыми словами, строго регламентировано только форматирование переменных - то, что идёт после знака процента. После форматированной переменной можно снова писать всё что угодно. Например: Printc "Var == %.2f and AnotherVar == %0.2f" Var AnotherVar Главное, чтобы количество переменных в кавычках и после кавычек совпадали, переменные после кавычек шли в нужном порядке и подходили по типу к формату (чтобы не получилось, что в кавычках стоит %.0f, а после кавычек реф-переменная). Всего функция принимает до двадцати одной переменной. Если в консоль вываливается слишком много всего, то можно записать это в файл для просмотра вне игры. Консольная функция называется SetConsoleOutputFile (это стандартная функция, не FOSE), но сама консоль понимает только сокращённое обозначение - SCOF. Например: scof "zz.txt" Будет создан файл zz.txt и всё, что будет после этого написано в консоли, сохранится в нём. Так что пользоваться не сложно, сложнее потом вычистить всё это из скрипта после отладки. Я например, когда вааще не понимаю, почему ничо не работает, втыкаю PrintToConsole чуть ли не после каждой строчки. На примере крышечного взрыва это выглядело бы примерно так:
Код
scn zzScript
short DoOnce short Z
ref MyDead ref MyOuterItem
;DEBUG VARIABLES short Outside short OutsideZ
Begin OnLoad set OutsideZ to GetPos z PrintToConsole "Outer item has appeared with %0.f Z position" OutsideZ set Outside to 1 PlaceAtMe caps001 zzGlobal PrintToConsole "Caps placed %0.f" zzGlobal Disable MarkForDelete End
Begin GAmeMode
if DoOnce == 10 PrintToConsole "DoOnce is %0.f, it's time to check where the item is" DoOnce set MyDead to GetContainer if MyDead != 0 PrintToConsole "The item is inside a container, the container is %n, RefID is %i " MyDead MyDead set Z to GetPos z + 100 set zzGlobal to ( MyDead.GetAV barter ) PrintToConsole "Variable Z is set to %0.f " Z PrintToConsole "Variable zzGlobal is set to %0.f" zzGlobal if MyDead.IsLimbGone 1 PrintToConsole "The container had a head 1 when it was alive but now does not have" if GetRandomPercent <= 99 PrintToConsole "Random percent is less than 99, it is predictable" set MyOuterItem to PlaceAtMe zzItem if MyOuterItem != 0 PrintToConsole "Variable MyOuterItem is set in script to %n, RefID is %i " MyOuterItem MyOuterItem else PrintToConsole "VARIABLE MYOUTERITEM IS NOT SET IN SCRIPT" endif MyOuterItem.SetPos z Z PrintToConsole "Item's Z position is set in script to %0.f" Z else PrintToConsole "Random percent is more than 99 O_o" endif else PrintToConsole "The container's head 1 is untouched or this container has no head from the beginning" endif else PrintToConsole "VARIABLE MYDEAD IS NOT SET IN SCRIPT" endif endif
if DoOnce < 20 && DoOnce >= 0 set DoOnce to ( DoOnce + 1 ) if Outside == 0 PrintToConsole "DoOnce is %0.f" DoOnce else PrintToConsole "GAMEMODE IS RUNNING OUTSIDE DOONCE IS %0.f" DoOnce endif else PrintToConsole "DoOnce is %0.f, the item should remove itself" DoOnce set DoOnce to -1 RemoveMe endif
if DoOnce < 0 PrintToConsole "GAMEMODE IS STILL RUNNING INSIDE DOONCE IS %0.f" DoOnce set DoOnce to DoOnce - 1 endif
End
Сорри фор май Инглиш, ит из нот май нэйтив лэнгвидж.
И потом в файле можно почитать как оно всё было:
SetConsoleOutputFilename >> 'zz.txt' player.addperk 02000adf Added Perk zzPerk to with rank 1 coc primmtents player.placeatme 7f4e5 prid ff001099 killactor player 1
тут я удалил не относящиеся к делу сведения, которые игра вываливает в консоль после killactor
DoOnce is 1 DoOnce is 2 DoOnce is 3 DoOnce is 4 DoOnce is 5 DoOnce is 6 DoOnce is 7 DoOnce is 8 DoOnce is 9 DoOnce is 10 DoOnce is 10, it's time to check where the item is The item is inside a container, the container is Рейдер, RefID is FF001099 Variable Z is set to 7448 Variable zzGlobal is set to 11 The container had a head 1 when it was alive but now does not have Random percent is less than 99, it is predictable Variable MyOuterItem is set in script to zzItemName, RefID is FF00109D Item's Z position is set in script to 7448 DoOnce is 11 DoOnce is 12 Outer item has appeared with 7448 Z position Caps placed 11 GAMEMODE IS RUNNING OUTSIDE DOONCE IS 1 DoOnce is 13 DoOnce is 14 DoOnce is 15 DoOnce is 16 DoOnce is 17 DoOnce is 18 DoOnce is 19 DoOnce is 20 DoOnce is 20, the item should remove itself qqq Bye.
Заодно можно обнаружить всякое интересное. Например, мы задаём наружному айтему координату Z за два оборота до его появления. Он, как ни странно, эту координату принимает как будто так и надо, но вообще-то конструкция держится на соплях. Надо, если по хорошему, записать Z во внешнюю переменную, в блоке OnLoad брать её оттуда, и позицию Z задавать в этом же блоке.
Дык я тоже не заморачивался. Но ведь куда-то же мне надо было попасть: на стартовом экране не шибко потестируешь А палатка возле Примма - единственная ячейка Вегаса, у которой я помню ID.
Я вообще всю жизнь думал, что это называется RadiationRads, а Rad Level первый раз вижу... Интереснее другое: почему там Set Value и как оно работает. Что, просто устанавливает урон от оружия в руках у ГГ строго 100 либо 200 ед? Почему не множитель, логичнее же? В обеих играх (без дополнений) для такого Entry Point'a используется только Multiply Value. Хотя там всякое интересное обнаружилось. Отрицательный урон, например. Не знаю только, работает ли
Насчёт мастеров esp тут не то что неоднократно, а наверное, не один десяток раз объясняли. Странно, что в "Картотеке" нет... При беглом поиске нашлось: тут, тут, тут и ниже через одно сообщение, тут и ниже на той же странице. Думаю, если поусерднее помучить поиск всякими запросами, можно ещё найти.
Добавлю, что анимации, предназначенные для просмотра от третьего лица, от первого лица не работают. Я пробовал так запускать курение сигарет и дуковское питьё из горла. Не видно ни рук, ни предмета в руках, видно только некоторое покачивание камеры.
Если мне не изменяет память, баг неверного перехода к плаванию или хождению наблюдается у реф-копий, чей рост изменён в игре командой SetScale. Рефы, чей рост установлен в редакторе в свойствах реф-копии, плавают вроде как положено по здравому смыслу. Про двери и препятствия не знаю.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1104
| Тема: ВОПРОСЫ по моддингу
написано: 13 августа 2018, 14:35
| Отредактировано: Joopeeter - 13 августа 2018, 14:36
Всё даже ещё заковырестее... За радиацию при плавании в ячейке отвечает Actor Effect того типа воды, который назначен этой ячейке. То есть, если мне не изменяет память, за сам факт получения радиации, количество же получаемой радиации от Actor Effecta не зависит. Если ячейке назначен грязный тип воды, то даже если сделать там водоём с кристально чистой Placable Water, при плавании игрок будет получать дозу облучения, хотя пить из этого водоёма можно без вреда. Аналогично, если ячейке назначен тип воды, в Actor Effect'е которого нет радиации, то плавать и не получать радиацию там можно в абсолютно любой воде с любым радиоактивным Actor Effect'ом, хотя при питье Actor Effect будет действовать обычным образом.
Напомню ещё про Snap to reference. Привязывает убежавшую сетку к ссылке. Ну это я так, на всякий случай. Не уверен, что оно поможет против десятитысячных долей, к тому же наверняка это уже было попробовано.
Можно гейммодом или менюмодом. Гейммод на предмете работает и в инвентаре. После того, как всё что надо произошло, предмет может самоудалиться (RemoveItem сам себя в количестве 1 штука), предварительно положив в инвентарь такой же, но незаскриптованный предмет. Только надо будет проверить, как поведут себя скрипты на стеке предметов. Но если нет особой необходимости в том, чтобы что-то произошло сей же миг при добавлении, то можно просто тупо время от времени проверять инвентарь квестовым скриптом, раз секунд в пять-десять. Всё-таки стек скриптованных предметов - штука, не внушающая большого доверия.
Я понимаю, что от ответа УМВР толку мало, но ничего не могу поделать, у меня всё работает, в том числе скрипты на стеке неэкипируемых предметов из Misc Items. Если это не работает, тогда только постоянная проверка инвентаря, больше ничего не остаётся. Либо пореже, но постоянно работающим квестовым скриптом, либо почаще, но работающим только в загруженной области объектным. Больше ничего в голову не приходит
Добавлено (03 Ноября 2018, 22:55) --------------------------------------------- Можно, конечно, и что-нибудь экзотическое придумать. Повесить на игрока скриптовый эффект, а у эффекта условие на наличие в инвентаре предмета. Предмет появляется - стартует эффект, срабатывает скрипт. Не знаю уж, как оно там насчёт нагрузки...
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1109
| Тема: ВОПРОСЫ по моддингу
написано: 4 ноября 2018, 18:28
| Отредактировано: Joopeeter - 4 ноября 2018, 18:29
player.PlaceAtMe [чего-нибудь] 20 создаёт вокруг игрока 20 отдельных копий чего-нибудь. Только надо подпрыгнуть перед включением консоли, а то они почти все под пол провалятся. Но это, конечно, следует признать скриптовым решением
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1110
| Тема: Скрипты
написано: 5 декабря 2018, 21:47
| Отредактировано: Joopeeter - 5 декабря 2018, 21:49
Пока кнопка не нажата, функция GetButtonPressed возвращает -1. Потом, после того как кнопка была нажата, функция один раз возвращает номер кнопки и опять сбрасывается на -1. Во время работы блока OnActivate ни одна кнопка ещё не нажата. То есть в этом блоке надо оставить только проверку на скрытный режим, сам показ сообщения и выключение и удаление. Всё остальное делается в гейммоде. Активировали лампу, сработал OnActivate, показалось сообщение (игра в это время в менюмоде), нажали кнопку, игра вернулась в гейммодд (а функция помнит кнопку), в гейммоде спросили функцию и запомнили ответ в переменной, ну и так далее.
Добавлено (06 Декабря 2018, 00:48) --------------------------------------------- GetButtonPressed