diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index abced6379..6246655d6 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -380,6 +380,7 @@ public class CreatureObject extends TangibleObject { } public void createObject(Player target) { + System.out.println(getName() + " sent to " + target.getCreatureObject().getName()); sendSceneCreateObject(target); BaselineBuilder bb = null; diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 4f1f0cddc..4bc8ef43b 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -4,7 +4,6 @@ import intents.GalacticPacketIntent; import intents.swgobject_events.SWGObjectEventIntent; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -71,6 +70,7 @@ public class ObjectManager extends Manager { objects.traverse(new Traverser() { @Override public void process(SWGObject obj) { + obj.setOwner(null); Location l = obj.getLocation(); if (l.getTerrain() != null) { QuadTree tree = quadTree.get(l.getTerrain()); @@ -94,6 +94,12 @@ public class ObjectManager extends Manager { @Override public boolean terminate() { + objects.traverse(new Traverser() { + @Override + public void process(SWGObject obj) { + obj.setOwner(null); + } + }); objects.save(); return super.terminate(); } @@ -171,24 +177,29 @@ public class ObjectManager extends Manager { } private void moveObject(SWGObject obj, Location oldLocation, Location newLocation) { - double x = 0, y = 0; - List updatedAware = new ArrayList(); if (oldLocation != null && oldLocation.getTerrain() != null) { // Remove from QuadTree - x = oldLocation.getX(); - y = oldLocation.getZ(); + double x = oldLocation.getX(); + double y = oldLocation.getZ(); quadTree.get(oldLocation.getTerrain()).remove(x, y, obj); } if (newLocation != null && newLocation.getTerrain() != null) { // Add to QuadTree, update awareness obj.setLocation(newLocation); - x = newLocation.getX(); - y = newLocation.getZ(); - QuadTree tree = quadTree.get(newLocation.getTerrain()); - for (SWGObject inRange : tree.getWithinRange(x, y, AWARE_RANGE)) - if (inRange.getOwner() != null && inRange.getObjectId() != obj.getObjectId()) - updatedAware.add(inRange.getOwner()); - quadTree.get(newLocation.getTerrain()).put(x, y, obj); + updateAwarenessForObject(obj); + quadTree.get(newLocation.getTerrain()).put(newLocation.getX(), newLocation.getZ(), obj); + } + } + + private void updateAwarenessForObject(SWGObject obj) { + Location location = obj.getLocation(); + 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()); + } } - System.out.println(obj.getName() + " - " + Arrays.toString(updatedAware.toArray())); obj.updateAwareness(updatedAware); obj.sendDataTransforms(); } @@ -240,6 +251,9 @@ public class ObjectManager extends Manager { CreatureObject creature = (CreatureObject) player.getCreatureObject(); player.sendPacket(new UpdatePvpStatusMessage(creature.getPvpType(), creature.getPvpFactionId(), creature.getObjectId())); creature.createObject(player); + creature.clearAware(); + moveObject(creature, creature.getLocation(), creature.getLocation()); + updateAwarenessForObject(creature); } } @@ -252,6 +266,7 @@ public class ObjectManager extends Manager { throw new NullPointerException("CreatureObject for ID: " + characterId + " cannot be null!"); } player.setCreatureObject(creature); // CreatureObject contains the player object! + creature.setOwner(player); if (player.getPlayerObject() == null) { System.err.println("FATAL: " + player.getUsername() + "'s CreatureObject has a null ghost!"); diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 166b599f1..5fb016c49 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -3,6 +3,8 @@ package services.player; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; import network.packets.Packet; import network.packets.swg.login.ClientIdMsg; @@ -11,21 +13,18 @@ import resources.control.Intent; import resources.control.Manager; import resources.network.ServerType; import resources.player.Player; -import resources.server_info.ObjectDatabase; -import resources.server_info.ObjectDatabase.Traverser; public class PlayerManager extends Manager { - private LoginService loginService; - private ZoneService zoneService; - - private ObjectDatabase players; + private final Map players; + private final LoginService loginService; + private final ZoneService zoneService; public PlayerManager() { loginService = new LoginService(); zoneService = new ZoneService(); - players = new ObjectDatabase("odb/players.db"); + players = new HashMap(); addChildService(loginService); addChildService(zoneService); @@ -34,19 +33,11 @@ public class PlayerManager extends Manager { @Override public boolean initialize() { registerForIntent(GalacticPacketIntent.TYPE); - players.loadToCache(); - players.traverse(new Traverser() { - @Override - public void process(Player p) { - p.setPlayerManager(PlayerManager.this); - } - }); return super.initialize(); } @Override public boolean terminate() { - players.save(); return super.terminate(); } @@ -59,8 +50,9 @@ public class PlayerManager extends Manager { long networkId = gpi.getNetworkId(); Player player = null; if (type == ServerType.ZONE && packet instanceof ClientIdMsg) - transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet); - player = players.get(networkId); + player = transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet); + else + player = players.get(networkId); if (player == null && type == ServerType.LOGIN) { player = new Player(this, networkId); players.put(networkId, player); @@ -89,14 +81,13 @@ public class PlayerManager extends Manager { return false; } - private void transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) { + private Player transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) { final byte [] nToken = clientId.getSessionToken(); - players.traverse(new Traverser() { - @Override - public void process(Player p) { + synchronized (players) { + for (Player p : players.values()) { byte [] pToken = p.getSessionToken(); if (pToken.length != nToken.length) - return; + continue; boolean match = true; for (int t = 0; t < pToken.length && match; t++) { if (pToken[t] != nToken[t]) @@ -107,9 +98,11 @@ public class PlayerManager extends Manager { p.setNetworkId(networkId); p.setGalaxyId(galaxyId); players.put(networkId, p); + return p; } } - }); + } + return null; } public Player getPlayerFromNetworkId(long networkId) {