Как поставить в условие триггера защиту от магии?
Есть много разных защит от магии, есть способность дриад, например, которая даёт магический иммунитет, есть аналогичная способность у предмета, есть амулет, который раз в 40 секунд блокирует негативное заклинание, есть заговор банши, есть неполная защита, которая уменьшает урон от заклинаний и блокирует некоторые заклинания, есть полная неуязвимость. Мне надо выбрать отряд, где нужно отсеять неуязвимых к магии юнитов, как это сделать?
Вроде как-то видел подобный вопрос, но поиск окончился безуспешно.

Лучший ответ:
Проверяешь здоровье
наносишь единицу маг.урона
сравниваешь здоровье
отсеиваешь у кого не изменилось
востанавливаешь потраченое хп



Просмотров: 234

» Лучшие комментарии


Borodach #1 - 1 неделю назад 0

Проверяешь здоровье
наносишь единицу маг.урона
сравниваешь здоровье
отсеиваешь у кого не изменилось
востанавливаешь потраченое хп
8gabriel8 #2 - 1 неделю назад 0
Borodach, страшно звучит) Это придётся для каждого выбранного юнита дамми создавать, который урон наносить будет?
Borodach #3 - 1 неделю назад 0
Не нежен дамми, тригером, normal_damage
8gabriel8 #4 - 1 неделю назад 0
Borodach, но в триггерах два типа нанесения урона: урон по области и урон по цели. Наносятся они от какого-то юнита, мне по области кастером что ли надо урон наносить?
Steal nerves #5 - 1 неделю назад (отредактировано ) 2
Я бы посоветовал бы. Но ничего не помню. Попробуй скачать старую наработку и посмотреть
Можно было бы все триггерно сделать, такой вариант мне больше нравится
8gabriel8 #6 - 1 неделю назад 0
Steal nerves:
...Можно было бы все триггерно сделать...
Да это было бы чудесно, конечно, но нежелательно, так как, если одобрят, потребуется для кампании, где очень много разных юнитов с нетриггерными способностями. Для всех писать системы триггеров, во-первых, слишком долго, во-вторых, того не стоит.
P. S. Steal nerves, а у тебя ведь примеры в вопросах про типы урона, мне там чего вообще смотреть будет надо?
Steal nerves #7 - 1 неделю назад (отредактировано ) 0
А попробуй базу данных вести. Вводи всех, кто обладает этими абилками. Юнит получил способность, или предмет, вводим такую то такую. Хотя все это неудобно будет
8gabriel8, я карту скинул. Там все блоки и резисторы. Ну для подробного, а решай сам.
думаю, что способ бородача верный.
8gabriel8 #8 - 1 неделю назад (отредактировано ) 0
Действительно надо экспериментировать с вариантом бородача.
Borodach #9 - 1 неделю назад 0
Не по области, а от любого юнита в переменной наносить целевой урон. Урон заклинаниями идет как "обычная" атака.
Можешь изначально, для этого действия, в начале создать юнита с "москитами" и занести в переменную.
И от лица этого юнита наносить посторонний(проверочный) урон
nvc123 #11 - 1 неделю назад 2
Borodach, не единицу а две
с единицей у вар3 баг
сталкивался с ним когда писал систему определения брони юнита
pro100master #12 - 1 неделю назад 0
единица будет возврашать 0 так как там возврашает реального число то есть 0.5
Clamp #13 - 1 неделю назад 2
nvc123, там, afaik, не баг, а приведение типов: float приводится к int через отбрасывание дробной части.
А ещё такой проверкой можно убить лоу-хп юнита, который не должен бы умереть.
nvc123 #14 - 1 неделю назад 0
Clamp, это баг
т.к. у всего что больше 1 отбрасывание не происходит
хотя если хочешь то можешь называть это фичей)
Clamp #15 - 1 неделю назад (отредактировано ) 0
nvc123, поведение базовых типов диктуется не варкрафтом, а стандартом Си, на котором он написан, зачем ты меня троллируешь, зелёный?!
Тебе что, корма в QA не хватает?!
ClotPh #16 - 1 неделю назад 0
Тупой вариант, но понятный любому идиоту и легчайший в импорте, багов минимум
Так можно легко считать магрезист (если он 100% - юнит либо маг иммунный, либо в принципе неуязвимый)
Где-то мне предлагали улучшенный, но усложненный, если надо, сам ищи. А этот - личного изготовления.
function GetUnitMagicResist takes unit u5 returns real
local real magicresist = 100
local real life = GetUnitStateSwap(UNIT_STATE_LIFE, u5)
local real maxlife = GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u5)
if (IsUnitAliveBJ(u5) == true) and ( GetUnitStateSwap(UNIT_STATE_LIFE, u5)) != 0 and (u5 != null) then
call SetUnitLifeBJ( u5, maxlife )
call UnitDamageTargetBJ (u5, u5, 100, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
set magicresist = magicresist - (maxlife - GetUnitStateSwap(UNIT_STATE_LIFE, u5))
call SetUnitLifeBJ( u5, life )
else
set magicresist = 0
endif
set u5 = null
return magicresist
endfunction
avuremybe #17 - 1 неделю назад 0
ClotPh, а почему оно все на бж? :С
ClotPh #18 - 1 неделю назад 0
avuremybe, я же говорю, простой вариант
avuremybe #19 - 1 неделю назад (отредактировано ) 0
ClotPh, я не о сложности. Я об этом:
function GetUnitMagicResist takes unit u returns real
    local real magicresist = 100
    local real life = GetUnitState(u, UNIT_STATE_LIFE)
    local real maxlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
    if (life > 0.405) and ( IsUnitType(u, UNIT_TYPE_DEAD) == false) and (u != null) then
        call SetUnitState( u, UNIT_STATE_LIFE, maxlife )
        call UnitDamageTarget(u, u, 100, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
        set magicresist = magicresist - (maxlife - GetUnitState(u, UNIT_STATE_LIFE))
        call SetUnitState( u, UNIT_STATE_LIFE, life )
    else
        set magicresist = 0
    endif
    set u = null
    return magicresist
endfunction
8gabriel8 #20 - 1 неделю назад 0
Джентльмены, вы предлагаете чудесные вещи, только как этим пользоваться для меня загадка. Примерно понять, что и как делает этот Jass-триггер могу, но не знаю, как мне его использовать среди ГУИшных триггеров.
ClotPh #21 - 1 неделю назад 0
8gabriel8, надо переместить эту функцию в нестандартный код карты, просто скопировать и всё.
Потом можно будет считывать GetUnitMagicResist(переменная твоего юнита), в гуи, по-моему, через кастом код можно. Лучше возьми вариант ниже, он лучше, хотя суть одинаковая.
То есть один раз поместишь в кастом код - и можно считать магрезист в процентах у любой цели.
Если он >= 100 (хотя > 100 по идее невозможно), значит, цель маг иммунная или неуязвимая.
Только недостатки:
  • Если макс. хп цели не больше 100 и магрезиста нет, она при попытке сосчитать ее магрезист сразу умрёт (ну я обычно только у героев магрезист считаю, хотя вот скоро планирую у юнитов... подумаю... ну это вкрай фиксится добавкой дефолтной предметной способности на макс. хп в начале и убиранием её в конце, только тогда maxlife нужно уже после ее добавки посчитать);
  • Цель дамажит сама себя, что может вызвать побочные эффекты, втч срабатывания каких-то еще триггеров.
А в остальном все очень удобно.
avuremybe #22 - 1 неделю назад (отредактировано ) 2
ClotPh, а зачем тебе именно 100? ХП изменяется до тысячных. Не обязательно измерять это в таких масшатабах.
Срабатывание других триггеров тоже фиксится изи.
ClotPh #23 - 1 неделю назад 0
avuremybe, да спс, кэп, но это все усложняет формулировки и заставляет трещать мозги
avuremybe #24 - 1 неделю назад (отредактировано ) 0
8gabriel8, ф-ция считает магическое сопротивление у юнита в процентах.
Возвращает тебе реальное число.
Используется примерно в следующем виде:
 local real r = GetUnitMagicResist(u)
Или можешь в условие вставить, как описал выше ClotPh.

ClotPh, что усложняет? Если ты хочешь получать именно кол-во процентов на выходе, никто не мешает тебе умножить результат до нужного масшатаба.
Вот только зачем?
Рассмотрим пример заклинания которое должно наносить 400 единиц урона с учетом маг.резиста.
В ситуации, когда тебе ф-ция возвращает 25% маг резиста в виде 0.250 ты можешь вставлять ее прямо в код:
call UnitDamageTarget(u, t, 400*GetUnitMagicResist(t), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
А в ситуации, когда 25% маг.резиста тебе возвращается в виде 25.000 тебе придется использовать дополнительный множитель:
call UnitDamageTarget(u, t, 400*GetUnitMagicResist(t)*0.01, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
ClotPh #25 - 1 неделю назад 0
avuremybe, вот это все и усложняет то, что ты написал
я это прекрасно понимаю
но это раскуривается уже сложнее в целом
а в моем и улучшенном твоем базовом примере число - сразу % магрезиста, без всяких дополнительных множителей
это понятно даже клиническому идиоту
тем по-своему и шедевр
8gabriel8 #26 - 1 неделю назад (отредактировано ) 0
ClotPh:
8gabriel8, надо переместить эту функцию в нестандартный код карты, просто скопировать и всё.
Потом можно будет считывать GetUnitMagicResist(переменная твоего юнита), в гуи, по-моему, через кастом код можно. Лучше возьми вариант ниже, он лучше, хотя суть одинаковая.
То есть один раз поместишь в кастом код - и можно считать магрезист в процентах у любой цели.
Если он >= 100 (хотя > 100 по идее невозможно), значит, цель маг иммунная или неуязвимая.
Только недостатки:
  • Если макс. хп цели не больше 100 и магрезиста нет, она при попытке сосчитать ее магрезист сразу умрёт (ну я обычно только у героев магрезист считаю, хотя вот скоро планирую у юнитов... подумаю... ну это вкрай фиксится добавкой дефолтной предметной способности на макс. хп в начале и убиранием её в конце, только тогда maxlife нужно уже после ее добавки посчитать);
  • Цель дамажит сама себя, что может вызвать побочные эффекты, втч срабатывания каких-то еще триггеров.
А в остальном все очень удобно.
Так а в условие на ГУИ мне что ставить, просто magicresist < 100? И надо ли создать переменные magicresist, life, maxlife, u?
ClotPh #27 - 1 неделю назад 0
8gabriel8, переменные никакие точно не надо, как на гуи задействовать кастомную функцию через кастом скрипт, пусть кто другой распишет, я так не делаю, но, как понимаю - можно
А, не, стоп, вроде понимаю, вот хотя бы так:
Custom script: local real r = GetUnitMagicResist(GetTriggerUnit())
Должно работать.
8gabriel8 #28 - 1 неделю назад 0
ClotPh, теперь стало посложнее) Поконкретнее спрошу:
  • есть точка, куда направлена способность;
  • есть выбор юнитов в радиусе 512 от этой точки;
  • выбранным юнитам поставлено matching condition, что они не неуязвимы к магии.
Я же не укажу в условии custom script, то есть сначала проверить выбранных юнитов этой функцией, у кого magicresist < 100 добавить в отряд, с которым и делать дальнейшие действия? Если да, то так делать:
Custom script: local real r = GetUnitMagicResist(Get!!Picked!!Unit())
if r<100 then add Picked unit to Squad else Do noting
?
ClotPh #29 - 1 неделю назад 0
8gabriel8,
попробуй так
Custom script: set udg_real = GetUnitMagicResist(GetTriggerUnit())
и дальше уже с глобалкой работай
UPD: сорри, немного невнимательно
в общем, вытащить значение можешь в глобалку через кастом скрипт, а глобалку юзать в любой уже гуишной функции
как в твоем случае сделать удобнее отлов нужных юнитов, додумывай сам, у меня ща уже нет времени
UPD v2: а попробуй сначала написать триг без этого условия, а потом конвертнуть в джасс и дописать, мб получится, хотя мне уже сложно вспомнить, как там че будет выглядеть.
UPD v3: ты для начала пихни в кастом скрипт и проверь, правильно ли оно у тебя вообще работает и все ли ты так понял, в ситуации попроще, а потом экспериментируй дальше
avuremybe #30 - 1 неделю назад (отредактировано ) 0
ClotPh, без множителей оно в том варианте, что я предлагаю, а не в том, что ты выложил. И выдает оно те же проценты, только их напрямую юзать можно. Я тебе все расписал выше, перечитай.
А что тебе сложнее раскуривается? Десятеричные дроби?
8gabriel8, в той функции, которая возвращает boolexpr в твой MatchingCondition пиши
return (GetUnitMagicResist(GetFilterUnit()) == 100)
8gabriel8 #31 - 1 неделю назад 0
Джентельмены, очень извиняюсь, рассчитываю, что ваши рекомендации пригодятся мне в будущем, но в данном случае как-то умудрился пропустить, что в условиях boolean comparsion в самом низу начального предложения стоит Неуязвимость к магии. Мне конкретно в данном случае этого достаточно. Ещё раз прошу прощения за потраченное вами время)