diff --git a/src/services/ConversationService.java b/src/services/ConversationService.java index b2b3854a..29dd18ec 100644 --- a/src/services/ConversationService.java +++ b/src/services/ConversationService.java @@ -57,6 +57,8 @@ public class ConversationService implements INetworkDispatch { if(player.getConversingNpc() != null && player.getConversingNpc() != npc) handleEndConversation(player, player.getConversingNpc()); + core.simulationService.faceTarget(npc, player); + player.setConversingNpc(npc); sendStartConversation(player, npc); core.scriptService.callScript("scripts/conversation/", (String) npc.getAttachment("conversationFile"), "startConversation", core, player, npc); diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index d4a36364..97d2e06f 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -953,6 +953,31 @@ public class SimulationService implements INetworkDispatch { transform(object, radians, object.getPosition()); } + public void faceTarget(SWGObject object, SWGObject target) { + float direction = (float) Math.atan2(target.getWorldPosition().x - object.getWorldPosition().x, target.getWorldPosition().z - object.getWorldPosition().z); + + if (direction < 0) { + direction = (float) (2 * Math.PI + direction); + } + + if (Math.abs(direction - object.getRadians()) < 0.05) { + return; + } + + Quaternion quaternion = new Quaternion((float) Math.cos(direction / 2), 0, (float) Math.sin(direction / 2), 0); + + if (quaternion.y < 0.0f && quaternion.w > 0.0f) { + quaternion.y *= -1; + quaternion.w *= -1; + } + + if (object.getContainer() instanceof CellObject) { + NGECore.getInstance().simulationService.moveObject(object, object.getPosition(), quaternion, object.getMovementCounter(), 0, (CellObject) object.getContainer()); + } else { + NGECore.getInstance().simulationService.moveObject(object, object.getPosition(), quaternion, object.getMovementCounter(), 0, null); + } + } + public void teleport(SWGObject obj, Point3D position, Quaternion orientation, long cellId) { if(cellId == 0) {