From 77082148abd36cbc9f6f44246acbb2894bdd5a7e Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 1 Nov 2020 19:56:36 +0000 Subject: [PATCH] mantis 8793: break link even if it is the script prim; adicialy standup all avatars as spec. Don't like this standup it is fundamentaly silly done on all cases, may review this later --- .../Shared/Api/Implementation/LSL_Api.cs | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 4ac76c7d08..9d24524491 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4586,56 +4586,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (linknum < ScriptBaseClass.LINK_THIS) return; - SceneObjectGroup parentPrim = m_host.ParentGroup; + SceneObjectGroup parentSOG = m_host.ParentGroup; - if (parentPrim.AttachmentPoint != 0) + if (parentSOG.AttachmentPoint != 0) return; // Fail silently if attached SceneObjectPart childPrim = null; switch (linknum) { case ScriptBaseClass.LINK_ROOT: - break; case ScriptBaseClass.LINK_SET: case ScriptBaseClass.LINK_ALL_OTHERS: case ScriptBaseClass.LINK_ALL_CHILDREN: - case ScriptBaseClass.LINK_THIS: - foreach (SceneObjectPart part in parentPrim.Parts) - { - if (part.UUID != m_host.UUID) - { - childPrim = part; - break; - } - } + break; + case ScriptBaseClass.LINK_THIS: // not as spec + childPrim = m_host; break; default: - childPrim = parentPrim.GetLinkNumPart(linknum); - if (childPrim.UUID == m_host.UUID) - childPrim = null; + childPrim = parentSOG.GetLinkNumPart(linknum); break; } if (linknum == ScriptBaseClass.LINK_ROOT) { - // Restructuring Multiple Prims. - List parts = new List(parentPrim.Parts); - parts.Remove(parentPrim.RootPart); + List avs = parentSOG.GetSittingAvatars(); + foreach (ScenePresence av in avs) + av.StandUp(); + + List parts = new List(parentSOG.Parts); + parts.Remove(parentSOG.RootPart); if (parts.Count > 0) { try { foreach (SceneObjectPart part in parts) { - parentPrim.DelinkFromGroup(part.LocalId, true); + parentSOG.DelinkFromGroup(part.LocalId, true); } } finally { } } - parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); - parentPrim.TriggerScriptChangedEvent(Changed.LINK); + parentSOG.HasGroupChanged = true; + parentSOG.ScheduleGroupForFullUpdate(); + parentSOG.TriggerScriptChangedEvent(Changed.LINK); if (parts.Count > 0) { @@ -4661,10 +4655,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (childPrim == null) return; - parentPrim.DelinkFromGroup(childPrim.LocalId, true); - parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); - parentPrim.TriggerScriptChangedEvent(Changed.LINK); + List avs = parentSOG.GetSittingAvatars(); + foreach (ScenePresence av in avs) + av.StandUp(); + + parentSOG.DelinkFromGroup(childPrim.LocalId, true); } } @@ -4724,9 +4719,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { linknum -= (m_host.ParentGroup.PrimCount) + 1; - if (linknum < 0) - return ScriptBaseClass.NULL_KEY; - List avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET); if (avatars.Count > linknum) {