diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index cc8851515..c77c533c3 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -28,16 +28,18 @@ import resources.objects.player.PlayerObject; import resources.objects.quadtree.QuadTree; import resources.objects.tangible.TangibleObject; import resources.player.Player; +import resources.server_info.ObjectDatabase; +import resources.server_info.ObjectDatabase.Traverser; import services.player.PlayerManager; public class ObjectManager extends Manager { - private Map objects; + private ObjectDatabase objects; private Map > quadTree; private long maxObjectId; public ObjectManager() { - objects = new HashMap(); + objects = new ObjectDatabase("odb/objects.db"); quadTree = new HashMap>(); maxObjectId = 1; } @@ -49,9 +51,32 @@ public class ObjectManager extends Manager { for (Terrain t : Terrain.values()) { quadTree.put(t.getFile(), new QuadTree(-5000, -5000, 5000, 5000)); } + objects.loadToCache(); + System.out.println("ObjectManager: Loading " + objects.size() + " objects from ObjectDatabase..."); + objects.traverse(new Traverser() { + @Override + public void process(SWGObject obj) { + Location l = obj.getLocation(); + if (l.getTerrain() != null) { + QuadTree tree = quadTree.get(l.getTerrain().getFile()); + if (tree != null) { + System.out.println(l.getX() + ", " + l.getZ()); + tree.put(l.getX(), l.getZ(), obj); + } else { + System.err.println("ObjectManager: Unable to load QuadTree for object " + obj.getObjectId() + " and terrain: " + l.getTerrain()); + } + } + } + }); return super.initialize(); } + @Override + public boolean terminate() { + objects.save(); + return super.terminate(); + } + @Override public void onIntentReceived(Intent i) { if (i instanceof SWGObjectMovedIntent) { @@ -69,7 +94,7 @@ public class ObjectManager extends Manager { } else if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; if (gpi.getPacket() instanceof SelectCharacter) { - zoneInCharacter(gpi.getPlayerManager(), gpi.getNetworkId()); + zoneInCharacter(gpi.getPlayerManager(), gpi.getNetworkId(), ((SelectCharacter)gpi.getPacket()).getCharacterId()); } } } @@ -84,13 +109,15 @@ public class ObjectManager extends Manager { SWGObject obj = createObjectFromTemplate(objectId, template); obj.setTemplate(template); obj.setLocation(l); + objects.put(objectId, obj); return obj; } } - private void zoneInCharacter(PlayerManager playerManager, long netId) { + private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) { Player player = playerManager.getPlayerFromNetworkId(netId); if (player != null) { + verifyPlayerObjectsSet(player, characterId); long objId = player.getCreatureObject().getObjectId(); Race race = ((CreatureObject) player.getCreatureObject()).getRace(); Location l = player.getCreatureObject().getLocation(); @@ -108,6 +135,23 @@ public class ObjectManager extends Manager { } } + private void verifyPlayerObjectsSet(Player player, long characterId) { + if (player.getCreatureObject() != null && player.getPlayerObject() != null) + return; + SWGObject creature = objects.get(characterId); + if (creature == null) { + System.err.println("ObjectManager: Failed to start zone - CreatureObject could not be fetched from database"); + throw new NullPointerException("CreatureObject for ID: " + characterId + " cannot be null!"); + } + player.setCreatureObject(creature); + for (SWGObject obj : creature.getChildren()) { + if (obj instanceof PlayerObject) { + player.setPlayerObject(obj); + break; + } + } + } + private long getNextObjectId() { synchronized (objects) { return maxObjectId++; diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index fb43e75d6..a73ce026f 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -1,8 +1,5 @@ package services.player; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import network.packets.Packet; import network.packets.swg.login.ClientIdMsg; import intents.GalacticPacketIntent; @@ -10,19 +7,21 @@ 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 Map players; + private ObjectDatabase players; public PlayerManager() { loginService = new LoginService(); zoneService = new ZoneService(); - players = new ConcurrentHashMap(); + players = new ObjectDatabase("odb/players.db"); addChildService(loginService); addChildService(zoneService); @@ -31,21 +30,41 @@ 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(); + } + @Override public void onIntentReceived(Intent i) { if (i instanceof GalacticPacketIntent) { - GalacticPacketIntent ipi = (GalacticPacketIntent) i; - Packet packet = ipi.getPacket(); - ServerType type = ipi.getServerType(); - long networkId = ipi.getNetworkId(); + GalacticPacketIntent gpi = (GalacticPacketIntent) i; + Packet packet = gpi.getPacket(); + ServerType type = gpi.getServerType(); + long networkId = gpi.getNetworkId(); Player player = null; if (type == ServerType.ZONE && packet instanceof ClientIdMsg) - player = transitionLoginToZone(networkId, (ClientIdMsg) packet); - else - player = players.get(networkId); + transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet); + player = players.get(networkId); + if (player == null) + System.out.println("Player: null"); + else { + System.out.println("Player: " + player.getUsername()); + System.out.println(" " + player.getUserId()); + System.out.println(" " + player.getGalaxyId()); + } + System.out.println("Player: " + ((player==null)?"null":player.getUsername())); if (player == null && type == ServerType.LOGIN) { player = new Player(this, networkId); players.put(networkId, player); @@ -54,30 +73,32 @@ public class PlayerManager extends Manager { if (type == ServerType.LOGIN) loginService.handlePacket(player, packet); else if (type == ServerType.ZONE) - zoneService.handlePacket(ipi, player, networkId, packet); + zoneService.handlePacket(gpi, player, networkId, packet); } } } - private Player transitionLoginToZone(long networkId, ClientIdMsg clientId) { - byte [] nToken = clientId.getSessionToken(); - for (Player p : players.values()) { - byte [] pToken = p.getSessionToken(); - if (pToken.length != nToken.length) - continue; - boolean match = true; - for (int t = 0; t < pToken.length && match; t++) { - if (pToken[t] != nToken[t]) - match = false; + private void transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) { + final byte [] nToken = clientId.getSessionToken(); + players.traverse(new Traverser() { + @Override + public void process(Player p) { + byte [] pToken = p.getSessionToken(); + if (pToken.length != nToken.length) + return; + boolean match = true; + for (int t = 0; t < pToken.length && match; t++) { + if (pToken[t] != nToken[t]) + match = false; + } + if (match) { + players.remove(p.getNetworkId()); + p.setNetworkId(networkId); + p.setGalaxyId(galaxyId); + players.put(networkId, p); + } } - if (match) { - players.remove(p.getNetworkId()); - p.setNetworkId(networkId); - players.put(networkId, p); - return p; - } - } - return null; + }); } public Player getPlayerFromNetworkId(long networkId) {