aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs77
1 files changed, 45 insertions, 32 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index fa6e6fc..674144b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -51,7 +51,8 @@ using OpenSim.Region.ScriptEngine.Shared.Api.Runtime;
51using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 51using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
52using OpenSim.Region.ScriptEngine.Shared.CodeTools; 52using OpenSim.Region.ScriptEngine.Shared.CodeTools;
53using OpenSim.Region.ScriptEngine.Interfaces; 53using OpenSim.Region.ScriptEngine.Interfaces;
54using System.Diagnostics; 54
55using System.Diagnostics; //for [DebuggerNonUserCode]
55 56
56namespace OpenSim.Region.ScriptEngine.Shared.Instance 57namespace OpenSim.Region.ScriptEngine.Shared.Instance
57{ 58{
@@ -256,8 +257,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
256 StartParam = startParam; 257 StartParam = startParam;
257 m_MaxScriptQueue = maxScriptQueue; 258 m_MaxScriptQueue = maxScriptQueue;
258 m_postOnRez = postOnRez; 259 m_postOnRez = postOnRez;
259 m_AttachedAvatar = Part.ParentGroup.AttachedAvatar; 260 m_AttachedAvatar = part.ParentGroup.AttachedAvatar;
260 m_RegionID = Part.ParentGroup.Scene.RegionInfo.RegionID; 261 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID;
261 262
262 m_SaveState = StatePersistedHere; 263 m_SaveState = StatePersistedHere;
263 264
@@ -456,27 +457,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
456 PostEvent(new EventParams("attach", 457 PostEvent(new EventParams("attach",
457 new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); 458 new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0]));
458 } 459 }
460
459 } 461 }
460 } 462 }
461 463
462 private void ReleaseControls() 464 private void ReleaseControls()
463 { 465 {
464 int permsMask; 466 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
465 UUID permsGranter; 467
466 lock (Part.TaskInventory) 468 if (part != null)
467 { 469 {
468 if (!Part.TaskInventory.ContainsKey(ItemID)) 470 int permsMask;
471 UUID permsGranter;
472 part.TaskInventory.LockItemsForRead(true);
473 if (!part.TaskInventory.ContainsKey(ItemID))
474 {
475 part.TaskInventory.LockItemsForRead(false);
469 return; 476 return;
477 }
478 permsGranter = part.TaskInventory[ItemID].PermsGranter;
479 permsMask = part.TaskInventory[ItemID].PermsMask;
480 part.TaskInventory.LockItemsForRead(false);
470 481
471 permsGranter = Part.TaskInventory[ItemID].PermsGranter; 482 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
472 permsMask = Part.TaskInventory[ItemID].PermsMask; 483 {
473 } 484 ScenePresence presence = Engine.World.GetScenePresence(permsGranter);
474 485 if (presence != null)
475 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 486 presence.UnRegisterControlEventsToScript(LocalID, ItemID);
476 { 487 }
477 ScenePresence presence = Engine.World.GetScenePresence(permsGranter);
478 if (presence != null)
479 presence.UnRegisterControlEventsToScript(LocalID, ItemID);
480 } 488 }
481 } 489 }
482 490
@@ -639,6 +647,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
639 return true; 647 return true;
640 } 648 }
641 649
650 [DebuggerNonUserCode] //Prevents the debugger from farting in this function
642 public void SetState(string state) 651 public void SetState(string state)
643 { 652 {
644 if (state == State) 653 if (state == State)
@@ -764,6 +773,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
764 /// <returns></returns> 773 /// <returns></returns>
765 public object EventProcessor() 774 public object EventProcessor()
766 { 775 {
776 EventParams data = null;
767 // We check here as the thread stopping this instance from running may itself hold the m_Script lock. 777 // We check here as the thread stopping this instance from running may itself hold the m_Script lock.
768 if (!Running) 778 if (!Running)
769 return 0; 779 return 0;
@@ -850,7 +860,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
850 Part.ParentGroup.UUID, 860 Part.ParentGroup.UUID,
851 Part.AbsolutePosition, 861 Part.AbsolutePosition,
852 Part.ParentGroup.Scene.Name); 862 Part.ParentGroup.Scene.Name);
853
854 AsyncCommandManager.StateChange(Engine, 863 AsyncCommandManager.StateChange(Engine,
855 LocalID, ItemID); 864 LocalID, ItemID);
856 // we are effectively in the new state now, so we can resume queueing 865 // we are effectively in the new state now, so we can resume queueing
@@ -867,6 +876,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
867 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", 876 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
868 // PrimName, ScriptName, data.EventName, State); 877 // PrimName, ScriptName, data.EventName, State);
869 878
879
870 try 880 try
871 { 881 {
872 m_CurrentEvent = data.EventName; 882 m_CurrentEvent = data.EventName;
@@ -931,15 +941,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
931 catch (Exception) 941 catch (Exception)
932 { 942 {
933 } 943 }
934 // catch (Exception e2) // LEGIT: User Scripting
935 // {
936 // m_log.Error("[SCRIPT]: "+
937 // "Error displaying error in-world: " +
938 // e2.ToString());
939 // m_log.Error("[SCRIPT]: " +
940 // "Errormessage: Error compiling script:\r\n" +
941 // e.ToString());
942 // }
943 } 944 }
944 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException)) 945 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
945 { 946 {
@@ -1012,15 +1013,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1012 ReleaseControls(); 1013 ReleaseControls();
1013 1014
1014 Stop(timeout); 1015 Stop(timeout);
1015 Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 1016 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
1016 Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 1017 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
1018 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
1019 part.CollisionSound = UUID.Zero;
1017 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 1020 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
1021
1022 m_TimerQueued = false;
1023 m_StateChangeInProgress = false;
1018 EventQueue.Clear(); 1024 EventQueue.Clear();
1025
1019 m_Script.ResetVars(); 1026 m_Script.ResetVars();
1020 StartParam = 0; 1027 StartParam = 0;
1021 State = "default"; 1028 State = "default";
1022 1029
1023 Part.SetScriptEvents(ItemID, 1030
1031 part.SetScriptEvents(ItemID,
1024 (int)m_Script.GetStateEventFlags(State)); 1032 (int)m_Script.GetStateEventFlags(State));
1025 if (running) 1033 if (running)
1026 Start(); 1034 Start();
@@ -1031,6 +1039,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1031 new Object[0], new DetectParams[0])); 1039 new Object[0], new DetectParams[0]));
1032 } 1040 }
1033 1041
1042 [DebuggerNonUserCode] //Stops the VS debugger from farting in this function
1034 public void ApiResetScript() 1043 public void ApiResetScript()
1035 { 1044 {
1036 // bool running = Running; 1045 // bool running = Running;
@@ -1039,17 +1048,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1039 ReleaseControls(); 1048 ReleaseControls();
1040 1049
1041 m_Script.ResetVars(); 1050 m_Script.ResetVars();
1042 Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 1051 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
1043 Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 1052 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
1053 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
1054 part.CollisionSound = UUID.Zero;
1044 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 1055 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
1045 1056
1057 m_TimerQueued = false;
1058 m_StateChangeInProgress = false;
1046 EventQueue.Clear(); 1059 EventQueue.Clear();
1047 m_Script.ResetVars(); 1060 m_Script.ResetVars();
1048 string oldState = State; 1061 string oldState = State;
1049 StartParam = 0; 1062 StartParam = 0;
1050 State = "default"; 1063 State = "default";
1051 1064
1052 Part.SetScriptEvents(ItemID, 1065 part.SetScriptEvents(ItemID,
1053 (int)m_Script.GetStateEventFlags(State)); 1066 (int)m_Script.GetStateEventFlags(State));
1054 1067
1055 if (m_CurrentEvent != "state_entry" || oldState != "default") 1068 if (m_CurrentEvent != "state_entry" || oldState != "default")