rendered paste body#define TARGET_BASE_PRIORITY 50
#define TARGET_NONE 0
#define TARGET_VALIDATE 1
/*
* Events:
*
* TARGET_DIED [guid]
* TARGET_ADDED [guid]
*/
objectdef oTarget
{
variable objectref Data
variable bool IsPlayer = FALSE
variable int Priority
method Initialize(string TargetGUID, int Priority)
{
Data:Set[${TargetGUID}]
This.Priority:Set[${Priority}]
}
}
objectdef oTargets inherits oBase
{
variable int TotalTargets = 0
variable int CurrentState = 0
variable int PreviousState = 0
variable index:oTarget Targets
variable objectref CurrentTarget
variable int LastValidation = 0
member NeedValidation()
{
if ${TotalTargets} > 0 && ${Math.Calc[${LavishScript.RunningTime} - ${LastValidation}]} > 1000
{
return TRUE
}
return FALSE
}
member State()
{
if ${NeedValidation}
{
return TARGET_VALIDATE
}
return TARGET_NONE
}
method Pulse()
{
CurrentState:Set[${State}]
if ${CurrentState} != ${PreviousState}
{
This:OnStateChange
PreviousState:Set[${CurrentState}]
}
switch ${CurrentState}
{
case TARGET_VALIDATE
This:Validate
break
case TARGET_NONE
break
}
}
method OnStateChange()
{
}
/*
* Methods
*/
method Add(string TargetGUID, int Priority=TARGET_BASE_PRIORITY)
{
if !${Unit[${TargetGUID}](exists)}
{
return
}
Event["TARGET_ADDED"]:Execute[${TargetGUID}]
Targets:Insert[${TargetGUID},${Priority}]
TotalTargets:Inc
}
method Clear()
{
Targets:Collapse
if ${Targets.Get[1](exists)}
{
do
{
Targets:Remove[1]
}
while ${Targets.Get[1](exists)}
}
This:ResetActiveTarget
}
method ResetActiveTarget()
{
CurrentTarget:Set[0]
}
member TargetIndex(string TargetGUID)
{
variable int Index = 1
Targets:Collapse
if ${Targets.Get[${Index}](exists)}
{
do
{
if ${Targets.Get[${Index}].Data.GUID.Equal[${TargetGUID}]}
{
return ${Index}
}
}
while ${Targets.Get[${Index:Inc}](exists)}
}
return 0
}
method SetPriority(string TargetGUID, int Priority)
{
variable int Index = 0
Index:Set[${TargetIndex[${TargetGUID}]}]
if ${Index} > 0
{
Targets.Get[${Index}].Priority:Set[${Priority}]
}
}
method Remove(string TargetGUID)
{
variable int Index = 0
Index:Set[${TargetIndex[${TargetGUID}]}]
if ${Index} > 0
{
Targets:Remove[${Index}]
TotalTargets:Dec
}
}
method Validate()
{
variable int Index = 1
variable int Best = 0
if ${TotalTargets} == 0
{
return
}
Targets:Collapse
if ${Targets.Get[${Index}](exists)}
{
do
{
;FIXME! calculate priority using callbacks
if ${Targets.Get[${Index}].Data.Dead}
{
Event["TARGET_DIED"]:Execute[${Targets.Get[${Index}].Data.GUID}]
Targets:Remove[${Index}]
}
Best:Set[${Index}]
}
while ${Targets.Get[${Index:Inc}](exists)}
CurrentTarget:Set[${Targets.Get[${Best}].Data.GUID}]
}
}
method Initialize()
{
LastValidation:Set[${LavishScript.RunningTime}]
LavishScript:RegisterEvent["TARGET_DIED"]
LavishScript:RegisterEvent["TARGET_ADDED"]
}
method Shutdown()
{
Event["TARGET_DIED"]:Unregister
Event["TARGET_ADDED"]:Unregister
}
}