Скрипт делает что-то вроде щитов протосов в старкрафте: юниты с маной при получении урона сначала теряют ману, а не здоровье. Но беда в том, что событие перестает срабатывать (проверял print'ами) примерно после того, как у первого юнита иссекает мана.
do
-- модель щита при полном поглощении урона
local MODEL_BLOCK_DAMAGE_FULL = "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl"
-- модель щита при частичном поглощении урона
local MODEL_BLOCK_DAMAGE_HALF = "Abilities\\Spells\\Human\\Defend\\DefendCaster.mdl"
local function GetDamageAfterSheild(whichUnit, damage)
local mp = GetUnitState(whichUnit, UNIT_STATE_MANA)
if mp >= damage then
SetUnitState(whichUnit, UNIT_STATE_MANA, mp - damage)
DestroyEffect(AddSpecialEffect(MODEL_BLOCK_DAMAGE_FULL, GetUnitX(whichUnit), GetUnitY(whichUnit)))
return 0
elseif mp < dmg then
SetUnitState(whichUnit, UNIT_STATE_MANA, 0)
DestroyEffect(AddSpecialEffect(MODEL_BLOCK_DAMAGE_HALF, GetUnitX(whichUnit), GetUnitY(whichUnit)))
return damage - mp
end
end
local trg = CreateTrigger()
for i=1,bj_MAX_PLAYERS,1 do
TriggerRegisterPlayerUnitEvent(trg, Player(i-1), EVENT_PLAYER_UNIT_DAMAGING, null)
end
TriggerRegisterPlayerUnitEvent(trg, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DAMAGING, null)
TriggerAddAction(trg, function()
local target = GetTriggerUnit()
local damager = GetEventDamageSource()
local dmg = GetEventDamage()
if dmg > 0 and BlzGetUnitMaxMana(target) > 0 then
local realDmg = GetDamageAfterSheild(target, dmg)
BlzSetEventDamage(realDmg)
end
target = nil
damager = nil
end)
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Hate
Отредактирован Берги
Bergi_Bear:
Но некоторые ругаются на этот способ, типо он кривой и костыльный, однако я других пока что не знаю
Вот
local f = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
f() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger()
end
тут твой триггер
end