From e0ca1ea7b278e30f330f57fc9620516894d735c3 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Mon, 17 Mar 2014 16:49:50 -0400 Subject: [PATCH] Range check on performances for spectators --- scripts/commands/watch.py | 3 +- .../objects/creature/CreatureObject.java | 17 ++++++++++- src/services/EntertainmentService.java | 30 +++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/scripts/commands/watch.py b/scripts/commands/watch.py index 071319c1..0a9baf04 100644 --- a/scripts/commands/watch.py +++ b/scripts/commands/watch.py @@ -33,6 +33,7 @@ def run(core, actor, target, commandString): actor.setPerformanceWatchee(target) target.addAudience(actor) + core.entertainmentService.startSpectating(actor, target) actor.setMoodAnimation('entertained') - actor.sendSystemMessage('You start watching ' + target.getCustomName() + '.',0) + actor.sendSystemMessage('You start watching ' + target.getCustomName() + '.',0) return \ No newline at end of file diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 56239f1c..19d60409 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -159,6 +159,9 @@ public class CreatureObject extends TangibleObject implements IPersistent { @NotPersistent private ScheduledFuture inspirationTick; + @NotPersistent + private ScheduledFuture spectatorTask; + private boolean staticNPC = false; // temp @NotPersistent private int flourishCount = 0; @@ -411,6 +414,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { } if (next == this) { continue; } next.sendSystemMessage("@performance:" + type + "_stop_other",(byte)0); + next.getSpectatorTask().cancel(true); } //not sure if this behaviour is correct. might need fixing later. performanceAudience = new SWGList(); @@ -1617,5 +1621,16 @@ public class CreatureObject extends TangibleObject implements IPersistent { this.appearanceEquipmentListUpdateCounter = appearanceEquipmentListUpdateCounter; } } - + + public ScheduledFuture getSpectatorTask() { + synchronized(objectMutex) { + return spectatorTask; + } + } + + public void setSpectatorTask(ScheduledFuture spectatorTask) { + synchronized(objectMutex) { + this.spectatorTask = spectatorTask; + } + } } diff --git a/src/services/EntertainmentService.java b/src/services/EntertainmentService.java index f82cb731..a57d486d 100644 --- a/src/services/EntertainmentService.java +++ b/src/services/EntertainmentService.java @@ -422,6 +422,36 @@ public class EntertainmentService implements INetworkDispatch { } + public void startSpectating(final CreatureObject spectator, final CreatureObject performer) { + final ScheduledFuture spectatorTask = scheduler.scheduleAtFixedRate(new Runnable() { + + @Override + public void run() { + if (spectator.getPosition().getDistance2D(performer.getWorldPosition()) > (float) 70) { + + String pType = (performer.getPerformanceType()) ? "dance" : "music"; + if(pType.equals("dance")) { + spectator.setPerformanceWatchee(null); + spectator.sendSystemMessage("You stop watching " + performer.getCustomName() + " because " + performer.getCustomName() + + " is out of range.", (byte) 0); + } + else { + spectator.setPerformanceListenee(null); + spectator.sendSystemMessage("You stop listening to " + performer.getCustomName() + " because " + performer.getCustomName() + + " is out of range.", (byte) 0); + } + spectator.setMoodAnimation("neutral"); + performer.removeAudience(spectator); + + spectator.getSpectatorTask().cancel(true); + } + } + + }, 2, 2, TimeUnit.SECONDS); + + spectator.setSpectatorTask(spectatorTask); + } + @Override public void shutdown() {