Модератор форума: КсюXa, ApeX  
Форум » Fallout 3 » Мастерская » Помощь по моддингу (Помощь в нелегком модмейкерском деле)

Помощь по моддингу
КсюXa  Offline  Сообщение №1 написано: 9 июля 2010, 18:51


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




Тема для общих вопросов по моддингу игры.
Возможно, что ответ на ваш вопрос уже есть в Картотеке.

Ой, всё...
Горностай  Offline  Сообщение №2371 написано: 1 мая 2022, 15:36


Хаотично-нейтральная сущность.


33
О! Живые! Я уж думал, трындец сайту...


Эва, как! А с этой-то стороны я и не подумал... Спасибо, будем пробовать! 

JIuKBuDaToR  Offline  Сообщение №2372 написано: 15 июня 2022, 09:16



64
Здравствуйте! Какой функцией в скрипте можно определить наличие какого либо предмета у игрока в инвентаре?

Я пишу скрипт, он должен проверить есть ли у игрока такой то предмет или нет, в моем случае BookSkillScience, у игрока в инвентаре.

Могу использовать функции FOSE, мой гекк его поддерживает.

Как работает функция GetItemValue ? 

Можно ли ей проверить наличие предмета у игрока в инвентаре? Если да, то как написать?


YikxX  Offline  Сообщение №2373 написано: 15 июня 2022, 12:01


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


JIuKBuDaToR, GetItemCount

Проверить можно так: If Player.GetItemCount BookSkillScience > 0

Да фиг ее знает, как она работает.

Нет, нельзя.

JIuKBuDaToR  Offline  Сообщение №2374 написано: 15 июня 2022, 18:45



64
YikxX, а если мне нужно проверить сначала наличие одного объекта, а потом другого? Как записать? Игра сначала проверяет один объект, потом другой через GetItemCount



YikxX  Offline  Сообщение №2375 написано: 15 июня 2022, 19:19


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


JIuKBuDaToR, от задачи зависит. Если один, потом другой и сделать что-то - используем логические операторы. Если один - сделать что-то, другой - сделать что-то другое, то просто 2 вышеприведенных условия подряд.

Проверяем наличие книги "Наука..." и книги "Починка..." и делаем что-то:

If Player.GetItemCount BookSkillScience > 0 && Player.GetItemCount BookSkillRepair > 0
Делаем что-то
endif

Проверяем наличие либо одной, либо другой и делаем что-то:

If Player.GetItemCount BookSkillScience > 0 || Player.GetItemCount BookSkillRepair > 0
Делаем что-то
endif

Ну и проверяем одно - делаем одно, потом другое - делаем другое:

If Player.GetItemCount BookSkillScience > 0
Делаем что-то
endif
If Player.GetItemCount BookSkillRepair > 0
Делаем что-то другое
endif

YikxX  Offline  Сообщение №2376 написано: 31 августа 2022, 04:52 | Отредактировано: YikxX - 31 августа 2022, 05:11


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


Почему такое

            If ( GameMonth > 12 )
                Set GameYear to GameYear + 1
                Set GameMonth to GameMonth - 12
            endif

из скрипта не работает, а из консоли - пожалуйста.

Пытаюсь исправить 13-й месяц после путешествия из PL обратно на Пустошь wacko

Upd: Разобрался victory

JIuKBuDaToR  Offline  Сообщение №2377 написано: 15 октября 2022, 09:35



64
Приветствую, есть какое нибудь руководство по созданию пакетов поведения персонажу? У меня есть нпс, прописал ему только два пакета на сон и санбокс с использованием анимаций на барной стойке. Можно ли сделать два пакета с одинаковым временем использования? Например, один пакет на принятие пищи будет использоваться с 15 до 20, а другой пакет на использование некоторых маркеров будет так же использоваться с 15 до 20. Т.е. по моей задумке, нужно чтобы после использования одного пакета сразу начинался выполняться другой. Нпс пошел поел, потом использовал маркер idle и снова пошел есть, и так по кругу до 20 часов. Будут ли пакеты так работать?

И еще вопрос, как создать свой собственный idle маркер и добавить в него нужные анимации, кроме того, как анимации эти просмотреть, чтобы понимать какие анимации использовать, а какие нет?


YikxX  Offline  Сообщение №2378 написано: 15 октября 2022, 10:41


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


JIuKBuDaToR, думаю тут найдется все, что нужно.

Маркер создать просто - найти готовый (например DefaultHumanIdleMarker) и переташить мышкой куда вам нужно в окне рендеринга. И потом уже править его параметры или рефы с других маркеров на него кидать.

