diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 41 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 71 |
3 files changed, 65 insertions, 55 deletions
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 63f7f17..b03ffe2 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -204,18 +204,45 @@ namespace OpenSim.Region.Environment.Scenes | |||
204 | /// Add an object to the scene. | 204 | /// Add an object to the scene. |
205 | /// </summary> | 205 | /// </summary> |
206 | /// <param name="sceneObject"></param> | 206 | /// <param name="sceneObject"></param> |
207 | public void AddSceneObject(SceneObjectGroup sceneObject) | 207 | /// <returns>true if the object was added, false if an object with the same uuid was already in the scene |
208 | /// </returns> | ||
209 | public bool AddSceneObject(SceneObjectGroup sceneObject) | ||
208 | { | 210 | { |
209 | if (!Entities.ContainsKey(sceneObject.UUID)) | 211 | lock (Entities) |
210 | { | 212 | { |
211 | // QuadTree.AddSceneObject(sceneObject); | 213 | if (!Entities.ContainsKey(sceneObject.UUID)) |
212 | lock (Entities) | ||
213 | { | 214 | { |
215 | // QuadTree.AddSceneObject(sceneObject); | ||
214 | Entities.Add(sceneObject.UUID, sceneObject); | 216 | Entities.Add(sceneObject.UUID, sceneObject); |
217 | m_numPrim++; | ||
218 | |||
219 | return true; | ||
215 | } | 220 | } |
216 | m_numPrim++; | 221 | |
222 | return false; | ||
217 | } | 223 | } |
218 | } | 224 | } |
225 | |||
226 | /// <summary> | ||
227 | /// Delete an object from the scene | ||
228 | /// </summary> | ||
229 | /// <param name="sceneObject"></param> | ||
230 | /// <returns>true if the object was deleted, false if there was no object to delete</returns> | ||
231 | public bool DeleteSceneObject(LLUUID uuid) | ||
232 | { | ||
233 | lock (Entities) | ||
234 | { | ||
235 | if (Entities.ContainsKey(uuid)) | ||
236 | { | ||
237 | Entities.Remove(uuid); | ||
238 | m_numPrim--; | ||
239 | |||
240 | return true; | ||
241 | } | ||
242 | } | ||
243 | |||
244 | return false; | ||
245 | } | ||
219 | 246 | ||
220 | /// <summary> | 247 | /// <summary> |
221 | /// Add an entity to the list of prims to process on the next update | 248 | /// Add an entity to the list of prims to process on the next update |
@@ -376,7 +403,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
376 | // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? | 403 | // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? |
377 | public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) | 404 | public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) |
378 | { | 405 | { |
379 | |||
380 | if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... | 406 | if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... |
381 | return; | 407 | return; |
382 | 408 | ||
@@ -392,11 +418,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
392 | group.DetachToInventoryPrep(); | 418 | group.DetachToInventoryPrep(); |
393 | m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); | 419 | m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); |
394 | m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID); | 420 | m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID); |
395 | m_parentScene.DeleteSceneObjectGroup(group); | 421 | m_parentScene.DeleteSceneObject(group); |
396 | } | 422 | } |
397 | } | 423 | } |
398 | } | 424 | } |
399 | |||
400 | } | 425 | } |
401 | 426 | ||
402 | public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos) | 427 | public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 816b01d..82e112f 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -1251,14 +1251,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
1251 | } | 1251 | } |
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | |||
1255 | if (permissionToDelete) | 1254 | if (permissionToDelete) |
1256 | { | 1255 | { |
1257 | DeleteSceneObjectGroup(objectGroup); | 1256 | DeleteSceneObject(objectGroup); |
1258 | } | 1257 | } |
1259 | } | 1258 | } |
1260 | } | 1259 | } |
1261 | |||
1262 | } | 1260 | } |
1263 | 1261 | ||
1264 | public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) | 1262 | public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) |
@@ -1790,7 +1788,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1790 | 1788 | ||
1791 | returnobjects[i] = null; | 1789 | returnobjects[i] = null; |
1792 | 1790 | ||
1793 | DeleteSceneObjectGroup(ObjectDeleting); | 1791 | DeleteSceneObject(ObjectDeleting); |
1794 | ObjectDeleting = null; | 1792 | ObjectDeleting = null; |
1795 | } | 1793 | } |
1796 | else | 1794 | else |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index bbe8bd9..e30813c 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -1335,22 +1335,40 @@ namespace OpenSim.Region.Environment.Scenes | |||
1335 | public void AddSceneObject(SceneObjectGroup sceneObject) | 1335 | public void AddSceneObject(SceneObjectGroup sceneObject) |
1336 | { | 1336 | { |
1337 | m_innerScene.AddSceneObject(sceneObject); | 1337 | m_innerScene.AddSceneObject(sceneObject); |
1338 | } | 1338 | } |
1339 | 1339 | ||
1340 | /// <summary> | 1340 | /// <summary> |
1341 | /// Remove an object from the scene | 1341 | /// Delete this object from the scene. |
1342 | /// </summary> | 1342 | /// </summary> |
1343 | /// <param name="sceneObject"></param> | 1343 | /// <param name="group"></param> |
1344 | public void RemoveSceneObject(SceneObjectGroup sceneObject) | 1344 | public void DeleteSceneObject(SceneObjectGroup group) |
1345 | { | 1345 | { |
1346 | if (Entities.ContainsKey(sceneObject.UUID)) | 1346 | SceneObjectPart rootPart = (group).GetChildPart(group.UUID); |
1347 | if (rootPart.PhysActor != null) | ||
1348 | { | ||
1349 | PhysicsScene.RemovePrim(rootPart.PhysActor); | ||
1350 | rootPart.PhysActor = null; | ||
1351 | } | ||
1352 | |||
1353 | m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID); | ||
1354 | group.DeleteGroup(); | ||
1355 | |||
1356 | if (m_innerScene.DeleteSceneObject(group.UUID)) | ||
1347 | { | 1357 | { |
1348 | EventManager.TriggerObjectBeingRemovedFromScene(sceneObject); | 1358 | EventManager.TriggerObjectBeingRemovedFromScene(group); |
1349 | Entities.Remove(sceneObject.UUID); | ||
1350 | EventManager.TriggerParcelPrimCountTainted(); | 1359 | EventManager.TriggerParcelPrimCountTainted(); |
1351 | m_innerScene.RemoveAPrimCount(); | ||
1352 | } | 1360 | } |
1353 | } | 1361 | |
1362 | group.DeleteParts(); | ||
1363 | |||
1364 | // In case anybody else retains a reference to this group, signal deletion by changing the name | ||
1365 | // to null. We can't zero out the UUID because this is taken from the root part, which has already | ||
1366 | // been removed. | ||
1367 | // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race | ||
1368 | // conditions where a user deletes an entity while it is being stored. Really, the update | ||
1369 | // code needs a redesign. | ||
1370 | group.Name = null; | ||
1371 | } | ||
1354 | 1372 | ||
1355 | public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset) | 1373 | public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset) |
1356 | { | 1374 | { |
@@ -1411,7 +1429,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1411 | // We remove the object here | 1429 | // We remove the object here |
1412 | try | 1430 | try |
1413 | { | 1431 | { |
1414 | DeleteSceneObjectGroup(grp); | 1432 | DeleteSceneObject(grp); |
1415 | } | 1433 | } |
1416 | catch (Exception) | 1434 | catch (Exception) |
1417 | { | 1435 | { |
@@ -1473,7 +1491,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1473 | // We remove the object here | 1491 | // We remove the object here |
1474 | try | 1492 | try |
1475 | { | 1493 | { |
1476 | DeleteSceneObjectGroup(grp); | 1494 | DeleteSceneObject(grp); |
1477 | } | 1495 | } |
1478 | catch (Exception) | 1496 | catch (Exception) |
1479 | { | 1497 | { |
@@ -3142,37 +3160,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
3142 | } | 3160 | } |
3143 | 3161 | ||
3144 | /// <summary> | 3162 | /// <summary> |
3145 | /// Delete this object from the scene. | ||
3146 | /// </summary> | ||
3147 | /// <param name="group"></param> | ||
3148 | public void DeleteSceneObjectGroup(SceneObjectGroup group) | ||
3149 | { | ||
3150 | SceneObjectPart rootPart = (group).GetChildPart(group.UUID); | ||
3151 | if (rootPart.PhysActor != null) | ||
3152 | { | ||
3153 | PhysicsScene.RemovePrim(rootPart.PhysActor); | ||
3154 | rootPart.PhysActor = null; | ||
3155 | } | ||
3156 | |||
3157 | m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID); | ||
3158 | group.DeleteGroup(); | ||
3159 | |||
3160 | lock (Entities) | ||
3161 | { | ||
3162 | RemoveSceneObject(group); | ||
3163 | } | ||
3164 | group.DeleteParts(); | ||
3165 | |||
3166 | // In case anybody else retains a reference to this group, signal deletion by changing the name | ||
3167 | // to null. We can't zero out the UUID because this is taken from the root part, which has already | ||
3168 | // been removed. | ||
3169 | // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race | ||
3170 | // conditions where a user deletes an entity while it is being stored. Really, the update | ||
3171 | // code needs a redesign. | ||
3172 | group.Name = null; | ||
3173 | } | ||
3174 | |||
3175 | /// <summary> | ||
3176 | /// | 3163 | /// |
3177 | /// </summary> | 3164 | /// </summary> |
3178 | /// <param name="action"></param> | 3165 | /// <param name="action"></param> |