diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index c832f66c6..009dc8e76 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -30,6 +30,7 @@ package services.objects; import intents.PlayerEventIntent; import intents.object.ObjectCreateIntent; import intents.object.ObjectCreatedIntent; +import intents.object.ObjectTeleportIntent; import java.util.HashMap; import java.util.HashSet; @@ -37,8 +38,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +import main.ProjectSWG; import network.packets.swg.zone.UpdateContainmentMessage; +import network.packets.swg.zone.insertion.CmdStartScene; import resources.Location; +import resources.Race; import resources.Terrain; import resources.control.Intent; import resources.control.Service; @@ -48,10 +52,12 @@ import resources.objects.creature.CreatureObject; import resources.objects.quadtree.QuadTree; import resources.objects.tangible.TangibleObject; import resources.player.Player; +import resources.player.PlayerEvent; public class ObjectAwareness extends Service { private static final double AWARE_RANGE = 1024; + private static final int DEFAULT_LOAD_RANGE = (int) square(200); // Squared for speed private final Map > quadTree; @@ -64,6 +70,7 @@ public class ObjectAwareness extends Service { registerForIntent(PlayerEventIntent.TYPE); registerForIntent(ObjectCreateIntent.TYPE); registerForIntent(ObjectCreatedIntent.TYPE); + registerForIntent(ObjectTeleportIntent.TYPE); loadQuadTree(); return true; } @@ -82,6 +89,10 @@ public class ObjectAwareness extends Service { case ObjectCreatedIntent.TYPE: if (i instanceof ObjectCreatedIntent) handleObjectCreatedIntent((ObjectCreatedIntent) i); + case ObjectTeleportIntent.TYPE: + if (i instanceof ObjectTeleportIntent) + processObjectTeleportIntent((ObjectTeleportIntent) i); + break; default: break; } @@ -132,6 +143,29 @@ public class ObjectAwareness extends Service { } } + private void processObjectTeleportIntent(ObjectTeleportIntent oti) { + SWGObject object = oti.getObject(); + 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()); + } else { + move(object, oti.getNewLocation()); + if (creature) + startScene((CreatureObject) object, oti.getNewLocation()); + object.createObject(owner); + } + } + + private void startScene(CreatureObject object, Location newLocation) { + long time = (long)(ProjectSWG.getCoreTime()/1E3); + Race race = ((CreatureObject)object).getRace(); + sendPacket(object.getOwner(), new CmdStartScene(false, object.getObjectId(), race, newLocation, time)); + new PlayerEventIntent(object.getOwner(), PlayerEvent.PE_ZONE_IN).broadcast(); + } + private void loadQuadTree() { for (Terrain t : Terrain.values()) { quadTree.put(t, new QuadTree(16, -8192, -8192, 8192, 8192)); @@ -241,20 +275,16 @@ public class ObjectAwareness extends Service { private boolean isValidInRange(SWGObject obj, SWGObject inRange, Location objLoc) { if (inRange.getObjectId() == obj.getObjectId()) return false; - Location inRangeLoc = inRange.getWorldLocation(); - double distSquared = distanceSquared(objLoc, inRangeLoc); - if (inRange.getLoadRange() != 0 && distSquared > square(inRange.getLoadRange())) - return false; - if (inRange.getLoadRange() == 0 && distSquared > square(200)) - return false; - return true; + int distSquared = distanceSquared(objLoc, inRange.getWorldLocation()); + int loadSquared = (int) (square(inRange.getLoadRange()) + 0.5); + return (loadSquared != 0 || distSquared <= DEFAULT_LOAD_RANGE) && (loadSquared == 0 || distSquared <= loadSquared); } - private double distanceSquared(Location l1, Location l2) { - return square(l1.getX()-l2.getX()) + square(l1.getY()-l2.getY()) + square(l1.getZ()-l2.getZ()); + private int distanceSquared(Location l1, Location l2) { + return (int) (square(l1.getX()-l2.getX()) + square(l1.getY()-l2.getY()) + square(l1.getZ()-l2.getZ()) + 0.5); } - private double square(double x) { + private static double square(double x) { return x * x; } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 0d3a8011a..ebd151c81 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -46,11 +46,9 @@ import intents.player.PlayerTransformedIntent; import intents.PlayerEventIntent; import intents.RequestZoneInIntent; import intents.network.GalacticPacketIntent; -import main.ProjectSWG; import network.packets.Packet; import network.packets.swg.ErrorMessage; import network.packets.swg.zone.SceneDestroyObject; -import network.packets.swg.zone.insertion.CmdStartScene; import network.packets.swg.zone.insertion.SelectCharacter; import network.packets.swg.zone.object_controller.DataTransform; import network.packets.swg.zone.object_controller.DataTransformWithParent; @@ -63,7 +61,6 @@ import resources.control.Manager; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; import resources.player.Player; -import resources.player.PlayerEvent; import resources.server_info.CachedObjectDatabase; import resources.server_info.Log; import resources.server_info.ObjectDatabase; @@ -235,8 +232,6 @@ public class ObjectManager extends Manager { default: break; } - } else if (i instanceof ObjectTeleportIntent) { - processObjectTeleportIntent((ObjectTeleportIntent) i); } else if (i instanceof ObjectIdRequestIntent) { processObjectIdRequestIntent((ObjectIdRequestIntent) i); } else if (i instanceof ObjectCreateIntent) { @@ -260,24 +255,6 @@ public class ObjectManager extends Manager { new ObjectIdResponseIntent(intent.getIdentifier(), reservedIds).broadcast(); } - private void processObjectTeleportIntent(ObjectTeleportIntent oti) { - SWGObject object = oti.getObject(); - if (object instanceof CreatureObject && object.getOwner() != null) { - Packet startScene = new CmdStartScene(false, object.getObjectId(), ((CreatureObject)object).getRace(), oti.getNewLocation(), (long)(ProjectSWG.getCoreTime()/1E3)); - if (oti.getParent() != null) { - objectAwareness.move(object, oti.getParent(), oti.getNewLocation()); - sendPacket(object.getOwner(), startScene); - } else { - objectAwareness.move(object, oti.getNewLocation()); - sendPacket(object.getOwner(), startScene); - object.createObject(object.getOwner()); - } - new PlayerEventIntent(object.getOwner(), PlayerEvent.PE_ZONE_IN).broadcast(); - } else { - object.setLocation(oti.getNewLocation()); - } - } - private void processGalacticPacketIntent(GalacticPacketIntent gpi) { Packet packet = gpi.getPacket(); if (packet instanceof SelectCharacter) {