Merge branch 'master' of /home/opensim/var/repo/opensim
						commit
						8a1b4d225b
					
				|  | @ -211,16 +211,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
| 
 | ||||
|             lock (sp.AttachmentsSyncLock) | ||||
|             { | ||||
|                 foreach (SceneObjectGroup grp in sp.GetAttachments()) | ||||
|                 foreach (SceneObjectGroup so in sp.GetAttachments()) | ||||
|                 { | ||||
|                     grp.Scene.DeleteSceneObject(grp, false); | ||||
|                     // We can only remove the script instances from the script engine after we've retrieved their xml state | ||||
|                     // when we update the attachment item. | ||||
|                     m_scene.DeleteSceneObject(so, false, false); | ||||
|      | ||||
|                     if (saveChanged || saveAllScripted) | ||||
|                     { | ||||
|                         grp.IsAttachment = false; | ||||
|                         grp.AbsolutePosition = grp.RootPart.AttachedPos; | ||||
|                         UpdateKnownItem(sp, grp, saveAllScripted); | ||||
|                         so.IsAttachment = false; | ||||
|                         so.AbsolutePosition = so.RootPart.AttachedPos; | ||||
|                         UpdateKnownItem(sp, so, saveAllScripted); | ||||
|                     } | ||||
| 
 | ||||
|                     so.RemoveScriptInstances(true); | ||||
|                 } | ||||
|      | ||||
|                 sp.ClearAttachments(); | ||||
|  | @ -682,7 +686,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
| 
 | ||||
|             m_scene.EventManager.TriggerOnAttach(so.LocalId, so.FromItemID, UUID.Zero); | ||||
|             sp.RemoveAttachment(so); | ||||
|             m_scene.DeleteSceneObject(so, false); | ||||
| 
 | ||||
|             // We can only remove the script instances from the script engine after we've retrieved their xml state | ||||
|             // when we update the attachment item. | ||||
|             m_scene.DeleteSceneObject(so, false, false); | ||||
| 
 | ||||
|             // Prepare sog for storage | ||||
|             so.AttachedAvatar = UUID.Zero; | ||||
|  | @ -691,6 +698,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
|             so.AbsolutePosition = so.RootPart.AttachedPos; | ||||
| 
 | ||||
|             UpdateKnownItem(sp, so, true); | ||||
|             so.RemoveScriptInstances(true); | ||||
|         } | ||||
| 
 | ||||
