* Implementation of LSL llBreakLink and llBreakAllLinks
* Thanks Y. Nitta!
0.6.0-stable
Justin Clarke Casey 2008-09-16 17:48:57 +00:00
parent 7212b06ca9
commit c6dfc99f22
2 changed files with 135 additions and 4 deletions

View File

@ -2986,13 +2986,78 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llBreakLink(int linknum) public void llBreakLink(int linknum)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llBreakLink"); UUID invItemID = InventorySelf();
if ((m_host.TaskInventory[invItemID].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_CHANGE_LINKS) == 0)
{
ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
return;
}
if (linknum < BuiltIn_Commands_BaseClass.LINK_THIS)
return;
SceneObjectGroup parentPrim = m_host.ParentGroup;
SceneObjectPart childPrim = null;
switch(linknum)
{
case BuiltIn_Commands_BaseClass.LINK_ROOT:
break;
case BuiltIn_Commands_BaseClass.LINK_SET:
case BuiltIn_Commands_BaseClass.LINK_ALL_OTHERS:
case BuiltIn_Commands_BaseClass.LINK_ALL_CHILDREN:
case BuiltIn_Commands_BaseClass.LINK_THIS:
foreach(SceneObjectPart part in parentPrim.Children.Values)
{
if (part.UUID != m_host.UUID)
{
childPrim = part;
break;
}
}
break;
default:
childPrim = parentPrim.GetLinkNumPart(linknum);
if (childPrim.UUID == m_host.UUID)
childPrim = null;
break;
}
if (linknum == BuiltIn_Commands_BaseClass.LINK_ROOT)
{
// Restructuring Multiple Prims.
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
parts.Remove(parentPrim.RootPart);
foreach (SceneObjectPart part in parts)
{
parentPrim.DelinkFromGroup(part.LocalId, true);
}
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
if (parts.Count > 0) {
SceneObjectPart newRoot = parts[0];
parts.Remove(newRoot);
foreach (SceneObjectPart part in parts)
{
part.UpdateFlag = 0;
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
}
}
}
else
{
if (childPrim == null)
return;
parentPrim.DelinkFromGroup(childPrim.LocalId, true);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
} }
public void llBreakAllLinks() public void llBreakAllLinks()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llBreakAllLinks"); SceneObjectGroup parentPrim = m_host.ParentGroup;
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
parts.Remove(parentPrim.RootPart);
foreach (SceneObjectPart part in parts) {
parentPrim.DelinkFromGroup(part.LocalId, true);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
} }
public string llGetLinkKey(int linknum) public string llGetLinkKey(int linknum)

View File

@ -2830,13 +2830,79 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llBreakLink(int linknum) public void llBreakLink(int linknum)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llBreakLink"); UUID invItemID = InventorySelf();
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0)
{
ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
return;
}
if (linknum < ScriptBaseClass.LINK_THIS)
return;
SceneObjectGroup parentPrim = m_host.ParentGroup;
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.Children.Values)
{
if (part.UUID != m_host.UUID)
{
childPrim = part;
break;
}
}
break;
default:
childPrim = parentPrim.GetLinkNumPart(linknum);
if (childPrim.UUID == m_host.UUID)
childPrim = null;
break;
}
if (linknum == ScriptBaseClass.LINK_ROOT)
{
// Restructuring Multiple Prims.
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
parts.Remove(parentPrim.RootPart);
foreach (SceneObjectPart part in parts)
{
parentPrim.DelinkFromGroup(part.LocalId, true);
}
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
if (parts.Count > 0) {
SceneObjectPart newRoot = parts[0];
parts.Remove(newRoot);
foreach (SceneObjectPart part in parts)
{
part.UpdateFlag = 0;
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
}
}
}
else
{
if (childPrim == null)
return;
parentPrim.DelinkFromGroup(childPrim.LocalId, true);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
} }
public void llBreakAllLinks() public void llBreakAllLinks()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llBreakAllLinks"); SceneObjectGroup parentPrim = m_host.ParentGroup;
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
parts.Remove(parentPrim.RootPart);
foreach (SceneObjectPart part in parts)
{
parentPrim.DelinkFromGroup(part.LocalId, true);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
} }
public LSL_Types.LSLString llGetLinkKey(int linknum) public LSL_Types.LSLString llGetLinkKey(int linknum)