library ExpirationFoodFix initializer Init
globals
private hashtable Dummy_Hash = InitHashtable()
private trigger Death_Trigger = CreateTrigger()
private integer array Dummy_Food_Array
private integer array Timed_Buff_Array
private integer Dummy_Count = 0
endglobals
private function KillDummyUnit takes nothing returns nothing
// I think this happens so rarely that it's better to
// avoid garbage collection and not use local variables.
if LoadUnitHandle(Dummy_Hash, GetHandleId(GetTriggerUnit()), 0) != null then
call RemoveUnit( LoadUnitHandle(Dummy_Hash, GetHandleId(GetTriggerUnit()), 0) )
call FlushChildHashtable( Dummy_Hash, GetHandleId(GetTriggerUnit()) )
set Dummy_Count = Dummy_Count - 1
if Dummy_Count == 0 then
call DisableTrigger(Death_Trigger)
endif
endif
endfunction
private function GetFoodCost takes integer foodCost returns integer
if foodCost > 0 and foodCost < 8 then
return Dummy_Food_Array[foodCost]
endif
return Dummy_Food_Array[1] // DEFAULT TO 1 FOOD COST
endfunction
private function GetBuffType takes integer buffIndex returns integer
if buffIndex > 0 and buffIndex < 8 then
return Timed_Buff_Array[buffIndex]
endif
return Timed_Buff_Array[4] // DEFAULT TO GENERIC
endfunction
function EFF_Add_Timed_Life takes unit u, integer buffIndex, real duration, integer foodCost returns nothing
local unit dummy
// If you leave food set to 0 it will assume
// that you want to use the provided unit's food cost
if foodCost == 0 then
set foodCost = GetUnitFoodUsed(u)
endif
call UnitApplyTimedLife(u, GetBuffType(buffIndex), duration)
set dummy = CreateUnit(GetOwningPlayer(u), GetFoodCost(foodCost), 0, 0, 0)
// Link the dummy unit to the timed life unit
call SaveUnitHandle(Dummy_Hash, GetHandleId(u), 0, dummy)
set Dummy_Count = Dummy_Count + 1
if Dummy_Count == 1 then
call EnableTrigger(Death_Trigger)
endif
set dummy = null
endfunction
private function Init takes nothing returns nothing
set Dummy_Food_Array[1] = 'ufd1'
set Dummy_Food_Array[2] = 'ufd2'
set Dummy_Food_Array[3] = 'ufd3'
set Dummy_Food_Array[4] = 'ufd4'
set Dummy_Food_Array[5] = 'ufd5'
set Dummy_Food_Array[6] = 'ufd6'
set Dummy_Food_Array[7] = 'ufd7'
set Timed_Buff_Array[1] = 'BUan'
set Timed_Buff_Array[2] = 'Bapl'
set Timed_Buff_Array[3] = 'BEfn'
set Timed_Buff_Array[4] = 'BTLF'
set Timed_Buff_Array[5] = 'Bhwd'
set Timed_Buff_Array[6] = 'Brai'
set Timed_Buff_Array[7] = 'BHwe'
call TriggerRegisterAnyUnitEventBJ( Death_Trigger, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddAction( Death_Trigger, function KillDummyUnit )
call DisableTrigger( Death_Trigger )
endfunction
endlibrary