diff options
author | John Hurliman | 2010-09-16 17:30:46 -0700 |
---|---|---|
committer | John Hurliman | 2010-09-16 17:30:46 -0700 |
commit | 860b2a502f797e5822c6705d4639f370f3ac5861 (patch) | |
tree | 5a74ddbd626142e27f6c3439ea267b8ea348ce9c /OpenSim/Region/OptionalModules | |
parent | Add the modules include line back that i dropped by mistake (diff) | |
download | opensim-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')
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 | } |