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