SetActivatorToTarget(MissileID);
эту строку замени на 0
т.к. получается ахинея
int MissileID = UniqueTID(); //даем тид переменной
Thing_ChangeTID(0, MissileID); //меняем тид активатора скрипта на переменную выше (активатор скрипта снаряд)
SetActivatorToTarget(MissileID); //почему-то опять ставим активатором снаряд... Должен быть ГГ активатором. По этому ставь тут 0
Если не поможет попробуй написать так:
SetActivator(0, AAPTR_PLAYER1);
SetActivatorToTarget(MissileID);
эту строку замени на 0
т.к. получается ахинея
int MissileID = UniqueTID(); //даем тид переменной
Thing_ChangeTID(0, MissileID); //меняем тид активатора скрипта на переменную выше (активатор скрипта снаряд)
SetActivatorToTarget(MissileID); //почему-то опять ставим активатором снаряд... Должен быть ГГ активатором. По этому ставь тут 0
Если не поможет попробуй написать так:
SetActivator(0, AAPTR_PLAYER1);
PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).
Общий урон без учёта других источников яда считается по формуле: tD = value * duration
Общая длительность в тиках без учёта других источников яда считается по формуле: tT = duration * period
Пример4
PoisonDamage 100, 0, 5
Итоговый урон - 0
Итоговая длительность - 0 тиков
Периодичность - раз в 5 тиков
Пример5
PoisonDamage (5-10000)
Итоговый урон - 20-21
Итоговая длительность - 10 секунд
Периодичность - раз в ~7 тиков
Пример6
PoisonDamage 100, 5
Итоговый урон - 500
Итоговая длительность - 5 секунд
Периодичность - раз в 1 секунду
Наличие у актора свойства "PoisonDamage" также автоматически устанавливает "DamageType" как "Poison".
Из 5-ого примера видно что PoisonDamage практически не имеет никакой корреляции со значением "value" ЕСЛИ отсутствует значение "duration" и в этом случае действует только на игрока.
ЭДИТ:
Как вычислить значение PoisonDamage согласно желаемому результату:
Скрытый текст:
Допустим мы хотим задать значения PoisonDamage v,d,p так, чтобы нанеслось 100 итогового урона (tD) за 20 сек (tT) с (p) в 5 тиков.
Вычисляем значения v и d:
{d = tT ((20)*35 tics)/p (5 tics)
{v = tD (100)/d
{d = 700/5 = 140
{v = 100/140 = 0,714285
К сожалению дробные значения не принимаются, поэтому в этом случае придётся изменить периодичность если не хочется жертвовать общими значениями урона и длительности. Тогда возьмём минимально допустимое значение v - единицу:
{tD (100) = v(1)*d
{tT (700 tics) = d*p
{d = 100
{p = 7
Значит по прошествии 20 сек 100 итогового урона будет нанесено по 1 с периодом в 7 тиков при PoisonDamage 1,100,7
Стрейф влево, подвинет влево, вправо - вправо.
Только тут просто как бы ходить будет снаряд.. настрой как тебе надо что бы летал.
Отлично! Спасибо! Ещё один вопрос. Как сделать так, что бы снарядом нельзя было управлять после его смерти? А то моим снарядом можно ещё управлять, пока он взрывается(смерть снаряда - многократный спаун взрывов). И да. Не работает кнопка самоуничтожения...опять
Огромное спасибо, alekv! Появился ещё один вопрос. Как реализовать поворот снаряда? Я попробовал через ThrustThing, но это работает очень странно. Я даже не знаю как пояснить. Сторона поворота кардинально меняется, в зависимости положения игрока на карте.
я не понимаю какой поворот нужен? У тебя же снаряд и так вертится благодаря setactorangle (....); и setactorpitch (....);
зачем тебе еще и thrustthing?
Благодаря setactorangle (....); и setactorpitch (....); я реализовал поворот только камеры, но не самого снаряда. Понимаешь, чего я хочу добиться? Что бы поворачивалась не только камера, но и снаряд вместе с ней.
Можно ли на декоре прописать стэйт "блока" урона? Т. е. как прописать чтобы моб с некоторым шансом игнорил весь входящий урон при попадании в него снаряда или мили-атаки?
Офк, есть ф-ции A_(Un)SetInvulnerable и A_ChangeFlag, но я хз как их прописать чтобы они выполнялись ДО калькуляции получения урона. Или такая проверка осуществима только скриптами?
Void Weaver Не понял задачи. Если надо, чтобы моб тупо с некоторым шансом включал полную неуязвимость, то просто включай Invulnerable-флаги по рандомным джампам. А вот если надо, чтобы моб игнорил входящий урон при неких условиях - тут надо конкретизировать, при каких именно.
А вот если надо, чтобы моб игнорил входящий урон при неких условиях - тут надо конкретизировать, при каких именно.
Зыс ван. Условие тривиальное - при столкновении моба с чьим-то кулаком или маслиной с Х% шансом входит в кастом стэйт и игнорит текущий входящий урон. Со снарядами у меня таки пришла мысля типа прописать какой-нибудь чек акторов в предельно малом радиусе, и при обнаружении в оном миссайлей прыгать в стэйт включающий бога. А вот как быть с мили - хз.
Я знаю что механика эвэйда реализована в моде Aetherius, но там, емнип, это запилено на скрипте.
З. Ы.
Сссука, уже в который раз мне пердак рвёт от того что обе CheckProximity только по акторклассу пашут.
Зыс ван. Условие тривиальное - при столкновении моба с чьим-то кулаком или маслиной с Х% шансом входит в кастом стэйт и игнорит текущий входящий урон. Со снарядами у меня таки пришла мысля типа прописать какой-нибудь чек акторов в радиусе, и при обнаружении в оном миссайлей прыгать в стэйт включающий бога. А вот как быть с мили - хз.
Т.е. задача в визуализации блока.
Очевидно, что в узерваре должно сохраняться текущее здоровье монстра. При попадании в Pain/Death с некими шансами срабатывает скрипт, который возвращает ему здоровье взад и ведёт на стейт с анимацией блока.
PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).
Все это здорово, но под такой яд нельзя соорудить противоядие (используемый айтем вроде бутылки здоровья, только снимает эффект яда). Также не совсем понятно, можно ли настроить в этом случае "зеленую ауру" на экран при отравлении.
Очевидно, что в узерваре должно сохраняться текущее здоровье монстра. При попадании в Pain/Death с некими шансами срабатывает скрипт, который возвращает ему здоровье взад и ведёт на стейт с анимацией блока.
Ну как вариант, правда не понятно когда(где) эта конструкция должна проверяться\выполняться, ибо тогда придётся прописывать этот чек в каждый кадр моба - а это писец какой гигантский код выйдет. Или я заблуждаюсь?
Shadowman:
Void Weaver:
PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).
Все это здорово, но под такой яд нельзя соорудить противоядие (используемый айтем вроде бутылки здоровья, только снимает эффект яда). Также не совсем понятно, можно ли настроить в этом случае "зеленую ауру" на экран при отравлении.
У меня тоже нет мыслей как прервать действие PoisonDamage яда. Возможно яд на А_Дэмэдж ф-циях прервать куда реальнее. Через какой-нибудь хитрый ДжампИфИнвентори с вызовом скрипта-прерывателя.
К сожалению, по неизвестным причинам "зелёный экран" в этом случае действительно не пашет. Но, еяпп, то его можно задать через самого игрока свойством Player.DamageScreenColor.
Ну как вариант, правда не понятно когда(где) эта конструкция должна проверяться\выполняться, ибо тогда придётся прописывать этот чек в каждый кадр моба - а это писец какой гигантский код выйдет. Или я заблуждаюсь?
PainChance надо прописать 256.
Есть узервар user_currenthealth. По умолчанию он должен быть равен максимальному здоровью моба. Он должен тупо должен время от времени сверяться с текущим уровнем здоровья: A_SetUserVar("user_currenthealth",health). Насколько часто это делать - вопрос философский. Я считаю, что достаточно одной сверки на выходе из стейта Pain, но для надежности можно делать это при каждом проходе стейта See.
Любой факт нанесения урона переключает моба либо в Pain, либо в Death. В случае срабатывания скрипта он мгновенно будет переведён на стейт блокировки с возвратом того количества здоровья, которое было у него при предыдущей проверке. Здесь даже ACS не нужен - просто A_SetHealth(user_currenthealth) и всё. Получится, что урона по монстру как будто бы и не было, хотя на самом деле был.