diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 231 |
1 files changed, 76 insertions, 155 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 6000293..a353b25 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -272,6 +272,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
272 | } | 272 | } |
273 | } | 273 | } |
274 | 274 | ||
275 | /// <summary> | ||
276 | /// Get the inventory item that hosts ourselves. | ||
277 | /// </summary> | ||
278 | /// <remarks> | ||
279 | /// FIXME: It would be far easier to pass in TaskInventoryItem rather than just m_itemID so that we don't need | ||
280 | /// to keep looking ourselves up. | ||
281 | /// </remarks> | ||
282 | /// <returns></returns> | ||
283 | protected TaskInventoryItem GetSelfInventoryItem() | ||
284 | { | ||
285 | lock (m_host.TaskInventory) | ||
286 | return m_host.TaskInventory[m_itemID]; | ||
287 | } | ||
288 | |||
275 | protected UUID InventoryKey(string name, int type) | 289 | protected UUID InventoryKey(string name, int type) |
276 | { | 290 | { |
277 | m_host.AddScriptLPS(1); | 291 | m_host.AddScriptLPS(1); |
@@ -2685,12 +2699,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2685 | { | 2699 | { |
2686 | m_host.AddScriptLPS(1); | 2700 | m_host.AddScriptLPS(1); |
2687 | 2701 | ||
2688 | TaskInventoryItem item; | 2702 | TaskInventoryItem item = GetSelfInventoryItem(); |
2689 | |||
2690 | lock (m_host.TaskInventory) | ||
2691 | { | ||
2692 | item = m_host.TaskInventory[m_itemID]; | ||
2693 | } | ||
2694 | 2703 | ||
2695 | if (item.PermsGranter == UUID.Zero) | 2704 | if (item.PermsGranter == UUID.Zero) |
2696 | return 0; | 2705 | return 0; |
@@ -2933,15 +2942,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2933 | 2942 | ||
2934 | public void llTakeControls(int controls, int accept, int pass_on) | 2943 | public void llTakeControls(int controls, int accept, int pass_on) |
2935 | { | 2944 | { |
2936 | TaskInventoryItem item; | 2945 | TaskInventoryItem item = GetSelfInventoryItem(); |
2937 | |||
2938 | lock (m_host.TaskInventory) | ||
2939 | { | ||
2940 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
2941 | return; | ||
2942 | else | ||
2943 | item = m_host.TaskInventory[m_itemID]; | ||
2944 | } | ||
2945 | 2946 | ||
2946 | if (item.PermsGranter != UUID.Zero) | 2947 | if (item.PermsGranter != UUID.Zero) |
2947 | { | 2948 | { |
@@ -2961,18 +2962,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2961 | 2962 | ||
2962 | public void llReleaseControls() | 2963 | public void llReleaseControls() |
2963 | { | 2964 | { |
2964 | TaskInventoryItem item; | ||
2965 | |||
2966 | lock (m_host.TaskInventory) | ||
2967 | { | ||
2968 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
2969 | return; | ||
2970 | else | ||
2971 | item = m_host.TaskInventory[m_itemID]; | ||
2972 | } | ||
2973 | |||
2974 | m_host.AddScriptLPS(1); | 2965 | m_host.AddScriptLPS(1); |
2975 | 2966 | ||
2967 | TaskInventoryItem item = GetSelfInventoryItem(); | ||
2968 | |||
2976 | if (item.PermsGranter != UUID.Zero) | 2969 | if (item.PermsGranter != UUID.Zero) |
2977 | { | 2970 | { |
2978 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 2971 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); |
@@ -3004,15 +2997,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3004 | // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) | 2997 | // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) |
3005 | // return; | 2998 | // return; |
3006 | 2999 | ||
3007 | TaskInventoryItem item; | 3000 | TaskInventoryItem item = GetSelfInventoryItem(); |
3008 | |||
3009 | lock (m_host.TaskInventory) | ||
3010 | { | ||
3011 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
3012 | return; | ||
3013 | else | ||
3014 | item = m_host.TaskInventory[m_itemID]; | ||
3015 | } | ||
3016 | 3001 | ||
3017 | if (item.PermsGranter != m_host.OwnerID) | 3002 | if (item.PermsGranter != m_host.OwnerID) |
3018 | return; | 3003 | return; |
@@ -3036,15 +3021,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3036 | if (m_host.ParentGroup.AttachmentPoint == 0) | 3021 | if (m_host.ParentGroup.AttachmentPoint == 0) |
3037 | return; | 3022 | return; |
3038 | 3023 | ||
3039 | TaskInventoryItem item; | 3024 | TaskInventoryItem item = GetSelfInventoryItem(); |
3040 | |||
3041 | lock (m_host.TaskInventory) | ||
3042 | { | ||
3043 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
3044 | return; | ||
3045 | else | ||
3046 | item = m_host.TaskInventory[m_itemID]; | ||
3047 | } | ||
3048 | 3025 | ||
3049 | if (item.PermsGranter != m_host.OwnerID) | 3026 | if (item.PermsGranter != m_host.OwnerID) |
3050 | return; | 3027 | return; |
@@ -3295,15 +3272,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3295 | { | 3272 | { |
3296 | m_host.AddScriptLPS(1); | 3273 | m_host.AddScriptLPS(1); |
3297 | 3274 | ||
3298 | TaskInventoryItem item; | 3275 | TaskInventoryItem item = GetSelfInventoryItem(); |
3299 | |||
3300 | lock (m_host.TaskInventory) | ||
3301 | { | ||
3302 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
3303 | return; | ||
3304 | else | ||
3305 | item = m_host.TaskInventory[m_itemID]; | ||
3306 | } | ||
3307 | 3276 | ||
3308 | if (item.PermsGranter == UUID.Zero) | 3277 | if (item.PermsGranter == UUID.Zero) |
3309 | return; | 3278 | return; |
@@ -3328,15 +3297,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3328 | { | 3297 | { |
3329 | m_host.AddScriptLPS(1); | 3298 | m_host.AddScriptLPS(1); |
3330 | 3299 | ||
3331 | TaskInventoryItem item; | 3300 | TaskInventoryItem item = GetSelfInventoryItem(); |
3332 | |||
3333 | lock (m_host.TaskInventory) | ||
3334 | { | ||
3335 | if (!m_host.TaskInventory.ContainsKey(m_itemID)) | ||
3336 | return; | ||
3337 | else | ||
3338 | item = m_host.TaskInventory[m_itemID]; | ||
3339 | } | ||
3340 | 3301 | ||
3341 | if (item.PermsGranter == UUID.Zero) | 3302 | if (item.PermsGranter == UUID.Zero) |
3342 | return; | 3303 | return; |
@@ -3396,12 +3357,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3396 | if (!UUID.TryParse(agent, out agentID)) | 3357 | if (!UUID.TryParse(agent, out agentID)) |
3397 | return; | 3358 | return; |
3398 | 3359 | ||
3399 | TaskInventoryItem item; | 3360 | TaskInventoryItem item = GetSelfInventoryItem(); |
3400 | |||
3401 | lock (m_host.TaskInventory) | ||
3402 | { | ||
3403 | item = m_host.TaskInventory[m_itemID]; | ||
3404 | } | ||
3405 | 3361 | ||
3406 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions | 3362 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions |
3407 | { | 3363 | { |
@@ -3531,39 +3487,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3531 | { | 3487 | { |
3532 | m_host.AddScriptLPS(1); | 3488 | m_host.AddScriptLPS(1); |
3533 | 3489 | ||
3534 | lock (m_host.TaskInventory) | 3490 | return GetSelfInventoryItem().PermsGranter.ToString(); |
3535 | { | ||
3536 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
3537 | { | ||
3538 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3539 | { | ||
3540 | return item.PermsGranter.ToString(); | ||
3541 | } | ||
3542 | } | ||
3543 | } | ||
3544 | |||
3545 | return UUID.Zero.ToString(); | ||
3546 | } | 3491 | } |
3547 | 3492 | ||
3548 | public LSL_Integer llGetPermissions() | 3493 | public LSL_Integer llGetPermissions() |
3549 | { | 3494 | { |
3550 | m_host.AddScriptLPS(1); | 3495 | m_host.AddScriptLPS(1); |
3551 | 3496 | ||
3552 | lock (m_host.TaskInventory) | 3497 | int perms = GetSelfInventoryItem().PermsMask; |
3553 | { | ||
3554 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
3555 | { | ||
3556 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3557 | { | ||
3558 | int perms = item.PermsMask; | ||
3559 | if (m_automaticLinkPermission) | ||
3560 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
3561 | return perms; | ||
3562 | } | ||
3563 | } | ||
3564 | } | ||
3565 | 3498 | ||
3566 | return 0; | 3499 | if (m_automaticLinkPermission) |
3500 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
3501 | |||
3502 | return perms; | ||
3567 | } | 3503 | } |
3568 | 3504 | ||
3569 | public LSL_Integer llGetLinkNumber() | 3505 | public LSL_Integer llGetLinkNumber() |
@@ -3597,11 +3533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3597 | if (!UUID.TryParse(target, out targetID)) | 3533 | if (!UUID.TryParse(target, out targetID)) |
3598 | return; | 3534 | return; |
3599 | 3535 | ||
3600 | TaskInventoryItem item; | 3536 | TaskInventoryItem item = GetSelfInventoryItem(); |
3601 | lock (m_host.TaskInventory) | ||
3602 | { | ||
3603 | item = m_host.TaskInventory[m_itemID]; | ||
3604 | } | ||
3605 | 3537 | ||
3606 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3538 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
3607 | && !m_automaticLinkPermission) | 3539 | && !m_automaticLinkPermission) |
@@ -3653,14 +3585,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3653 | { | 3585 | { |
3654 | m_host.AddScriptLPS(1); | 3586 | m_host.AddScriptLPS(1); |
3655 | 3587 | ||
3656 | lock (m_host.TaskInventory) | 3588 | if ((GetSelfInventoryItem().PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
3589 | && !m_automaticLinkPermission) | ||
3657 | { | 3590 | { |
3658 | if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3591 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
3659 | && !m_automaticLinkPermission) | 3592 | return; |
3660 | { | ||
3661 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | ||
3662 | return; | ||
3663 | } | ||
3664 | } | 3593 | } |
3665 | 3594 | ||
3666 | if (linknum < ScriptBaseClass.LINK_THIS) | 3595 | if (linknum < ScriptBaseClass.LINK_THIS) |
@@ -4537,23 +4466,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4537 | 4466 | ||
4538 | public LSL_String llGetScriptName() | 4467 | public LSL_String llGetScriptName() |
4539 | { | 4468 | { |
4540 | string result = String.Empty; | ||
4541 | |||
4542 | m_host.AddScriptLPS(1); | 4469 | m_host.AddScriptLPS(1); |
4543 | 4470 | ||
4544 | lock (m_host.TaskInventory) | 4471 | TaskInventoryItem item = GetSelfInventoryItem(); |
4545 | { | ||
4546 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
4547 | { | ||
4548 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
4549 | { | ||
4550 | result = item.Name != null ? item.Name : String.Empty; | ||
4551 | break; | ||
4552 | } | ||
4553 | } | ||
4554 | } | ||
4555 | 4472 | ||
4556 | return result; | 4473 | return item.Name != null ? item.Name : String.Empty; |
4557 | } | 4474 | } |
4558 | 4475 | ||
4559 | public LSL_Integer llGetLinkNumberOfSides(int link) | 4476 | public LSL_Integer llGetLinkNumberOfSides(int link) |
@@ -9655,16 +9572,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9655 | { | 9572 | { |
9656 | m_host.AddScriptLPS(1); | 9573 | m_host.AddScriptLPS(1); |
9657 | 9574 | ||
9658 | lock (m_host.TaskInventory) | 9575 | TaskInventoryItem item = GetSelfInventoryItem(); |
9659 | { | ||
9660 | if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) | ||
9661 | return new LSL_Vector(); | ||
9662 | 9576 | ||
9663 | if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | 9577 | if (item.PermsGranter == UUID.Zero) |
9664 | { | 9578 | return new LSL_Vector(); |
9665 | ShoutError("No permissions to track the camera"); | 9579 | |
9666 | return new LSL_Vector(); | 9580 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
9667 | } | 9581 | { |
9582 | ShoutError("No permissions to track the camera"); | ||
9583 | return new LSL_Vector(); | ||
9668 | } | 9584 | } |
9669 | 9585 | ||
9670 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 9586 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
@@ -9680,16 +9596,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9680 | { | 9596 | { |
9681 | m_host.AddScriptLPS(1); | 9597 | m_host.AddScriptLPS(1); |
9682 | 9598 | ||
9683 | lock (m_host.TaskInventory) | 9599 | TaskInventoryItem item = GetSelfInventoryItem(); |
9684 | { | ||
9685 | if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) | ||
9686 | return new LSL_Rotation(); | ||
9687 | 9600 | ||
9688 | if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | 9601 | if (item.PermsGranter == UUID.Zero) |
9689 | { | 9602 | return new LSL_Rotation(); |
9690 | ShoutError("No permissions to track the camera"); | 9603 | |
9691 | return new LSL_Rotation(); | 9604 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
9692 | } | 9605 | { |
9606 | ShoutError("No permissions to track the camera"); | ||
9607 | return new LSL_Rotation(); | ||
9693 | } | 9608 | } |
9694 | 9609 | ||
9695 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 9610 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
@@ -9865,17 +9780,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9865 | 9780 | ||
9866 | // the object we are in | 9781 | // the object we are in |
9867 | UUID objectID = m_host.ParentUUID; | 9782 | UUID objectID = m_host.ParentUUID; |
9868 | if (objectID == UUID.Zero) return; | 9783 | if (objectID == UUID.Zero) |
9784 | return; | ||
9869 | 9785 | ||
9870 | UUID agentID; | 9786 | TaskInventoryItem item = GetSelfInventoryItem(); |
9871 | lock (m_host.TaskInventory) | ||
9872 | { | ||
9873 | // we need the permission first, to know which avatar we want to set the camera for | ||
9874 | agentID = m_host.TaskInventory[m_itemID].PermsGranter; | ||
9875 | 9787 | ||
9876 | if (agentID == UUID.Zero) return; | 9788 | // we need the permission first, to know which avatar we want to set the camera for |
9877 | if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; | 9789 | UUID agentID = item.PermsGranter; |
9878 | } | 9790 | |
9791 | if (agentID == UUID.Zero) | ||
9792 | return; | ||
9793 | |||
9794 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | ||
9795 | return; | ||
9879 | 9796 | ||
9880 | ScenePresence presence = World.GetScenePresence(agentID); | 9797 | ScenePresence presence = World.GetScenePresence(agentID); |
9881 | 9798 | ||
@@ -9917,21 +9834,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9917 | 9834 | ||
9918 | // the object we are in | 9835 | // the object we are in |
9919 | UUID objectID = m_host.ParentUUID; | 9836 | UUID objectID = m_host.ParentUUID; |
9920 | if (objectID == UUID.Zero) return; | 9837 | if (objectID == UUID.Zero) |
9838 | return; | ||
9839 | |||
9840 | TaskInventoryItem item = GetSelfInventoryItem(); | ||
9921 | 9841 | ||
9922 | // we need the permission first, to know which avatar we want to clear the camera for | 9842 | // we need the permission first, to know which avatar we want to clear the camera for |
9923 | UUID agentID; | 9843 | UUID agentID = item.PermsGranter; |
9924 | lock (m_host.TaskInventory) | 9844 | |
9925 | { | 9845 | if (agentID == UUID.Zero) |
9926 | agentID = m_host.TaskInventory[m_itemID].PermsGranter; | 9846 | return; |
9927 | if (agentID == UUID.Zero) return; | 9847 | |
9928 | if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; | 9848 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
9929 | } | 9849 | return; |
9930 | 9850 | ||
9931 | ScenePresence presence = World.GetScenePresence(agentID); | 9851 | ScenePresence presence = World.GetScenePresence(agentID); |
9932 | 9852 | ||
9933 | // we are not interested in child-agents | 9853 | // we are not interested in child-agents |
9934 | if (presence.IsChildAgent) return; | 9854 | if (presence.IsChildAgent) |
9855 | return; | ||
9935 | 9856 | ||
9936 | presence.ControllingClient.SendClearFollowCamProperties(objectID); | 9857 | presence.ControllingClient.SendClearFollowCamProperties(objectID); |
9937 | } | 9858 | } |