From 423d03eaefcae1bcaff8e4d16da014d350c91c42 Mon Sep 17 00:00:00 2001 From: mingchen Date: Sat, 14 Jul 2007 15:11:36 +0000 Subject: *Added support for prim counting on parcels **No restrictions yet in place, or total prim count --- OpenSim/Region/Environment/ParcelManager.cs | 117 ++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/Environment/ParcelManager.cs') diff --git a/OpenSim/Region/Environment/ParcelManager.cs b/OpenSim/Region/Environment/ParcelManager.cs index b9c4067..981898f 100644 --- a/OpenSim/Region/Environment/ParcelManager.cs +++ b/OpenSim/Region/Environment/ParcelManager.cs @@ -75,6 +75,11 @@ namespace OpenSim.Region.Environment private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1; private int[,] parcelIDList = new int[64, 64]; + /// + /// Set to true when a prim is moved, created, added. Performs a prim count update + /// + public bool parcelPrimCountTainted = false; + private Scene m_world; private RegionInfo m_regInfo; @@ -190,6 +195,13 @@ namespace OpenSim.Region.Environment /// Value between 0 - 256 on the x axis of the point /// Value between 0 - 256 on the y axis of the point /// Parcel at the point supplied + public Parcel getParcel(float x_float, float y_float) + { + int x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float))); + int y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float))); + + return getParcel(x, y); + } public Parcel getParcel(int x, int y) { if (x > 256 || y > 256 || x < 0 || y < 0) @@ -200,7 +212,6 @@ namespace OpenSim.Region.Environment { return parcelList[parcelIDList[x / 4, y / 4]]; } - } #endregion @@ -262,9 +273,11 @@ namespace OpenSim.Region.Environment parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false)); parcelList[startParcelIndex].forceUpdateParcelInfo(); + + this.setPrimsTainted(); + //Now add the new parcel Parcel result = addParcel(newParcel); - result.sendParcelUpdateToAvatarsOverMe(); @@ -326,6 +339,8 @@ namespace OpenSim.Region.Environment } + this.setPrimsTainted(); + masterParcel.sendParcelUpdateToAvatarsOverMe(); return true; @@ -493,13 +508,46 @@ namespace OpenSim.Region.Environment Avatar clientAvatar = m_world.RequestAvatar(remote_client.AgentId); if (clientAvatar != null) { - Parcel over = getParcel(Convert.ToInt32(clientAvatar.Pos.X), Convert.ToInt32(clientAvatar.Pos.Y)); + Parcel over = getParcel(clientAvatar.Pos.X,clientAvatar.Pos.Y); if (over != null) { over.sendParcelProperties(0, false, 0, remote_client); } } } + + public void resetAllParcelPrimCounts() + { + foreach (Parcel p in parcelList.Values) + { + p.resetParcelPrimCounts(); + } + } + + public void addPrimToParcelCounts(SceneObject obj) + { + LLVector3 position = obj.rootPrimitive.Pos; + int pos_x = Convert.ToInt32(Math.Round(position.X)); + int pos_y = Convert.ToInt32(Math.Round(position.Y)); + Parcel parcelUnderPrim = getParcel(pos_x, pos_y); + if (parcelUnderPrim != null) + { + parcelUnderPrim.addPrimToCount(obj); + } + } + + public void removePrimFromParcelCounts(SceneObject obj) + { + foreach (Parcel p in parcelList.Values) + { + p.removePrimFromCount(obj); + } + } + + public void setPrimsTainted() + { + this.parcelPrimCountTainted = true; + } #endregion } #endregion @@ -513,6 +561,8 @@ namespace OpenSim.Region.Environment { #region Member Variables public ParcelData parcelData = new ParcelData(); + public List primsOverMe = new List(); + public Scene m_world; private bool[,] parcelBitmap = new bool[64, 64]; @@ -602,9 +652,9 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName); updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented updatePacket.ParcelData.OtherCount = 0; //unemplemented - updatePacket.ParcelData.OtherPrims = 0; //unemplented + updatePacket.ParcelData.OtherPrims = parcelData.groupPrims; updatePacket.ParcelData.OwnerID = parcelData.ownerID; - updatePacket.ParcelData.OwnerPrims = 0; //unemplemented + updatePacket.ParcelData.OwnerPrims = parcelData.ownerPrims; updatePacket.ParcelData.ParcelFlags = parcelData.parcelFlags; updatePacket.ParcelData.ParcelPrimBonus = m_world.RegionInfo.estateSettings.objectBonusFactor; updatePacket.ParcelData.PassHours = parcelData.passHours; @@ -616,7 +666,7 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.RegionPushOverride = (((uint)m_world.RegionInfo.estateSettings.regionFlags & (uint)Simulator.RegionFlags.RestrictPushObject) > 0); updatePacket.ParcelData.RentPrice = 0; updatePacket.ParcelData.RequestResult = request_result; - updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented + updatePacket.ParcelData.SalePrice = parcelData.salePrice; updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented updatePacket.ParcelData.SelfCount = 0;//unemplemented updatePacket.ParcelData.SequenceID = sequence_id; @@ -625,7 +675,7 @@ namespace OpenSim.Region.Environment updatePacket.ParcelData.SnapSelection = snap_selection; updatePacket.ParcelData.SnapshotID = parcelData.snapshotID; updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus; - updatePacket.ParcelData.TotalPrims = 0; //unemplemented + updatePacket.ParcelData.TotalPrims = parcelData.ownerPrims + parcelData.groupPrims + parcelData.otherPrims; updatePacket.ParcelData.UserLocation = parcelData.userLocation; updatePacket.ParcelData.UserLookAt = parcelData.userLookAt; remote_client.OutPacket((Packet)updatePacket); @@ -900,6 +950,59 @@ namespace OpenSim.Region.Environment } #endregion + public void resetParcelPrimCounts() + { + parcelData.groupPrims = 0; + parcelData.ownerPrims = 0; + parcelData.groupPrims = 0; + primsOverMe.Clear(); + } + + public void addPrimToCount(SceneObject obj) + { + LLUUID prim_owner = obj.rootPrimitive.OwnerID; + int prim_count = obj.primCount; + + if(prim_owner == parcelData.ownerID) + { + parcelData.ownerPrims += prim_count; + } + else if (prim_owner == parcelData.groupID) + { + parcelData.groupPrims += prim_count; + } + else + { + parcelData.otherPrims += prim_count; + } + primsOverMe.Add(obj); + + } + + public void removePrimFromCount(SceneObject obj) + { + if (primsOverMe.Contains(obj)) + { + LLUUID prim_owner = obj.rootPrimitive.OwnerID; + int prim_count = obj.primCount; + + if (prim_owner == parcelData.ownerID) + { + parcelData.ownerPrims -= prim_count; + } + else if (prim_owner == parcelData.groupID) + { + parcelData.groupPrims -= prim_count; + } + else + { + parcelData.otherPrims -= prim_count; + } + + primsOverMe.Remove(obj); + } + } + #endregion -- cgit v1.1