From 7f10179129d4b5ac4ae5c05ff8598f569b8e6412 Mon Sep 17 00:00:00 2001 From: mingchen Date: Mon, 16 Jul 2007 01:25:16 +0000 Subject: *Fixed bug that incorrectly tabulated 'others' prims on a parcel *Added support for selected prims (does not yet support prims being sat on) *Added support for listing avatars with prims on parcel with their prim count --- OpenSim/Region/Environment/ParcelManager.cs | 73 +++++++++++++++++++--- .../Environment/Scenes/Scene.PacketHandlers.cs | 23 +++++++ OpenSim/Region/Environment/Scenes/Scene.cs | 3 + OpenSim/Region/Environment/Scenes/SceneObject.cs | 2 + 4 files changed, 91 insertions(+), 10 deletions(-) (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/ParcelManager.cs b/OpenSim/Region/Environment/ParcelManager.cs index 838a003..e413650 100644 --- a/OpenSim/Region/Environment/ParcelManager.cs +++ b/OpenSim/Region/Environment/ParcelManager.cs @@ -33,6 +33,7 @@ using OpenSim.Framework.Interfaces; using OpenSim.Framework.Types; using OpenSim.Region.Environment.Scenes; using Avatar = OpenSim.Region.Environment.Scenes.ScenePresence; +using System.IO; namespace OpenSim.Region.Environment { @@ -501,6 +502,11 @@ namespace OpenSim.Region.Environment { parcelList[local_id].sendForceObjectSelect(local_id, request_type, remote_client); } + + public void handleParcelObjectOwnersRequest(int local_id, IClientAPI remote_client) + { + parcelList[local_id].sendParcelObjectOwners(remote_client); + } #endregion /// @@ -591,7 +597,7 @@ namespace OpenSim.Region.Environment foreach (Parcel p in parcelOwnersAndParcels[owner]) { simArea += p.parcelData.area; - simPrims += p.parcelData.ownerPrims + p.parcelData.otherPrims + p.parcelData.groupPrims; + simPrims += p.parcelData.ownerPrims + p.parcelData.otherPrims + p.parcelData.groupPrims + p.parcelData.selectedPrims; } foreach (Parcel p in parcelOwnersAndParcels[owner]) @@ -713,7 +719,7 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName); updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented updatePacket.ParcelData.OtherCount = 0; //unemplemented - updatePacket.ParcelData.OtherPrims = parcelData.groupPrims; + updatePacket.ParcelData.OtherPrims = parcelData.otherPrims; updatePacket.ParcelData.OwnerID = parcelData.ownerID; updatePacket.ParcelData.OwnerPrims = parcelData.ownerPrims; updatePacket.ParcelData.ParcelFlags = parcelData.parcelFlags; @@ -728,7 +734,7 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.RentPrice = 0; updatePacket.ParcelData.RequestResult = request_result; updatePacket.ParcelData.SalePrice = parcelData.salePrice; - updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented + updatePacket.ParcelData.SelectedPrims = parcelData.selectedPrims; updatePacket.ParcelData.SelfCount = 0;//unemplemented updatePacket.ParcelData.SequenceID = sequence_id; if (parcelData.simwideArea > 0) @@ -743,7 +749,7 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.SnapSelection = snap_selection; updatePacket.ParcelData.SnapshotID = parcelData.snapshotID; updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus; - updatePacket.ParcelData.TotalPrims = parcelData.ownerPrims + parcelData.groupPrims + parcelData.otherPrims; + updatePacket.ParcelData.TotalPrims = parcelData.ownerPrims + parcelData.groupPrims + parcelData.otherPrims + parcelData.selectedPrims; updatePacket.ParcelData.UserLocation = parcelData.userLocation; updatePacket.ParcelData.UserLookAt = parcelData.userLookAt; remote_client.OutPacket((Packet)updatePacket); @@ -1042,7 +1048,7 @@ namespace OpenSim.Region.Environment bool firstCall = true; - int MAX_OBJECTS_PER_PACKET = 255; + int MAX_OBJECTS_PER_PACKET = 251; ForceObjectSelectPacket pack = new ForceObjectSelectPacket(); ForceObjectSelectPacket.DataBlock[] data; while (resultLocalIDs.Count > 0) @@ -1074,16 +1080,55 @@ namespace OpenSim.Region.Environment resultLocalIDs.RemoveAt(0); } pack.Data = data; - remote_client.OutPacket((Packet)pack); } } + public void sendParcelObjectOwners(IClientAPI remote_client) + { + Dictionary ownersAndCount = new Dictionary(); + foreach(SceneObject obj in primsOverMe) + { + if(!ownersAndCount.ContainsKey(obj.rootPrimitive.OwnerID)) + { + ownersAndCount.Add(obj.rootPrimitive.OwnerID,0); + } + ownersAndCount[obj.rootPrimitive.OwnerID] += obj.primCount; + } + if (ownersAndCount.Count > 0) + { + + ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock = new ParcelObjectOwnersReplyPacket.DataBlock[32]; + + if(ownersAndCount.Count < 32) + { + dataBlock = new ParcelObjectOwnersReplyPacket.DataBlock[ownersAndCount.Count]; + } + + + int num = 0; + foreach (LLUUID owner in ownersAndCount.Keys) + { + dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock(); + dataBlock[num].Count = ownersAndCount[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++; + } + + ParcelObjectOwnersReplyPacket pack = new ParcelObjectOwnersReplyPacket(); + pack.Data = dataBlock; + remote_client.OutPacket(pack); + } + } public void resetParcelPrimCounts() { parcelData.groupPrims = 0; parcelData.ownerPrims = 0; - parcelData.groupPrims = 0; + parcelData.otherPrims = 0; + parcelData.selectedPrims = 0; primsOverMe.Clear(); } @@ -1092,14 +1137,22 @@ namespace OpenSim.Region.Environment LLUUID prim_owner = obj.rootPrimitive.OwnerID; int prim_count = obj.primCount; - if(prim_owner == parcelData.ownerID) + if (obj.isSelected) { - parcelData.ownerPrims += prim_count; + parcelData.selectedPrims += prim_count; } else { - parcelData.otherPrims += prim_count; + if (prim_owner == parcelData.ownerID) + { + parcelData.ownerPrims += prim_count; + } + else + { + parcelData.otherPrims += prim_count; + } } + primsOverMe.Add(obj); } diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 6431bc7..347625a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -341,6 +341,29 @@ namespace OpenSim.Region.Environment.Scenes if (((SceneObject)ent).rootLocalID == primLocalID) { ((SceneObject)ent).GetProperites(remoteClient); + ((SceneObject)ent).isSelected = true; + this.ParcelManager.setPrimsTainted(); + break; + } + } + } + } + + /// + /// + /// + /// + /// + public void DeselectPrim(uint primLocalID, IClientAPI remoteClient) + { + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + if (((SceneObject)ent).rootLocalID == primLocalID) + { + ((SceneObject)ent).isSelected = false; + this.ParcelManager.setPrimsTainted(); break; } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 5e2e494..ba57115 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -537,6 +537,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnUpdatePrimTexture += this.UpdatePrimTexture; client.OnTeleportLocationRequest += this.RequestTeleportLocation; client.OnObjectSelect += this.SelectPrim; + client.OnObjectDeselect += this.DeselectPrim; client.OnGrapUpdate += this.MoveObject; client.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest; client.OnObjectDescription += this.PrimDescription; @@ -549,6 +550,8 @@ namespace OpenSim.Region.Environment.Scenes client.OnParcelJoinRequest += new ParcelJoinRequest(m_parcelManager.handleParcelJoinRequest); client.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(m_parcelManager.handleParcelPropertiesUpdateRequest); client.OnParcelSelectObjects += new ParcelSelectObjects(m_parcelManager.handleParcelSelectObjectsRequest); + client.OnParcelObjectOwnerRequest += new ParcelObjectOwnerRequest(m_parcelManager.handleParcelObjectOwnersRequest); + client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage); } diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs index 8de7cdb..e615599 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObject.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs @@ -49,6 +49,8 @@ namespace OpenSim.Region.Environment.Scenes private EventManager m_eventManager; + public bool isSelected = false; + public LLUUID rootUUID { get -- cgit v1.1