From 375673ec903719f0225b182cb62aab153c86e04e Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sat, 24 May 2008 11:10:21 +0000 Subject: This enables return from the parcel object owner display. There's some oddness with the parcel counts, but if you can get past the oddness, you can return objects under an owner that you have permission to return. --- .../Environment/Modules/World/Land/LandChannel.cs | 7 ++ .../Modules/World/Land/LandManagementModule.cs | 30 +++++++- .../Environment/Modules/World/Land/LandObject.cs | 86 ++++++++++++++++------ 3 files changed, 99 insertions(+), 24 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/World/Land') diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs index 77c70a8..0b77b23 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs @@ -142,6 +142,13 @@ namespace OpenSim.Region.Environment.Modules.World.Land m_landManagementModule.UpdateLandObject(localID, data); } } + public void ReturnObjectsInParcel(int localID, uint returnType, LLUUID[] agentIDs, LLUUID[] taskIDs, IClientAPI remoteClient) + { + if (m_landManagementModule != null) + { + m_landManagementModule.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient); + } + } #endregion } diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index 7163769..5bc28f7 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs @@ -902,7 +902,17 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void handleParcelObjectOwnersRequest(int local_id, IClientAPI remote_client) { - landList[local_id].sendLandObjectOwners(remote_client); + lock (landList) + { + if (landList.ContainsKey(local_id)) + { + landList[local_id].sendLandObjectOwners(remote_client); + } + else + { + System.Console.WriteLine("[PARCEL]: Invalid land object passed for parcel object owner request"); + } + } } public void handleParcelAbandonRequest(int local_id, IClientAPI remote_client) @@ -1004,6 +1014,24 @@ namespace OpenSim.Region.Environment.Modules.World.Land AddLandObject(new_land); } + public void ReturnObjectsInParcel(int localID, uint returnType, LLUUID[] agentIDs, LLUUID[] taskIDs, IClientAPI remoteClient) + { + ILandObject selectedParcel = null; + lock (landList) + { + if (landList.ContainsKey(localID)) + selectedParcel = landList[localID]; + } + if (selectedParcel == null) + return; + + if (returnType == 16) // parcel return + { + selectedParcel.returnLandObjects(returnType, agentIDs, remoteClient); + } + + } + public void NoLandDataFromStorage() { ResetSimLandObjects(); diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs index 98f3a3a..1a83f60 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs @@ -683,13 +683,25 @@ namespace OpenSim.Region.Environment.Modules.World.Land public Dictionary getLandObjectOwners() { Dictionary ownersAndCount = new Dictionary(); - foreach (SceneObjectGroup obj in primsOverMe) + lock (primsOverMe) { - if (!ownersAndCount.ContainsKey(obj.OwnerID)) + try + { + + foreach (SceneObjectGroup obj in primsOverMe) + { + if (!ownersAndCount.ContainsKey(obj.OwnerID)) + { + ownersAndCount.Add(obj.OwnerID, 0); + } + ownersAndCount[obj.OwnerID] += obj.PrimCount; + } + } + catch (InvalidOperationException) { - ownersAndCount.Add(obj.OwnerID, 0); + m_log.Error("[LAND]: Unable to enumerate land owners. arr."); } - ownersAndCount[obj.OwnerID] += obj.PrimCount; + } return ownersAndCount; } @@ -700,10 +712,33 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void returnObject(SceneObjectGroup obj) { + SceneObjectGroup[] objs = new SceneObjectGroup[1]; + objs[0] = obj; + m_scene.returnObjects(objs, obj.OwnerID); } - public void returnLandObjects(int type, LLUUID owner) + public void returnLandObjects(uint type, LLUUID[] owners, IClientAPI remote_client) { + List objlist = new List(); + for (int i = 0; i < owners.Length; i++) + { + lock (primsOverMe) + { + try + { + foreach (SceneObjectGroup obj in primsOverMe) + { + if (obj.OwnerID == owners[i]) + objlist.Add(obj); + } + } + catch (InvalidOperationException) + { + m_log.Info("[PARCEL]: Unable to figure out all the objects owned by " + owners[i].ToString() + " arr."); + } + } + } + m_scene.returnObjects(objlist.ToArray(), remote_client.AgentId); } #endregion @@ -716,7 +751,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land landData.ownerPrims = 0; landData.otherPrims = 0; landData.selectedPrims = 0; - primsOverMe.Clear(); + lock (primsOverMe) + primsOverMe.Clear(); } public void addPrimToCount(SceneObjectGroup obj) @@ -740,30 +776,34 @@ namespace OpenSim.Region.Environment.Modules.World.Land } } - primsOverMe.Add(obj); + lock (primsOverMe) + primsOverMe.Add(obj); } public void removePrimFromCount(SceneObjectGroup obj) { - if (primsOverMe.Contains(obj)) + lock (primsOverMe) { - LLUUID prim_owner = obj.OwnerID; - int prim_count = obj.PrimCount; - - if (prim_owner == landData.ownerID) - { - landData.ownerPrims -= prim_count; - } - else if (prim_owner == landData.groupID) - { - landData.groupPrims -= prim_count; - } - else + if (primsOverMe.Contains(obj)) { - landData.otherPrims -= prim_count; - } + LLUUID prim_owner = obj.OwnerID; + int prim_count = obj.PrimCount; - primsOverMe.Remove(obj); + if (prim_owner == landData.ownerID) + { + landData.ownerPrims -= prim_count; + } + else if (prim_owner == landData.groupID) + { + landData.groupPrims -= prim_count; + } + else + { + landData.otherPrims -= prim_count; + } + + primsOverMe.Remove(obj); + } } } -- cgit v1.1