как сделать так, чтобы диалог появился через неделю после другого? То есть: поговорил, прошла неделя, появился другой диалог.
Тут пригодится глобальная переменная GameDaysPassed - сколько дней прошло с начала игры. В квестовый скрипт вписываем примерно так:
Code
scn zzQuestScript
short DayX
Begin GameMode
if DayX>0 if DayX<=GameDaysPassed set DayX to -1 endif endif
End
Условие первого диалога: GetQuestVariable zzQuestScript.DayX>-1 (тогда он будет доступен всю эту неделю) Условие второго диалога: GetQuestVariable zzQuestScript.DayX==-1 В первом диалоге в подходящем результ-скрипте пишем:
Code
if zzQuestScript.DayX==0 set zzQuestScript.DayX to GameDaysPassed+7 endif
Есть такое ощущение, что считает движок где-то внутри, а у него не очень-то допытаешься
Похоже, я тут тебя обманул. Допытаться можно функцией GetPCMiscStat, а Песочного человека можно ещё поймать за работой функцией GetSandman. Тогда если через подсчёт, то в квестовом скрипте будет примерно так:
Code
short Sandman short DoOnce
Begin GameMode
if DoOnce==0 set Sandman to GetPCMiscStat "Sandman Kills" set DoOnce to 1 endif
if GetPCMiscStat "Sandman Kills" - Sandman >=5 player.ModAV sneak 1 set Sandman to GetPCMiscStat "Sandman Kills" endif
End
А если через отслеживание действия, то примерно так:
Code
short DoOnce short Sandman
Begin GameMode
if player.GetSandman==1
if DoOnce==0 set Sandman to Sandman+1 set DoOnce to 1 endif
else
if DoOnce==1 if Sandman>=5 player.ModAV sneak 1 set Sandman to 0 endif set DoOnce to 0 endif
endif
End
Действие там длинное, так что по идее квестовый гейммод должен успеть сработать.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №153
| Тема: Помощь по моддингу
написано: 30 августа 2012, 16:16
| Отредактировано: Joopeeter - 30 августа 2012, 16:01
стимпак может "съедаться" тремя способами. Из инвенторя пип-бой (менюмод), с инвентарной кнопки, если стимпак повешен на кнопку (гейммод), а также из пип-боя со страницы эффектов - причём на ней двумя способами: просто кнопка "скушать стимпак" и целевое втыкание стимпака в покалеченные части силуэта ГГ.
А вот интересно, что позволяет именно стимпаку (а не пиву, например) иметь возможность лечить больную голову ГГ и другие части тела. И ещё рад-икс с антирадином на вкладке радиации. Вроде, ничего такого, кроме флажка Medicine их не отличает от прочих предметов из раздела "Помощь", однако, установка этого флага всё равно не даёт возможности лечить переломы морковкой, а лучевую болезнь - стаканом доброго вина.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №154
| Тема: ВОПРОСЫ по моддингу
написано: 1 сентября 2012, 11:29
| Отредактировано: Joopeeter - 1 сентября 2012, 11:37
Там ещё фракции могут подсуропить. Хотя с этим как-то неясно. Если дать кому-нибудь в рыло в Мегатонне и сделать ему StopCombat, то он на секунду успокаивается и зеленеет, а потом опять краснеет и начинает драться. Типа ничего личного, но теперь ты враг моей фракции. А вот если стукнуть Агату (совсем небольно, честное слово!) и сделать ей StopCombat, то всё путём - успокаивается и прощает. Со SCAOnActor то же самое. Также у меня в игре был случай: случайно попал по Доку Хоффу во время боя, он, естественно, взъелся и вся его свита тоже. Так вот, пока с консоли не успокоил StopCombat одновременно его самого, его охранника и его корову, они так и агрились по очереди. По видимому, это важно для фракций с более чем одним членом. Так что может пригодиться ClearActorsFactionsPlayerEnemyFlag.
Некоторые делают. Отследить можно функцией GetLockLevel, но учти, что придётся навешивать скрипт на все запертые терминалы сколько их есть, либо дописывать к уже навешенным скриптам. В отличие от дверей, у терминалов запертость настраивается в базовом объекте, но это не сильно облегчает задачу - всё равно перелопачивать придётся вручную. Сам скрипт вроде такого:
Code
scn zzScript
short Lock
Begin OnActivate
if GetLocked set Lock to GetLockLevel else set Lock to -1 endif Activate
End
Begin MenuMode
if Lock>=0 if GetLocked==0 set [переменная] to [переменная]+Lock+1 set Lock to -1 endif endif
А вот в сцене драки с Туннельными Змеями используется не Player.GetHealthPercentage, а сравнение текущего здоровья с половиной запомненного в начале. Впрочем, Player.GetHealthPercentage в Ф3 тоже используется раз пять. Как насчёт локализовать проблему? Просто, до всяких диалогов, затеять драку и с консоли успокоить непися StopCombat или player.SCAOnActor. Потом во время заскриптованной драки. Хоть ясно будет, на каком этапе поломка.
Пораньше начать. Я о чём и толкую, нельзя со стороны определить, по крайней мере, стандартными средствами, во что именно сейчас тычет отвёрткой/пальцами игрок. Поэтому отслеживать должен сам тыкаемый объект, а для этого надо на него навесить скрипт. Что было хорошо для одного повышающего навык сейфа, может стать таким вот гемором если надо учесть всё-всё, что заперто в игре. Дверей тоже больше трёхсот, контейнеров - больше пятисот. Надо ещё не накосячить с уже имеющимися на всём этом скриптами. В принципе, есть специальные менюмоды для взлома/хака, но в ГЭКК-вики они не упоминаются среди правильно работающих. К тому же остаётся проблема определения текущего взламываемого объекта.
Возможно, не срабатывает if Player.GetHealthPercentage < 0.50. Некоторые функции, которые в Ф3 использовали доли единицы, в Вегасе используют проценты. Конкретно по этой ГЭКК-вики не пишет ничего такого, но там иногда не всё задокументировано. Опять можно посмотреть, что возвращает рlayer.GetHealthPercentage, введённая с консоли. Или вместо неё можно попробовать так:
Code
if player.GetAV health < player.GetBaseAV health/2 StopCombat; или SCAOnActor endif
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №159
| Тема: Помощь по моддингу
написано: 1 сентября 2012, 19:57
| Отредактировано: Joopeeter - 1 сентября 2012, 20:00
Скрипт надо будет чуть изменить из-за того, что висеть он будет и на запертых, и не незапертых контейнерах, так как у контейнеров это настраивается на копии, а не на базовом объекте. Кроме того, если ходил по ссылке, то наверное заметил, что сложность механического замка и сложность терминала нумеруются по-разному:
Code
scn zzScript
short Lock
Begin OnActivate
if GetLocked && GetLockLevel<255 set Lock to GetLockLevel/25+1 else set Lock to -1 endif Activate
End
Begin MenuMode
if Lock>0 if GetLocked==0 set [переменная] to [переменная]+Lock set Lock to -1 endif endif
End
Кстати, там в терминалах я не учёл невзламываемые (правда, что-то не припомню таких в игре). Надо дополнить условие if GetLocked && GetLockLevel<5 НО! В локации может быть много десятков контейнеров и в режиме меню запустятся разом скрипты на каждой копии. Уж не знаю насколько менюмод легче для игры, чем гейммод (если вообще легче), но лучше сначала проверить: поставить штук 50-70-100 копий заскриптованного контейнера и посмотреть насчёт тормозов в разных меню. И, честно говоря, вызывает сомнения целесообразность редактирования многих сотен объектов. Даже не в смысле трудоёмкости, а в смысле что чем меньше лезешь с изменениями в оригинальное, тем лучше. Если по хорошему, то надо будет проверять каждый контейнер через Use Info, и если у него нет копий, подлежащих взлому, скрипт не вешать. И ещё. Если контейнер заперт на взламываемый замок, но также может быть открыт и ключом, то при данном способе в обоих случаях скорее всего будет засчитан успешный взлом. Если, конечно, скрипт срабатывает до отпирания, что вероятней всего.
Вис, я очень не люблю говорить кому-то что ему делать, а что нет, но тут всё же дам такой совет: не реализуй этот способ. Лучше отслеживай потихоньку в квестовом скрипте GetPCMiscStat и фиг с ним с уровнем сложности. Во-первых, неизбежны баги. Баги с ключами/паролями, баги с дверьми, либо исключение дверных замков из подсчёта, кто его знает какие ещё баги из-за скриптов, потому что придётся изменять их десятками, а внимание притупляется... Честное слово, простой незабагованный мод лучше сложного забагованного. Лучше для игроков, красивее при взгляде изнутри. Во-вторых, менять какие-то оригинальные объекты, скрипты и т.п., не понимая чётко что ты делаешь, не нужно. Причём понимать придётся тебе самому, потому что переписывать за тебя кучу игровых скриптов вряд ли кто возьмётся. Я, например, не возьмусь. Пошаговую инструкцию по совмещению скриптов писать тоже не стану, поскольку совсем не уверен, что она подойдет ко всем случаям, а понимания, которое требуется, чтобы сманеврировать в нужном месте, механическое выполнение кем-то написанных пунктов не прибавит ни на грош.
Если перчатки не у игрока, то BoxBonkTarget'ом является как раз игрок. Может, использовать ещё GetContainer? Типа: ref Owner .... set Owner to GetContainer .... Owner.StopCombat
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №162
| Тема: ВОПРОСЫ по моддингу
написано: 2 сентября 2012, 17:08
| Отредактировано: Joopeeter - 2 сентября 2012, 17:10
(ref Owner) под (ref BoxBonkTarget)'ом (set Owner to GetContainer) под (Set BoxBonkTarget to GetOwnerLastTarget)'ом (Owner.StopCombat) под (BoxBonkTarget.StopCombat)'ом И переменные обычно всё же объявляют сразу после Scriptname, хоть тут и без разницы.
А что, он должен, по-твоему, подбежать к двери, порыскать там, остановиться, почесать репу, а потом подойти к тебе и сказать:"Дык эта... А навмеш-то где? Нету навмеша-то!" Игра и не подбегая знает, может он пройти или нет, вот и не суетится зря.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №164
| Тема: Скрипты
написано: 6 сентября 2012, 15:09
| Отредактировано: Joopeeter - 6 сентября 2012, 15:10
Какой функцией возможно вернуть значение урона, который был нанесен игроку в данный момент? Просто мне нужно сделать скрипт, который не позволял бы игроку умереть, если ему был нанесен урон больше, чем его собственное текущее здоровье
Насколько мне известно, стандартными средствами такой фокус не провернёшь. Однажды я решал аналогичную задачу и там пришлось на время "бессмертия" тупо скриптово задирать здоровье и скриптово же снижать его до нужного процента (чтобы полоска оставалась той же длины). В пип-бое, правда, всё равно было видно реальное положение дел, но в принципе, несложно в режиме меню временно вернуть как было.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №165
| Тема: Скрипты
написано: 7 сентября 2012, 05:48
| Отредактировано: Joopeeter - 7 сентября 2012, 06:30
Наличие/отсутствие гриба - это переменная State на том грибе. Тогда на кнопке будет так:
Code
scn AAATestSwitchScript
short Open
Begin OnActivate if AAATestFungusARef.State==0 if Open==0 AAATestDoorRef.SetOpenState 1 ShowMessage [Есть гриб!] set Open to 1 else AAATestDoorRef.SetOpenState 0 set Open to 0 endif Activate else if Open==1 AAATestDoorRef.SetOpenState 0 set Open to 0 endif ShowMessage [Нету гриба!] endif End
Кстати, этот скрипт, насколько я помню, для двери с выключателем в другой локации. Если выключатель этой двери - вон тот слева, то можно просто связать их через Activate Parent:
Code
scn AAATestSwitchScript
Begin OnActivate if AAATestFungusARef.State==0 AAATestDoorRef.Activate ShowMessage [Есть гриб!] Activate else if AAATestDoorRef.GetOpenState==1 AAATestDoorRef.Activate endif ShowMessage [Нету гриба!] endif End
И ещё кстати. Не ясно зачем вообще там дверь, гриб, как видно из его скрипта, прекрасно растёт и при открытой. Чтоб не рос:
Code
scn AAATestFundusScript
float TimeStart float TimeStop short State
Begin onActivate if (State == 0) Disable player.additem AAATestFungusA 1 set State to 1 endif End
Begin GameMode if State>0 if State==1 if AAATestDoorRef.GetOpenState==3 set TimeStart to GameDaysPassed set State to 2 endif elseif State==2 set TimeStop to GameDaysPassed if TimeStop - TimeStart >= 1 Enable set State to 0 endif endif endif End
Всё написано без проверки.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №166
| Тема: Скрипты
написано: 8 сентября 2012, 12:11
| Отредактировано: Joopeeter - 8 сентября 2012, 12:14
Всё кроме "умри" - пакеты. Чтобы пакет начался сразу, надо либо добавить его скриптово AddScriptPackage, либо в нужном месте дать команду на переоценку пакетов EvaluatePackage.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №167
| Тема: Помощь по моддингу
написано: 8 сентября 2012, 15:23
| Отредактировано: Joopeeter - 8 сентября 2012, 15:48
Дык OpenTeammateContainer это и есть залаз в инвентарь. Просто надо читать что там про синтаксис пишут.. OpenTeammateContainer 1 открывает инвентарь как если бы непись был напарником.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №169
| Тема: Помощь по моддингу
написано: 8 сентября 2012, 20:18
| Отредактировано: Joopeeter - 8 сентября 2012, 20:18
Сложность можно отследить и без ФОСЕ. Экстендер, как теперь выяснилось, позволяет получить реф-ссылку, на которой потом применяется функция GetLockLevel. То есть, не навешивая скрипт на базовый объект, можно определить, сложность чего именно отслеживается в данный момент. Правда, как я уже упоминал, ГЭКК-вики не упоминает менюмод хака (MenuMode 1055) в числе всегда корректно работающих, но сам я это не проверял, а не верить Ipatow'у нет никаких оснований. Так что если у тебя нет предубеждений против ФОСЕ... Можно переиначить и под контейнеры с дверьми, но двери-телепорты всё равно не будут отслеживаться правильно.
Есть туторы которые уходят в сами подробности скриптинга?
На том же modder.ucoz.ru, который посоветовал tundruck73, есть учебник OSFM. Он по Обливиону, но общие принципы насчёт шортов, бегин-гейммодов и прочего те же самые. Большинство функций тоже остались как были, но и отличаются многие, так что на ГЭКК-вики ходить всё равно придётся, как ни крути, больше информацию взять просто негде.
Нужно уменьшить расстояние уховосприятия оружия (потрошитель...), так как играть сложно из-за обилия выданных на руки экземпляров. Кто скажет? Радиус обнаружения уменьшать негоже, сам звук тоже, неплохо-бы скрипт на оружие, дабы оно включалось только в десяти метрах...
Не понял, не нравится жужжание в своих руках или в чужих? И где это там, интересно, "обилие"? В чужих - меняй звук. Гоже там или нет, но расстояние, с которого начинается затухание и расстояние, на котором затухает полностью, задаются именно в настройках звука. В своих - хм, можно, наверное, нагромоздить скрипт, заменяющий озвученное оружие на беззвучное в зависимости, скажем, от того... Но надо ли оно? Есть клавиша "R", что ещё надо?
KAIN48, по-хорошему, так это мы все должны поздравлять тебя, как главного библиотекаря. Фотошоп я не умею,так что рисовал поздравительную открытку в ГЭКК и портретного сходства, как ни мучился, не вышло. Никакого не вышло, если честно. Поэтому на всякий случай: Каин в шляпе.
Кстати да. Хотя ГЭКК-вики и пишет, будто Spread игнорируется и игра использует для макс. разброса вычисленные значения, но когда мне надо было, чтобы непись точнее попадал из уникальной железнодорожной винтовки, я уменьшил её разброс и костыли ложились заметно кучнее. Правда, мин. разброс я там вообще убрал в ноль, но и внешний диаметр круга из костылей значительно уменьшился.
Римайер, я не проводил целенаправленных исследований, просто было такое, как я описал. Требовалась более меткая стрельба из ж-д винтовки, я не стал мудрить и тупо снизил ей разбросы. Помогло.
Там на вики в обсуждении пишут, что будто бы для игрока и непися разброс считается по-разному: для игрока по "большой" формуле со всякими там модификаторами, а для непися по "малой" Spread * fWeaponConditionSpreadX + Min. Spread Так что, возможно, моё наблюдение для играбельного оружия и не актуально.
Цитата Ipatow
можно задать лампочку в свойствах прожектиля, но это никак на игре не отразится - обо что первым делом бьются каждый раз пытающиеся изобрести ракетницу
Ничего себе клипчик! Даже не представляю, сколько часов труда ушло на шестиминутный ролик. Автор молодец!
Который уползает на карачках - это из тех, кому хоть хороший ответ, хоть плохой - всё равно пойдёт и спросит по стопятьсотдвадцатьпятому разу (сам знаешь, такие есть).
Alisa1992, есть небольшой модик Centered 3P Cam, он центрирует камеру при виде от третьего лица. Там изменены настройки fOverShoulderOffsetPointX и fOverShoulderPosX. Думаю, копать надо в ту сторону.
Но зато можно приспособить на пользу делу баг с остающейся на месте коллизией при перемещении с помощью SetPos (ну кто мог подумать, что пригодиться! ). VIPerMX, делается объект Moveble Staic (или Activator, или ещё какой, лишь бы двигался через SetPos) с моделью от "отключаемой" статики. Ставится где-нибудь в укромном месте - до отключения коллизии он не потребуется. Лучше сразу делать его путём дублирования и замены той статики, тогда можно будет просто сместить его подальше по любой одной оси (пусть будет z). В нужный момент настоящая статика дизэйблится: [RefID настоящей статики].Disable а на её место скриптово подсовывается фальшивая: [RefID фальшивой статики].SetPos z [значение координаты z настоящей статики] При этом коллизия фальшивки остаётся где была, а перемещается только "внешний вид" - это тот самый баг.