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

This commit is contained in:
UbitUmarov
2020-11-01 19:56:36 +00:00
parent 2b72df84de
commit 77082148ab

View File

@@ -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<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Parts);
parts.Remove(parentPrim.RootPart);
List<ScenePresence> avs = parentSOG.GetSittingAvatars();
foreach (ScenePresence av in avs)
av.StandUp();
List<SceneObjectPart> parts = new List<SceneObjectPart>(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<ScenePresence> 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<ScenePresence> avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET);
if (avatars.Count > linknum)
{