library NegateDamageLib globals private constant group Group = CreateGroup() private constant timer Timer = CreateTimer() public keyword MaxLifeBonusAbility public keyword MaxLifeBonus 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 local boolean add_ability = life2set > GetUnitState(u, UNIT_STATE_MAX_LIFE) if add_ability then call GroupAddUnit(Group, u) call UnitAddAbility(u, MaxLifeBonusAbility) endif call SetWidgetLife(u, life2set) if add_ability then call TimerStart(Timer, 0., false, function ProcessUnits) endif endfunction endlibrary