library hcdSystem
globals
real udg_HCD_HEALTH_REGEN_MAX = 1
boolexpr udg_HCD_HealthChanged
real array udg_HCD_OldHealth
unit array udg_HCD_Units
timer array udg_HCD_Timers
trigger array udg_HCD_Triggers
endglobals
function ChechDeadOrRemoved takes nothing returns nothing
local integer id = GetTimerData(GetExpiredTimer())
if IsUnitType(udg_HCD_Units[id], UNIT_TYPE_DEAD) or GetUnitTypeId(udg_HCD_Units[id]) == 0 then
call ReleaseTimer(udg_HCD_Timers[id])
call DestroyTrigger(udg_HCD_Triggers[unitId])
set udg_HCD_Units[id] = null
set udg_HCD_Timers[id] = null
set udg_HCD_Triggers[unitId] = null
endif
endfunction
function AddUnitHealthChangeDetection takes unit whichUnit, real checkDuration returns nothing
local real health = GetWidgetLife(whichUnit)
local integer unitId = GetUnitUserData(whichUnit)
set udg_HCD_Triggers[unitId] = CreateTrigger()
call TriggerRegisterUnitStateEvent(udg_HCD_Triggers[unitId], whichUnit, UNIT_STATE_LIFE, GREATER_THAN, health +0.0625)
call TriggerRegisterUnitStateEvent(udg_HCD_Triggers[unitId], whichUnit, UNIT_STATE_LIFE, LESS_THAN, health -0.0625)
call TriggerAddCondition(udg_HCD_Triggers[unitId], udg_HCD_HealthChanged)
set udg_HCD_Units[unitId] = whichUnit
set udg_HCD_OldHealth[unitId] = health
if checkDuration > 0. then
if udg_HCD_Timers[unitId] == null then
set udg_HCD_Timers[unitId] = NewTimerEx(unitId)
endif
call TimerStart(udg_HCD_Timers[unitId], checkDuration, tue, function ChechDeadOrRemoved)
endif
endfunction
function HealthChanged takes nothing returns boolean
local unit u = GetTriggerUnit()
local real health = GetWidgetLife(u)
local real oldHealth = udg_HCD_OldHealth[GetUnitUserData(u)]
local real difference = health - oldHealth
call DestroyTrigger(GetTriggeringTrigger())
call AddUnitHealthChangeDetection(u, 0)
if difference < udg_HCD_HEALTH_REGEN_MAX and difference > -udg_HCD_HEALTH_REGEN_MAX then
set u = null
return false
endif
if difference < 0 then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetUnitName(u) + " is damaged for " + R2S(oldHealth-health) + " damage.")
else
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetUnitName(u) + " is health for " + R2S(health-oldHealth) + " health.")
endif
set u = null
return false
endfunction
endlibrary
function HealthChangeUnitRegion takes nothing returns boolean
call AddUnitHealthChangeDetection(GetFilterUnit(), 60)
return false
endfunction
function Init_HealthChangeDetection takes nothing returns nothing
local unit FoG
local group g
local region r = CreateRegion()
local rect r2 = GetWorldBounds()
call RegionAddRect(r, r2)
call TriggerRegisterEnterRegion(CreateTrigger(), r, Filter(function HealthChangeUnitRegion))
call RemoveRect(r2)
set g = CreateGroup()
call GroupEnumUnitsInRect(g, GetWorldBounds(), null)
loop
set FoG = FirstOfGroup(g)
exitwhen FoG == null
call GroupRemoveUnit(g, FoG)
call AddUnitHealthChangeDetection(FoG, 60)
endloop
set g = null
call DestroyTimer(GetExpiredTimer())
endfunction
//===========================================================================
function InitTrig_Health_Change_Detection takes nothing returns nothing
call TimerStart(CreateTimer(), 0, false, function Init_HealthChangeDetection)
set udg_HCD_HealthChanged = Filter(function HealthChanged)
endfunction