Упс, удалили. 0legat0r, дословно упомянутые туторы называются так: "Help G.E.C.K. с сайта geck.bethsoft.com" и "Пакеты AI в Fallout 3 - справочный материал".
А можно ли сделать так что бы после выстрела на месте попадания появлялся NPC?
Способ, однажды подсказанный мне Galko в соседней теме: Создаём предмет (активатор, например, или любой, на какой можно навесить скрипт) с примерно таким скриптом (пишу без проверки, возможны неточности)
Code
scn zzScript
ref PlacedNPC
float X float Y float Z
Begin OnLoad
set X to GetPos x set Y to GetPos y set Z to GetPos z
set PlacedNPC to PlaceAtMe [baseID непися] 1
PlacedNPC.SetPos x X PlacedNPC.SetPos y Y PlacedNPC.SetPos z Z
Disable MarkForDelete
End
или, если надо "телепортировать" туда конкретную копию непися
Code
scn zzScript
ref Destination
float X float Y float Z
Begin OnLoad
set X to GetPos x set Y to GetPos y set Z to GetPos z
set Destination to GetSelf
[refID непися].Disable [refID непися].MoveTo Destination [refID непися].SetPos x X [refID непися].SetPos y Y [refID непися].SetPos z Z [refID непися].Enable
Disable MarkForDelete
End
По желанию можно ещё развернуть в нужную сторону.
Создаём фальшивый взрыв, в котором всё оставляем по нулям, кроме Placed Impact Object, там выбираем заскриптованный предмет. Прожектиль делаем взрывающимся с Trigger On Impact, выбираем в качестве взрыва эту фальшивку.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №94
| Тема: ВОПРОСЫ по моддингу
написано: 13 июля 2012, 09:18
| Отредактировано: Joopeeter - 13 июля 2012, 09:27
emo877, Ipatow, гейммод очень даже крутится в инвентаре и в контейнере, но тут, думаю, можно и без него. Насколько я понял, скрипт принуждает неписей употребить и по мере протрезвления усугублять. Употребление можно перенести в блок OnAdd прям как есть, а усугубление - в ScriptEffectFinish с проверкой осталось там ещё или вчера всё допили.
Кстати, а что, интересно, будет, если принудить к употреблению не актёра, а холодильник, например? Возможно, стоит ещё проверить насчёт rSlf.IsActor.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №95
| Тема: Помощь по моддингу
написано: 15 июля 2012, 15:28
| Отредактировано: Joopeeter - 15 июля 2012, 15:28
В falloute ведь есть такие места где так происходит
Напрашивается мой любимый совет: посмотри как сделано в этих самых "таких местах" и сделай также. Даже необязательно читать эти скрипты, достаточно просто посмотреть что к чему прилинковано и что для чего является Enable Parent'ом.
Чего объяснить-то? Как щёлкнуть два раза на триггере, посмотреть какой у него базовый объект, к чему прилинкована эта конкретная копия и есть ли у неё Enable Parent? А потом как проделать то же со вторым триггером, вертолётом, маркером и анклавовцами?
_ANDRUHA_, ты зря кипятишся. Рассказ (локация), а тем более роман (новый мир с квестами) получается гораздо интересней если научиться писать слова (овладеть возможностями редактора) до, а не во время написания. Если будут конкретные грамотно сформулированные вопросы вида "я хочу сделать то-то, делаю так-то, а получается то-то", я уверен, найдуться желающие и помочь и подсказать. Кстати, там в одном скрипте (GenericVertibirdLandingSCRIPT, строка "if (getStage MQ05 >= 85)") проверяется, дошёл ли сюжет до точки, когда анклавовцам уже пора шастать по пустоши, имей в виду, если что.
"Навыков всех NPC сразу" не существует, так как у многих стоит PC Level Mult. Для остальных в окне объектов это есть в виде класса и уровня. Только оффсетов нет, но они редко используются.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №99
| Тема: ВОПРОСЫ по моддингу
написано: 17 июля 2012, 16:23
| Отредактировано: Joopeeter - 17 июля 2012, 16:24
BushWacker, это антигуманно - подсовывать такие скрипты на разбор. Понял только, что несколько десятков (если не сотен) каких-то реф-ссылок (предположительно лампочек) таскаются за игроком и друг за другом. Причём, если не трогали Script Processing Delay квеста, происходит это раз в пять секунд. В остальное время что, лампочки стоят на месте? Фонарик убежал, свет остался?
BushWacker, помогли бы не скриншоты, а сведения о том, что из себя представляют перемещаемые ссылки dlt, dlu, dltlast и dlulast, есть ли на них какие-то свои скрипты, и отличается ли Script Processing Delay от дефолтного. Ну ладно, раз работает, то можно предположить, что квестовый скрипт всё же разогнали до нескольких десятков раз в секунду. Раз не падает FPS, можно предположить, что у тебя не ПК, а целая графическая станция что автору хватило совести запускать этот скриптомонстр не в каждом фрейме, а пореже. В общих чертах: В начале пара десятков каких-то объектов (похоже, вспомогательных) выстраиваются в ряд по направлению взгляда игрока, к каждому из них сразу же перемещается ещё по одному (видимо, лампочки). Потом несколько, я полагаю, дополнительных лампочек располагаются возле основных в зависимости от того, на какое расстояние может видеть игрок (мешают ли препятствия). Возможно, это для более яркого освещения предмета, в который упирается "луч". Лишнее, что не видит игрок, отправляется на 5000 единиц вниз, в ад, наверное. И так каждый раз - каждый фрейм или через один или через два фрейма. При выключении всё это хозяйство ухает аж на 10000 ед. вниз, а чтоб не вылезло, останавливается квест, в котором, надо думать, находится первый скрипт. Забавно, при выстраивании в ряд используется player.GetScale, как будто размер игрока может отличаться от единицы. Как-то так, хотя дополнительные скрипты на каких-либо из упомянутых объектов или просто на рядом лежащих (в инвентаре, к примеру) могут существенно влиять на картину.
Возможно ли сделать квест (не маркированный), чтобы он завершался после того как ГГ покалечит, например, 10 задних лап когтям смерти?
Ну, первым делом надо завести в этом квесте переменную типа short для подсчёта отдавленных лап. А вот дальше... В третьем фолле я бы раздал несчастным обладателям лап скрипт с блоком OnHit, в котором увеличивал бы счётчик на единицу при повреждении лапы именно игроком. В NV OnHit как-то переиначили, так что неясно, как определять факт попадания одного актёра в другого. Можно ещё через эффект. Делается базовый эффект со скриптом:
Begin ScriptEffectStart if [счётчик лап]<10 set [счётчик лап] to [счётчик лап]+1 elseif [счётчик лап]==10 set [счётчик лап] to [счётчик лап]+1 StopQuest [членовредительский квест] ;Здесь раздаются плюшки и делается всё, что должно быть сделано при завершении этого квеста End
На его основе делается актор-эффект с условием LeftMobilityCondition==0 OR RightMobilityCondition==0. Или отдельные эффекты на правую и левую лапу. Эффекты раздаются при запуске членовредительского квеста и отбираются при его остановке. При этом нельзя отследить, кто именно нанёс удар, повредивший конечность. Можно попробовать использовать player.GetCombatTarget, но там какие-то ограничения по расстоянию. Ещё в NV, если мне не изменяет память, есть всякие способности, выдаваемые типа за "1000 раз поковырять в носу". Можно покопаться, может, есть что-то похожее.
[Счётчик лап] - это та переменная short в квестовом скрипте, в которой хранится количество повреждённых конечностей. Как объявлять переменные - см. учебник по скриптам OSFM или ГЕКК-вики.
Цитата Вис
Можно поподробнее?
Эффект выдаётся актёру функцией AddSpell. Тут есть нюанс: функция применяется на копии актёра, а эффект добавляется базовому объекту и, следовательно, всем его копиям. Отбирается эффект RemoveSpell или Dispell, впрочем, можно и не отбирать. Версия скрипта с GetCombatTarget:
Code
scn zzScript
ref Target ref Self
Begin ScriptEffectStart
set Self to GetSelf set Target to player.GetCombatTarget
if Self==Target if zzQ.LegsCount<10 set zzQ.LegsCount to zzQ.LegsCount+1 elseif zzQ.LegsCount==10 set zzQ.LegsCount to zzQ.LegsCount+1 StopQuest zzQ ;Здесь раздаются плюшки и делается всё, что должно быть сделано при завершении этого квеста endif endif End
где zzQ - квест, а LegsCount - счётчик лап в нём. Но тут может случиться так, что на больших расстояниях не сработает.
Для Ф3:
Code
scn zzScript2
short DoOnceL short DoOnceR
Begin OnLoad if GetAV LeftMobilityCondition==0 && DoOnceL==0 set DoOnceL to 1 endif if GetAV RightMobilityCondition==0 && DoOnceR==0 set DoOnceR to 1 endif End
Begin OnHit player if GetAV LeftMobilityCondition==0 && DoOnceL==0 set DoOnceL to 1 set zzQ.LegsCount to zzQ.LegsCount+1 endif if GetAV RightMobilityCondition==0 && DoOnceR==0 set DoOnceR to 1 set zzQ.LegsCount to zzQ.LegsCount+1 endif End
Begin OnHit if GetAV LeftMobilityCondition==0 && DoOnceL==0 set DoOnceL to 1 endif if GetAV RightMobilityCondition==0 && DoOnceR==0 set DoOnceR to 1 endif End
Тут может насторожить использование одновременно OnHit и OnHit player, но я проверил - работает. Остановку квеста и раздачу плюшек можно вписать в блок OnHit player с проверкой сколько уже настреляли (if zzQ.LegsCount==10 и т.д.) или вынести в квестовый скрипт (в NV тоже можно вынести в квест).
Ясен пень ошибка. Смотри, в гейммоде в первом elseif проверяется прошло ли 0,6 сек. с момента включения, во втором - прошло ли 0,5 сек. , в третьем - 0,4 сек. и т.д., то есть после включения второй группы лампочек остальные включатся с задержкой в один фрейм. Короче, проверяемое значение таймера в каждом следующем elseif должно увеличиваться.
defox, тут на форуме уже несколько раз предлагался такой вариант для подобных действий: армия бомжей с пакетами Find. По пакету на каждый тип вещей, который может быть в выброшен. По несколько бомжей на пакет. Бомжей сделать очень шустрыми (Speed Mult). Энейблить и выпускать на охоту когда игрок не смотрит. Периодически очищать инвентарь. Все предметы, изначально находящиеся в локации, сделать собственностью какой-нибудь фракции, в которую бомжи не записаны.
Вис, все вещи из разряда "как сделать, чтобы после А стало возможно Б" делаются через условия. Для Б задаётся условие (значение переменной, стадия квеста, смерть персонажа и т.д.), которое в результате А (в результ-скрипте, просто скрипте, непосредственным воздействием игрока на что-то и т.д.) становится истинным. Конкретно в твоём случае обычно используют переменную.
Возможно ли сделать так, чтобы, например, после взлома определённого сейфа в зависимости от интеллекта прибавлялось к взлому определённое кол-во навыка
Можно. Для примера: инт. 1-3 - +1 к взлому инт. 4-7 - +10 к взлому инт 8-10 - +20 к взлому. Скрипт на сейфе:
Code
scn zzScript
short DoOnce
Begin MenuMode
if DoOnce==0 && GetLocked==0 if player.GetAV Intelligence<4 player.ModAV LockPick 1 elseif player.GetAV Intelligence>=4 && player.GetAV Intelligence<8 player.ModAV LockPick 10 elseif player.GetAV Intelligence>=8 player.ModAV LockPick 20 endif set DoOnce to 1 endif
End
Добавлено (21.07.2012, 17:35) --------------------------------------------- Невероятно, но факт: если заменить MenuMode на OnActivate тоже срабатывает. Видимо, между взломом и собственно открытием происходит ещё одна активация.
Code
scn zzScript
short DoOnce
Begin OnActivate Activate if DoOnce==0 && GetLocked==0 if player.GetAV Intelligence<4 player.ModAV LockPick 1 elseif player.GetAV Intelligence>=4 && player.GetAV Intelligence<8 player.ModAV LockPick 10 elseif player.GetAV Intelligence>=8 player.ModAV LockPick 20 endif set DoOnce to 1 endif
Конечно он будет ругаться, если прям так и скопипастить. А если подойти творчески - загрузить в окно рендера какую-нибудь ячейку, зайти в World -> Image Space Modifiers, потыкать мышью в разные модифаеры и в кнопку Test (для анимированных), то можно легко найти нужный и вписать его вместо FadeToBlackAndBackISFX. Он, кстати, почти также и называется.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №109
| Тема: Скрипты
написано: 22 июля 2012, 21:24
| Отредактировано: Joopeeter - 22 июля 2012, 21:55
Мне интересно, что будет с игрой, если таких квестов будет крутится сотня- другая?
Мне тоже. Думаю, это в разы больше того количества квестовых гейммодов, какое есть в игре изначально. Но мне кажется, что такого издевательства можно избежать, по крайней мере, облегчить ношу. В скрипте в обоих блоках if проверяются те же условия, кроме одного, причём в порядке уменьшения вероятности того, что условие будет истинным. Не знаю, правда, в каком там порядке игра будет их проверять, но лучше сделать так:
Code
scn ZZModQuestReppairScript
Short WeapHealth
Begin GameMode if iskeypressed 36; если это, конечно, не клавиша движения, которая нажата почти всегда if player.isweaponout == 1; if (player.getitemcount ZZModAssaultrifle > 0) set WeapHealth to player.GetWeaponHealthPerc player.AddItemHealthPercent ZZModAsaultRifleReppair 1 WeapHealth player.EquipItem ZZModAsaultRifleReppair 0 1 player.removeitem ZZModAssaultrifle 1 endif if (player.getitemcount ZZModAsaultRifleReppair > 0) set WeapHealth to player.GetWeaponHealthPerc player.AddItemHealthPercent ZZModAssaultrifle 1 WeapHealth player.EquipItem ZZModAssaultrifle 0 1 player.removeitem ZZModAsaultRifleReppair 1 endif endif endif End
Далее. Если во многих из этих сотен скриптов проверяются одни и те же условия (что неизбежно, так как клавиш можно задействовать гораздо меньше двухсот), то можно скомпоновать их по этому признаку, опять же, в каждом проверяя условия по очереди, то есть отбрасывая уже на ранних этапах большие куски, не подходящие под наиболее общие условия. Думаю, таким образом можно избежать полной остановки игры и превратить её в интересное слайд-шоу. Ещё. Я так понял, что один квест приходится на одну пару оружий, так? Тогда почему бы не запускать только один единственный из этих квестов в блоке OnEquip на оружии?
Code
Begin OnEquip if GetQuestRunning [пушкин квест]==0 StartQuest [пушкин квест] endif End Begin OnUnequip StopQuest [пушкин квест] End
А в квестовый скрипт вставить проверку на экипированность соответствующего оружия и остановку квеста если блок UnEquip не сработал по каким-то причинам или ошибочно сработал OnEquip. Типа такого:
Code
scn ZZModQuestReppairScript
Short WeapHealth
Begin GameMode if player.GetEquipped [пушка]==0 StopQuest [пушкин квест] elseif iskeypressed 36; если это, конечно, не клавиша движения, которая нажата почти всегда if player.isweaponout == 1; if (player.getitemcount ZZModAssaultrifle > 0) set WeapHealth to player.GetWeaponHealthPerc player.AddItemHealthPercent ZZModAsaultRifleReppair 1 WeapHealth player.EquipItem ZZModAsaultRifleReppair 0 1 player.removeitem ZZModAssaultrifle 1 endif if (player.getitemcount ZZModAsaultRifleReppair > 0) set WeapHealth to player.GetWeaponHealthPerc player.AddItemHealthPercent ZZModAssaultrifle 1 WeapHealth player.EquipItem ZZModAssaultrifle 0 1 player.removeitem ZZModAsaultRifleReppair 1 endif endif endif End
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №110
| Тема: Помощь по моддингу
написано: 22 июля 2012, 22:27
| Отредактировано: Joopeeter - 22 июля 2012, 22:34
Как сделать нечто подобное для кусочка карты ничего не взрывая?
Взрыв вообще ни при чём, это просто декорация. Не совсем ясно, что именно требуется. Сам зелёный газ или чтобы он появлялся после какого-то события? Если первое - то это просто туман, подсвеченный зелёным через Emitance. Если второе, то всё, что должно появиться или исчезнуть после события, привязывается через Enable Parent к какой-нибудь персистент-ссылке (обычно это маркер). Для "появляемого" отмечается Set enable state to opposite of parent, для "исчезаемого" - нет. Или наоборот, без разницы. В результате события маркер дизейблися или энейблится. Вместе с ним появляются/исчезают привязанные объекты. Set enable state to opposite of parent означает, что если маркер в состоянии disable, то данный объект будет в состоянии enable и наоборот.
Он будет там, где ты его разместишь в GECK, сам он никуда не расползётся. Родительский маркер может быть где угодно, не обязательно в той же ячейке, на то он и персистент, то есть можно объекты из разных ячеек привязывать к одному единственному маркеру. Если требуется равномерно наполнить "духами и туманами" интерьер и при этом внести в него ещё много каких-то связанных с событием изменений, то возможно, проще будет сделать его копию, затуманить и позеленить её на вкладке Lighting, а в результате события просто подменить входную дверь, чтобы вела теперь в отравленный интерьер.
В Moveble Static. FXMist и FXSmoke. Обычные объекты - можно менять размер, назначать Emitence, Enable Parent и прочее. Ещё там есть зелёные летающие пылинки, а их серый аналог почему-то в Static.
Игрец, чесслово, я думал, ты прикалываешся. Сейчас глянул, а там... и в самом деле... розовая с сердечком <вытирая слёзы> Заполучить её не удастся, пока эта модель не назначена какой-нибудь играбельной броне (может, оно и к лучшему). К тому-же у неё нет world-модели (как выглядит, когда ни на кого не надета). А розовые танки не в ГЕКК (хотя я уже не уверен, в Анкоридже ведь есть Химера), а в кинотеатре.
Римайер, можно поэкспериментировать с fImpactShaderMaxDistance и fImpactShaderMaxMagnitude, которые в Gameplay -> Settings. Ещё там есть какая-то настройка fDistanceProjectileExplosionDetection.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №116
| Тема: Помощь по моддингу
написано: 29 июля 2012, 01:09
| Отредактировано: Joopeeter - 29 июля 2012, 01:10
Вис, а Enable Parent ты ему не назначал? И этот объект ты сам размещал в игровом мире? Если нет, то у него может быть назначен Enable Parent. Это значит, что его появление/исчезновение строго привязано к "энейблящему родителю" и на refid.enable он не отреагирует. Если объект "одушевлённый", то у него может быть пакет AI, предписывающий ему находиться совсем в другом месте. Тогда он может мгновенно умотать туда, даже заметить его не успеешь. Если ни то, ни другое, то даже не знаю... Результ-скрипт скомпилировать не забыл?
У торговцев в результ-скрипте фразы, после которой идёт собственно торговля, вписано ShowBarterMenu. К этой функции можно приписать параметр от -100 до 100. Это будет процент наценки/скидки. Например
Снести врагу 40% здоровья. Или при найме изменить настройку iXPDeathRewardHealthThreshold (сколько % здоровья надо снести, чтобы дали опыт), но это повлияет на всех, не только на компаньона. Или навесить на каждого актёра скрипт, проверяющий сколько здоровья ему снёс напарник, а сколько игрок. И выдавать опыт если игрок не дотягивает до необходимого порога, а напарник дотягивает.
"Шмон" - это в смысле обыскивать и тырить детали? Делаешь контейнер с моделью кучи мусора. В нём левел-лист (или несколько) того, что в куче может найтись. Потом надо заменить все такие кучи в игре на эти контейнеры. То же со всей остальной статикой, какая подлежит разграблению. Нестатику (работающие терминалы и т.п.) трогать не надо.