diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 77 |
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; | |||
51 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 51 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
52 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | 52 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; |
53 | using OpenSim.Region.ScriptEngine.Interfaces; | 53 | using OpenSim.Region.ScriptEngine.Interfaces; |
54 | using System.Diagnostics; | 54 | |
55 | using System.Diagnostics; //for [DebuggerNonUserCode] | ||
55 | 56 | ||
56 | namespace OpenSim.Region.ScriptEngine.Shared.Instance | 57 | namespace 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") |