aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorMelanie2010-10-08 11:31:52 +0200
committerMelanie2010-10-08 11:31:52 +0200
commit52dd547863c0cdd22f53f0efcaef11ae096855a0 (patch)
treee1b545832530f02b3485a39826555e444423aad3 /OpenSim/Region
parentImplement rezzing coalesced objects (diff)
downloadopensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.zip
opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.gz
opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.bz2
opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.xz
Make SendKillObject send multiple localIDs in one packet. This avoids the
halting visual behavior of large group deletes and eliminates the packet flood
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs41
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs2
-rw-r--r--OpenSim/Region/Examples/SimpleModule/ComplexObject.cs5
-rw-r--r--OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs6
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs2
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs3
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs4
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs4
15 files changed, 69 insertions, 49 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 2b1bd97..fff4300 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -1516,35 +1516,46 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1516 OutPacket(pc, ThrottleOutPacketType.Unknown); 1516 OutPacket(pc, ThrottleOutPacketType.Unknown);
1517 } 1517 }
1518 1518
1519 public void SendKillObject(ulong regionHandle, uint localID) 1519 public void SendKillObject(ulong regionHandle, List<uint> localIDs)
1520 { 1520 {
1521// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); 1521// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle);
1522 1522
1523 KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); 1523 KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
1524 // TODO: don't create new blocks if recycling an old packet 1524 // TODO: don't create new blocks if recycling an old packet
1525 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; 1525 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count];
1526 kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); 1526 for (int i = 0 ; i < localIDs.Count ; i++ )
1527 kill.ObjectData[0].ID = localID; 1527 {
1528 kill.ObjectData[i] = new KillObjectPacket.ObjectDataBlock();
1529 kill.ObjectData[i].ID = localIDs[i];
1530 }
1528 kill.Header.Reliable = true; 1531 kill.Header.Reliable = true;
1529 kill.Header.Zerocoded = true; 1532 kill.Header.Zerocoded = true;
1530 1533
1531 if (m_scene.GetScenePresence(localID) == null) 1534 if (localIDs.Count == 1)
1532 { 1535 {
1533 lock (m_entityUpdates.SyncRoot) 1536 if (m_scene.GetScenePresence(localIDs[0]) != null)
1534 { 1537 {
1535 m_killRecord.Add(localID); 1538 OutPacket(kill, ThrottleOutPacketType.State);
1536 1539 return;
1537 // The throttle queue used here must match that being used for updates. Otherwise, there is a
1538 // chance that a kill packet put on a separate queue will be sent to the client before an existing
1539 // update packet on another queue. Receiving updates after kills results in unowned and undeletable
1540 // scene objects in a viewer until that viewer is relogged in.
1541 OutPacket(kill, ThrottleOutPacketType.Task);
1542 } 1540 }
1541 m_killRecord.Add(localIDs[0]);
1543 } 1542 }
1544 else 1543 else
1545 { 1544 {
1546 OutPacket(kill, ThrottleOutPacketType.State); 1545 lock (m_entityUpdates.SyncRoot)
1546 {
1547 foreach (uint localID in localIDs)
1548 m_killRecord.Add(localID);
1549 }
1547 } 1550 }
1551
1552 // The throttle queue used here must match that being used for
1553 // updates. Otherwise, there is a chance that a kill packet put
1554 // on a separate queue will be sent to the client before an
1555 // existing update packet on another queue. Receiving updates
1556 // after kills results in unowned and undeletable
1557 // scene objects in a viewer until that viewer is relogged in.
1558 OutPacket(kill, ThrottleOutPacketType.Task);
1548 } 1559 }
1549 1560
1550 /// <summary> 1561 /// <summary>
@@ -10969,7 +10980,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10969 { 10980 {
10970 // It's a ghost! tell the client to delete it from view. 10981 // It's a ghost! tell the client to delete it from view.
10971 simClient.SendKillObject(Scene.RegionInfo.RegionHandle, 10982 simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
10972 localId); 10983 new List<uint>() { localId });
10973 } 10984 }
10974 else 10985 else
10975 { 10986 {
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 87c9100..6ff0ffc 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -616,7 +616,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
616 // 616 //
617 if (so.IsSelected) 617 if (so.IsSelected)
618 { 618 {
619 m_scene.SendKillObject(so.RootPart.LocalId); 619 m_scene.SendKillObject(new List<uint> { so.RootPart.LocalId });
620 } 620 }
621 621
622 so.IsSelected = false; // fudge.... 622 so.IsSelected = false; // fudge....
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index d506208..2921b0d 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -529,7 +529,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
529 529
530 protected void KillEntity(Scene scene, uint localID) 530 protected void KillEntity(Scene scene, uint localID)
531 { 531 {
532 scene.SendKillObject(localID); 532 scene.SendKillObject(new List<uint>() { localID });
533 } 533 }
534 534
535 protected virtual GridRegion GetFinalDestination(GridRegion region) 535 protected virtual GridRegion GetFinalDestination(GridRegion region)
diff --git a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
index e951bef..7a0ce51 100644
--- a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
+++ b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
@@ -25,6 +25,7 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System.Collections.Generic;
28using OpenMetaverse; 29using OpenMetaverse;
29using OpenSim.Framework; 30using OpenSim.Framework;
30using OpenSim.Region.Framework.Scenes; 31using OpenSim.Region.Framework.Scenes;
@@ -110,7 +111,7 @@ namespace OpenSim.Region.Examples.SimpleModule
110 { 111 {
111 m_parts.Remove(part.UUID); 112 m_parts.Remove(part.UUID);
112 113
113 remoteClient.SendKillObject(m_regionHandle, part.LocalId); 114 remoteClient.SendKillObject(m_regionHandle, new List<uint>() { part.LocalId} );
114 remoteClient.AddMoney(1); 115 remoteClient.AddMoney(1);
115 remoteClient.SendChatMessage("Poof!", 1, AbsolutePosition, "Party Party", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully); 116 remoteClient.SendChatMessage("Poof!", 1, AbsolutePosition, "Party Party", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
116 } 117 }
@@ -121,7 +122,7 @@ namespace OpenSim.Region.Examples.SimpleModule
121 { 122 {
122 m_parts.Remove(m_rootPart.UUID); 123 m_parts.Remove(m_rootPart.UUID);
123 m_scene.DeleteSceneObject(this, false); 124 m_scene.DeleteSceneObject(this, false);
124 remoteClient.SendKillObject(m_regionHandle, m_rootPart.LocalId); 125 remoteClient.SendKillObject(m_regionHandle, new List<uint>() { m_rootPart.LocalId });
125 remoteClient.AddMoney(50); 126 remoteClient.AddMoney(50);
126 remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully); 127 remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
127 } 128 }
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index 944ad94..db427b4 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -429,7 +429,7 @@ namespace OpenSim.Region.Examples.SimpleModule
429 429
430 } 430 }
431 431
432 public virtual void SendKillObject(ulong regionHandle, uint localID) 432 public virtual void SendKillObject(ulong regionHandle, List<uint> localID)
433 { 433 {
434 } 434 }
435 435
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index 8feb022..a8d24fd 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -104,8 +104,15 @@ namespace OpenSim.Region.Framework.Scenes
104 // better than losing the object for now. 104 // better than losing the object for now.
105 if (permissionToDelete) 105 if (permissionToDelete)
106 { 106 {
107 List<uint> killIDs = new List<uint>();
108
107 foreach (SceneObjectGroup g in objectGroups) 109 foreach (SceneObjectGroup g in objectGroups)
110 {
111 killIDs.Add(g.LocalId);
108 g.DeleteGroupFromScene(false); 112 g.DeleteGroupFromScene(false);
113 }
114
115 m_scene.SendKillObject(killIDs);
109 } 116 }
110 } 117 }
111 118
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 8b5316a..6d7f984 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1709,7 +1709,7 @@ namespace OpenSim.Region.Framework.Scenes
1709 if (part == null) 1709 if (part == null)
1710 { 1710 {
1711 //Client still thinks the object exists, kill it 1711 //Client still thinks the object exists, kill it
1712 SendKillObject(localID); 1712 deleteIDs.Add(localID);
1713 continue; 1713 continue;
1714 } 1714 }
1715 1715
@@ -1717,7 +1717,7 @@ namespace OpenSim.Region.Framework.Scenes
1717 if (part.ParentGroup == null || part.ParentGroup.IsDeleted) 1717 if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
1718 { 1718 {
1719 //Client still thinks the object exists, kill it 1719 //Client still thinks the object exists, kill it
1720 SendKillObject(localID); 1720 deleteIDs.Add(localID);
1721 continue; 1721 continue;
1722 } 1722 }
1723 1723
@@ -1727,8 +1727,8 @@ namespace OpenSim.Region.Framework.Scenes
1727 1727
1728 SceneObjectGroup grp = part.ParentGroup; 1728 SceneObjectGroup grp = part.ParentGroup;
1729 1729
1730 deleteIDs.Add(localID);
1731 deleteGroups.Add(grp); 1730 deleteGroups.Add(grp);
1731 deleteIDs.Add(grp.LocalId);
1732 1732
1733 if (remoteClient == null) 1733 if (remoteClient == null)
1734 { 1734 {
@@ -1811,6 +1811,8 @@ namespace OpenSim.Region.Framework.Scenes
1811 } 1811 }
1812 } 1812 }
1813 1813
1814 SendKillObject(deleteIDs);
1815
1814 if (permissionToTake) 1816 if (permissionToTake)
1815 { 1817 {
1816 m_asyncSceneObjectDeleter.DeleteToInventory( 1818 m_asyncSceneObjectDeleter.DeleteToInventory(
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 76e160d..48ae4ca 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2188,6 +2188,8 @@ namespace OpenSim.Region.Framework.Scenes
2188 } 2188 }
2189 2189
2190 group.DeleteGroupFromScene(silent); 2190 group.DeleteGroupFromScene(silent);
2191 if (!silent)
2192 SendKillObject(new List<uint>() { group.LocalId });
2191 2193
2192// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2194// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2193 } 2195 }
@@ -3273,7 +3275,7 @@ namespace OpenSim.Region.Framework.Scenes
3273 delegate(IClientAPI client) 3275 delegate(IClientAPI client)
3274 { 3276 {
3275 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway 3277 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway
3276 try { client.SendKillObject(avatar.RegionHandle, avatar.LocalId); } 3278 try { client.SendKillObject(avatar.RegionHandle, new List<uint>() { avatar.LocalId}); }
3277 catch (NullReferenceException) { } 3279 catch (NullReferenceException) { }
3278 }); 3280 });
3279 3281
@@ -3336,18 +3338,24 @@ namespace OpenSim.Region.Framework.Scenes
3336 3338
3337 #region Entities 3339 #region Entities
3338 3340
3339 public void SendKillObject(uint localID) 3341 public void SendKillObject(List<uint> localIDs)
3340 { 3342 {
3341 SceneObjectPart part = GetSceneObjectPart(localID); 3343 List<uint> deleteIDs = new List<uint>();
3342 if (part != null) // It is a prim 3344
3345 foreach (uint localID in localIDs)
3343 { 3346 {
3344 if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid 3347 SceneObjectPart part = GetSceneObjectPart(localID);
3348 if (part != null) // It is a prim
3345 { 3349 {
3346 if (part.ParentGroup.RootPart != part) // Child part 3350 if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid
3347 return; 3351 {
3352 if (part.ParentGroup.RootPart != part) // Child part
3353 continue;
3354 }
3348 } 3355 }
3356 deleteIDs.Add(localID);
3349 } 3357 }
3350 ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, localID); }); 3358 ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, deleteIDs); });
3351 } 3359 }
3352 3360
3353 #endregion 3361 #endregion
@@ -3365,7 +3373,6 @@ namespace OpenSim.Region.Framework.Scenes
3365 //m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; 3373 //m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
3366 //m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar; 3374 //m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar;
3367 m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid; 3375 m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid;
3368 m_sceneGridService.KiPrimitive += SendKillObject;
3369 m_sceneGridService.OnGetLandData += GetLandData; 3376 m_sceneGridService.OnGetLandData += GetLandData;
3370 } 3377 }
3371 3378
@@ -3374,7 +3381,6 @@ namespace OpenSim.Region.Framework.Scenes
3374 /// </summary> 3381 /// </summary>
3375 public void UnRegisterRegionWithComms() 3382 public void UnRegisterRegionWithComms()
3376 { 3383 {
3377 m_sceneGridService.KiPrimitive -= SendKillObject;
3378 m_sceneGridService.OnLogOffUser -= HandleLogOffUserFromGrid; 3384 m_sceneGridService.OnLogOffUser -= HandleLogOffUserFromGrid;
3379 //m_sceneGridService.OnRemoveKnownRegionFromAvatar -= HandleRemoveKnownRegionsFromAvatar; 3385 //m_sceneGridService.OnRemoveKnownRegionFromAvatar -= HandleRemoveKnownRegionsFromAvatar;
3380 //m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate; 3386 //m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate;
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 1293d5d..632646d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -44,8 +44,6 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion;
44 44
45namespace OpenSim.Region.Framework.Scenes 45namespace OpenSim.Region.Framework.Scenes
46{ 46{
47 public delegate void KiPrimitiveDelegate(uint localID);
48
49 public delegate void RemoveKnownRegionsFromAvatarList(UUID avatarID, List<ulong> regionlst); 47 public delegate void RemoveKnownRegionsFromAvatarList(UUID avatarID, List<ulong> regionlst);
50 48
51 /// <summary> 49 /// <summary>
@@ -113,8 +111,6 @@ namespace OpenSim.Region.Framework.Scenes
113// private LogOffUser handlerLogOffUser = null; 111// private LogOffUser handlerLogOffUser = null;
114// private GetLandData handlerGetLandData = null; // OnGetLandData 112// private GetLandData handlerGetLandData = null; // OnGetLandData
115 113
116 public KiPrimitiveDelegate KiPrimitive;
117
118 public SceneCommunicationService() 114 public SceneCommunicationService()
119 { 115 {
120 } 116 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 9a7d560..c870797 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1151,7 +1151,7 @@ namespace OpenSim.Region.Framework.Scenes
1151 // 1151 //
1152 if (IsSelected) 1152 if (IsSelected)
1153 { 1153 {
1154 m_scene.SendKillObject(m_rootPart.LocalId); 1154 m_scene.SendKillObject(new List<uint> { m_rootPart.LocalId });
1155 } 1155 }
1156 1156
1157 IsSelected = false; // fudge.... 1157 IsSelected = false; // fudge....
@@ -1415,11 +1415,7 @@ namespace OpenSim.Region.Framework.Scenes
1415 avatar.StandUp(); 1415 avatar.StandUp();
1416 1416
1417 if (!silent) 1417 if (!silent)
1418 {
1419 part.UpdateFlag = 0; 1418 part.UpdateFlag = 0;
1420 if (part == m_rootPart)
1421 avatar.ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
1422 }
1423 }); 1419 });
1424 } 1420 }
1425 1421
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 4ab67aa..72e5ebd 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -947,7 +947,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
947 947
948 } 948 }
949 949
950 public void SendKillObject(ulong regionHandle, uint localID) 950 public void SendKillObject(ulong regionHandle, List<uint> localID)
951 { 951 {
952 952
953 } 953 }
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
index 3a6996e..84c7f29 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
@@ -259,9 +259,10 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
259 // I thought that the DeleteGroup() function would handle all of this, but it doesn't. I'm not sure WHAT it handles. 259 // I thought that the DeleteGroup() function would handle all of this, but it doesn't. I'm not sure WHAT it handles.
260 ((SceneObjectGroup)scene.Entities[uuid]).DetachFromBackup(); 260 ((SceneObjectGroup)scene.Entities[uuid]).DetachFromBackup();
261 scene.PhysicsScene.RemovePrim(((SceneObjectGroup)scene.Entities[uuid]).RootPart.PhysActor); 261 scene.PhysicsScene.RemovePrim(((SceneObjectGroup)scene.Entities[uuid]).RootPart.PhysActor);
262 scene.SendKillObject(scene.Entities[uuid].LocalId); 262 scene.SendKillObject(new List<uint>() { scene.Entities[uuid].LocalId });
263 scene.SceneGraph.DeleteSceneObject(uuid, false); 263 scene.SceneGraph.DeleteSceneObject(uuid, false);
264 ((SceneObjectGroup)scene.Entities[uuid]).DeleteGroupFromScene(false); 264 ((SceneObjectGroup)scene.Entities[uuid]).DeleteGroupFromScene(false);
265 scene.SendKillObject(new List<uint>() { ((SceneObjectGroup)scene.Entities[uuid]).LocalId });
265 } 266 }
266 catch(Exception e) 267 catch(Exception e)
267 { 268 {
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
index c7b1ed7..cd60f4b 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
@@ -175,7 +175,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
175 //This is important because we are not IN any database. 175 //This is important because we are not IN any database.
176 //m_Entity.FakeDeleteGroup(); 176 //m_Entity.FakeDeleteGroup();
177 foreach (SceneObjectPart part in m_Entity.Parts) 177 foreach (SceneObjectPart part in m_Entity.Parts)
178 client.SendKillObject(m_Entity.RegionHandle, part.LocalId); 178 client.SendKillObject(m_Entity.RegionHandle, new List<uint>() { part.LocalId });
179 } 179 }
180 180
181 /// <summary> 181 /// <summary>
@@ -187,7 +187,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
187 { 187 {
188 m_Entity.Scene.ForEachClient( 188 m_Entity.Scene.ForEachClient(
189 delegate(IClientAPI controller) 189 delegate(IClientAPI controller)
190 { controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); } 190 { controller.SendKillObject(m_Entity.RegionHandle, new List<uint>() { part.LocalId }); }
191 ); 191 );
192 } 192 }
193 } 193 }
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 1653ecb..3cbe391 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -519,7 +519,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
519 519
520 } 520 }
521 521
522 public virtual void SendKillObject(ulong regionHandle, uint localID) 522 public virtual void SendKillObject(ulong regionHandle, List<uint> localID)
523 { 523 {
524 } 524 }
525 525
diff --git a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs
index 421da36..2563361 100644
--- a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs
+++ b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs
@@ -386,7 +386,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
386 m_scene.ForEachClient(delegate(IClientAPI controller) 386 m_scene.ForEachClient(delegate(IClientAPI controller)
387 { 387 {
388 controller.SendKillObject(m_scene.RegionInfo.RegionHandle, 388 controller.SendKillObject(m_scene.RegionInfo.RegionHandle,
389 selectedTree.LocalId); 389 new List<uint>() { selectedTree.LocalId });
390 }); 390 });
391 } 391 }
392 else 392 else
@@ -727,7 +727,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
727 m_scene.ForEachClient(delegate(IClientAPI controller) 727 m_scene.ForEachClient(delegate(IClientAPI controller)
728 { 728 {
729 controller.SendKillObject(m_scene.RegionInfo.RegionHandle, 729 controller.SendKillObject(m_scene.RegionInfo.RegionHandle,
730 selectedTree.LocalId); 730 new List<uint>() { selectedTree.LocalId });
731 }); 731 });
732 732
733 break; 733 break;