public void llBreakLink(int linknum)
{
if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return;
UUID invItemID = InventorySelf();
lock (m_host.TaskInventory)
{
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
&& !m_automaticLinkPermission)
{
ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
return;
}
}
if (linknum < ScriptBaseClass.LINK_THIS)
return;
ISceneEntity parentPrim = m_host.ParentEntity;
if (parentPrim.RootChild.AttachmentPoint != 0)
return; // Fail silently if attached
ISceneChildEntity childPrim = null;
if (linknum == ScriptBaseClass.LINK_ROOT)
{
}
else if (linknum == ScriptBaseClass.LINK_SET ||
ScriptBaseClass.LINK_ALL_OTHERS ||
ScriptBaseClass.LINK_ALL_CHILDREN ||
ScriptBaseClass.LINK_THIS)
{
foreach (ISceneChildEntity part in parentPrim.ChildrenEntities())
{
if (part.UUID != m_host.UUID)
{
childPrim = part;
break;
}
}
}
else
{
IEntity target = m_host.ParentEntity.GetLinkNumPart(linknum);
if (target is ISceneChildEntity)
{
childPrim = target as ISceneChildEntity;
}
else
return;
if (childPrim.UUID == m_host.UUID)
childPrim = null;
}
if (linknum == ScriptBaseClass.LINK_ROOT)
{
// Restructuring Multiple Prims.
List<ISceneChildEntity> parts = new List<ISceneChildEntity>(parentPrim.ChildrenEntities());
parts.Remove(parentPrim.RootChild);
foreach (ISceneChildEntity part in parts)
{
parentPrim.DelinkFromGroup(part, true);
}
parentPrim.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
if (parts.Count > 0)
{
ISceneChildEntity newRoot = parts[0];
parts.Remove(newRoot);
foreach (ISceneChildEntity part in parts)
{
newRoot.ParentEntity.LinkToGroup(part.ParentEntity);
}
newRoot.ParentEntity.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate);
}
}
else
{
if (childPrim == null)
return;
parentPrim.DelinkFromGroup(childPrim, true);
childPrim.ParentEntity.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate);
parentPrim.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
}