diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 3300bf717..452d02217 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -28,9 +28,11 @@ package services.objects; import intents.PlayerEventIntent; +import intents.network.GalacticPacketIntent; import intents.object.ObjectCreateIntent; import intents.object.ObjectCreatedIntent; import intents.object.ObjectTeleportIntent; +import intents.player.PlayerTransformedIntent; import java.util.HashMap; import java.util.HashSet; @@ -39,20 +41,24 @@ import java.util.Map; import java.util.Set; import main.ProjectSWG; +import network.packets.Packet; import network.packets.swg.zone.UpdateContainmentMessage; import network.packets.swg.zone.insertion.CmdStartScene; +import network.packets.swg.zone.object_controller.DataTransform; +import network.packets.swg.zone.object_controller.DataTransformWithParent; import resources.Location; import resources.Race; import resources.Terrain; +import resources.buildout.BuildoutArea; import resources.control.Intent; import resources.control.Service; import resources.objects.SWGObject; -import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; import resources.objects.quadtree.QuadTree; -import resources.objects.tangible.TangibleObject; +import resources.objects.staticobject.StaticObject; import resources.player.Player; import resources.player.PlayerEvent; +import resources.server_info.Log; public class ObjectAwareness extends Service { @@ -63,16 +69,12 @@ public class ObjectAwareness extends Service { public ObjectAwareness() { quadTree = new HashMap>(); - } - - @Override - public boolean initialize() { registerForIntent(PlayerEventIntent.TYPE); registerForIntent(ObjectCreateIntent.TYPE); registerForIntent(ObjectCreatedIntent.TYPE); registerForIntent(ObjectTeleportIntent.TYPE); + registerForIntent(GalacticPacketIntent.TYPE); loadQuadTree(); - return true; } @Override @@ -89,10 +91,15 @@ public class ObjectAwareness extends Service { case ObjectCreatedIntent.TYPE: if (i instanceof ObjectCreatedIntent) handleObjectCreatedIntent((ObjectCreatedIntent) i); + break; case ObjectTeleportIntent.TYPE: if (i instanceof ObjectTeleportIntent) processObjectTeleportIntent((ObjectTeleportIntent) i); break; + case GalacticPacketIntent.TYPE: + if (i instanceof GalacticPacketIntent) + processGalacticPacketIntent((GalacticPacketIntent) i); + break; default: break; } @@ -127,20 +134,14 @@ public class ObjectAwareness extends Service { private void handleObjectCreateIntent(ObjectCreateIntent oci) { SWGObject obj = oci.getObject(); - if (obj.getParent() == null) { - if (obj instanceof TangibleObject || obj instanceof BuildingObject) { - add(obj); - } - } + if (isInAwareness(obj)) + add(obj); } private void handleObjectCreatedIntent(ObjectCreatedIntent oci) { SWGObject obj = oci.getObject(); - if (obj.getParent() == null) { - if (obj instanceof TangibleObject || obj instanceof BuildingObject) { - add(obj); - } - } + if (isInAwareness(obj)) + add(obj); } private void processObjectTeleportIntent(ObjectTeleportIntent oti) { @@ -148,14 +149,28 @@ public class ObjectAwareness extends Service { Player owner = object.getOwner(); boolean creature = object instanceof CreatureObject && owner != null; if (oti.getParent() != null) { - move(object, oti.getParent(), oti.getNewLocation()); if (creature) startScene((CreatureObject) object, oti.getNewLocation()); + move(object, oti.getParent(), oti.getNewLocation()); } else { - move(object, oti.getNewLocation()); if (creature) startScene((CreatureObject) object, oti.getNewLocation()); object.createObject(owner); + move(object, oti.getNewLocation()); + } + } + + private void processGalacticPacketIntent(GalacticPacketIntent i) { + Packet packet = i.getPacket(); + if (packet instanceof DataTransform) { + DataTransform trans = (DataTransform) packet; + SWGObject obj = i.getObjectManager().getObjectById(trans.getObjectId()); + moveObject(obj, trans); + } else if (packet instanceof DataTransformWithParent) { + DataTransformWithParent transformWithParent = (DataTransformWithParent) packet; + SWGObject object = i.getObjectManager().getObjectById(transformWithParent.getObjectId()); + SWGObject parent = i.getObjectManager().getObjectById(transformWithParent.getCellId()); + moveObject(object, parent, transformWithParent); } } @@ -166,12 +181,46 @@ public class ObjectAwareness extends Service { new PlayerEventIntent(object.getOwner(), PlayerEvent.PE_ZONE_IN).broadcast(); } + private void moveObject(SWGObject obj, DataTransform transform) { + Location newLocation = transform.getLocation(); + newLocation.setTerrain(obj.getTerrain()); + BuildoutArea area = obj.getBuildoutArea(); + if (area != null && area.isAdjustCoordinates()) + newLocation.translatePosition(area.getX1(), 0, area.getZ1()); + if (obj instanceof CreatureObject) + new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), null, obj.getLocation(), newLocation).broadcast(); + move(obj, newLocation); + if (area != null && area.isAdjustCoordinates()) + newLocation.translatePosition(-area.getX1(), 0, -area.getZ1()); + obj.sendDataTransforms(transform); + + // TODO: State checks before sending a data transform message to ensure the move is valid + } + + private void moveObject(SWGObject obj, SWGObject parent, DataTransformWithParent transformWithParent) { + Location newLocation = transformWithParent.getLocation(); + newLocation.setTerrain(obj.getTerrain()); + if (parent == null) { + System.err.println("ObjectManager: Could not find parent for transform! Cell: " + transformWithParent.getCellId()); + Log.e("ObjectManager", "Could not find parent for transform! Cell: %d Object: %s", transformWithParent.getCellId(), obj); + return; + } + if (obj instanceof CreatureObject) + new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast(); + move(obj, parent, newLocation); + obj.sendParentDataTransforms(transformWithParent); + } + private void loadQuadTree() { for (Terrain t : Terrain.values()) { quadTree.put(t, new QuadTree(16, -8192, -8192, 8192, 8192)); } } + private boolean isInAwareness(SWGObject object) { + return object.getParent() == null && !(object instanceof StaticObject); + } + /** * Adds the specified object to the awareness quadtree * @param object the object to add diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index d372aaf00..f8ef1cf03 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -42,18 +42,13 @@ import intents.object.ObjectIdRequestIntent; import intents.object.ObjectIdResponseIntent; import intents.object.ObjectTeleportIntent; import intents.player.DeleteCharacterIntent; -import intents.player.PlayerTransformedIntent; import intents.RequestZoneInIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; import network.packets.swg.ErrorMessage; import network.packets.swg.zone.SceneDestroyObject; import network.packets.swg.zone.insertion.SelectCharacter; -import network.packets.swg.zone.object_controller.DataTransform; -import network.packets.swg.zone.object_controller.DataTransformWithParent; -import network.packets.swg.zone.object_controller.ObjectController; import resources.Location; -import resources.buildout.BuildoutArea; import resources.containers.ContainerPermissions; import resources.control.Intent; import resources.control.Manager; @@ -109,10 +104,9 @@ public class ObjectManager extends Manager { registerForIntent(ObjectIdRequestIntent.TYPE); registerForIntent(ObjectCreateIntent.TYPE); registerForIntent(DeleteCharacterIntent.TYPE); - boolean init = super.initialize(); loadClientObjects(); loadObjects(); - return init; + return super.initialize(); } private void loadObjects() { @@ -238,16 +232,6 @@ public class ObjectManager extends Manager { String galaxy = gpi.getGalaxy().getName(); long characterId = ((SelectCharacter) packet).getCharacterId(); zoneInCharacter(pm, galaxy, gpi.getNetworkId(), characterId); - } else if (packet instanceof ObjectController) { - if (packet instanceof DataTransform) { - DataTransform trans = (DataTransform) packet; - SWGObject obj = getObjectById(trans.getObjectId()); - moveObject(obj, trans); - } else if (packet instanceof DataTransformWithParent) { - DataTransformWithParent transformWithParent = (DataTransformWithParent) packet; - SWGObject object = getObjectById(transformWithParent.getObjectId()); - moveObject(object, transformWithParent); - } } } @@ -357,40 +341,6 @@ public class ObjectManager extends Manager { } } - private void moveObject(SWGObject obj, DataTransform transform) { - if (transform == null) - return; - Location newLocation = transform.getLocation(); - newLocation.setTerrain(obj.getTerrain()); - BuildoutArea area = obj.getBuildoutArea(); - if (area != null && area.isAdjustCoordinates()) - newLocation.translatePosition(area.getX1(), 0, area.getZ1()); - if (obj instanceof CreatureObject) - new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), null, obj.getLocation(), newLocation).broadcast(); - objectAwareness.move(obj, newLocation); - if (area != null && area.isAdjustCoordinates()) - newLocation.translatePosition(-area.getX1(), 0, -area.getZ1()); - obj.sendDataTransforms(transform); - - // TODO: State checks before sending a data transform message to ensure the move is valid/change speed depending - // on the active state (mainly for CreatureObject, override sendDataTransforms in the class?) - } - - private void moveObject(SWGObject obj, DataTransformWithParent transformWithParent) { - Location newLocation = transformWithParent.getLocation(); - newLocation.setTerrain(obj.getTerrain()); - SWGObject parent = objectMap.get(transformWithParent.getCellId()); - if (parent == null) { - System.err.println("ObjectManager: Could not find parent for transform! Cell: " + transformWithParent.getCellId()); - Log.e("ObjectManager", "Could not find parent for transform! Cell: %d Object: %s", transformWithParent.getCellId(), obj); - return; - } - if (obj instanceof CreatureObject) - new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast(); - objectAwareness.move(obj, parent, newLocation); - obj.sendParentDataTransforms(transformWithParent); - } - private void zoneInCharacter(PlayerManager playerManager, String galaxy, long netId, long characterId) { Player player = playerManager.getPlayerFromNetworkId(netId); if (player == null) {