package NET.worlds.scape; import java.io.IOException; public class ProximitySensor extends Sensor implements FrameHandler { private boolean _wasin = false; private Point3 _start = new Point3(0.0F, 0.0F, 0.0F); private Point3 _end = new Point3(1.0F, 1.0F, 1.0F); private boolean _triggerin = true; private boolean _triggerout = false; private boolean _silentTeleport = false; private Room _lastRoom; private static Object classCookie = new Object(); public ProximitySensor(Action a) { if (a != null) { this.addAction(a); } } public ProximitySensor() { } @Override public boolean handle(FrameEvent e) { SuperRoot owner = this.getOwner(); if (!(owner instanceof WObject)) { return true; } else { WObject wo = (WObject)owner; Pilot pilot = Pilot.getActive(); Room room = pilot.getRoom(); boolean teleport = room != this._lastRoom; this._lastRoom = room; Point3Temp pos = pilot.getPosition(); BoundBoxTemp bbt = BoundBoxTemp.make(Point3Temp.make(this._start).times(wo), Point3Temp.make(this._end).times(wo)); if (pilot.getRoom() == wo.getRoom() && bbt.contains(pos)) { if (!this._wasin) { this._wasin = true; if (this._triggerin && (!teleport || !this._silentTeleport)) { this.trigger(e); } } } else if (this._wasin) { this._wasin = false; if (this._triggerout && (!teleport || !this._silentTeleport)) { this.trigger(e); } } return true; } } @Override public Object properties(int index, int offset, int mode, Object value) throws NoSuchPropertyException { Object ret = null; switch (index - offset) { case 0: if (mode == 0) { ret = Point3PropertyEditor.make(new Property(this, index, "Start")); } else if (mode == 1) { ret = new Point3(this._start); } else if (mode == 2) { this._start = (Point3)value; } break; case 1: if (mode == 0) { ret = Point3PropertyEditor.make(new Property(this, index, "End")); } else if (mode == 1) { ret = new Point3(this._end); } else if (mode == 2) { this._end = (Point3)value; } break; case 2: if (mode == 0) { ret = BooleanPropertyEditor.make(new Property(this, index, "Trigger on entry"), "Don't trigger when entered", "Trigger when entered"); } else if (mode == 1) { ret = new Boolean(this._triggerin); } else if (mode == 2) { this._triggerin = (Boolean)value; } break; case 3: if (mode == 0) { ret = BooleanPropertyEditor.make(new Property(this, index, "Trigger on exit"), "Don't trigger when exited", "Trigger when exited"); } else if (mode == 1) { ret = new Boolean(this._triggerout); } else if (mode == 2) { this._triggerout = (Boolean)value; } break; case 4: if (mode == 0) { ret = BooleanPropertyEditor.make(new Property(this, index, "Teleport trigger"), "Don't trigger on teleports", "Trigger on teleports"); } else if (mode == 1) { ret = new Boolean(!this._silentTeleport); } else if (mode == 2) { this._silentTeleport = !(Boolean)value; } break; default: ret = super.properties(index, offset + 5, mode, value); } return ret; } @Override public void saveState(Saver s) throws IOException { s.saveVersion(2, classCookie); super.saveState(s); s.saveBoolean(this._triggerin); s.saveBoolean(this._triggerout); s.saveBoolean(this._silentTeleport); s.save(this._start); s.save(this._end); } @Override public void restoreState(Restorer r) throws IOException, TooNewException { switch (r.restoreVersion(classCookie)) { case 1: super.restoreState(r); this._triggerin = r.restoreBoolean(); this._triggerout = r.restoreBoolean(); this._start = (Point3)r.restore(); this._end = (Point3)r.restore(); break; case 2: super.restoreState(r); this._triggerin = r.restoreBoolean(); this._triggerout = r.restoreBoolean(); this._silentTeleport = r.restoreBoolean(); this._start = (Point3)r.restore(); this._end = (Point3)r.restore(); break; default: throw new TooNewException(); } } @Override public String toString() { return super.toString() + "[" + (this._triggerin ? "I" : " ") + (this._triggerout ? "O" : " ") + this._start + " to " + this._end + "]"; } }