diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fc6bec1824..0cc88297f9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4641,7 +4641,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(agent, out agentId)) { ScenePresence presence = World.GetScenePresence(agentId); - if (presence != null) + if (presence != null && presence.PresenceType != PresenceType.Npc) { // agent must not be a god if (presence.UserLevel >= 200) return; @@ -4650,7 +4650,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.OwnerID == World.LandChannel.GetLandObject( presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) { - World.TeleportClientHome(agentId, presence.ControllingClient); + if (!World.TeleportClientHome(agentId, presence.ControllingClient)) + { + // They can't be teleported home for some reason + GridRegion regionInfo = World.GridService.GetRegionByUUID(UUID.Zero, new UUID("2b02daac-e298-42fa-9a75-f488d37896e6")); + if (regionInfo != null) + { + World.RequestTeleportLocation( + presence.ControllingClient, regionInfo.RegionHandle, new Vector3(128, 128, 23), Vector3.Zero, + (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); + } + } } } } @@ -4664,7 +4674,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(agent, out agentId)) { ScenePresence presence = World.GetScenePresence(agentId); - if (presence != null) + if (presence != null && presence.PresenceType != PresenceType.Npc) { // agent must not be a god if (presence.UserLevel >= 200) return; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 2424130c08..a9b8e0454e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2265,6 +2265,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string groupTitle = String.Empty; + if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z))) + return new LSL_Key(UUID.Zero.ToString()); + if (firstname != String.Empty || lastname != String.Empty) { if (firstname != "Shown outfit:") @@ -2594,8 +2597,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID npcId = new UUID(npc.m_string); - if (!module.CheckPermissions(npcId, m_host.OwnerID)) - return; + ILandObject l = World.LandChannel.GetLandObject(m_host.GroupPosition.X, m_host.GroupPosition.Y); + if (l == null || m_host.OwnerID != l.LandData.OwnerID) + { + if (!module.CheckPermissions(npcId, m_host.OwnerID)) + return; + } module.DeleteNPC(npcId, World); } diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 9e6752c10f..8adf4c5bc8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -858,7 +858,7 @@ namespace OpenSim.Region.ScriptEngine.Shared ret = Math.Sign(Quaternion.Mag(l) - Quaternion.Mag(r)); } - if (ascending == 0) + if (ascending != 1) { ret = 0 - ret; } @@ -891,6 +891,9 @@ namespace OpenSim.Region.ScriptEngine.Shared stride = 1; } + if ((Data.Length % stride) != 0) + return new list(ret); + // we can optimize here in the case where stride == 1 and the list // consists of homogeneous types @@ -910,7 +913,7 @@ namespace OpenSim.Region.ScriptEngine.Shared if (homogeneous) { Array.Sort(ret, new HomogeneousComparer()); - if (ascending == 0) + if (ascending != 1) { Array.Reverse(ret); }