JIuKBuDaToR  Offline  Сообщение №2379 написано: 15 октября 2022, 11:30



64
YikxX, вот как раз таки на гекк вики ничего не нашел про маркеры)

Вот, что получается пока у меня) 

https://www.youtube.com/watch?v=MwFIpwP4Ljc


JIuKBuDaToR  Offline  Сообщение №2380 написано: 15 октября 2022, 11:32



64
YikxX, я думаю сделать несколько маркеров с разными анимациями и нпс сделать пакет поведения через патруль, чтобы он ходил от одного маркера к другом поочередно. Таким же образом сделан пакет поведения у Азрухала в 9 Круге. У него 3 маркера с разными анимациями, он через патруль ходит от одного к другому. 

YikxX  Offline  Сообщение №2381 написано: 17 октября 2022, 01:49


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


JIuKBuDaToR, ну да, сделайте по аналогии, только с нужными вам анимациями.
Маркер придется создавать свой (Misc... - Idle marker - ПКМ - New) и анимации ему выбирать тоже самому, превью там есть. Думаю, разберетесь.

YikxX  Offline  Сообщение №2382 написано: 23 октября 2022, 06:19


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


Как в скрипте одежды сделать действие скрипта не только на игрока, но и на любого NPC, который ее наденет?

Например типа мед. скрипт - если в инвентаре носящего броню есть стимпак, то при падении здоровья ниже опр. уровня у носящего броню удаляется 1 стимпак и на носящего броню накладывается эффект стимпака.

Как это сделать для игрока понятно, но как сделать для непися?

ApeX  Offline  Сообщение №2383 написано: 23 октября 2022, 08:59



А если поглядеть, как это сделано у китайских драконов в Анкоридже? Или же перком выдаваемым.

JupiterJour  Offline  Сообщение №2384 написано: 23 октября 2022, 09:57


_


Как это сделать для игрока понятно, но как сделать для непися?
Да вроде так же... Только зачем скрипт одежды? Не, ну можно и на одежде гонять непрерывно гейммод, конечно. А так ScriptEffectStart в базовом эффекте, базовый эффект в объектном эффекте с условием, что здоровье ниже опр. уровня, объектный эффект на одежде, одежда на NPC. Или на игроке, без разницы.

Кстати, раз уж у актёра завалялся в кармане стимпак, в бою он его и сам употребит безо всякого скрипта. Правда, только один стимпак, а следующий через какое-то время, не раньше. Время задаётся где-то в настройках, не помню уже название этой настройки... Смешно, что это может быть любой актёр, не обязательно человек. Но анимация укола будет только у людей, конечно (а жаль, было бы ещё смешнее).


YikxX  Offline  Сообщение №2385 написано: 23 октября 2022, 13:15 | Отредактировано: YikxX - 23 октября 2022, 13:17


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


ApeX, может я туплю, а драконы - это кто? blush


JupiterJour, так в том то и дело, что у непися 10 стимов в инвентаре и после смерти 10 и остается. Значит не используют они их совсем. А скрипт бы сам колол и с паузой, как это сделано для игрока. Да, там на броне гоняется именно game mode, потому что эффект занят стелс-скриптом )

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
ApeX  Offline  Сообщение №2386 написано: 23 октября 2022, 13:30



Цитата YikxX

драконы - это кто?


По-другому - драгуны, которые в невидимости. У них вроде в конфиге это прячется, но можно ведь повесить и на шмотку. 

Но драконы мне больше нравятся biggrin


JupiterJour  Offline  Сообщение №2387 написано: 23 октября 2022, 14:43


_


Ну, актёр жрёт свой стимпак только в бою, и то не всегда прямо сразу по достижении порогового значения здоровья, может и через несколько секунд. Плюс к этому сам укол занимает время. Вне боя актёр будет ходить хоть с единицей здоровья, но лечиться не станет.

В объектный эффект можно и ещё один базовый добавить. Тот будет занят стелс-скриптом, этот лечилкой, все при деле.

Если прямо так необходимо лечить именно в скрипте на одежде, то тут тоже всё одинаково для игроков и неписей. Получаем ссылку на текущий контейнер с помощью GetContainer, записываем в реф-переменную, отслеживаем, надета ли на этот контейнер эта одежда, отслеживаем здоровье этого контейнера и подлечиваем его при необходимости.


YikxX  Offline  Сообщение №2388 написано: 23 октября 2022, 15:16


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


JupiterJour, ну они и погибают в бою. Но стимы, все 10, остаются в инвентаре, никаких попыток использования. Хотя, может просто не успевают...

Скажем я задал переменную

ref rSelf
set rSelf to GetContainer

как проверить что контейнер - игрок?

