Решил выложить используемую мной систему для отлова всякого-разного урона без лишних усилий. Конечно, это изобретение велосипеда, но возможно кому-то подойдет, тем более альтернативы на сайте я не увидел. И даже не поленился перевести её в vJass...
Code
library EMDSystem initializer InitSystem
#include "cj_types.j"
define UnitDamageTarget = UserUnitDamageTarget
constant int SPELL_MARK = 'A003' //РАВ-код способности "Метка (Damage System)" constant int SPELL_BUFF = 'B000' //РАВ-код эффекта для "Метка (Damage System)"
private unit bj_lastSourceDamage private unit bj_lastTargetDamage private real bj_lastCountsDamage endglobals
function GetDSCounts takes nothing returns real return bj_lastCountsDamage endfunction
function GetDSSource takes nothing returns unit return bj_lastSourceDamage endfunction
function GetDSTarget takes nothing returns unit return bj_lastTargetDamage endfunction
private function FilterEvent takes nothing returns boolean local integer i = 0 if not (GetEventDamage() > 0.0) then return false endif set bj_lastCountsDamage = GetEventDamage() set bj_lastSourceDamage = GetEventDamageSource() set bj_lastTargetDamage = GetTriggerUnit() if (GetUnitAbilityLevel(bj_lastTargetDamage, SPELL_BUFF) != 0) then call UnitRemoveAbility(bj_lastTargetDamage, SPELL_BUFF) set bj_lastDamageType = DAMAGE_TYPE_NORMAL if (IsUnitType(bj_lastSourceDamage, UNIT_TYPE_HERO) == true) then set bj_lastAttackType = ATTACK_TYPE_HERO else set bj_lastAttackType = ATTACK_TYPE_MELEE endif else set bj_lastDamageType = DAMAGE_TYPE_MAGIC set bj_lastAttackType = ATTACK_TYPE_MAGIC endif loop exitwhen (user[i] == null) if TriggerEvaluate(user[i]) then call TriggerExecute(user[i]) endif set i = i + 1 endloop set bj_lastDamageType = null set bj_lastAttackType = null return false endfunction
private function CreateNewMember takes nothing returns boolean local unit targ = GetFilterUnit() if (GetWidgetLife(targ) > 0.0 and GetUnitAbilityLevel(targ, SPELL_MARK) == 0) then call TriggerRegisterUnitEvent(execute, targ, EVENT_UNIT_DAMAGED) call UnitAddAbility(targ, SPELL_MARK) endif set targ = null return false endfunction
function GetEventDamageType takes nothing returns damagetype return bj_lastDamageType endfunction
function GetEventAttackType takes nothing returns attacktype return bj_lastAttackType endfunction
function UserUnitDamageTarget takes unit c, unit t, real d, boolean a_b, boolean r_b, attacktype a_t, damagetype d_t, weapontype w_t returns boolean set bj_lastAttackType = a_t set bj_lastDamageType = d_t return UnitDamageTarget(c, t, d, a_b, r_b, a_t, d_t, w_t) endfunction
function TriggerRegisterAllUnitDamaged takes trigger t returns nothing local integer i = 0 loop exitwhen (user[i] == null) set i = i + 1 endloop set user[i] = t endfunction
private function TimerLoop takes nothing returns nothing local group timed = CreateGroup() call GroupEnumUnitsInRect(timed, bj_mapInitialPlayableArea, filter) call DestroyGroup(timed) set timed = null endfunction
private function InitSystem takes nothing returns nothing set filter = Condition(function CreateNewMember) call TriggerAddCondition(execute, Condition(function FilterEvent)) call TimerStart(CreateTimer(), 0.1, true, function TimerLoop) endfunction
endlibrary
Просто скопируйте к себе в карту триггер (при этом нужно иметь JNGP и, возможно, AdicParser), способность "Метка" и её эффект... Затем можете использовать новые функции:
1) TriggerRegisterAllUnitDamaged(<Триггер>) - новое событие, срабатывает при получении любым воинов урона. 2) GetDSSource, GetDSTarget и GetDSCounts - работают аналогично GetEventDamageSource, GetTriggerUnit и GetEventDamage соответственно. 3) GetEventAttackType и GetEventDamageType - возвращают, как ни странно, тип атаки и урона. 4) UserUnitDamageTarget - только для vJass версии, принимает те же параметры, что и UnitDamageTarget...
Про стан не знал... значит в любом случае придется "триггерить". У меня еще одна мысль с "Аурой возмездия", которая при уроне возвращает 1ед. урона. Это такой же бред?
Маска смерти будет прокать при этом ХД.И только она, больше никакие модификаторы атаки напрямую.
Ну я думаю орбы нужны и так, только чтоб их не приходилось самому создавать, а еще и прикреплять к предметам которых может быть дофига. Стан все воображение про хорошо работающую систему испортил
Есть несколько вопросов: Допустим я хочу сделать вампирик с помощью этой системки, но не постоянный а с шансом К примеру есть скилл крит, который при событии получения урона любым юнитом проверяет наличие абилы крита и шанс, и наносит геройский урон, но он не отлавливается системой, и тем более отловится просто атака, и если шанс вампирика совпал с шансом крита как это все запилить
смотри, на пример есть крит, который наносит 2 х сила, дамаг с руки к примеру 100, силы тоже 100, крит будет 300, но когда ты будешь триггерно наносить крит будет два урона : 100 с руки и 200 крит, это два события, а шасовый вампирик работает на одно. Нужно допилить систему, чтобы можно было делать криты одним событием получения урона, исключая событие урона с руки, дабы тот же вампирик или триггерный уворот работали корректно
Добавлено (06 Ноября 2012, 14:40:59) --------------------------------------------- может кто нибудь написать функцию получения любым воином урона из этой системы, только на джасс 2?
Долго думал как бы придраться и придумал - тип атаки "Герой" не отлавливается при атаке копиями. Это объяснимо впрочем, ведь иллюзии не могут вешать corruption, как и все остальные орбы, кроме морозной атаки...
ведь IsUnitType(u, UNIT_TYPE_HERO) на иллюзиях возвращает false.
речь об отлове типа атаки, а не об отлове иллюзий. Поясню: например я хочу чтобы под действием заклинания любой осадный урон, наносимый жертве усиливался на ххх. Ели создать копию нашего юнита с осадным типом атаки, урон от него, точнее тип урона отловлен не будет.
Добавлено (19 Февраля 2013, 22:03:02) ---------------------------------------------
Цитата (Bru)
Иллюзия - не герой
тип атаки у неё - тип атаки оригинала, на заметку. И кстати если в триггере отлова вызванных существ создавать ещё одно такое существо, то при срабатывании триггера на вызов иллюзии создастся нормальный герой, а не копия.
под действием заклинания любой осадный урон, наносимый жертве усиливался на ххх
Цитата (Naturekid)
Ели создать копию нашего юнита с осадным типом атаки, урон от него, точнее тип урона отловлен не будет
и ещё раз,
Цитата (Naturekid)
речь об отлове типа атаки, а не об отлове иллюзий
Добавлено (20 Февраля 2013, 01:07:19) --------------------------------------------- Короче наглядный пример: Цементирующее зелье. При броске во врага бафает его на х секунд, увеличивая любой осадный урон этому юниту на 48%. - На катапульту/волчьего всадника использовали жезл иллюзий, создали копию юнита с осадным типом атаки. Копия наносит определённый % урона от оригинала, но тип этого урона система не отлавливает => бонусного урона от осадного оружия иллюзий не будет.