#define RADAR_NONE 0 #define RADAR_SWEEP 1 #define RADAR_MAX_RANGE 60 objectdef oBlip { variable int Priority variable objectref Data method Initialize(string DataGUID, int Priority = 100) { This.Data:Set[${DataGUID}] This.Priority:Set[${Priority}] } } objectdef oBlacklist { variable string BlacklistGUID variable int Expiration method Initialize(string BlacklistGUID, int Expiration) { This.BlacklistGUID:Set[${BlacklistGUID}] This.Expiration:Set[${This.Expiration}] } } objectdef oRadar inherits oBase { variable int LastSweep variable index:oBlip HostilePlayers variable index:oBlip FriendlyPlayers variable index:oBlip Aggro variable index:oBlacklist Blacklist variable int TargetCount = 0 variable int HostilePlayerCount = 0 variable int FriendlyPlayerCount = 0 method BlacklistGUID(string ObjectGUID, int Expiration=0) { This.Blacklist:Collapse } member Blacklisted(string ObjectGUID) { } method ResetHostilePlayers() { This.HostilePlayerCount:Set[0] HostilePlayers:Collapse if ${HostilePlayers.Get[1](exists)} { do { HostilePlayers:Remove[1] } while ${HostilePlayers.Get[1](exists)} } } method ResetFriendlyPlayers() { This.FriendlyPlayerCount:Set[0] FriendlyPlayers:Collapse if ${FriendlyPlayers.Get[1](exists)} { do { FriendlyPlayers:Remove[1] } while ${FriendlyPlayers.Get[1](exists)} } } method SweepHostilePlayers() { variable guidlist Targets variable int Index = 1 Targets:Search[-players,-hostile,-lineofsight,-alive,-nearest,-notflying,-range 0-RADAR_MAX_RANGE] if ${Targets.Count} > 0 { do { This.HostilePlayerCount:Inc This.TargetCount:Inc HostilePlayers:Insert[${Targets.GUID[${Index}]},50] } while ${Index:Inc}<=${Targets.Count} } Event[RADAR_EVENT_HOSTILEPLAYERSUPDATED]:Execute } method SweepFriendlyPlayers() { variable guidlist Targets variable int Index = 1 Targets:Search[-players,-friendly,-lineofsight,-alive,-nearest,-notflying,-range 0-RADAR_MAX_RANGE] if ${Targets.Count} > 0 { do { if ${Targets.GUID[${Index}].NotEqual[${Me.GUID}]} { This.FriendlyPlayerCount:Inc This.TargetCount:Inc FriendlyPlayers:Insert[${Targets.GUID[${Index}]},50] } } while ${Index:Inc}<=${Targets.Count} } Event[RADAR_EVENT_FRIENDLYPLAYERSUPDATED]:Execute } method Sweep() { This.LastSweep:Set[${LavishScript.RunningTime}] This.TargetCount:Set[0] This:ResetHostilePlayers This:SweepHostilePlayers This:ResetFriendlyPlayers This:SweepFriendlyPlayers Event[RADAR_EVENT_SWEEP]:Execute } member NeedSweep() { if ${Math.Calc[${LavishScript.RunningTime} - ${This.LastSweep}]} > 50 { return TRUE } return FALSE } member HaveTarget() { if ${This.HostilePlayerCount} > 0 { return TRUE } return FALSE } method SelectTarget() { if ${HostilePlayers.Get[1](exists)} { This:Debug["Target ${This.HostilePlayers.Get[1].GUID}"] Target ${This.HostilePlayers.Get[1].Data.GUID} } } /* * */ member State() { if ${This.NeedSweep} { return RADAR_SWEEP } return RADAR_NONE } method Pulse(int Priority) { This.CurrentState:Set[${This.State}] switch ${This.CurrentState} { case RADAR_SWEEP This:Sweep break case RADAR_NONE break } } method Plugin() { Event[CORE_EVENT_PULSE]:AttachAtom[${This.ObjectName}:Pulse] LavishScript:RegisterEvent[RADAR_EVENT_SWEEP] LavishScript:RegisterEvent[RADAR_EVENT_HOSTILEPLAYERSUPDATED] LavishScript:RegisterEvent[RADAR_EVENT_FRIENDLYPLAYERSUPDATED] } method Initialize() { This.LastSweep:Set[${LavishScript.RunningTime}] } method Shutdown() { Event[CORE_EVENT_PULSE]:DetachAtom[${This.ObjectName}:Pulse] Event[RADAR_EVENT_SWEEP]:Unregister Event[RADAR_EVENT_HOSTILEPLAYERSUPDATED]:Unregister Event[RADAR_EVENT_FRIENDLYPLAYERSUPDATED]:Unregister } }