aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules
diff options
context:
space:
mode:
authorJohn Hurliman2010-09-16 17:30:46 -0700
committerJohn Hurliman2010-09-16 17:30:46 -0700
commit860b2a502f797e5822c6705d4639f370f3ac5861 (patch)
tree5a74ddbd626142e27f6c3439ea267b8ea348ce9c /OpenSim/Region/OptionalModules
parentAdd the modules include line back that i dropped by mistake (diff)
downloadopensim-SC_OLD-860b2a502f797e5822c6705d4639f370f3ac5861.zip
opensim-SC_OLD-860b2a502f797e5822c6705d4639f370f3ac5861.tar.gz
opensim-SC_OLD-860b2a502f797e5822c6705d4639f370f3ac5861.tar.bz2
opensim-SC_OLD-860b2a502f797e5822c6705d4639f370f3ac5861.tar.xz
Changed SceneObjectGroup to store parts with the fast and thread-safe MapAndArray collection
Diffstat (limited to 'OpenSim/Region/OptionalModules')
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs19
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs35
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/CMView.cs9
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs169
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs45
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs6
6 files changed, 124 insertions, 159 deletions
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs
index d21b652..7f64ebd 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs
@@ -121,19 +121,16 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
121 continue; 121 continue;
122 temp = (SceneObjectGroup) currObj; 122 temp = (SceneObjectGroup) currObj;
123 123
124 lock (temp.Children) 124 if (m_CMEntityHash.ContainsKey(temp.UUID))
125 { 125 {
126 if (m_CMEntityHash.ContainsKey(temp.UUID)) 126 foreach (SceneObjectPart part in temp.Parts)
127 { 127 if (!((ContentManagementEntity)m_CMEntityHash[temp.UUID]).HasChildPrim(part.UUID))
128 foreach (SceneObjectPart part in temp.Children.Values)
129 if (!((ContentManagementEntity)m_CMEntityHash[temp.UUID]).HasChildPrim(part.UUID))
130 missingList.Add(part);
131 }
132 else //Entire group is missing from revision. (and is a new part in region)
133 {
134 foreach (SceneObjectPart part in temp.Children.Values)
135 missingList.Add(part); 128 missingList.Add(part);
136 } 129 }
130 else //Entire group is missing from revision. (and is a new part in region)
131 {
132 foreach (SceneObjectPart part in temp.Parts)
133 missingList.Add(part);
137 } 134 }
138 } 135 }
139 return missingList; 136 return missingList;
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
index 0b02a9f..3a6996e 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs
@@ -167,11 +167,11 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
167 public void RemoveOrUpdateDeletedEntity(SceneObjectGroup group) 167 public void RemoveOrUpdateDeletedEntity(SceneObjectGroup group)
168 { 168 {
169 // Deal with new parts not revisioned that have been deleted. 169 // Deal with new parts not revisioned that have been deleted.
170 lock (group.Children) 170 SceneObjectPart[] parts = group.Parts;
171 for (int i = 0; i < parts.Length; i++)
171 { 172 {
172 foreach (SceneObjectPart part in group.Children.Values) 173 if (m_MetaEntityCollection.Auras.ContainsKey(parts[i].UUID))
173 if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID)) 174 m_MetaEntityCollection.RemoveNewlyCreatedEntityAura(parts[i].UUID);
174 m_MetaEntityCollection.RemoveNewlyCreatedEntityAura(part.UUID);
175 } 175 }
176 } 176 }
177 177
@@ -210,12 +210,10 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
210 { 210 {
211 temp = SceneObjectSerializer.FromXml2Format(xml); 211 temp = SceneObjectSerializer.FromXml2Format(xml);
212 temp.SetScene(scene); 212 temp.SetScene(scene);
213 213
214 lock (temp.Children) 214 SceneObjectPart[] parts = temp.Parts;
215 { 215 for (int i = 0; i < parts.Length; i++)
216 foreach (SceneObjectPart part in temp.Children.Values) 216 parts[i].RegionHandle = scene.RegionInfo.RegionHandle;
217 part.RegionHandle = scene.RegionInfo.RegionHandle;
218 }
219 217
220 ReplacementList.Add(temp.UUID, (EntityBase)temp); 218 ReplacementList.Add(temp.UUID, (EntityBase)temp);
221 } 219 }
@@ -346,17 +344,16 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
346 System.Collections.ArrayList auraList = new System.Collections.ArrayList(); 344 System.Collections.ArrayList auraList = new System.Collections.ArrayList();
347 if (group == null) 345 if (group == null)
348 return null; 346 return null;
349 347
350 lock (group.Children) 348 SceneObjectPart[] parts = group.Parts;
349 for (int i = 0; i < parts.Length; i++)
351 { 350 {
352 foreach (SceneObjectPart part in group.Children.Values) 351 SceneObjectPart part = parts[i];
352 if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID))
353 { 353 {
354 if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID)) 354 ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).SetAura(new Vector3(0, 254, 0), part.Scale);
355 { 355 ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).RootPart.GroupPosition = part.GetWorldPosition();
356 ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).SetAura(new Vector3(0,254,0), part.Scale); 356 auraList.Add((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]);
357 ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).RootPart.GroupPosition = part.GetWorldPosition();
358 auraList.Add((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]);
359 }
360 } 357 }
361 } 358 }
362 359
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMView.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMView.cs
index f75f40a..3807ccd 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMView.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMView.cs
@@ -186,12 +186,9 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
186 ((ContentManagementEntity)m_model.MetaEntityCollection.Entities[group.UUID]).SendFullDiffUpdateToAll(); 186 ((ContentManagementEntity)m_model.MetaEntityCollection.Entities[group.UUID]).SendFullDiffUpdateToAll();
187 187
188 // Deal with new parts not revisioned that have been deleted. 188 // Deal with new parts not revisioned that have been deleted.
189 lock (group.Children) 189 foreach (SceneObjectPart part in group.Parts)
190 { 190 if (m_model.MetaEntityCollection.Auras.ContainsKey(part.UUID))
191 foreach (SceneObjectPart part in group.Children.Values) 191 ((AuraMetaEntity)m_model.MetaEntityCollection.Auras[part.UUID]).HideFromAll();
192 if (m_model.MetaEntityCollection.Auras.ContainsKey(part.UUID))
193 ((AuraMetaEntity)m_model.MetaEntityCollection.Auras[part.UUID]).HideFromAll();
194 }
195 } 192 }
196 193
197 public void SendMetaEntitiesToNewClient(IClientAPI client) 194 public void SendMetaEntitiesToNewClient(IClientAPI client)
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
index 49d20e1..0248f36 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
@@ -132,33 +132,30 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
132 // if group is not contained in scene's list 132 // if group is not contained in scene's list
133 if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID)) 133 if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID))
134 { 134 {
135 lock (m_UnchangedEntity.Children) 135 foreach (SceneObjectPart part in m_UnchangedEntity.Parts)
136 { 136 {
137 foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values) 137 // if scene list no longer contains this part, display translucent part and mark with red aura
138 if (!ContainsKey(sceneEntityList, part.UUID))
138 { 139 {
139 // if scene list no longer contains this part, display translucent part and mark with red aura 140 // if already displaying a red aura over part, make sure its red
140 if (!ContainsKey(sceneEntityList, part.UUID)) 141 if (m_AuraEntities.ContainsKey(part.UUID))
141 { 142 {
142 // if already displaying a red aura over part, make sure its red 143 m_AuraEntities[part.UUID].SetAura(new Vector3(254, 0, 0), part.Scale);
143 if (m_AuraEntities.ContainsKey(part.UUID)) 144 }
144 { 145 else
145 m_AuraEntities[part.UUID].SetAura(new Vector3(254,0,0), part.Scale); 146 {
146 } 147 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
147 else 148 part.GetWorldPosition(),
148 { 149 MetaEntity.TRANSLUCENT,
149 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, 150 new Vector3(254, 0, 0),
150 part.GetWorldPosition(), 151 part.Scale
151 MetaEntity.TRANSLUCENT, 152 );
152 new Vector3(254,0,0), 153 m_AuraEntities.Add(part.UUID, auraGroup);
153 part.Scale
154 );
155 m_AuraEntities.Add(part.UUID, auraGroup);
156 }
157 SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum);
158 SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT);
159 } 154 }
160 // otherwise, scene will not contain the part. note: a group can not remove a part without changing group id 155 SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum);
156 SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT);
161 } 157 }
158 // otherwise, scene will not contain the part. note: a group can not remove a part without changing group id
162 } 159 }
163 160
164 // a deleted part has no where to point a beam particle system, 161 // a deleted part has no where to point a beam particle system,
@@ -183,11 +180,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
183 /// </summary> 180 /// </summary>
184 public bool HasChildPrim(UUID uuid) 181 public bool HasChildPrim(UUID uuid)
185 { 182 {
186 lock (m_UnchangedEntity.Children) 183 return m_UnchangedEntity.ContainsPart(uuid);
187 if (m_UnchangedEntity.Children.ContainsKey(uuid))
188 return true;
189
190 return false;
191 } 184 }
192 185
193 /// <summary> 186 /// <summary>
@@ -195,12 +188,9 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
195 /// </summary> 188 /// </summary>
196 public bool HasChildPrim(uint localID) 189 public bool HasChildPrim(uint localID)
197 { 190 {
198 lock (m_UnchangedEntity.Children) 191 foreach (SceneObjectPart part in m_UnchangedEntity.Parts)
199 { 192 if (part.LocalId == localID)
200 foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values) 193 return true;
201 if (part.LocalId == localID)
202 return true;
203 }
204 194
205 return false; 195 return false;
206 } 196 }
@@ -237,72 +227,37 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
237 // Use "UnchangedEntity" to do comparisons because its text, transparency, and other attributes will be just as the user 227 // Use "UnchangedEntity" to do comparisons because its text, transparency, and other attributes will be just as the user
238 // had originally saved. 228 // had originally saved.
239 // m_Entity will NOT necessarily be the same entity as the user had saved. 229 // m_Entity will NOT necessarily be the same entity as the user had saved.
240 lock (m_UnchangedEntity.Children) 230 foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Parts)
241 { 231 {
242 foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Children.Values) 232 //This is the part that we use to show changes.
233 metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum);
234 if (sceneEntityGroup.ContainsPart(UnchangedPart.UUID))
243 { 235 {
244 //This is the part that we use to show changes. 236 sceneEntityPart = sceneEntityGroup.GetChildPart(UnchangedPart.UUID);
245 metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum); 237 differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart);
246 if (sceneEntityGroup.Children.ContainsKey(UnchangedPart.UUID)) 238 if (differences != Diff.NONE)
239 metaEntityPart.Text = "CHANGE: " + differences.ToString();
240 if (differences != 0)
247 { 241 {
248 sceneEntityPart = sceneEntityGroup.Children[UnchangedPart.UUID]; 242 // Root Part that has been modified
249 differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart); 243 if ((differences & Diff.POSITION) > 0)
250 if (differences != Diff.NONE)
251 metaEntityPart.Text = "CHANGE: " + differences.ToString();
252 if (differences != 0)
253 {
254 // Root Part that has been modified
255 if ((differences&Diff.POSITION) > 0)
256 {
257 // If the position of any part has changed, make sure the RootPart of the
258 // meta entity is pointing with a beam particle system
259 if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
260 {
261 m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
262 m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
263 }
264 BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene,
265 m_UnchangedEntity.RootPart.GetWorldPosition(),
266 MetaEntity.TRANSLUCENT,
267 sceneEntityPart,
268 new Vector3(0,0,254)
269 );
270 m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup);
271 }
272
273 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
274 {
275 m_AuraEntities[UnchangedPart.UUID].HideFromAll();
276 m_AuraEntities.Remove(UnchangedPart.UUID);
277 }
278 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
279 UnchangedPart.GetWorldPosition(),
280 MetaEntity.TRANSLUCENT,
281 new Vector3(0,0,254),
282 UnchangedPart.Scale
283 );
284 m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
285 SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
286
287 DiffersFromSceneGroup = true;
288 }
289 else // no differences between scene part and meta part
290 { 244 {
245 // If the position of any part has changed, make sure the RootPart of the
246 // meta entity is pointing with a beam particle system
291 if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) 247 if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
292 { 248 {
293 m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); 249 m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
294 m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); 250 m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
295 } 251 }
296 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) 252 BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene,
297 { 253 m_UnchangedEntity.RootPart.GetWorldPosition(),
298 m_AuraEntities[UnchangedPart.UUID].HideFromAll(); 254 MetaEntity.TRANSLUCENT,
299 m_AuraEntities.Remove(UnchangedPart.UUID); 255 sceneEntityPart,
300 } 256 new Vector3(0, 0, 254)
301 SetPartTransparency(metaEntityPart, MetaEntity.NONE); 257 );
258 m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup);
302 } 259 }
303 } 260
304 else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted.
305 {
306 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) 261 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
307 { 262 {
308 m_AuraEntities[UnchangedPart.UUID].HideFromAll(); 263 m_AuraEntities[UnchangedPart.UUID].HideFromAll();
@@ -311,14 +266,46 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
311 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, 266 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
312 UnchangedPart.GetWorldPosition(), 267 UnchangedPart.GetWorldPosition(),
313 MetaEntity.TRANSLUCENT, 268 MetaEntity.TRANSLUCENT,
314 new Vector3(254,0,0), 269 new Vector3(0, 0, 254),
315 UnchangedPart.Scale 270 UnchangedPart.Scale
316 ); 271 );
317 m_AuraEntities.Add(UnchangedPart.UUID, auraGroup); 272 m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
318 SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT); 273 SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
319 274
320 DiffersFromSceneGroup = true; 275 DiffersFromSceneGroup = true;
321 } 276 }
277 else // no differences between scene part and meta part
278 {
279 if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
280 {
281 m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
282 m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
283 }
284 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
285 {
286 m_AuraEntities[UnchangedPart.UUID].HideFromAll();
287 m_AuraEntities.Remove(UnchangedPart.UUID);
288 }
289 SetPartTransparency(metaEntityPart, MetaEntity.NONE);
290 }
291 }
292 else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted.
293 {
294 if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
295 {
296 m_AuraEntities[UnchangedPart.UUID].HideFromAll();
297 m_AuraEntities.Remove(UnchangedPart.UUID);
298 }
299 AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
300 UnchangedPart.GetWorldPosition(),
301 MetaEntity.TRANSLUCENT,
302 new Vector3(254, 0, 0),
303 UnchangedPart.Scale
304 );
305 m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
306 SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
307
308 DiffersFromSceneGroup = true;
322 } 309 }
323 } 310 }
324 311
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
index d7838c5..c7b1ed7 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
@@ -98,10 +98,9 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
98 98
99 #region Public Properties 99 #region Public Properties
100 100
101 public Dictionary<UUID, SceneObjectPart> Children 101 public SceneObjectPart[] Parts
102 { 102 {
103 get { return m_Entity.Children; } 103 get { return m_Entity.Parts; }
104 set { m_Entity.Children = value; }
105 } 104 }
106 105
107 public uint LocalId 106 public uint LocalId
@@ -150,19 +149,17 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
150 { 149 {
151 //make new uuids 150 //make new uuids
152 Dictionary<UUID, SceneObjectPart> parts = new Dictionary<UUID, SceneObjectPart>(); 151 Dictionary<UUID, SceneObjectPart> parts = new Dictionary<UUID, SceneObjectPart>();
153 152
154 lock (m_Entity.Children) 153 foreach (SceneObjectPart part in m_Entity.Parts)
155 { 154 {
156 foreach (SceneObjectPart part in m_Entity.Children.Values) 155 part.ResetIDs(part.LinkNum);
157 { 156 parts.Add(part.UUID, part);
158 part.ResetIDs(part.LinkNum);
159 parts.Add(part.UUID, part);
160 }
161
162 //finalize
163 m_Entity.RootPart.PhysActor = null;
164 m_Entity.Children = parts;
165 } 157 }
158
159 //finalize
160 m_Entity.RootPart.PhysActor = null;
161 foreach (SceneObjectPart part in parts.Values)
162 m_Entity.AddPart(part);
166 } 163 }
167 164
168 #endregion Protected Methods 165 #endregion Protected Methods
@@ -177,11 +174,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
177 //This deletes the group without removing from any databases. 174 //This deletes the group without removing from any databases.
178 //This is important because we are not IN any database. 175 //This is important because we are not IN any database.
179 //m_Entity.FakeDeleteGroup(); 176 //m_Entity.FakeDeleteGroup();
180 lock (m_Entity.Children) 177 foreach (SceneObjectPart part in m_Entity.Parts)
181 { 178 client.SendKillObject(m_Entity.RegionHandle, part.LocalId);
182 foreach (SceneObjectPart part in m_Entity.Children.Values)
183 client.SendKillObject(m_Entity.RegionHandle, part.LocalId);
184 }
185 } 179 }
186 180
187 /// <summary> 181 /// <summary>
@@ -189,15 +183,12 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
189 /// </summary> 183 /// </summary>
190 public virtual void HideFromAll() 184 public virtual void HideFromAll()
191 { 185 {
192 lock (m_Entity.Children) 186 foreach (SceneObjectPart part in m_Entity.Parts)
193 { 187 {
194 foreach (SceneObjectPart part in m_Entity.Children.Values) 188 m_Entity.Scene.ForEachClient(
195 { 189 delegate(IClientAPI controller)
196 m_Entity.Scene.ForEachClient( 190 { controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); }
197 delegate(IClientAPI controller) 191 );
198 { controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); }
199 );
200 }
201 } 192 }
202 } 193 }
203 194
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
index 59ad9d8..faed522 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
@@ -193,11 +193,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
193 193
194 int i = 0; 194 int i = 0;
195 195
196 List<SceneObjectPart> partList = null; 196 foreach (SceneObjectPart part in my.ParentGroup.Parts)
197 lock (my.ParentGroup.Children)
198 partList = new List<SceneObjectPart>(my.ParentGroup.Children.Values);
199
200 foreach (SceneObjectPart part in partList)
201 { 197 {
202 rets[i++] = new SOPObject(m_rootScene, part.LocalId, m_security); 198 rets[i++] = new SOPObject(m_rootScene, part.LocalId, m_security);
203 } 199 }