Фильтр урона, поиск от чего идет урон

  • Автор темы Автор темы Danis
  • Дата начала Дата начала

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Есть функция или велосипед для того чтобы найти от чего исходит урон (с руки, от абилки) не в зависимости от типа урона?
 
Есть функция или велосипед для того чтобы найти от чего исходит урон (с руки, от абилки) не в зависимости от типа урона?
Есть такая вещь как фильтры, как ты и сказал.
Фильтр урона вызывается до того как урон нанесется, и возврат 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;
То фильтр уменьшит урон вдвое, а если сделаем так
Код:
return false;
То фильтр вовсе не нанесет никакого урона.

Вот еще картиночка от наших друзей с моддоты иллюстрирующая работу фильтров(а фильтр урона не единственный).
Op4u0Oa.png

Ссылка на гайд на моддоте

А вообще давно надо уже запилить к нам сюда гайдик по фильтрам, но мне естественно лень этим заниматься.
 
Последнее редактирование модератором:
Тебе в последствии нужно этот урон модифицировать как-то? Или просто выполнять различные действия, если урон например от автоатаки?
 
Тебе в последствии нужно этот урон модифицировать как-то? Или просто выполнять различные действия, если урон например от автоатаки?
Ну типа да, сейчас параллельно с фиксами скиллов линзу делаю на велосипедах.
 
Последнее редактирование модератором:
Тебе в последствии нужно этот урон модифицировать как-то? Или просто выполнять различные действия, если урон например от автоатаки?

А как выполнять различные действия, если урон например от автоатаки? Через фильтр громоздко получается. (Только мне нужно обнаруживать урон именно с абилки)
 
Последнее редактирование модератором:
А как выполнять различные действия, если урон например от автоатаки? Через фильтр громоздко получается. (Только мне нужно обнаруживать урон именно с абилки)
От автоатаки или в абилки?
 
Последнее редактирование модератором:
мамин программист, модификатор он атаклендед
 
мамин программист, MODIFIER_EVENT_ON_TAKEDAMAGE 135 OnTakeDamage Event that fires when taking damage.
 
И да, в таблице с данными про ивент есть ключ inflictor, который показывает какая абилка нанесла урон
 
Кстати, про inflictor: можно ли как-то влезть в данную таблицу, чтобы самостоятельно занести туда этот самый inflictor? Например из кода своей абилки?

Я это к чему: самодельный октарин работает с фильтром урона и исходя из него дает отхил герою по абилкам. Но если абилка самодельная, то inflictor`а у неё нет. Быть может его надо как-то задавать в самой абилке? А то на данный момент у меня захил не в фильтре урона происходит, а в коде самих абилок и это не есть хорошо.
 
Когда урон наносишь можно указать абилку
 
Проверил, действительно помогло, спасибо. Видимо я в прошлые разы как-то криво это делал, что не работало.
 
Реклама: