//! zinc
library DamageDetection
{
//CONFIGURATION
constant boolean REFRESH = true; //Should it really refresh?
constant real REFRESH_INTERVAL = 600; //In seconds. 600 = 10 minutes
constant boolean CHECK = true; //If it should check if the damage is atleast a
//specified amount
constant real CHECK_DAMAGE = 1.0; //Amount of damage it has to have
//CONFIGURATION
//Damaged unit, damaging unit, damage
type eventHandler extends function(unit, unit, real);
eventHandler event[];
integer count = 0;
trigger exec = CreateTrigger();
public function TriggerRegisterAnyUnitDamageEvent(eventHandler func)
{
event[count] = func;
count += 1;
}
function Damage() -> boolean
{
integer i = 0;
static if (CHECK)
{
if (GetEventDamage() < CHECK_DAMAGE) { return false; }
}
while(i < count)
{
event[i].evaluate(GetTriggerUnit(), GetEventDamageSource(), GetEventDamage());
i += 1;
}
return false;
}
function DamageEnum() -> boolean
{
TriggerRegisterUnitEvent(exec, GetFilterUnit(), EVENT_UNIT_DAMAGED);
return false;
}
function onInit()
{
trigger t = CreateTrigger();
timer r;
//To register all units that exist at the beginning
group g = CreateGroup();
GroupEnumUnitsInRange(g, 0, 0, 999999, function DamageEnum);
DestroyGroup(g);
g = null;
//To register units that are created after the beginning
TriggerRegisterEnterRectSimple(t, bj_mapInitialPlayableArea);
TriggerAddCondition(t, function() -> boolean
{
TriggerRegisterUnitEvent(exec, GetTriggerUnit(), EVENT_UNIT_DAMAGED);
return false;
});
TriggerAddCondition(exec, function Damage);
static if(REFRESH)
{
r = CreateTimer();
TimerStart(r, REFRESH_INTERVAL, true, function()
{
group g = CreateGroup();
DestroyTrigger(exec);
exec = CreateTrigger();
GroupEnumUnitsInRange(g, 0, 0, 999999, function DamageEnum);
DestroyGroup(g);
g = null;
TriggerAddCondition(exec, function Damage);
});
}
}
}
//! endzinc