YikxX, а если мне нужно проверить сначала наличие одного объекта, а потом другого? Как записать? Игра сначала проверяет один объект, потом другой через GetItemCount
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
YikxXOffline
Сообщение №2376
написано: 31 августа 2022, 04:52
| Отредактировано: YikxX - 31 августа 2022, 05:11
Приветствую, есть какое нибудь руководство по созданию пакетов поведения персонажу? У меня есть нпс, прописал ему только два пакета на сон и санбокс с использованием анимаций на барной стойке. Можно ли сделать два пакета с одинаковым временем использования? Например, один пакет на принятие пищи будет использоваться с 15 до 20, а другой пакет на использование некоторых маркеров будет так же использоваться с 15 до 20. Т.е. по моей задумке, нужно чтобы после использования одного пакета сразу начинался выполняться другой. Нпс пошел поел, потом использовал маркер idle и снова пошел есть, и так по кругу до 20 часов. Будут ли пакеты так работать?
И еще вопрос, как создать свой собственный idle маркер и добавить в него нужные анимации, кроме того, как анимации эти просмотреть, чтобы понимать какие анимации использовать, а какие нет?
Маркер создать просто - найти готовый (например DefaultHumanIdleMarker) и переташить мышкой куда вам нужно в окне рендеринга. И потом уже править его параметры или рефы с других маркеров на него кидать.
YikxX, я думаю сделать несколько маркеров с разными анимациями и нпс сделать пакет поведения через патруль, чтобы он ходил от одного маркера к другом поочередно. Таким же образом сделан пакет поведения у Азрухала в 9 Круге. У него 3 маркера с разными анимациями, он через патруль ходит от одного к другому.
Как в скрипте одежды сделать действие скрипта не только на игрока, но и на любого NPC, который ее наденет?
Например типа мед. скрипт - если в инвентаре носящего броню есть стимпак, то при падении здоровья ниже опр. уровня у носящего броню удаляется 1 стимпак и на носящего броню накладывается эффект стимпака.
Как это сделать для игрока понятно, но как сделать для непися?
Как это сделать для игрока понятно, но как сделать для непися?
Да вроде так же... Только зачем скрипт одежды? Не, ну можно и на одежде гонять непрерывно гейммод, конечно. А так ScriptEffectStart в базовом эффекте, базовый эффект в объектном эффекте с условием, что здоровье ниже опр. уровня, объектный эффект на одежде, одежда на NPC. Или на игроке, без разницы.
Кстати, раз уж у актёра завалялся в кармане стимпак, в бою он его и сам употребит безо всякого скрипта. Правда, только один стимпак, а следующий через какое-то время, не раньше. Время задаётся где-то в настройках, не помню уже название этой настройки... Смешно, что это может быть любой актёр, не обязательно человек. Но анимация укола будет только у людей, конечно (а жаль, было бы ещё смешнее).
Изменение репутации для пользователя YikxX
YikxXOffline
Сообщение №2385
написано: 23 октября 2022, 13:15
| Отредактировано: YikxX - 23 октября 2022, 13:17
JupiterJour, так в том то и дело, что у непися 10 стимов в инвентаре и после смерти 10 и остается. Значит не используют они их совсем. А скрипт бы сам колол и с паузой, как это сделано для игрока. Да, там на броне гоняется именно game mode, потому что эффект занят стелс-скриптом )
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Ну, актёр жрёт свой стимпак только в бою, и то не всегда прямо сразу по достижении порогового значения здоровья, может и через несколько секунд. Плюс к этому сам укол занимает время. Вне боя актёр будет ходить хоть с единицей здоровья, но лечиться не станет.
В объектный эффект можно и ещё один базовый добавить. Тот будет занят стелс-скриптом, этот лечилкой, все при деле.
Если прямо так необходимо лечить именно в скрипте на одежде, то тут тоже всё одинаково для игроков и неписей. Получаем ссылку на текущий контейнер с помощью GetContainer, записываем в реф-переменную, отслеживаем, надета ли на этот контейнер эта одежда, отслеживаем здоровье этого контейнера и подлечиваем его при необходимости.
JupiterJour, ну они и погибают в бою. Но стимы, все 10, остаются в инвентаре, никаких попыток использования. Хотя, может просто не успевают...
Скажем я задал переменную
ref rSelf set rSelf to GetContainer
как проверить что контейнер - игрок?
If rSelf == Player или как? Просто там игроку выводится мессага при лечении, на неписях этот вывод не нужен.
А так ScriptEffectStart в базовом эффекте, базовый эффект в объектном эффекте с условием, что здоровье ниже опр. уровня, объектный эффект на одежде, одежда на NPC. Или на игроке, без разницы.
А насколько это понизит использование ресурса при наличии, скажем, 15 носителей брони на локации?
Да, так. Замечу ещё, что игрок может таскать с собой несколько экземпляров. А несколько экземпляров заскриптованных предметов в инвентаре - это почти гарантированные глюки.
Ну и ещё, пожалуй, rSelf проверить надо ещё на IsActor и GetDead, чтобы зря неживые контейнеры не лечить.
Цитата YikxX
насколько это понизит использование ресурса при наличии, скажем, 15 носителей брони на локации?
Подозреваю, что не больше, чем то же количество гейммодов.
А им не нужна фракция дополнительная как курильщикам?
Нет. Если уж брамины - и те лечатся стимпаком, если им его положить в инвентарь... У курильщиков своя фракция сделана ради условий в idle-анимациях, чтобы анимации курения могли исполнять только курильщики.
Изменение репутации для пользователя YikxX
YikxXOffline
Сообщение №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
JupiterJourOffline
Сообщение №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.
if rSelf.IsSpellTarget DelayIngestible == 0 ; контейнер не помечен пустым эффектом, помеченных не лечим
А не проще в условии эффекта выставить HasMagicEffect Stimpak == 0 ? Хотя да, пауза нужна, в скрипте это вертится на Timer > 8 в GameMode после истечения таймера переменная stim_used в условие на которой завернута проверка количества, каст, удаления стима из инвентаря сбрасывается в 0.
Хм, как ни странно, вполне себе заработала GetSelf вместо GetContainer... Во всяком случае на игроке, на неписях пока не проверял.
И еще - спустя какое-то время и/или кол-во использованных стимов эффект тупо перестает работать ( Перс может хоть вечность ходить со здоровьем меньше 60% - эффект не работает. Если снять/надеть броню - начинает снова работать. Может ему флаг Recover нужен?
И от сообщения "Стимулятор - действие закончилось" никак не избавиться, да?
С сейвами да, непонятка. Такое ощущения, что кончились слоты под запись о_О
пустя какое-то время и/или кол-во использованных стимов эффект тупо перестает работать ( Перс может хоть вечность ходить со здоровьем меньше 60% - эффект не работает. Если снять/надеть броню - начинает снова работать. Может ему флаг Recover нужен?
Хм, да, объектный эффект, включившись раз при снижении здоровья обратно уже не выключается при его повышении и, соответственно, не включается повторно при повторном снижении. Интересно, как же я вчера делал, что он несколько раз включился и отключился?.. Короче, неважно. Стабильно включаются и отключаются актор-эффекты, но их не приделаешь напрямую к одежде.
Можно сделать так. Объектный эффект на одежде не делает ничего, только навешивает на актёра актор-эффект в блоке ScriptEffectStart при надевании и снимает его в блоке ScriptEffectFinish при раздевании. Тип актор-эффекта - Эффект, длительность - 99999 дней. А актор-эффект тоже ничего не делает, только содержит в себе скриптовый базовый эффект с условием на низкое здоровье. Этот базовый эффект тоже ничего не делает, а только в блоке ScriptEffectStart накладывает третий эффект, например, Ingestible, который имеет такую длительность, сколько времени должно пройти между уколами. Третий эффект наконец что-то делает, то есть на старте он кастует стимпак и изымает его из инвентаря, а на финише смотрит, выше порога здоровье или ниже, и если ниже, кастует сам себя снова. Сюда же можно вставить и всякие предохранители типа проверки надетой одежды (у неписей в некоторых случаях бывает, что одёжные эффекты не снимаются с одеждой, тогда можно заодно и снять застрявший эффект), проверки живости, наличия стимпаков и т.п. И всё это, заметь, безо всяких гейммодов и таймеров.
То есть одёжный эффект нужен только для того, чтобы накладывать и снимать актор-эффект при одевании и раздевании, потому что больше ничего в нём толком сделать не получается. А актор-эффект с гигантской длительностью нужен только для отслеживания падения здоровья, потому что одёжный с этим не справляется. А третий эффект нужен, потому что ему можно задать маленькую длительность и использовать вместо таймера.
Цитата YikxX
от сообщения "Стимулятор - действие закончилось" никак не избавиться, да?
Не знаю. Непонятно откуда оно вообще взялось, у эффектов без длительности оно же не появляется в норме.
Цитата YikxX
в каком блоке скрипта эффекта можно реализовать таймер с getsecondspassed и будет ли он вообще там работать?
В скриптах вместо GetSecondsPassed полагается использовать ScriptEffectElapsedSeconds в блоке ScriptEffectUpdate, но я знаю, что и блок GameMode в скриптах, как ни странно, работает тоже, так что может, и GetSecondsPassed прокатит. Смутно припоминаю только, что эффектные скрипты будто сильнее жрут ресурс, чем простые объектные. В свете этого много одновременных постоянных ScriptEffectUpdate'ов с таймерами, наверное, не слишком хорошо...
JupiterJour, прочитав вышеизложенное, все больше понимаю, что может лучше починить/оптимизировать скрипт брони, который GameMode (как минимум одну секцию там можно полностью отключить для неписей, через проверку IsActor например), чтобы работал нормально для неписей и игрока. Ну должна же быть универсальность, блин.
Все люди - курьеры. Просто некоторые не понимают, какие сообщения они несут...
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №2399
написано: 25 октября 2022, 00:13
| Отредактировано: JupiterJour - 25 октября 2022, 00:49
Дык и скрипт, и эффект одинаково работают для непися и игрока. Гейммод, конечно, проще и привычнее, зато многоэтажный эффект в 10 раз прикольнее ))
Там ничего сложного на самом деле: эффект, который может быть прикреплён к броне, но не может отслеживать здоровье, накладывает эффект, который не может быть прикреплён к броне, но может отслеживать здоровье и который накладывает эффект, который может иметь небольшую длительность и который перенакладывает себя при необходимости, который в тёмном чулане хранится в доме, который построил Джек.
Нам надо чтобы что-то срабатывало в тот момент, когда здоровье падает ниже порога. Какие у нас варианты? Отслеживать в гейммоде. Ладно, вчера отследили. Что ещё? Эффект с условием. Поначалу думалось, что в осуществлении проще гейммода, но оказалось, что не совсем. Но тем на менее рассмотрим. Актёр (любой - хоть игрок, хоть непись) надевает одежду. Объектный эффект одежды сразу скриптом накладывает на актёра актор-эффект. Актёр снимает одежду. Объектный эффект скриптом снимает актор-эффект. Больше объектный эффект ничего не делает. Актор-эффект имеет в себе только условие "здоровье меньше порога" и маленький скриптик, который накладывает основной эффект-лечилку (не стимпак). Здоровье опустилось - эффект со скриптиком стартанул, наложил лечилку. Здоровье повысилось - эффект финишировал, но ничего не произошло, потому что в актор-эффекте для нас важен не финиш, а умение стартануть повторно, когда здоровье снова понизится. Объектные эффекты, как видим, в этом деле крайне ненадёжны, точнее, их редкий повторный старт - это скорее баг. Зато про актор-эффекты мы знаем, что они могут многократно включаться-выключаться (см., например, перк "Бешенство ботаника", там как раз все составляющие заусловлены на здоровье). Актор-эффект должен накладываться только на реф-копию актёра, поэтому делаем его типа Эффект (суубъект), даём длительность много-много дней и накладываем с помощью CIOS. Эффект-лечилка (который не стимпак) тоже скриптовый и он делает всю работу. Я делал его типа Ingestible, но можно попробовать сделать объектный типа Оружие - тогда не будет выводиться сообщение о его окончании. На старте он проверяет наличие стимпаков и на всякий случай одежду, живость, ещё что-нибудь, в чём возникнет необходимость, и если всё нормально - кастует стимпак и удаляет один. Длительность эффекта-лечилки соответствует промежутку между уколами, но не ноль, какая-то длительность должна быть. На финише лечилка смотрит, превышает ли здоровье пороговое значение, и если нет - кастует снова эту же лечилку. И так по кругу до тех пор, пока здоровье не повысится до порога. При повышении здоровья актор-эффект финиширует и может стартовать снова и опять наложить лечилку.
А, вот ещё что. В образце я это упустил, но на финише лечилка должна проверить нааличие стимпаков и не должна кастовать себя, если стимпаков нет. А то будет вечный холостой цикл: лечилка расходует последний стимпак и, не проверив это на финише, кастует себя снова, а стимпака нет, здоровье не растёт, лечилка видит, что здоровье ниже порога, кастует лечилку, а стимпака нет и здоровье не растёт.
Изменение репутации для пользователя YikxX
YikxXOffline
Сообщение №2400
написано: 25 октября 2022, 01:06
| Отредактировано: YikxX - 25 октября 2022, 01:16