diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d5fc9a6..249b4dd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2830,13 +2830,79 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2830 | public void llBreakLink(int linknum) | 2830 | public void llBreakLink(int linknum) |
2831 | { | 2831 | { |
2832 | m_host.AddScriptLPS(1); | 2832 | m_host.AddScriptLPS(1); |
2833 | NotImplemented("llBreakLink"); | 2833 | UUID invItemID = InventorySelf(); |
2834 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0) | ||
2835 | { | ||
2836 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | ||
2837 | return; | ||
2838 | } | ||
2839 | if (linknum < ScriptBaseClass.LINK_THIS) | ||
2840 | return; | ||
2841 | SceneObjectGroup parentPrim = m_host.ParentGroup; | ||
2842 | SceneObjectPart childPrim = null; | ||
2843 | switch(linknum) | ||
2844 | { | ||
2845 | case ScriptBaseClass.LINK_ROOT: | ||
2846 | break; | ||
2847 | case ScriptBaseClass.LINK_SET: | ||
2848 | case ScriptBaseClass.LINK_ALL_OTHERS: | ||
2849 | case ScriptBaseClass.LINK_ALL_CHILDREN: | ||
2850 | case ScriptBaseClass.LINK_THIS: | ||
2851 | foreach(SceneObjectPart part in parentPrim.Children.Values) | ||
2852 | { | ||
2853 | if (part.UUID != m_host.UUID) | ||
2854 | { | ||
2855 | childPrim = part; | ||
2856 | break; | ||
2857 | } | ||
2858 | } | ||
2859 | break; | ||
2860 | default: | ||
2861 | childPrim = parentPrim.GetLinkNumPart(linknum); | ||
2862 | if (childPrim.UUID == m_host.UUID) | ||
2863 | childPrim = null; | ||
2864 | break; | ||
2865 | } | ||
2866 | if (linknum == ScriptBaseClass.LINK_ROOT) | ||
2867 | { | ||
2868 | // Restructuring Multiple Prims. | ||
2869 | List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values); | ||
2870 | parts.Remove(parentPrim.RootPart); | ||
2871 | foreach (SceneObjectPart part in parts) | ||
2872 | { | ||
2873 | parentPrim.DelinkFromGroup(part.LocalId, true); | ||
2874 | } | ||
2875 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); | ||
2876 | if (parts.Count > 0) { | ||
2877 | SceneObjectPart newRoot = parts[0]; | ||
2878 | parts.Remove(newRoot); | ||
2879 | foreach (SceneObjectPart part in parts) | ||
2880 | { | ||
2881 | part.UpdateFlag = 0; | ||
2882 | newRoot.ParentGroup.LinkToGroup(part.ParentGroup); | ||
2883 | } | ||
2884 | } | ||
2885 | } | ||
2886 | else | ||
2887 | { | ||
2888 | if (childPrim == null) | ||
2889 | return; | ||
2890 | parentPrim.DelinkFromGroup(childPrim.LocalId, true); | ||
2891 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); | ||
2892 | } | ||
2834 | } | 2893 | } |
2835 | 2894 | ||
2836 | public void llBreakAllLinks() | 2895 | public void llBreakAllLinks() |
2837 | { | 2896 | { |
2838 | m_host.AddScriptLPS(1); | 2897 | m_host.AddScriptLPS(1); |
2839 | NotImplemented("llBreakAllLinks"); | 2898 | SceneObjectGroup parentPrim = m_host.ParentGroup; |
2899 | List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values); | ||
2900 | parts.Remove(parentPrim.RootPart); | ||
2901 | foreach (SceneObjectPart part in parts) | ||
2902 | { | ||
2903 | parentPrim.DelinkFromGroup(part.LocalId, true); | ||
2904 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); | ||
2905 | } | ||
2840 | } | 2906 | } |
2841 | 2907 | ||
2842 | public LSL_Types.LSLString llGetLinkKey(int linknum) | 2908 | public LSL_Types.LSLString llGetLinkKey(int linknum) |