From 16ba7ae82cb2e9323e7bf527a57079bf4cfeb634 Mon Sep 17 00:00:00 2001
From: Todd Stinson <stinson@lindenlab.com>
Date: Tue, 26 Jun 2012 14:47:50 -0700
Subject: [PATCH] Updating the teleport-me-to-it behavior for the characters
 and linksets.  Firstly, to remove the direct call to gAgent.teleportRequest()
 which is being made into a private function.  Secondly, to check the viewer
 object list to see if the object exists there, and if so, to use that
 location as the teleport destination.

---
 indra/newview/llfloaterpathfindingobjects.cpp | 23 ++++++++++++-------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp
index 9bfbc582bdb..eb18fa00d5a 100644
--- a/indra/newview/llfloaterpathfindingobjects.cpp
+++ b/indra/newview/llfloaterpathfindingobjects.cpp
@@ -57,9 +57,10 @@
 #include "llviewerobject.h"
 #include "llviewerobjectlist.h"
 #include "llviewerregion.h"
-#include "v4color.h"
 #include "pipeline.h"
-#include "llfloaterreg.h"
+#include "v3dmath.h"
+#include "v3math.h"
+#include "v4color.h"
 
 #define DEFAULT_BEACON_WIDTH 6
 
@@ -488,14 +489,20 @@ void LLFloaterPathfindingObjects::teleportToSelectedObject()
 		std::vector<LLScrollListItem*>::const_reference selectedItemRef = selectedItems.front();
 		const LLScrollListItem *selectedItem = selectedItemRef;
 		llassert(mObjectList != NULL);
-		const LLPathfindingObjectPtr objectPtr = mObjectList->find(selectedItem->getUUID().asString());
-		const LLVector3 &objectLocation = objectPtr->getLocation();
-
-		LLViewerRegion* region = gAgent.getRegion();
-		if (region != NULL)
+		LLVector3d teleportLocation;
+		LLViewerObject *viewerObject = gObjectList.findObject(selectedItem->getUUID());
+		if (viewerObject == NULL)
+		{
+			// If we cannot find the object in the viewer list, teleport to the last reported position
+			const LLPathfindingObjectPtr objectPtr = mObjectList->find(selectedItem->getUUID().asString());
+			teleportLocation = gAgent.getPosGlobalFromAgent(objectPtr->getLocation());
+		}
+		else
 		{
-			gAgent.teleportRequest(region->getHandle(), objectLocation, true);
+			// If we can find the object in the viewer list, teleport to the known current position
+			teleportLocation = viewerObject->getPositionGlobal();
 		}
+		gAgent.teleportViaLocationLookAt(teleportLocation);
 	}
 }
 
-- 
GitLab