From aff8d2e25c5bc2cfa5c44910f8fa9ca65498c422 Mon Sep 17 00:00:00 2001 From: Obique Date: Wed, 14 Jan 2015 15:27:24 -0600 Subject: [PATCH] Increased code readability for ObjectManager --- src/services/objects/ObjectManager.java | 73 ++++++++++++++++++------- src/services/player/PlayerManager.java | 2 +- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 32728711f..5db701987 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -118,10 +118,7 @@ public class ObjectManager extends Manager { if (controller.getControllerData() instanceof DataTransform) { DataTransform trans = (DataTransform) controller.getControllerData(); SWGObject obj = getObject(controller.getObjectId()); - Location oldLocation = obj.getLocation(); - Location newLocation = trans.getLocation(); - newLocation.setTerrain(oldLocation.getTerrain()); - moveObject(trans, obj, oldLocation, newLocation); + moveObject(obj, trans); } } } else if (i instanceof PlayerEventIntent) { @@ -143,8 +140,12 @@ public class ObjectManager extends Manager { if (obj == null) return null; Location loc = obj.getLocation(); - if (loc != null && loc.getTerrain() != null) - quadTree.get(loc.getTerrain()).remove(loc.getX(), loc.getZ(), obj); + if (loc != null && loc.getTerrain() != null) { + QuadTree tree = quadTree.get(loc.getTerrain()); + synchronized (tree) { + tree.remove(loc.getX(), loc.getZ(), obj); + } + } for (SWGObject child : obj.getChildren()) if (child != null) deleteObject(child.getObjectId()); @@ -170,37 +171,68 @@ public class ObjectManager extends Manager { addObjectAttributes(obj, template); obj.setTemplate(template); obj.setLocation(l); -// addToQuadtree(obj, l); - moveObject(null, obj, null, l); + updateAwarenessForObject(obj); + addToQuadTree(obj); objects.put(objectId, obj); return obj; } } - private void moveObject(DataTransform transform, SWGObject obj, Location oldLocation, Location newLocation) { - if (oldLocation != null && oldLocation.getTerrain() != null) { // Remove from QuadTree - double x = oldLocation.getX(); - double y = oldLocation.getZ(); - quadTree.get(oldLocation.getTerrain()).remove(x, y, obj); + private void addToQuadTree(SWGObject obj) { + if (obj == null) + return; + Location loc = obj.getLocation(); + if (loc == null || loc.getTerrain() == null) + return; + QuadTree tree = quadTree.get(loc.getTerrain()); + synchronized (tree) { + tree.put(loc.getX(), loc.getZ(), obj); } - if (newLocation != null && newLocation.getTerrain() != null) { // Add to QuadTree, update awareness + } + + private void removeFromQuadTree(SWGObject obj) { + if (obj == null) + return; + Location loc = obj.getLocation(); + if (loc == null || loc.getTerrain() == null) + return; + double x = loc.getX(); + double y = loc.getZ(); + QuadTree tree = quadTree.get(loc.getTerrain()); + synchronized (tree) { + tree.remove(x, y, obj); + } + } + + private void moveObject(SWGObject obj, DataTransform transform) { + removeFromQuadTree(obj); + Location newLocation = transform.getLocation(); + newLocation.setTerrain(obj.getLocation().getTerrain()); + + if (newLocation != null) obj.setLocation(newLocation); - updateAwarenessForObject(obj); - quadTree.get(newLocation.getTerrain()).put(newLocation.getX(), newLocation.getZ(), obj); - } + + updateAwarenessForObject(obj); + addToQuadTree(obj); + if (transform != null) obj.sendDataTransforms(transform); } private void updateAwarenessForObject(SWGObject obj) { Location location = obj.getLocation(); + if (location == null) + return; List updatedAware = new ArrayList(); double x = location.getX(); double y = location.getZ(); QuadTree tree = quadTree.get(location.getTerrain()); - for (SWGObject inRange : tree.getWithinRange(x, y, AWARE_RANGE)) { - if (inRange.getOwner() != null && inRange.getObjectId() != obj.getObjectId()) { - updatedAware.add(inRange.getOwner()); + synchronized (tree) { + List range = tree.getWithinRange(x, y, AWARE_RANGE); + for (SWGObject inRange : range) { + if (inRange.getOwner() != null && inRange.getObjectId() != obj.getObjectId()) { + updatedAware.add(inRange.getOwner()); + } } } obj.updateAwareness(updatedAware); @@ -254,7 +286,6 @@ public class ObjectManager extends Manager { player.sendPacket(new UpdatePvpStatusMessage(creature.getPvpType(), creature.getPvpFactionId(), creature.getObjectId())); creature.createObject(player); creature.clearAware(); - moveObject(null, creature, creature.getLocation(), creature.getLocation()); updateAwarenessForObject(creature); new PlayerEventIntent(player, galaxy, PlayerEvent.PE_ZONE_IN).broadcast(); } diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index aa5beab36..5e1a6f2c7 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -57,7 +57,7 @@ public class PlayerManager extends Manager { player = transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet); else player = players.get(networkId); - if (player == null && type == ServerType.LOGIN) { + if (type == ServerType.LOGIN && player == null) { player = new Player(this, networkId); players.put(networkId, player); }