aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs231
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 }