library NegateDamageLib globals private constant group Group = CreateGroup() private constant timer Timer = CreateTimer() // MUST BE SPECIFIED public constant integer MaxLifeBonusAbility = 'A000' public constant integer MaxLifeBonus = 1000000 endglobals native UnitAlive takes unit id returns boolean function GetUnitMaxLife takes unit u returns real return GetUnitState(u, UNIT_STATE_MAX_LIFE) - GetUnitAbilityLevel(u, MaxLifeBonusAbility) * MaxLifeBonus endfunction private function ProcessUnits takes nothing returns nothing local unit u local real life2set loop set u = FirstOfGroup(Group) exitwhen u == null call GroupRemoveUnit(Group, u) if UnitAlive(u) then set life2set = GetWidgetLife(u) call UnitRemoveAbility(u, MaxLifeBonusAbility) call SetWidgetLife(u, life2set) else call UnitRemoveAbility(u, MaxLifeBonusAbility) endif endloop endfunction function NegateDamage takes unit u, real negated returns nothing local real life2set = GetWidgetLife(u) + negated if life2set > GetUnitState(u, UNIT_STATE_MAX_LIFE) then call GroupAddUnit(Group, u) call UnitAddAbility(u, MaxLifeBonusAbility) endif call SetWidgetLife(u, life2set) call TimerStart(Timer, 0., false, function ProcessUnits) endfunction endlibrary