From c687bf112b7bcbfdcb00c0afe35e7be619b911c8 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Thu, 7 Jan 2016 12:15:18 -0600 Subject: [PATCH] Fixed bug when leaving a building despawns everything --- src/services/objects/ObjectAwareness.java | 26 +++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 61d1bb432..10e6fbd3b 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -166,7 +166,8 @@ public class ObjectAwareness extends Service { DataTransformWithParent transformWithParent = (DataTransformWithParent) packet; SWGObject object = i.getObjectManager().getObjectById(transformWithParent.getObjectId()); SWGObject parent = i.getObjectManager().getObjectById(transformWithParent.getCellId()); - moveObject(object, parent, transformWithParent); + if (object instanceof CreatureObject) + moveObject((CreatureObject) object, parent, transformWithParent); } } @@ -193,7 +194,7 @@ public class ObjectAwareness extends Service { obj.sendDataTransforms(transform); } - private void moveObject(SWGObject obj, SWGObject parent, DataTransformWithParent transformWithParent) { + private void moveObject(CreatureObject obj, SWGObject parent, DataTransformWithParent transformWithParent) { Location newLocation = transformWithParent.getLocation(); newLocation.setTerrain(obj.getTerrain()); if (parent == null) { @@ -201,8 +202,19 @@ public class ObjectAwareness extends Service { 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(); + double time = ((CreatureObject) obj).getTimeSinceLastTransform() / 1000; + obj.updateLastTransformTime(); + Location l = obj.getWorldLocation(); + Location nWorld = new Location(newLocation.getX(), 0, newLocation.getZ(), parent.getTerrain()); + nWorld.translateLocation(parent.getWorldLocation()); + double speed = Math.sqrt(square(l.getX()-nWorld.getX()) + square(l.getZ()-nWorld.getZ())) / time; + if (speed > obj.getMovementScale()*7.3) { + double angle = (nWorld.getX() == l.getX() ? 0 : Math.atan2(nWorld.getZ()-l.getZ(), nWorld.getX()-l.getX())) + Math.PI; + newLocation.setX(newLocation.getX()+obj.getMovementScale()*7.3*time*invertNormalizedValue(Math.cos(angle))); + newLocation.setZ(newLocation.getZ()+obj.getMovementScale()*7.3*time*invertNormalizedValue(Math.sin(angle))); + transformWithParent.setSpeed((float) (obj.getMovementScale()*7.3)); + } + new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast(); move(obj, parent, newLocation, true); obj.sendParentDataTransforms(transformWithParent); } @@ -217,6 +229,12 @@ public class ObjectAwareness extends Service { return object.getParent() == null && !(object instanceof StaticObject); } + private double invertNormalizedValue(double x) { + if (x < 0) + return -1 - x; + return 1-x; + } + /** * Adds the specified object to the awareness quadtree * @param object the object to add