diff --git a/src/resources/commands/callbacks/JumpCmdCallback.java b/src/resources/commands/callbacks/JumpCmdCallback.java index e9ce0a74b..e102944fc 100644 --- a/src/resources/commands/callbacks/JumpCmdCallback.java +++ b/src/resources/commands/callbacks/JumpCmdCallback.java @@ -39,7 +39,7 @@ public class JumpCmdCallback implements ICmdCallback { @Override public void execute(GalacticManager galacticManager, Player player, SWGObject target, String args) { CreatureObject creature = player.getCreatureObject(); - creature.sendObservers(new JumpUpdate(creature.getObjectId())); + creature.sendObserversAndSelf(new JumpUpdate(creature.getObjectId())); } } diff --git a/src/resources/commands/callbacks/KneelCmdCallback.java b/src/resources/commands/callbacks/KneelCmdCallback.java index 4abf5a6bd..e7c564098 100644 --- a/src/resources/commands/callbacks/KneelCmdCallback.java +++ b/src/resources/commands/callbacks/KneelCmdCallback.java @@ -43,7 +43,7 @@ public class KneelCmdCallback implements ICmdCallback { creature.setPosture(Posture.CROUCHED); creature.setMovementScale(0); creature.setTurnScale(0); - creature.sendObservers(new PostureUpdate(creature.getObjectId(), Posture.CROUCHED)); + creature.sendObserversAndSelf(new PostureUpdate(creature.getObjectId(), Posture.CROUCHED)); } diff --git a/src/resources/commands/callbacks/ProneCmdCallback.java b/src/resources/commands/callbacks/ProneCmdCallback.java index 390321482..68e8ccf85 100644 --- a/src/resources/commands/callbacks/ProneCmdCallback.java +++ b/src/resources/commands/callbacks/ProneCmdCallback.java @@ -43,7 +43,7 @@ public class ProneCmdCallback implements ICmdCallback { creature.setPosture(Posture.PRONE); creature.setTurnScale(1); creature.setMovementScale(0.50); - creature.sendObservers(new PostureUpdate(creature.getObjectId(), Posture.PRONE)); + creature.sendObserversAndSelf(new PostureUpdate(creature.getObjectId(), Posture.PRONE)); } diff --git a/src/resources/commands/callbacks/SitOnObjectCmdCallback.java b/src/resources/commands/callbacks/SitOnObjectCmdCallback.java index 7ce494b86..f22da18c7 100644 --- a/src/resources/commands/callbacks/SitOnObjectCmdCallback.java +++ b/src/resources/commands/callbacks/SitOnObjectCmdCallback.java @@ -64,6 +64,6 @@ public class SitOnObjectCmdCallback implements ICmdCallback { creature.setPosture(Posture.SITTING); creature.setMovementScale(0); creature.setTurnScale(0); - creature.sendObservers(new SitOnObject(creature.getObjectId(), sot)); + creature.sendObserversAndSelf(new SitOnObject(creature.getObjectId(), sot)); } } \ No newline at end of file diff --git a/src/resources/commands/callbacks/SocialInternalCmdCallback.java b/src/resources/commands/callbacks/SocialInternalCmdCallback.java index 06b0491c6..d0a1332ae 100644 --- a/src/resources/commands/callbacks/SocialInternalCmdCallback.java +++ b/src/resources/commands/callbacks/SocialInternalCmdCallback.java @@ -27,8 +27,6 @@ ***********************************************************************************/ package resources.commands.callbacks; -import java.util.List; - import network.packets.swg.zone.object_controller.PlayerEmote; import resources.commands.ICmdCallback; import resources.objects.SWGObject; @@ -49,11 +47,9 @@ public class SocialInternalCmdCallback implements ICmdCallback { PlayerEmote emote = new PlayerEmote(objectId, objectId, ((target == null) ? 0 : target.getObjectId()), Short.valueOf(cmd[1])); player.sendPacket(emote); - List observers = player.getCreatureObject().getObservers(); - for (Player observer : observers) { - if (observer.getCreatureObject() == null) - continue; - observer.sendPacket(new PlayerEmote(observer.getCreatureObject().getObjectId(), emote)); + for (SWGObject aware : player.getCreatureObject().getObjectsAware()) { + if (aware.getOwner() != null) + aware.getOwner().sendPacket(new PlayerEmote(aware.getObjectId(), emote)); } } } diff --git a/src/resources/commands/callbacks/StandCmdCallback.java b/src/resources/commands/callbacks/StandCmdCallback.java index c546f5b91..e3723ea5d 100644 --- a/src/resources/commands/callbacks/StandCmdCallback.java +++ b/src/resources/commands/callbacks/StandCmdCallback.java @@ -46,7 +46,7 @@ public class StandCmdCallback implements ICmdCallback { creature.setMovementScale(1); if(creature.getTurnScale() != 1) creature.setTurnScale(1); - creature.sendObservers(new PostureUpdate(creature.getObjectId(), Posture.UPRIGHT)); + creature.sendObserversAndSelf(new PostureUpdate(creature.getObjectId(), Posture.UPRIGHT)); } } diff --git a/src/resources/network/DeltaBuilder.java b/src/resources/network/DeltaBuilder.java index f238239e4..5ca019b76 100644 --- a/src/resources/network/DeltaBuilder.java +++ b/src/resources/network/DeltaBuilder.java @@ -64,8 +64,8 @@ public class DeltaBuilder { public void send() { DeltasMessage message = getBuiltMessage(); switch(num) { - case 3: object.sendObservers(message); break; - case 6: object.sendObservers(message); break; + case 3: object.sendObserversAndSelf(message); break; + case 6: object.sendObserversAndSelf(message); break; default: object.sendSelf(message); break; } } diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 68d8895a2..5521bcac6 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -65,7 +66,6 @@ public class SWGObject implements Serializable, Comparable { private final Map slots; // Can only be occupied one time, containers are slots who have children private final Map attributes; private final Map templateAttributes; - private transient List observers; private transient List objectsAware; private List > arrangement; @@ -89,7 +89,6 @@ public class SWGObject implements Serializable, Comparable { this.objectId = objectId; this.location = new Location(); this.children = new Vector(); - this.observers = new Vector(); this.objectsAware = new Vector(); this.slots = new HashMap(); // Concurrent maps wont allow for null keys/values, which is what the empty slots are set to :/ this.attributes = new LinkedHashMap(); @@ -98,7 +97,6 @@ public class SWGObject implements Serializable, Comparable { private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - observers = new LinkedList(); objectsAware = new LinkedList(); } @@ -349,14 +347,6 @@ public class SWGObject implements Serializable, Comparable { } public void clearAware() { -// Player [] players; -// synchronized (playersAware) { -// players = playersAware.toArray(new Player[playersAware.size()]); -// } -// for (Player p : players) { -// ((SWGObject) p.getCreatureObject()).awarenessOutOfRange(getOwner()); -// awarenessOutOfRange(p); -// } SWGObject [] objects; synchronized (objectsAware) { objects = objectsAware.toArray(new SWGObject[objectsAware.size()]); @@ -367,21 +357,29 @@ public class SWGObject implements Serializable, Comparable { } } - public List getObservers() { - return new ArrayList(observers); + public List getObjectsAware() { + synchronized (objectsAware) { + return Collections.unmodifiableList(objectsAware); + } } - public void sendObservers(Packet... packets) { + public void sendObserversAndSelf(Packet ... packets) { sendSelf(packets); - synchronized (observers) { - for (Player observer : observers) { - if (observer != null && observer.getPlayerState() == PlayerState.ZONED_IN) - observer.sendPacket(packets); + sendObservers(packets); + } + + public void sendObservers(Packet ... packets) { + synchronized (objectsAware) { + for (SWGObject obj : objectsAware) { + Player p = obj.getOwner(); + if (p == null || p.getPlayerState() != PlayerState.ZONED_IN) + continue; + p.sendPacket(packets); } } } - public void sendSelf(Packet... packets) { + public void sendSelf(Packet ... packets) { if (owner != null) owner.sendPacket(packets); } @@ -401,7 +399,6 @@ public class SWGObject implements Serializable, Comparable { synchronized (objectsAware) { if (objectsAware.remove(o)) { if (o.getOwner() != null) { - observers.remove(o.getOwner()); destroyObject(o.getOwner()); } if (getOwner() != null) @@ -415,7 +412,6 @@ public class SWGObject implements Serializable, Comparable { if (!objectsAware.contains(o)) { objectsAware.add(o); if (o.getOwner() != null) { - observers.add(o.getOwner()); createObject(o.getOwner()); } if (getOwner() != null) @@ -439,7 +435,7 @@ public class SWGObject implements Serializable, Comparable { transform.setUpdateCounter(transformCounter++); transform.setDirection((byte) direction); transform.setSpeed(speed); - sendObservers(transform); + sendObserversAndSelf(transform); } protected void createChildrenObjects(Player target) { diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 3a5d15ced..665fb168e 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -201,10 +201,9 @@ public class ChatService extends Service { sender.sendPacket(message); // Notify observers of the chat message - for (Player observer : actor.getObservers()) { - if (observer.getCreatureObject() == null) - continue; - observer.sendPacket(new SpatialChat(observer.getCreatureObject().getObjectId(), message)); + for (SWGObject aware : actor.getObjectsAware()) { + if (aware.getOwner() != null) + aware.getOwner().sendPacket(new SpatialChat(aware.getObjectId(), message)); } } @@ -290,10 +289,7 @@ public class ChatService extends Service { ChatSystemMessage packet = new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT.ordinal(), message); broadcaster.sendPacket(packet); - List observers = broadcaster.getCreatureObject().getObservers(); - for (Player player : observers) { - player.sendPacket(packet); - } + broadcaster.getCreatureObject().sendObservers(packet); } private void broadcastGalaxyMessage(String message, Terrain terrain) { diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index d64376fa6..21f534470 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -261,7 +261,7 @@ public class ObjectManager extends Manager { }else{ ((CreatureObject) obj).setPosture(Posture.UPRIGHT); } - ((CreatureObject) obj).sendObservers(new PostureUpdate(obj.getObjectId(), ((CreatureObject) obj).getPosture())); + ((CreatureObject) obj).sendObserversAndSelf(new PostureUpdate(obj.getObjectId(), ((CreatureObject) obj).getPosture())); } obj.sendDataTransforms(transform); }