From dbdeb40d46dc500179edc773a2caa14b1579bcc6 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Mon, 28 Apr 2008 22:21:42 +0000 Subject: * Lash up mantis 1064 - nre thrown in LandObject.sendLandObjectOwners() * From reading the code, the cause must be that a 'show objects on my parcel' is performed when there are objects belonging to more than 32 people * I'm not sure why there is a hardcoded 32 limit but I'm leaving it in place for now. I don't regard this mantis as resolved. --- .../Modules/LandManagement/LandObject.cs | 49 ++++++++++++++++------ 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/LandManagement/LandObject.cs b/OpenSim/Region/Environment/Modules/LandManagement/LandObject.cs index 6e87a1c..da42c21 100644 --- a/OpenSim/Region/Environment/Modules/LandManagement/LandObject.cs +++ b/OpenSim/Region/Environment/Modules/LandManagement/LandObject.cs @@ -772,19 +772,28 @@ namespace OpenSim.Region.Environment.Modules.LandManagement } } + /// + /// Notify the parcel owner each avatar that owns prims situated on their land. This notification includes + /// aggreagete details such as the number of prims. + /// + /// + /// + /// A + /// public void sendLandObjectOwners(IClientAPI remote_client) { - Dictionary ownersAndCount = new Dictionary(); - ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply); + Dictionary primCount = new Dictionary(); + ParcelObjectOwnersReplyPacket pack + = (ParcelObjectOwnersReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply); // TODO: don't create new blocks if recycling an old packet foreach (SceneObjectGroup obj in primsOverMe) { try { - if (!ownersAndCount.ContainsKey(obj.OwnerID)) + if (!primCount.ContainsKey(obj.OwnerID)) { - ownersAndCount.Add(obj.OwnerID, 0); + primCount.Add(obj.OwnerID, 0); } } catch (NullReferenceException) @@ -793,36 +802,50 @@ namespace OpenSim.Region.Environment.Modules.LandManagement } try { - ownersAndCount[obj.OwnerID] += obj.PrimCount; + primCount[obj.OwnerID] += obj.PrimCount; } catch (KeyNotFoundException) { m_log.Error("[LAND]: Unable to match a prim with it's owner."); } } - if (ownersAndCount.Count > 0) + + int notifyCount = primCount.Count; + + if (notifyCount > 0) { - ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock = new ParcelObjectOwnersReplyPacket.DataBlock[32]; - - if (ownersAndCount.Count < 32) + if (notifyCount > 32) { - dataBlock = new ParcelObjectOwnersReplyPacket.DataBlock[ownersAndCount.Count]; + m_log.InfoFormat( + "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}" + + " - a developer might want to investigate whether this is a hard limit", 32); + + notifyCount = 32; } - + + ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock + = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount]; int num = 0; - foreach (LLUUID owner in ownersAndCount.Keys) + foreach (LLUUID owner in primCount.Keys) { dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock(); - dataBlock[num].Count = ownersAndCount[owner]; + dataBlock[num].Count = primCount[owner]; dataBlock[num].IsGroupOwned = false; //TODO: fix me when group support is added dataBlock[num].OnlineStatus = true; //TODO: fix me later dataBlock[num].OwnerID = owner; num++; + + if (num >= notifyCount) + { + break; + } } + pack.Data = dataBlock; } + remote_client.OutPacket(pack, ThrottleOutPacketType.Task); } -- cgit v1.1