package Sensor import public Entity import HashMap import FxEntity /** Sensor module that adds onInRange closure capabilities to the class */ public abstract class SensorListener abstract function onSensor(UnitEntity source, UnitEntity target) public module Sensor private trigger inRangeTrig = null private unit actorRef = null private static let sensorListeners = new HashMap() function addSensorListener(Entity e, SensorListener listener) if listener == null error("Trying to add null listener") inRangeTrig = CreateTrigger() if e instanceof UnitEntity this.actorRef = (e castTo UnitEntity).actor else if e instanceof FxEntity this.actorRef = (e castTo FxEntity).getDummy() inRangeTrig.registerUnitInRangeSource(actorRef, e.radius, null) sensorListeners.put(inRangeTrig, listener) inRangeTrig.addAction() -> let trig = GetTriggeringTrigger() let u = GetTriggerUnit() if u.getUserData() > 0 let target = u.getEntity() if target != null and not target.done let slistener = sensorListeners.get(trig) if slistener != null slistener.onSensor(trig.getSource().getEntity(), target) ondestroy if inRangeTrig != null destroy sensorListeners.get(inRangeTrig) sensorListeners.remove(inRangeTrig) actorRef.clearRegister() inRangeTrig = null public function unit.abortOrder() returns boolean if this.isPaused() return false else this.pause() this.issueImmediateOrder("stop") this.unpause() return true