|         private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( | ||||
|  |  | |||
|  | @ -92,7 +92,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         void ResumeScripts(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop all the scripts in this entity. | ||||
|         /// Stop and remove all the scripts in this entity from the scene. | ||||
|         /// </summary> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|         /// Should be true if these scripts are being removed because the scene | ||||
|  | @ -100,6 +100,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         /// </param> | ||||
|         void RemoveScriptInstances(bool sceneObjectBeingDeleted); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop all the scripts in this entity. | ||||
|         /// </summary> | ||||
|         void StopScriptInstances(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Start a script which is in this entity's inventory. | ||||
|         /// </summary> | ||||
|  | @ -129,7 +134,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop a script which is in this prim's inventory. | ||||
|         /// Stop and remove a script which is in this prim's inventory from the scene. | ||||
|         /// </summary> | ||||
|         /// <param name="itemId"></param> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|  | @ -138,6 +143,12 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         /// </param> | ||||
|         void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop a script which is in this prim's inventory. | ||||
|         /// </summary> | ||||
|         /// <param name="itemId"></param> | ||||
|         void StopScriptInstance(UUID itemId); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add an item to this entity's inventory.  If an item with the same name already exists, then an alternative | ||||
|         /// name is chosen. | ||||
|  |  | |||
|  | @ -2183,13 +2183,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// <summary> | ||||
|         /// Synchronously delete the given object from the scene. | ||||
|         /// </summary> | ||||
|         /// <remarks> | ||||
|         /// Scripts are also removed. | ||||
|         /// </remarks> | ||||
|         /// <param name="group">Object Id</param> | ||||
|         /// <param name="silent">Suppress broadcasting changes to other clients.</param> | ||||
|         public void DeleteSceneObject(SceneObjectGroup group, bool silent) | ||||
|         { | ||||
|             DeleteSceneObject(group, silent, true); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Synchronously delete the given object from the scene. | ||||
|         /// </summary> | ||||
|         /// <param name="group">Object Id</param> | ||||
|         /// <param name="silent">Suppress broadcasting changes to other clients.</param> | ||||
|         /// <param name="removeScripts">If true, then scripts are removed.  If false, then they are only stopped.</para> | ||||
|         public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool removeScripts) | ||||
|         {             | ||||
| //            m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); | ||||
| 
 | ||||
|             group.RemoveScriptInstances(true); | ||||
|             if (removeScripts) | ||||
|                 group.RemoveScriptInstances(true); | ||||
|             else | ||||
|                 group.StopScriptInstances(); | ||||
| 
 | ||||
|             SceneObjectPart[] partList = group.Parts; | ||||
| 
 | ||||
|  |  | |||
|  | @ -79,7 +79,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop the scripts contained in all the prims in this group | ||||
|         /// Stop and remove the scripts contained in all the prims in this group | ||||
|         /// </summary> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|         /// Should be true if these scripts are being removed because the scene | ||||
|  | @ -92,6 +92,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 parts[i].Inventory.RemoveScriptInstances(sceneObjectBeingDeleted); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop the scripts contained in all the prims in this group | ||||
|         /// </summary> | ||||
|         public void StopScriptInstances() | ||||
|         { | ||||
|             Array.ForEach<SceneObjectPart>(m_parts.GetArray(), p => p.Inventory.StopScriptInstances()); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add an inventory item from a user's inventory to a prim in this scene object. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -4556,10 +4556,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// Get a copy of the list of sitting avatars. | ||||
|         /// </summary> | ||||
|         /// <remarks>This applies to all sitting avatars whether there is a sit target set or not.</remarks> | ||||
|         /// <returns></returns> | ||||
|         /// <returns>A hashset of the sitting avatars.  Returns null if there are no sitting avatars.</returns> | ||||
|         public HashSet<UUID> GetSittingAvatars() | ||||
|         { | ||||
|             return new HashSet<UUID>(m_sittingAvatars); | ||||
|             HashSet<UUID> sittingAvatars = m_sittingAvatars; | ||||
| 
 | ||||
|             if (sittingAvatars == null) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 lock (sittingAvatars) | ||||
|                     return new HashSet<UUID>(sittingAvatars); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  |  | |||
|  | @ -280,7 +280,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop all the scripts in this prim. | ||||
|         /// Stop and remove all the scripts in this prim. | ||||
|         /// </summary> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|         /// Should be true if these scripts are being removed because the scene | ||||
|  | @ -293,6 +293,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop all the scripts in this prim. | ||||
|         /// </summary> | ||||
|         public void StopScriptInstances() | ||||
|         { | ||||
|             GetInventoryItems(InventoryType.LSL).ForEach(i => StopScriptInstance(i)); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Start a script which is in this prim's inventory. | ||||
|         /// </summary> | ||||
|  | @ -443,7 +451,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop a script which is in this prim's inventory. | ||||
|         /// Stop and remove a script which is in this prim's inventory. | ||||
|         /// </summary> | ||||
|         /// <param name="itemId"></param> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|  | @ -470,7 +478,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.ErrorFormat( | ||||
|                 m_log.WarnFormat( | ||||
|                     "[PRIM INVENTORY]: " + | ||||
|                     "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", | ||||
|                     itemId, m_part.Name, m_part.UUID,  | ||||
|  | @ -478,6 +486,51 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop a script which is in this prim's inventory. | ||||
|         /// </summary> | ||||
|         /// <param name="itemId"></param> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|         /// Should be true if this script is being removed because the scene | ||||
|         /// object is being deleted.  This will prevent spurious updates to the client. | ||||
|         /// </param> | ||||
|         public void StopScriptInstance(UUID itemId) | ||||
|         { | ||||
|             TaskInventoryItem scriptItem; | ||||
| 
 | ||||
|             lock (m_items) | ||||
|                 m_items.TryGetValue(itemId, out scriptItem); | ||||
| 
 | ||||
|             if (scriptItem != null) | ||||
|             { | ||||
|                 StopScriptInstance(scriptItem); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.WarnFormat( | ||||
|                     "[PRIM INVENTORY]: " + | ||||
|                     "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", | ||||
|                     itemId, m_part.Name, m_part.UUID,  | ||||
|                     m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Stop a script which is in this prim's inventory. | ||||
|         /// </summary> | ||||
|         /// <param name="itemId"></param> | ||||
|         /// <param name="sceneObjectBeingDeleted"> | ||||
|         /// Should be true if this script is being removed because the scene | ||||
|         /// object is being deleted.  This will prevent spurious updates to the client. | ||||
|         /// </param> | ||||
|         public void StopScriptInstance(TaskInventoryItem item) | ||||
|         { | ||||
|             m_part.ParentGroup.Scene.EventManager.TriggerStopScript(m_part.LocalId, item.ItemID); | ||||
| 
 | ||||
|             // At the moment, even stopped scripts are counted as active, which is probably wrong. | ||||
| //            m_part.ParentGroup.AddActiveScriptCount(-1); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Check if the inventory holds an item with a given name. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -1895,7 +1895,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                    ) | ||||
|                    )); | ||||
| 
 | ||||
|             m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); | ||||
| //            m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); | ||||
| 
 | ||||
|             if (PhysicsActor != null) | ||||
|                 m_sitAvatarHeight = PhysicsActor.Size.Z; | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ | |||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using Nini.Config; | ||||
| using NUnit.Framework; | ||||
|  | @ -69,6 +70,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); | ||||
|             Assert.That(part.GetSittingAvatars(), Is.Null); | ||||
|             Assert.That(m_sp.ParentID, Is.EqualTo(0)); | ||||
|         } | ||||
| 
 | ||||
|  | @ -86,7 +89,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
| 
 | ||||
|             m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); | ||||
| 
 | ||||
|             Assert.That(m_sp.PhysicsActor, Is.Null); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(1)); | ||||
|             HashSet<UUID> sittingAvatars = part.GetSittingAvatars(); | ||||
|             Assert.That(sittingAvatars.Count, Is.EqualTo(1)); | ||||
|             Assert.That(sittingAvatars.Contains(m_sp.UUID)); | ||||
|             Assert.That(m_sp.ParentID, Is.EqualTo(part.LocalId)); | ||||
|         } | ||||
| 
 | ||||
|  | @ -104,10 +113,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
| 
 | ||||
|             m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(m_sp.ParentID, Is.EqualTo(part.LocalId)); | ||||
|             Assert.That(m_sp.PhysicsActor, Is.Null); | ||||
| 
 | ||||
|             // FIXME: This is different for live avatars - z position is adjusted.  This is half the height of the | ||||
|             // default avatar. | ||||
|             // Curiously, Vector3.ToString() will not display the last two places of the float.  For example, | ||||
|  | @ -119,6 +124,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             m_sp.StandUp(); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); | ||||
|             Assert.That(part.GetSittingAvatars(), Is.Null); | ||||
|             Assert.That(m_sp.ParentID, Is.EqualTo(0)); | ||||
|             Assert.That(m_sp.PhysicsActor, Is.Not.Null); | ||||
|         } | ||||
|  | @ -145,11 +152,20 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|                 Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT)); | ||||
|             Assert.That(m_sp.PhysicsActor, Is.Null); | ||||
| 
 | ||||
