diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 7b29de0f3..830756afd 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -651,16 +651,16 @@ public abstract class SWGObject implements Serializable, Comparable { } private Set getObservers(SWGObject childObject) { - return getObserversFromSet(objectsAware, childObject); + return getObserversFromSet(new HashSet(), childObject); } private Set getObserversFromSet(Set aware, SWGObject childObject) { Set awareExtra; synchronized (aware) { - synchronized (objectsAware) { - awareExtra = new HashSet<>(aware); - awareExtra.addAll(objectsAware); - } + awareExtra = new HashSet<>(aware); + } + synchronized (objectsAware) { + awareExtra.addAll(objectsAware); } if (getParent() == null) { Set observers = new HashSet<>(); @@ -779,47 +779,52 @@ public abstract class SWGObject implements Serializable, Comparable { } public void updateObjectAwareness(Set withinRange) { + Set outOfRange; synchronized (objectsAware) { - Set observers = getObserversFromSet(withinRange, this); - Set outOfRange = new HashSet<>(objectsAware); - outOfRange.removeAll(withinRange); - outOfRange.removeAll(observers); - for (SWGObject o : outOfRange) { - awarenessOutOfRange(o); - o.awarenessOutOfRange(this); - } - for (SWGObject o : withinRange) { - awarenessInRange(o); - o.awarenessInRange(this); - } - for (SWGObject o : observers) { - awarenessInRange(o); - o.awarenessInRange(this); - } + outOfRange = new HashSet<>(objectsAware); + } + Set observers = getObserversFromSet(withinRange, this); + outOfRange.removeAll(withinRange); + outOfRange.removeAll(observers); + for (SWGObject o : outOfRange) { + awarenessOutOfRange(o); + o.awarenessOutOfRange(this); + } + for (SWGObject o : withinRange) { + awarenessInRange(o); + o.awarenessInRange(this); + } + for (SWGObject o : observers) { + awarenessInRange(o); + o.awarenessInRange(this); } } protected void awarenessOutOfRange(SWGObject o) { + boolean success = false; synchronized (objectsAware) { - if (objectsAware.remove(o)) { - Player owner = o.getOwner(); - if (owner != null) - destroyObject(owner); - else - destroyObjectObservers(o); - } + success = objectsAware.remove(o); + } + if (success) { + Player owner = o.getOwner(); + if (owner != null) + destroyObject(owner); + else + destroyObjectObservers(o); } } protected void awarenessInRange(SWGObject o) { + boolean success = false; synchronized (objectsAware) { - if (objectsAware.add(o)) { - Player owner = o.getOwner(); - if (owner != null) - createObject(owner); - else - createObjectObservers(o); - } + success = objectsAware.add(o); + } + if (success) { + Player owner = o.getOwner(); + if (owner != null) + createObject(owner); + else + createObjectObservers(o); } }