Есть функция или велосипед для того чтобы найти от чего исходит урон (с руки, от абилки) не в зависимости от типа урона?
Есть такая вещь как фильтры, как ты и сказал.
Фильтр урона вызывается до того как урон нанесется, и возврат
true нанесет таблицу урона что была изменена/не была изменена.
В этом фильтре урона есть очень полезная константа -
entindex_inflictor_const, которая будет индексом(entityindex, а не номером в инвентаре) абилки/предмета который нанес урон.
Фильтр устанавливается вот так, и фильтр ставится
один на весь гейммод.
В
InitGameMode()
Код:
GameRules:GetGameModeEntity():SetDamageFilter(Dynamic_Wrap(my_game_mode, "DamageFilter"), self)
И естественно ставится обработчик фильтра:
Код:
function my_game_mode:DamageFilter( event )
local damage = event.damage
local entindex_inflictor_const = event.entindex_inflictor_const
local entindex_victim_const = event.entindex_victim_const
local entindex_attacker_const = event.entindex_attacker_const
local damagetype_const = event.damagetype_const
local ability
local victim
local attacker
if (entindex_inflictor_const) then ability = EntIndexToHScript(entindex_inflictor_const) end
if (entindex_victim_const) then victim = EntIndexToHScript(entindex_victim_const) end
if (entindex_attacker_const) then attacker = EntIndexToHScript(entindex_attacker_const) end
return true;
end
Итого ты будешь иметь абилку(если она есть, если ее нет то
ability будет
nil), того кто нанес урон(
attacker), того кто получил урон(
victim), а так же приятные штуки как само количество урона и его тип. А да, если мы сделаем в фильтре так:
Код:
event.damage = event.damage / 2;
return true;
То фильтр уменьшит урон вдвое, а если сделаем так
То фильтр вовсе не нанесет никакого урона.
Вот еще картиночка от наших друзей с моддоты иллюстрирующая работу фильтров(а фильтр урона не единственный).
Ссылка на гайд на моддоте
А вообще давно надо уже запилить к нам сюда гайдик по фильтрам, но мне естественно лень этим заниматься.