If rSelf == Player или как? Просто там игроку выводится мессага при лечении, на неписях этот вывод не нужен.

А так ScriptEffectStart в базовом эффекте, базовый эффект в объектном эффекте с условием, что здоровье ниже опр. уровня, объектный эффект на одежде, одежда на NPC. Или на игроке, без разницы.
А насколько это понизит использование ресурса при наличии, скажем, 15 носителей брони на локации?

ApeX  Offline  Сообщение №2389 написано: 23 октября 2022, 18:24



Цитата YikxX

никаких попыток использования. Хотя, может просто не успевают...


А им не нужна фракция дополнительная как курильщикам?

JupiterJour  Offline  Сообщение №2390 написано: 23 октября 2022, 20:20


_


Цитата YikxX

If rSelf == Player или как?


Да, так. Замечу ещё, что игрок может таскать с собой несколько экземпляров. А несколько экземпляров заскриптованных предметов в инвентаре - это почти гарантированные глюки.

Ну и ещё, пожалуй, rSelf проверить надо ещё на IsActor и GetDead, чтобы зря неживые контейнеры не лечить.


Цитата YikxX

насколько это понизит использование ресурса при наличии, скажем, 15 носителей брони на локации?


Подозреваю, что не больше, чем то же количество гейммодов.

JupiterJour  Offline  Сообщение №2391 написано: 23 октября 2022, 20:35


_


Цитата ApeX

А им не нужна фракция дополнительная как курильщикам?


Нет. Если уж брамины - и те лечатся стимпаком, если им его положить в инвентарь... У курильщиков своя фракция сделана ради условий в idle-анимациях, чтобы анимации курения могли исполнять только курильщики.

YikxX  Offline  Сообщение №2392 написано: 24 октября 2022, 04:18 | Отредактировано: YikxX - 24 октября 2022, 04:33


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


