diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index d5af5428d8..a122217d85 100755 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -1081,7 +1081,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments so.AttachedAvatar = sp.UUID; so.AttachmentPoint = attachmentpoint; so.RootPart.AttachedPos = attachOffset; - so.AbsolutePosition = attachOffset; + so.RootPart.GroupPosition = attachOffset; // can not set absolutepos so.IsAttachment = true; sp.AddAttachment(so); @@ -1099,7 +1099,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // scene that it's no longer in their awareness. m_scene.ForEachClient( client => - { if (client.AgentId != so.AttachedAvatar) + { if (client.IsActive && client.AgentId != so.AttachedAvatar) client.SendKillObject(new List() { so.LocalId }); }); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index f4955b6230..8192c06a36 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -79,8 +79,7 @@ namespace OpenSim.Region.Framework.Scenes { if (group is SceneObjectGroup) { - scriptsValidForStarting - += ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); + scriptsValidForStarting += ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); ((SceneObjectGroup) group).ResumeScripts(); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0507131d2f..f8430408f0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -499,7 +499,7 @@ namespace OpenSim.Region.Framework.Scenes private uint _groupMask = (uint)PermissionMask.None; private uint _everyoneMask = (uint)PermissionMask.None; private uint _nextOwnerMask = (uint)(PermissionMask.Move | PermissionMask.Transfer); - private PrimFlags _flags = PrimFlags.None; + private PrimFlags m_flags = PrimFlags.None; private DateTime m_expires; private DateTime m_rezzed; private bool m_createSelected = false; @@ -1395,11 +1395,11 @@ namespace OpenSim.Region.Framework.Scenes /// public PrimFlags Flags { - get { return _flags; } + get { return m_flags; } set { -// m_log.DebugFormat("[SOP]: Setting flags for {0} {1} to {2}", UUID, Name, value); - _flags = value; + //m_log.DebugFormat("[SOP]: Setting flags for {0} {1} to {2}", UUID, Name, value); + m_flags = value; } } @@ -1908,11 +1908,10 @@ namespace OpenSim.Region.Framework.Scenes public void AddFlag(PrimFlags flag) { - // PrimFlags prevflag = Flags; - if ((Flags & flag) == 0) + if ((m_flags & flag) == 0) { //m_log.Debug("Adding flag: " + ((PrimFlags) flag).ToString()); - Flags |= flag; + m_flags |= flag; if (flag == PrimFlags.TemporaryOnRez) ResetExpire(); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index e258bb9d8c..734d7e45be 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -312,11 +312,11 @@ namespace OpenSim.Region.Framework.Scenes } m_items.LockItemsForWrite(false); - if (m_part == null || m_part.ParentGroup == null || m_part.ParentGroup.Scene == null) + if (m_part.ParentGroup == null || m_part.ParentGroup.Scene == null) return; - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - if (engines == null) // No engine at all + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) // No engine at all return; bool running; @@ -326,7 +326,7 @@ namespace OpenSim.Region.Framework.Scenes foreach (TaskInventoryItem item in m_scripts.Values) { //running = false; - foreach (IScriptModule e in engines) + foreach (IScriptModule e in scriptEngines) { if (e.HasScript(item.ItemID, out running)) { @@ -359,11 +359,11 @@ namespace OpenSim.Region.Framework.Scenes if (item.InvType != (int)InventoryType.LSL) return false; - IScriptModule[] engines = scene.RequestModuleInterfaces(); - if (engines == null) // No engine at all + IScriptModule[] scriptEngines = scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) // No engine at all return false; - foreach (IScriptModule e in engines) + foreach (IScriptModule e in scriptEngines) { if (e.HasScript(item.ItemID, out running)) return true; @@ -394,11 +394,9 @@ namespace OpenSim.Region.Framework.Scenes public ArrayList GetScriptErrors(UUID itemID) { + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); ArrayList ret = new ArrayList(); - - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - - foreach (IScriptModule e in engines) + foreach (IScriptModule e in scriptEngines) { if (e != null) { @@ -461,8 +459,8 @@ namespace OpenSim.Region.Framework.Scenes /// true if the script instance was created, false otherwise public bool CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { -// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", -// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); + //m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", + // item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item, m_part)) { @@ -476,13 +474,25 @@ namespace OpenSim.Region.Framework.Scenes return false; UUID itemID = item.ItemID; - TaskInventoryItem it; + + m_items.LockItemsForRead(true); + if (!m_items.TryGetValue(item.ItemID, out TaskInventoryItem it)) + { + m_items.LockItemsForRead(false); + + StoreScriptError(itemID, String.Format("TaskItem ID {0} could not be found", item.ItemID)); + m_log.ErrorFormat( + "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since taskitem ID {4} could not be found", + item.Name, item.ItemID, m_part.AbsolutePosition, + m_part.ParentGroup.Scene.RegionInfo.RegionName, item.ItemID); + return false; + } + m_items.LockItemsForRead(false); if (stateSource == 2 && m_part.ParentGroup.Scene.m_trustBinaries) { // Prim crossing m_items.LockItemsForWrite(true); - it = m_items[itemID]; it.PermsMask = 0; it.PermsGranter = UUID.Zero; m_items.LockItemsForWrite(false); @@ -511,7 +521,6 @@ namespace OpenSim.Region.Framework.Scenes item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, itemID); m_items.LockItemsForWrite(true); - it = m_items[itemID]; it.OldItemID = item.OldItemID; it.PermsMask = 0; it.PermsGranter = UUID.Zero; @@ -531,12 +540,11 @@ namespace OpenSim.Region.Framework.Scenes private UUID RestoreSavedScriptState(UUID loadedID, UUID oldID, UUID newID) { -// m_log.DebugFormat( -// "[PRIM INVENTORY]: Restoring scripted state for item {0}, oldID {1}, loadedID {2}", -// newID, oldID, loadedID); - - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - if (engines.Length == 0) // No engine at all + //m_log.DebugFormat( + // "[PRIM INVENTORY]: Restoring scripted state for item {0}, oldID {1}, loadedID {2}", + // newID, oldID, loadedID); + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) // No engine at all return oldID; UUID stateID = oldID; @@ -576,12 +584,12 @@ namespace OpenSim.Region.Framework.Scenes // This created document has only the minimun data // necessary for XEngine to parse it successfully -// m_log.DebugFormat("[PRIM INVENTORY]: Adding legacy state {0} in {1}", stateID, newID); + //m_log.DebugFormat("[PRIM INVENTORY]: Adding legacy state {0} in {1}", stateID, newID); m_part.ParentGroup.m_savedScriptState[stateID] = newDoc.OuterXml; } - foreach (IScriptModule e in engines) + foreach (IScriptModule e in scriptEngines) { if (e != null) { @@ -618,11 +626,9 @@ namespace OpenSim.Region.Framework.Scenes { m_items.LockItemsForRead(true); - if (m_items.ContainsKey(itemId)) + if (m_items.TryGetValue(itemId, out TaskInventoryItem it)) { - TaskInventoryItem it = m_items[itemId]; m_items.LockItemsForRead(false); - CreateScriptInstance(it, startParam, postOnRez, engine, stateSource); } else @@ -1236,7 +1242,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_items.ContainsKey(item.ItemID)) { -// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name); + //m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name); item.ParentID = m_part.UUID; item.ParentPartID = m_part.UUID; @@ -1669,8 +1675,8 @@ namespace OpenSim.Region.Framework.Scenes /// public int RunningScriptCount() { - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - if (engines.Length == 0) + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) return 0; int count = 0; @@ -1685,15 +1691,19 @@ namespace OpenSim.Region.Framework.Scenes foreach (TaskInventoryItem item in scripts) { - foreach (IScriptModule engine in engines) + foreach (IScriptModule engine in scriptEngines) { if (engine != null) { - if (engine.GetScriptState(item.ItemID)) - count++; + if (engine.HasScript(item.ItemID, out bool running)) + { + if(running) + count++; + break; } } } + } return count; } @@ -1743,8 +1753,8 @@ namespace OpenSim.Region.Framework.Scenes if (m_part.ParentGroup.Scene == null) // Group not in a scene return ret; - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - if (engines.Length == 0) // No engine at all + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) // No engine at all return ret; m_items.LockItemsForRead(true); @@ -1758,13 +1768,13 @@ namespace OpenSim.Region.Framework.Scenes foreach (TaskInventoryItem item in scripts) { - foreach (IScriptModule e in engines) + foreach (IScriptModule e in scriptEngines) { if (e != null) { -// m_log.DebugFormat( -// "[PRIM INVENTORY]: Getting script state from engine {0} for {1} in part {2} in group {3} in {4}", -// e.Name, item.Name, m_part.Name, m_part.ParentGroup.Name, m_part.ParentGroup.Scene.Name); + //m_log.DebugFormat( + // "[PRIM INVENTORY]: Getting script state from engine {0} for {1} in part {2} in group {3} in {4}", + // e.Name, item.Name, m_part.Name, m_part.ParentGroup.Name, m_part.ParentGroup.Scene.Name); string n = e.GetXMLState(item.ItemID); if (n != String.Empty) @@ -1789,8 +1799,8 @@ namespace OpenSim.Region.Framework.Scenes public void ResumeScripts() { - IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); - if (engines.Length == 0) + IScriptModule[] scriptEngines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (scriptEngines.Length == 0) return; m_items.LockItemsForRead(true); @@ -1804,15 +1814,16 @@ namespace OpenSim.Region.Framework.Scenes foreach (TaskInventoryItem item in scripts) { - foreach (IScriptModule engine in engines) + foreach (IScriptModule engine in scriptEngines) { if (engine != null) { -// m_log.DebugFormat( -// "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}", -// item.Name, item.ItemID, item.OwnerID, item.OwnerChanged); + //m_log.DebugFormat( + // "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}", + // item.Name, item.ItemID, item.OwnerID, item.OwnerChanged); - engine.ResumeScript(item.ItemID); + if(!engine.ResumeScript(item.ItemID)) + continue; if (item.OwnerChanged) engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs b/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs index 56cba3094a..c197dcbb4e 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs @@ -1214,9 +1214,6 @@ namespace OpenSim.Region.ScriptEngine.Yengine if (script.StartsWith("//MRM:")) return; - SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); - TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); - if(!m_LateInit) { m_LateInit = true; @@ -1281,6 +1278,9 @@ namespace OpenSim.Region.ScriptEngine.Yengine if(!string.IsNullOrEmpty(langsrt) && langsrt !="lsl") return; + SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); + TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); + // Put on object/instance lists. XMRInstance instance = (XMRInstance)Activator.CreateInstance(ScriptCodeGen.xmrInstSuperType); instance.m_LocalID = localID; @@ -1411,6 +1411,10 @@ namespace OpenSim.Region.ScriptEngine.Yengine if(!instance.m_Running) instance.EmptyEventQueues(); } + // Declare which events the script's current state can handle. + int eventMask = instance.GetStateEventFlags(instance.stateCode); + instance.m_Part.SetScriptEvents(instance.m_ItemID, eventMask); + QueueToStart(instance); } diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs index 6465742f16..83bf202cf1 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs @@ -126,10 +126,6 @@ namespace OpenSim.Region.ScriptEngine.Yengine suspendOnCheckRunHold = false; suspendOnCheckRunTemp = false; - - // Declare which events the script's current state can handle. - int eventMask = GetStateEventFlags(stateCode); - m_Part.SetScriptEvents(m_ItemID, eventMask); } private void InitScriptApi(Yengine engine, string api, IScriptApi scriptApi) diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstMisc.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstMisc.cs index 45d3121ec9..b2dbf8d92a 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstMisc.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstMisc.cs @@ -213,24 +213,23 @@ namespace OpenSim.Region.ScriptEngine.Yengine * @brief For a given stateCode, get a mask of the low 32 event codes * that the state has handlers defined for. */ - public int GetStateEventFlags(int stateCode) + public int GetStateEventFlags(int state) { - if((stateCode < 0) || - (stateCode >= m_ObjCode.scriptEventHandlerTable.GetLength(0))) + if((state < 0) || + (state >= m_ObjCode.scriptEventHandlerTable.GetLength(0))) { return 0; } - int code = 0; + int flags = 0; for(int i = 0; i < 32; i++) { - if(m_ObjCode.scriptEventHandlerTable[stateCode, i] != null) + if(m_ObjCode.scriptEventHandlerTable[state, i] != null) { - code |= 1 << i; + flags |= 1 << i; } } - - return code; + return flags; } /**