diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 172 |
1 files changed, 96 insertions, 76 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 669cc37..c8ced43 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -30,6 +30,7 @@ using System.Collections; | |||
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Globalization; | 31 | using System.Globalization; |
32 | using System.IO; | 32 | using System.IO; |
33 | using System.Diagnostics; //for [DebuggerNonUserCode] | ||
33 | using System.Reflection; | 34 | using System.Reflection; |
34 | using System.Runtime.Remoting; | 35 | using System.Runtime.Remoting; |
35 | using System.Runtime.Remoting.Lifetime; | 36 | using System.Runtime.Remoting.Lifetime; |
@@ -165,13 +166,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
165 | 166 | ||
166 | public UUID ItemID { get; private set; } | 167 | public UUID ItemID { get; private set; } |
167 | 168 | ||
168 | public UUID ObjectID { get { return Part.UUID; } } | 169 | public UUID ObjectID { get; private set; } |
169 | 170 | ||
170 | public uint LocalID { get { return Part.LocalId; } } | 171 | public uint LocalID { get; private set; } |
171 | 172 | ||
172 | public UUID RootObjectID { get { return Part.ParentGroup.UUID; } } | 173 | public UUID RootObjectID { get; private set; } |
173 | 174 | ||
174 | public uint RootLocalID { get { return Part.ParentGroup.LocalId; } } | 175 | public uint RootLocalID { get; private set; } |
175 | 176 | ||
176 | public UUID AssetID { get; private set; } | 177 | public UUID AssetID { get; private set; } |
177 | 178 | ||
@@ -235,8 +236,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
235 | StartParam = startParam; | 236 | StartParam = startParam; |
236 | m_MaxScriptQueue = maxScriptQueue; | 237 | m_MaxScriptQueue = maxScriptQueue; |
237 | m_postOnRez = postOnRez; | 238 | m_postOnRez = postOnRez; |
238 | m_AttachedAvatar = Part.ParentGroup.AttachedAvatar; | 239 | m_AttachedAvatar = part.ParentGroup.AttachedAvatar; |
239 | m_RegionID = Part.ParentGroup.Scene.RegionInfo.RegionID; | 240 | m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; |
240 | 241 | ||
241 | if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") | 242 | if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") |
242 | { | 243 | { |
@@ -481,27 +482,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
481 | PostEvent(new EventParams("attach", | 482 | PostEvent(new EventParams("attach", |
482 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); | 483 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); |
483 | } | 484 | } |
485 | |||
484 | } | 486 | } |
485 | } | 487 | } |
486 | 488 | ||
487 | private void ReleaseControls() | 489 | private void ReleaseControls() |
488 | { | 490 | { |
489 | int permsMask; | 491 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); |
490 | UUID permsGranter; | 492 | |
491 | lock (Part.TaskInventory) | 493 | if (part != null) |
492 | { | 494 | { |
493 | if (!Part.TaskInventory.ContainsKey(ItemID)) | 495 | int permsMask; |
496 | UUID permsGranter; | ||
497 | part.TaskInventory.LockItemsForRead(true); | ||
498 | if (!part.TaskInventory.ContainsKey(ItemID)) | ||
499 | { | ||
500 | part.TaskInventory.LockItemsForRead(false); | ||
494 | return; | 501 | return; |
502 | } | ||
503 | permsGranter = part.TaskInventory[ItemID].PermsGranter; | ||
504 | permsMask = part.TaskInventory[ItemID].PermsMask; | ||
505 | part.TaskInventory.LockItemsForRead(false); | ||
495 | 506 | ||
496 | permsGranter = Part.TaskInventory[ItemID].PermsGranter; | 507 | if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) |
497 | permsMask = Part.TaskInventory[ItemID].PermsMask; | 508 | { |
498 | } | 509 | ScenePresence presence = Engine.World.GetScenePresence(permsGranter); |
499 | 510 | if (presence != null) | |
500 | if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) | 511 | presence.UnRegisterControlEventsToScript(LocalID, ItemID); |
501 | { | 512 | } |
502 | ScenePresence presence = Engine.World.GetScenePresence(permsGranter); | ||
503 | if (presence != null) | ||
504 | presence.UnRegisterControlEventsToScript(LocalID, ItemID); | ||
505 | } | 513 | } |
506 | } | 514 | } |
507 | 515 | ||
@@ -650,6 +658,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
650 | return true; | 658 | return true; |
651 | } | 659 | } |
652 | 660 | ||
661 | [DebuggerNonUserCode] //Prevents the debugger from farting in this function | ||
653 | public void SetState(string state) | 662 | public void SetState(string state) |
654 | { | 663 | { |
655 | if (state == State) | 664 | if (state == State) |
@@ -661,7 +670,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
661 | new DetectParams[0])); | 670 | new DetectParams[0])); |
662 | PostEvent(new EventParams("state_entry", new Object[0], | 671 | PostEvent(new EventParams("state_entry", new Object[0], |
663 | new DetectParams[0])); | 672 | new DetectParams[0])); |
664 | 673 | ||
665 | throw new EventAbortException(); | 674 | throw new EventAbortException(); |
666 | } | 675 | } |
667 | 676 | ||
@@ -751,57 +760,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
751 | /// <returns></returns> | 760 | /// <returns></returns> |
752 | public object EventProcessor() | 761 | public object EventProcessor() |
753 | { | 762 | { |
763 | EventParams data = null; | ||
754 | // We check here as the thread stopping this instance from running may itself hold the m_Script lock. | 764 | // We check here as the thread stopping this instance from running may itself hold the m_Script lock. |
755 | if (!Running) | 765 | if (!Running) |
756 | return 0; | 766 | return 0; |
757 | 767 | ||
758 | lock (m_Script) | ||
759 | { | ||
760 | // m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName); | 768 | // m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName); |
761 | 769 | ||
762 | if (Suspended) | 770 | if (Suspended) |
763 | return 0; | 771 | return 0; |
764 | |||
765 | EventParams data = null; | ||
766 | 772 | ||
767 | lock (EventQueue) | 773 | lock (EventQueue) |
774 | { | ||
775 | data = (EventParams) EventQueue.Dequeue(); | ||
776 | if (data == null) // Shouldn't happen | ||
768 | { | 777 | { |
769 | data = (EventParams)EventQueue.Dequeue(); | 778 | if (EventQueue.Count > 0 && Running && !ShuttingDown) |
770 | if (data == null) // Shouldn't happen | ||
771 | { | 779 | { |
772 | if (EventQueue.Count > 0 && Running && !ShuttingDown) | 780 | m_CurrentWorkItem = Engine.QueueEventHandler(this); |
773 | { | ||
774 | m_CurrentWorkItem = Engine.QueueEventHandler(this); | ||
775 | } | ||
776 | else | ||
777 | { | ||
778 | m_CurrentWorkItem = null; | ||
779 | } | ||
780 | return 0; | ||
781 | } | 781 | } |
782 | 782 | else | |
783 | if (data.EventName == "timer") | ||
784 | m_TimerQueued = false; | ||
785 | if (data.EventName == "control") | ||
786 | { | 783 | { |
787 | if (m_ControlEventsInQueue > 0) | 784 | m_CurrentWorkItem = null; |
788 | m_ControlEventsInQueue--; | ||
789 | } | 785 | } |
790 | if (data.EventName == "collision") | 786 | return 0; |
791 | m_CollisionInQueue = false; | ||
792 | } | 787 | } |
793 | 788 | ||
789 | if (data.EventName == "timer") | ||
790 | m_TimerQueued = false; | ||
791 | if (data.EventName == "control") | ||
792 | { | ||
793 | if (m_ControlEventsInQueue > 0) | ||
794 | m_ControlEventsInQueue--; | ||
795 | } | ||
796 | if (data.EventName == "collision") | ||
797 | m_CollisionInQueue = false; | ||
798 | } | ||
799 | |||
800 | lock(m_Script) | ||
801 | { | ||
802 | |||
803 | // m_log.DebugFormat("[XEngine]: Processing event {0} for {1}", data.EventName, this); | ||
804 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); | ||
805 | |||
794 | if (DebugLevel >= 2) | 806 | if (DebugLevel >= 2) |
795 | m_log.DebugFormat( | 807 | m_log.DebugFormat( |
796 | "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", | 808 | "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", |
797 | data.EventName, | 809 | data.EventName, |
798 | ScriptName, | 810 | ScriptName, |
799 | Part.Name, | 811 | part.Name, |
800 | Part.LocalId, | 812 | part.LocalId, |
801 | Part.ParentGroup.Name, | 813 | part.ParentGroup.Name, |
802 | Part.ParentGroup.UUID, | 814 | part.ParentGroup.UUID, |
803 | Part.AbsolutePosition, | 815 | part.AbsolutePosition, |
804 | Part.ParentGroup.Scene.Name); | 816 | part.ParentGroup.Scene.Name); |
805 | 817 | ||
806 | m_DetectParams = data.DetectParams; | 818 | m_DetectParams = data.DetectParams; |
807 | 819 | ||
@@ -814,17 +826,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
814 | "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", | 826 | "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", |
815 | State, | 827 | State, |
816 | ScriptName, | 828 | ScriptName, |
817 | Part.Name, | 829 | part.Name, |
818 | Part.LocalId, | 830 | part.LocalId, |
819 | Part.ParentGroup.Name, | 831 | part.ParentGroup.Name, |
820 | Part.ParentGroup.UUID, | 832 | part.ParentGroup.UUID, |
821 | Part.AbsolutePosition, | 833 | part.AbsolutePosition, |
822 | Part.ParentGroup.Scene.Name); | 834 | part.ParentGroup.Scene.Name); |
823 | 835 | ||
824 | AsyncCommandManager.RemoveScript(Engine, | 836 | AsyncCommandManager.RemoveScript(Engine, |
825 | LocalID, ItemID); | 837 | LocalID, ItemID); |
826 | 838 | ||
827 | Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); | 839 | if (part != null) |
840 | { | ||
841 | part.SetScriptEvents(ItemID, | ||
842 | (int)m_Script.GetStateEventFlags(State)); | ||
843 | } | ||
828 | } | 844 | } |
829 | else | 845 | else |
830 | { | 846 | { |
@@ -887,17 +903,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
887 | text = text.Substring(0, 1000); | 903 | text = text.Substring(0, 1000); |
888 | Engine.World.SimChat(Utils.StringToBytes(text), | 904 | Engine.World.SimChat(Utils.StringToBytes(text), |
889 | ChatTypeEnum.DebugChannel, 2147483647, | 905 | ChatTypeEnum.DebugChannel, 2147483647, |
890 | Part.AbsolutePosition, | 906 | part.AbsolutePosition, |
891 | Part.Name, Part.UUID, false); | 907 | part.Name, part.UUID, false); |
892 | 908 | ||
893 | 909 | ||
894 | m_log.DebugFormat( | 910 | m_log.DebugFormat( |
895 | "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}", | 911 | "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}", |
896 | ScriptName, | 912 | ScriptName, |
897 | PrimName, | 913 | PrimName, |
898 | Part.UUID, | 914 | part.UUID, |
899 | Part.AbsolutePosition, | 915 | part.AbsolutePosition, |
900 | Part.ParentGroup.Scene.Name, | 916 | part.ParentGroup.Scene.Name, |
901 | text.Replace("\n", "\\n"), | 917 | text.Replace("\n", "\\n"), |
902 | e.InnerException); | 918 | e.InnerException); |
903 | } | 919 | } |
@@ -917,12 +933,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
917 | else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException)) | 933 | else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException)) |
918 | { | 934 | { |
919 | m_InSelfDelete = true; | 935 | m_InSelfDelete = true; |
920 | Engine.World.DeleteSceneObject(Part.ParentGroup, false); | 936 | if (part != null) |
937 | Engine.World.DeleteSceneObject(part.ParentGroup, false); | ||
921 | } | 938 | } |
922 | else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) | 939 | else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) |
923 | { | 940 | { |
924 | m_InSelfDelete = true; | 941 | m_InSelfDelete = true; |
925 | Part.Inventory.RemoveInventoryItem(ItemID); | 942 | if (part != null) |
943 | part.Inventory.RemoveInventoryItem(ItemID); | ||
926 | } | 944 | } |
927 | else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException)) | 945 | else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException)) |
928 | { | 946 | { |
@@ -976,14 +994,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
976 | ReleaseControls(); | 994 | ReleaseControls(); |
977 | 995 | ||
978 | Stop(timeout); | 996 | Stop(timeout); |
979 | Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; | 997 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); |
980 | Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; | 998 | part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; |
999 | part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; | ||
1000 | part.CollisionSound = UUID.Zero; | ||
981 | AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); | 1001 | AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); |
982 | EventQueue.Clear(); | 1002 | EventQueue.Clear(); |
983 | m_Script.ResetVars(); | 1003 | m_Script.ResetVars(); |
984 | State = "default"; | 1004 | State = "default"; |
985 | 1005 | ||
986 | Part.SetScriptEvents(ItemID, | 1006 | part.SetScriptEvents(ItemID, |
987 | (int)m_Script.GetStateEventFlags(State)); | 1007 | (int)m_Script.GetStateEventFlags(State)); |
988 | if (running) | 1008 | if (running) |
989 | Start(); | 1009 | Start(); |
@@ -992,6 +1012,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
992 | new Object[0], new DetectParams[0])); | 1012 | new Object[0], new DetectParams[0])); |
993 | } | 1013 | } |
994 | 1014 | ||
1015 | [DebuggerNonUserCode] //Stops the VS debugger from farting in this function | ||
995 | public void ApiResetScript() | 1016 | public void ApiResetScript() |
996 | { | 1017 | { |
997 | // bool running = Running; | 1018 | // bool running = Running; |
@@ -1000,15 +1021,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
1000 | ReleaseControls(); | 1021 | ReleaseControls(); |
1001 | 1022 | ||
1002 | m_Script.ResetVars(); | 1023 | m_Script.ResetVars(); |
1003 | Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; | 1024 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); |
1004 | Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; | 1025 | part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; |
1026 | part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; | ||
1027 | part.CollisionSound = UUID.Zero; | ||
1005 | AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); | 1028 | AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); |
1006 | 1029 | ||
1007 | EventQueue.Clear(); | 1030 | EventQueue.Clear(); |
1008 | m_Script.ResetVars(); | 1031 | m_Script.ResetVars(); |
1009 | State = "default"; | 1032 | State = "default"; |
1010 | 1033 | ||
1011 | Part.SetScriptEvents(ItemID, | 1034 | part.SetScriptEvents(ItemID, |
1012 | (int)m_Script.GetStateEventFlags(State)); | 1035 | (int)m_Script.GetStateEventFlags(State)); |
1013 | 1036 | ||
1014 | if (m_CurrentEvent != "state_entry") | 1037 | if (m_CurrentEvent != "state_entry") |
@@ -1022,10 +1045,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
1022 | 1045 | ||
1023 | public Dictionary<string, object> GetVars() | 1046 | public Dictionary<string, object> GetVars() |
1024 | { | 1047 | { |
1025 | if (m_Script != null) | 1048 | return m_Script.GetVars(); |
1026 | return m_Script.GetVars(); | ||
1027 | else | ||
1028 | return new Dictionary<string, object>(); | ||
1029 | } | 1049 | } |
1030 | 1050 | ||
1031 | public void SetVars(Dictionary<string, object> vars) | 1051 | public void SetVars(Dictionary<string, object> vars) |