From 57c8d82c9e3d55581982a75a02d1f54bc547fb50 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 2 Jun 2013 23:53:20 +0200
Subject: Fix llTeleportAgentGlobalCoords

---
 .../Shared/Api/Implementation/LSL_Api.cs           | 27 +++++++++++++---------
 1 file changed, 16 insertions(+), 11 deletions(-)

(limited to 'OpenSim/Region/ScriptEngine/Shared/Api')

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5af2a8d..5ea14c7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -4679,24 +4679,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             m_host.AddScriptLPS(1);
             UUID agentId = new UUID();
 
-            ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y);
+            ulong regionHandle = Utils.UIntsToLong((uint)(global_coords.x / 256) * 256, (uint)(global_coords.y / 256) * 256);
 
             if (UUID.TryParse(agent, out agentId))
             {
+                // This function is owner only!
+                if (m_host.OwnerID != agentId)
+                    return;
+
                 ScenePresence presence = World.GetScenePresence(agentId);
+
+                // Can't TP sitting avatars
+                if (presence.ParentID != 0) // Sitting
+                    return;
+
                 if (presence != null && presence.PresenceType != PresenceType.Npc)
                 {
-                    // agent must not be a god
-                    if (presence.GodLevel >= 200) return;
-
-                    // agent must be over the owners land
-                    if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
-                    {
-                        World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
-                    }
-                    else // or must be wearing the prim
+                    if (m_item.PermsGranter == agentId)
                     {
-                        if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID)
+                        // If attached using llAttachToAvatarTemp, cowardly refuse
+                        if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
+                            return;
+
+                        if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
                         {
                             World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
                         }
-- 
cgit v1.1