JupiterJour, в общем, эксперимент закончился полным провалом :(

1. GetContainer не записывает в rSelf player ни под каким соусом
2. Соответственно нельзя проверить кол-во стимов у игрока и кастануть на него эффект стимпака через скрипт (cios)

Эту проблему я решил, оставив rSelf если IsActor == 1 а если нет, то используется тот же кусок скрипта, но вместо rSelf - player

3. Скрипт эффекта срабатывает ровно 1 раз и пофиг, маленькое до сих пор здоровье или нет. Хотя в условии стоит вызывать эффект при здоровье <= 60% и если не мертв

Так же непонятно, какие флаги ставить на базовый эффект и на чем проверять кондишены в объектном эффекте (Субъект, Таргет и т.д.)

И да, еще сейвы сделанные с этим новым эффектом игра тупо не видит О_о

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
JupiterJour  Offline  Сообщение №2393 написано: 24 октября 2022, 07:39 | Отредактировано: JupiterJour - 24 октября 2022, 07:46


_


Эт-то очень-очень загадочно, потому что я вчера включил ГЭКК и всё мной описанное проверил: и эффект, и скрипт. Работало как задумывалось использовалось столько стимуляторов, сколько надо для излечения до установленного уровня здоровья (было 25%). И вроде использованные функции раньше не были замечены в каких-то подлянках... Единственное, я ещё ввёл дополнительный пустой эффект с секундной длительностью для задержки между срабатыванием нескольких скриптов, чтобы стопка заскриптованных одёжек в инвентаре не колола бы игроку сразу все стимуляторы.

set rSelf to GetContainer ; УМВР, что поделаешь...

if rSelf.IsActor

 if rSelf.IsSpellTarget DelayIngestible == 0 ; контейнер не помечен пустым эффектом, помеченных не лечим

  if rSelf.GetHealthPercentage < 0.25

   if rSelf.GetDead == 0

    if rSelf.GetEquipped OutfitJumpsuitRedRacer ; первая попавшаяся одежда

     if rSelf.GetItemCount Stimpak > 0

      rSelf.CIOS Stimpak

      rSelf.Removeitem Stimpak 1

      rSelf.CIOS DelayIngestible ; помечаем актёра пустым эффектом как находящегося уже под действием одного стимулятора

      if rSelf == player

       ShowМessage GenericDebugMsg

      endif

     endif

    endif

   endif

  endif

 endif

endif

Проверялось, естественно, на чистой игре без единого мода. Но блин, какому моду под силу сломать GetContainer ?!

А вообще через эффект надо делать и не мучиться. Флаг на базовый эффект - Self, условия объектного эффекта (тип эффекта - одежда, на себя) проверяются на Subject.

Насчёт сэйвов никаких идей.


YikxX  Offline  Сообщение №2394 написано: 24 октября 2022, 11:38


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


Цитата JupiterJour

if rSelf.IsSpellTarget DelayIngestible == 0 ; контейнер не помечен пустым эффектом, помеченных не лечим


А не проще в условии эффекта выставить HasMagicEffect Stimpak == 0 ? Хотя да, пауза нужна, в скрипте это вертится на Timer > 8 в GameMode после истечения таймера переменная stim_used в условие на которой завернута проверка количества, каст, удаления стима из инвентаря сбрасывается в 0.

Хм, как ни странно, вполне себе заработала GetSelf вместо GetContainer... Во всяком случае на игроке, на неписях пока не проверял.

И еще - спустя какое-то время и/или кол-во использованных стимов эффект тупо перестает работать ( Перс может хоть вечность ходить со здоровьем меньше 60% - эффект не работает. Если снять/надеть броню - начинает снова работать. Может ему флаг Recover нужен?

И от сообщения "Стимулятор - действие закончилось" никак не избавиться, да?

С сейвами да, непонятка. Такое ощущения, что кончились слоты под запись о_О

YikxX  Offline  Сообщение №2395 написано: 24 октября 2022, 14:16


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


Цитата YikxX

С сейвами да, непонятка. Такое ощущения, что кончились слоты под запись о_О

Ахахаха, нет. Тупо кончилось место на диске D - такое тоже бывает biggrin


И все-таки, в каком блоке скрипта эффекта можно реализовать таймер с getsecondspassed и будет ли он вообще там работать?


JupiterJour  Offline  Сообщение №2396 написано: 24 октября 2022, 17:33


_


Цитата YikxX

пустя какое-то время и/или кол-во использованных стимов эффект тупо перестает работать ( Перс может хоть вечность ходить со здоровьем меньше 60% - эффект не работает. Если снять/надеть броню - начинает снова работать. Может ему флаг Recover нужен?


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

Можно сделать так. Объектный эффект на одежде не делает ничего, только навешивает на актёра актор-эффект в блоке ScriptEffectStart при надевании и снимает его в блоке ScriptEffectFinish при раздевании. Тип актор-эффекта - Эффект, длительность - 99999 дней. А актор-эффект тоже ничего не делает, только содержит в себе скриптовый базовый эффект с условием на низкое здоровье. Этот базовый эффект тоже ничего не делает, а только в блоке ScriptEffectStart накладывает третий эффект, например, Ingestible, который имеет такую длительность, сколько времени должно пройти между уколами. Третий эффект наконец что-то делает, то есть на старте он кастует стимпак и изымает его из инвентаря, а на финише смотрит, выше порога здоровье или ниже, и если ниже, кастует сам себя снова. Сюда же можно вставить и всякие предохранители типа проверки надетой одежды (у неписей в некоторых случаях бывает, что одёжные эффекты не снимаются с одеждой, тогда можно заодно и снять застрявший эффект), проверки живости, наличия стимпаков и т.п. И всё это, заметь, безо всяких гейммодов и таймеров.

То есть одёжный эффект нужен только для того, чтобы накладывать и снимать актор-эффект при одевании и раздевании, потому что больше ничего в нём толком сделать не получается. А актор-эффект с гигантской длительностью нужен только для отслеживания падения здоровья, потому что одёжный с этим не справляется. А третий эффект нужен, потому что ему можно задать маленькую длительность и использовать вместо таймера.

Цитата YikxX

от сообщения "Стимулятор - действие закончилось" никак не избавиться, да?

Не знаю. Непонятно откуда оно вообще взялось, у эффектов без длительности оно же не появляется в норме.

Цитата YikxX

в каком блоке скрипта эффекта можно реализовать таймер с getsecondspassed и будет ли он вообще там работать?


В скриптах вместо GetSecondsPassed полагается использовать ScriptEffectElapsedSeconds в блоке ScriptEffectUpdate, но я знаю, что и блок GameMode в скриптах, как ни странно, работает тоже, так что может, и GetSecondsPassed прокатит. Смутно припоминаю только, что эффектные скрипты будто сильнее жрут ресурс, чем простые объектные. В свете этого много одновременных постоянных ScriptEffectUpdate'ов с таймерами, наверное, не слишком хорошо...

JupiterJour  Offline  Сообщение №2397 написано: 24 октября 2022, 21:35


_


Зарапортовался совсем. Вместо "в скриптах вместо GetSecondsPassed" следует читать "в эффектах вместо GetSecondsPassed", разумеется.

YikxX  Offline  Сообщение №2398 написано: 24 октября 2022, 22:40 | Отредактировано: YikxX - 24 октября 2022, 22:42


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


JupiterJour, прочитав вышеизложенное, все больше понимаю, что может лучше починить/оптимизировать скрипт брони, который GameMode (как минимум одну секцию там можно полностью отключить для неписей, через проверку IsActor например), чтобы работал нормально для неписей и игрока. Ну должна же быть универсальность, блин.

Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
JupiterJour  Offline  Сообщение №2399 написано: 25 октября 2022, 00:13 | Отредактировано: JupiterJour - 25 октября 2022, 00:49


_


Дык и скрипт, и эффект одинаково работают для непися и игрока. Гейммод, конечно, проще и привычнее, зато многоэтажный эффект в 10 раз прикольнее ))

Там ничего сложного на самом деле: эффект, который может быть прикреплён к броне, но не может отслеживать здоровье, накладывает эффект, который не может быть прикреплён к броне, но может отслеживать здоровье и который накладывает эффект, который может иметь небольшую длительность и который перенакладывает себя при необходимости, который в тёмном чулане хранится в доме, который построил Джек.

Нам надо чтобы что-то срабатывало в тот момент, когда здоровье падает ниже порога. Какие у нас варианты? Отслеживать в гейммоде. Ладно, вчера отследили. Что ещё? Эффект с условием. Поначалу думалось, что в осуществлении проще гейммода, но оказалось, что не совсем. Но тем на менее рассмотрим. Актёр (любой - хоть игрок, хоть непись) надевает одежду. Объектный эффект одежды сразу скриптом накладывает на актёра актор-эффект. Актёр снимает одежду. Объектный эффект скриптом снимает актор-эффект. Больше объектный эффект ничего не делает. Актор-эффект имеет в себе только условие "здоровье меньше порога" и маленький скриптик, который накладывает основной эффект-лечилку (не стимпак). Здоровье опустилось - эффект со скриптиком стартанул, наложил лечилку. Здоровье повысилось - эффект финишировал, но ничего не произошло, потому что в актор-эффекте для нас важен не финиш, а умение стартануть повторно, когда здоровье снова понизится. Объектные эффекты, как видим, в этом деле крайне ненадёжны, точнее, их редкий повторный старт - это скорее баг. Зато про актор-эффекты мы знаем, что они могут многократно включаться-выключаться (см., например, перк "Бешенство ботаника", там как раз все составляющие заусловлены на здоровье). Актор-эффект должен накладываться только на реф-копию актёра, поэтому делаем его типа Эффект (суубъект), даём длительность много-много дней и накладываем с помощью CIOS. Эффект-лечилка (который не стимпак) тоже скриптовый и он делает всю работу. Я делал его типа Ingestible, но можно попробовать сделать объектный типа Оружие - тогда не будет выводиться сообщение о его окончании. На старте он проверяет наличие стимпаков и на всякий случай одежду, живость, ещё что-нибудь, в чём возникнет необходимость, и если всё нормально - кастует стимпак и удаляет один. Длительность эффекта-лечилки соответствует промежутку между уколами, но не ноль, какая-то длительность должна быть. На финише лечилка смотрит, превышает ли здоровье пороговое значение, и если нет - кастует снова эту же лечилку. И так по кругу до тех пор, пока здоровье не повысится до порога. При повышении здоровья актор-эффект финиширует и может стартовать снова и опять наложить лечилку.

Короче, вот образец:

https://drive.google.com/file/d/1j7I2SRs_aG8YEFtKFh-oUn0hiLTqpu3F/view

А, вот ещё что. В образце я это упустил, но на финише лечилка должна проверить нааличие стимпаков и не должна кастовать себя, если стимпаков нет. А то будет вечный холостой цикл: лечилка расходует последний стимпак и, не проверив это на финише, кастует себя снова, а стимпака нет, здоровье не растёт, лечилка видит, что здоровье ниже порога, кастует лечилку, а стимпака нет и здоровье не растёт.


YikxX  Offline  Сообщение №2400 написано: 25 октября 2022, 01:06 | Отредактировано: YikxX - 25 октября 2022, 01:16


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


JupiterJour, ух ты, круто! Пошел проверять, по итогу отпишусь...

но на финише лечилка должна проверить нааличие стимпаков и не должна кастовать себя

Лечилка - это jjScriptIngestible ? Так вроде там на финише стоит условие проверять кол-во стимпаков.

Begin ScriptEffectFinish

if GetEquipped jjOutfit
    if GetDead == 0
        if GetHealthPercentage < 0.6
            if GetItemCount Stimpak > 0
                CIOS jjIngestible
            endif
        endif
    endif
else
    Dispel jjObjectEff
    Dispel jjActorEff
endif

End

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





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