aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-01-25 21:51:58 +0000
committerJustin Clark-Casey (justincc)2010-01-25 21:51:58 +0000
commit38cfc9366ce264d2aeb6409df48be7cecc348952 (patch)
tree2f90126ff91a339436d93f1c7d13fd69e1a44f24 /OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
parent* Quick fix to Remote Console session ID handling. (diff)
downloadopensim-SC-38cfc9366ce264d2aeb6409df48be7cecc348952.zip
opensim-SC-38cfc9366ce264d2aeb6409df48be7cecc348952.tar.gz
opensim-SC-38cfc9366ce264d2aeb6409df48be7cecc348952.tar.bz2
opensim-SC-38cfc9366ce264d2aeb6409df48be7cecc348952.tar.xz
Fix a problem where llDie() calls were sometimes leaving dead objects behind.
When an object was deleted, the remove script instance call was aggregating the scripting events as normal. This would queue a full update of the prim before the viewer was notifed of the deletion of that prim (QuitPacket) On some occasions, the QuitPacket would be sent before the full update was dequeued and sent. In principle, you would think that a viewer would ignore updates for deleted prims. But it appears that in the Linden viewer (1.23.5), a prim update that arrives after the prim was deleted instead makes the deleted prim persist in the viewer. Such prims have no properties and cannot be removed from the viewer except by a relog. This change stops the prim event aggregation call if it's being deleted anyway, hence removing the spurious viewer-confusing update.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs21
1 files changed, 16 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index eb7f5ff..5f13278 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -230,7 +230,11 @@ namespace OpenSim.Region.Framework.Scenes
230 /// <summary> 230 /// <summary>
231 /// Stop all the scripts in this prim. 231 /// Stop all the scripts in this prim.
232 /// </summary> 232 /// </summary>
233 public void RemoveScriptInstances() 233 /// <param name="sceneObjectBeingDeleted">
234 /// Should be true if these scripts are being removed because the scene
235 /// object is being deleted. This will prevent spurious updates to the client.
236 /// </param>
237 public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
234 { 238 {
235 lock (Items) 239 lock (Items)
236 { 240 {
@@ -238,8 +242,7 @@ namespace OpenSim.Region.Framework.Scenes
238 { 242 {
239 if ((int)InventoryType.LSL == item.InvType) 243 if ((int)InventoryType.LSL == item.InvType)
240 { 244 {
241 RemoveScriptInstance(item.ItemID); 245 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
242 m_part.RemoveScriptEvents(item.ItemID);
243 } 246 }
244 } 247 }
245 } 248 }
@@ -388,10 +391,17 @@ namespace OpenSim.Region.Framework.Scenes
388 /// Stop a script which is in this prim's inventory. 391 /// Stop a script which is in this prim's inventory.
389 /// </summary> 392 /// </summary>
390 /// <param name="itemId"></param> 393 /// <param name="itemId"></param>
391 public void RemoveScriptInstance(UUID itemId) 394 /// <param name="sceneObjectBeingDeleted">
395 /// Should be true if this script is being removed because the scene
396 /// object is being deleted. This will prevent spurious updates to the client.
397 /// </param>
398 public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted)
392 { 399 {
393 if (m_items.ContainsKey(itemId)) 400 if (m_items.ContainsKey(itemId))
394 { 401 {
402 if (!sceneObjectBeingDeleted)
403 m_part.RemoveScriptEvents(itemId);
404
395 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemId); 405 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemId);
396 m_part.ParentGroup.AddActiveScriptCount(-1); 406 m_part.ParentGroup.AddActiveScriptCount(-1);
397 } 407 }
@@ -465,7 +475,7 @@ namespace OpenSim.Region.Framework.Scenes
465 if (i.Name == item.Name) 475 if (i.Name == item.Name)
466 { 476 {
467 if (i.InvType == (int)InventoryType.LSL) 477 if (i.InvType == (int)InventoryType.LSL)
468 RemoveScriptInstance(i.ItemID); 478 RemoveScriptInstance(i.ItemID, false);
469 479
470 RemoveInventoryItem(i.ItemID); 480 RemoveInventoryItem(i.ItemID);
471 break; 481 break;
@@ -613,6 +623,7 @@ namespace OpenSim.Region.Framework.Scenes
613 int type = m_items[itemID].InvType; 623 int type = m_items[itemID].InvType;
614 if (type == 10) // Script 624 if (type == 10) // Script
615 { 625 {
626 m_part.RemoveScriptEvents(itemID);
616 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); 627 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
617 } 628 }
618 m_items.Remove(itemID); 629 m_items.Remove(itemID);