|             Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(1)); | ||||
|             HashSet<UUID> sittingAvatars = part.GetSittingAvatars(); | ||||
|             Assert.That(sittingAvatars.Count, Is.EqualTo(1)); | ||||
|             Assert.That(sittingAvatars.Contains(m_sp.UUID)); | ||||
| 
 | ||||
|             m_sp.StandUp(); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(m_sp.ParentID, Is.EqualTo(0)); | ||||
|             Assert.That(m_sp.PhysicsActor, Is.Not.Null); | ||||
| 
 | ||||
|             Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||||
|             Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); | ||||
|             Assert.That(part.GetSittingAvatars(), Is.Null); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|  |  | |||
|  | @ -179,7 +179,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
|         public void TestOsForceAttachToOtherAvatarFromInventory() | ||||
|         { | ||||
|             TestHelpers.InMethod(); | ||||
|             TestHelpers.EnableLogging(); | ||||
| //            TestHelpers.EnableLogging(); | ||||
| 
 | ||||
|             string taskInvObjItemName = "sphere"; | ||||
|             UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); | ||||
|  |  | |||
|  | @ -1574,7 +1574,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
|         { | ||||
|             IScriptInstance instance = GetInstance(itemID); | ||||
|             if (instance != null) | ||||
|                 instance.Stop(0); | ||||
|             { | ||||
|                 // Give the script some time to finish processing its last event.  Simply aborting the script thread can | ||||
|                 // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. | ||||
|                 instance.Stop(1000); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public DetectParams GetDetectParams(UUID itemID, int idx) | ||||
|  |  | |||
|  | @ -3081,6 +3081,7 @@ | |||
| 
 | ||||
|       <ReferencePath>../../../bin/</ReferencePath> | ||||
|       <Reference name="System"/> | ||||
|       <Reference name="System.Core"/> | ||||
|       <Reference name="System.Xml"/> | ||||
|       <Reference name="System.Drawing"/> | ||||
|       <Reference name="System.Runtime.Remoting"/> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BlueWall
						BlueWall