library RescueUnits
globals
private constant hashtable DataTable = InitHashtable()
private constant integer KeyTrigger = 1
private constant integer KeyUnit = 2
private constant integer KeyPlayers = 3
private constant real RescueRange = 284.00
private force Allowed = null
endglobals
private function ClearUnitRescueData takes unit whichUnit returns nothing
local integer handleId = GetHandleId(whichUnit)
local trigger trg = LoadTriggerHandle(DataTable, handleId, KeyTrigger)
local integer trgId = GetHandleId(trg)
local force players = LoadForceHandle(DataTable, trgId, KeyPlayers)
call FlushChildHashtable(DataTable, handleId)
call FlushChildHashtable(DataTable, trgId)
call DestroyForce(players)
call DestroyTrigger(trg)
set trg = null
set players = null
endfunction
private function RescueTriggerActions takes nothing returns nothing
local integer handleId = GetHandleId(GetTriggeringTrigger())
local player rescuer = GetOwningPlayer(GetTriggerUnit())
local unit rescuableUnit
if IsPlayerInForce(rescuer, LoadForceHandle(DataTable, handleId, KeyPlayers)) then
set rescuableUnit = LoadUnitHandle(DataTable, handleId, KeyUnit)
call RescueUnitBJ(rescuableUnit, rescuer, true)
call ClearUnitRescueData(rescuableUnit)
endif
set rescuer = null
set rescuableUnit = null
endfunction
private function AddRescueForce takes nothing returns nothing
call ForceAddPlayer(Allowed, GetEnumPlayer())
endfunction
private function AddRescuePlayers takes trigger t, force allowedPlayers returns nothing
set Allowed = LoadForceHandle(DataTable, GetHandleId(t), KeyPlayers)
call ForForce(allowedPlayers, function AddRescueForce)
set Allowed = null
endfunction
private function CreateRescuableUnitTrigger takes unit rescuableUnit, force allowedPlayers returns nothing
local trigger trg = CreateTrigger()
local integer trgId = GetHandleId(trg)
set Allowed = CreateForce()
call ForForce(allowedPlayers, function AddRescueForce)
call TriggerRegisterUnitInRangeSimple(trg, RescueRange, rescuableUnit)
call TriggerAddAction(trg, function RescueTriggerActions)
call SaveUnitHandle(DataTable, trgId, KeyUnit, rescuableUnit)
call SaveForceHandle(DataTable, trgId, KeyPlayers, Allowed)
call SaveTriggerHandle(DataTable, GetHandleId(rescuableUnit), KeyTrigger, trg)
set trg = null
set Allowed = null
endfunction
function MakeUnitRescueable takes unit rescuableUnit, force allowedPlayers returns nothing
local trigger t = LoadTriggerHandle(DataTable, GetHandleId(rescuableUnit), KeyTrigger)
if t == null then
call CreateRescuableUnitTrigger(rescuableUnit, allowedPlayers)
else
call AddRescuePlayers(t, allowedPlayers)
endif
set t = null
endfunction
function ClearRescueData takes unit whichUnit returns nothing
call ClearUnitRescueData(whichUnit)
endfunction
endlibrary