aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/General/Types/ParcelData.cs4
-rw-r--r--OpenSim/Region/Environment/ParcelManager.cs117
-rw-r--r--OpenSim/Region/Environment/Scenes/Primitive.cs26
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs23
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneEvents.cs11
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObject.cs60
6 files changed, 221 insertions, 20 deletions
diff --git a/OpenSim/Framework/General/Types/ParcelData.cs b/OpenSim/Framework/General/Types/ParcelData.cs
index ac34a26..2d332f5 100644
--- a/OpenSim/Framework/General/Types/ParcelData.cs
+++ b/OpenSim/Framework/General/Types/ParcelData.cs
@@ -47,6 +47,8 @@ namespace OpenSim.Framework.Types
47 public int claimPrice = 0; //Unemplemented 47 public int claimPrice = 0; //Unemplemented
48 public LLUUID groupID = new LLUUID(); //Unemplemented 48 public LLUUID groupID = new LLUUID(); //Unemplemented
49 public int groupPrims = 0; //Unemplemented 49 public int groupPrims = 0; //Unemplemented
50 public int otherPrims = 0; //Unemplemented
51 public int ownerPrims = 0; //Unemplemented
50 public int salePrice = 0; //Unemeplemented. Parcels price. 52 public int salePrice = 0; //Unemeplemented. Parcels price.
51 public Parcel.ParcelStatus parcelStatus = Parcel.ParcelStatus.Leased; 53 public Parcel.ParcelStatus parcelStatus = Parcel.ParcelStatus.Leased;
52 public uint parcelFlags = (uint)Parcel.ParcelFlags.AllowFly | (uint)Parcel.ParcelFlags.AllowLandmark | (uint)Parcel.ParcelFlags.AllowAllObjectEntry | (uint)Parcel.ParcelFlags.AllowDeedToGroup | (uint)Parcel.ParcelFlags.AllowTerraform | (uint)Parcel.ParcelFlags.CreateObjects | (uint)Parcel.ParcelFlags.AllowOtherScripts; 54 public uint parcelFlags = (uint)Parcel.ParcelFlags.AllowFly | (uint)Parcel.ParcelFlags.AllowLandmark | (uint)Parcel.ParcelFlags.AllowAllObjectEntry | (uint)Parcel.ParcelFlags.AllowDeedToGroup | (uint)Parcel.ParcelFlags.AllowTerraform | (uint)Parcel.ParcelFlags.CreateObjects | (uint)Parcel.ParcelFlags.AllowOtherScripts;
@@ -84,6 +86,8 @@ namespace OpenSim.Framework.Types
84 parcelData.globalID = this.globalID; 86 parcelData.globalID = this.globalID;
85 parcelData.groupID = this.groupID; 87 parcelData.groupID = this.groupID;
86 parcelData.groupPrims = this.groupPrims; 88 parcelData.groupPrims = this.groupPrims;
89 parcelData.otherPrims = this.otherPrims;
90 parcelData.ownerPrims = this.ownerPrims;
87 parcelData.isGroupOwned = this.isGroupOwned; 91 parcelData.isGroupOwned = this.isGroupOwned;
88 parcelData.localID = this.localID; 92 parcelData.localID = this.localID;
89 parcelData.landingType = this.landingType; 93 parcelData.landingType = this.landingType;
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
75 private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1; 75 private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
76 private int[,] parcelIDList = new int[64, 64]; 76 private int[,] parcelIDList = new int[64, 64];
77 77
78 /// <summary>
79 /// Set to true when a prim is moved, created, added. Performs a prim count update
80 /// </summary>
81 public bool parcelPrimCountTainted = false;
82
78 private Scene m_world; 83 private Scene m_world;
79 private RegionInfo m_regInfo; 84 private RegionInfo m_regInfo;
80 85
@@ -190,6 +195,13 @@ namespace OpenSim.Region.Environment
190 /// <param name="x">Value between 0 - 256 on the x axis of the point</param> 195 /// <param name="x">Value between 0 - 256 on the x axis of the point</param>
191 /// <param name="y">Value between 0 - 256 on the y axis of the point</param> 196 /// <param name="y">Value between 0 - 256 on the y axis of the point</param>
192 /// <returns>Parcel at the point supplied</returns> 197 /// <returns>Parcel at the point supplied</returns>
198 public Parcel getParcel(float x_float, float y_float)
199 {
200 int x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float)));
201 int y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float)));
202
203 return getParcel(x, y);
204 }
193 public Parcel getParcel(int x, int y) 205 public Parcel getParcel(int x, int y)
194 { 206 {
195 if (x > 256 || y > 256 || x < 0 || y < 0) 207 if (x > 256 || y > 256 || x < 0 || y < 0)
@@ -200,7 +212,6 @@ namespace OpenSim.Region.Environment
200 { 212 {
201 return parcelList[parcelIDList[x / 4, y / 4]]; 213 return parcelList[parcelIDList[x / 4, y / 4]];
202 } 214 }
203
204 } 215 }
205 #endregion 216 #endregion
206 217
@@ -262,9 +273,11 @@ namespace OpenSim.Region.Environment
262 parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false)); 273 parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false));
263 parcelList[startParcelIndex].forceUpdateParcelInfo(); 274 parcelList[startParcelIndex].forceUpdateParcelInfo();
264 275
276
277 this.setPrimsTainted();
278
265 //Now add the new parcel 279 //Now add the new parcel
266 Parcel result = addParcel(newParcel); 280 Parcel result = addParcel(newParcel);
267
268 result.sendParcelUpdateToAvatarsOverMe(); 281 result.sendParcelUpdateToAvatarsOverMe();
269 282
270 283
@@ -326,6 +339,8 @@ namespace OpenSim.Region.Environment
326 } 339 }
327 340
328 341
342 this.setPrimsTainted();
343
329 masterParcel.sendParcelUpdateToAvatarsOverMe(); 344 masterParcel.sendParcelUpdateToAvatarsOverMe();
330 345
331 return true; 346 return true;
@@ -493,13 +508,46 @@ namespace OpenSim.Region.Environment
493 Avatar clientAvatar = m_world.RequestAvatar(remote_client.AgentId); 508 Avatar clientAvatar = m_world.RequestAvatar(remote_client.AgentId);
494 if (clientAvatar != null) 509 if (clientAvatar != null)
495 { 510 {
496 Parcel over = getParcel(Convert.ToInt32(clientAvatar.Pos.X), Convert.ToInt32(clientAvatar.Pos.Y)); 511 Parcel over = getParcel(clientAvatar.Pos.X,clientAvatar.Pos.Y);
497 if (over != null) 512 if (over != null)
498 { 513 {
499 over.sendParcelProperties(0, false, 0, remote_client); 514 over.sendParcelProperties(0, false, 0, remote_client);
500 } 515 }
501 } 516 }
502 } 517 }
518
519 public void resetAllParcelPrimCounts()
520 {
521 foreach (Parcel p in parcelList.Values)
522 {
523 p.resetParcelPrimCounts();
524 }
525 }
526
527 public void addPrimToParcelCounts(SceneObject obj)
528 {
529 LLVector3 position = obj.rootPrimitive.Pos;
530 int pos_x = Convert.ToInt32(Math.Round(position.X));
531 int pos_y = Convert.ToInt32(Math.Round(position.Y));
532 Parcel parcelUnderPrim = getParcel(pos_x, pos_y);
533 if (parcelUnderPrim != null)
534 {
535 parcelUnderPrim.addPrimToCount(obj);
536 }
537 }
538
539 public void removePrimFromParcelCounts(SceneObject obj)
540 {
541 foreach (Parcel p in parcelList.Values)
542 {
543 p.removePrimFromCount(obj);
544 }
545 }
546
547 public void setPrimsTainted()
548 {
549 this.parcelPrimCountTainted = true;
550 }
503 #endregion 551 #endregion
504 } 552 }
505 #endregion 553 #endregion
@@ -513,6 +561,8 @@ namespace OpenSim.Region.Environment
513 { 561 {
514 #region Member Variables 562 #region Member Variables
515 public ParcelData parcelData = new ParcelData(); 563 public ParcelData parcelData = new ParcelData();
564 public List<SceneObject> primsOverMe = new List<SceneObject>();
565
516 public Scene m_world; 566 public Scene m_world;
517 567
518 private bool[,] parcelBitmap = new bool[64, 64]; 568 private bool[,] parcelBitmap = new bool[64, 64];
@@ -602,9 +652,9 @@ namespace OpenSim.Region.Environment
602 updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName); 652 updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName);
603 updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented 653 updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented
604 updatePacket.ParcelData.OtherCount = 0; //unemplemented 654 updatePacket.ParcelData.OtherCount = 0; //unemplemented
605 updatePacket.ParcelData.OtherPrims = 0; //unemplented 655 updatePacket.ParcelData.OtherPrims = parcelData.groupPrims;
606 updatePacket.ParcelData.OwnerID = parcelData.ownerID; 656 updatePacket.ParcelData.OwnerID = parcelData.ownerID;
607 updatePacket.ParcelData.OwnerPrims = 0; //unemplemented 657 updatePacket.ParcelData.OwnerPrims = parcelData.ownerPrims;
608 updatePacket.ParcelData.ParcelFlags = parcelData.parcelFlags; 658 updatePacket.ParcelData.ParcelFlags = parcelData.parcelFlags;
609 updatePacket.ParcelData.ParcelPrimBonus = m_world.RegionInfo.estateSettings.objectBonusFactor; 659 updatePacket.ParcelData.ParcelPrimBonus = m_world.RegionInfo.estateSettings.objectBonusFactor;
610 updatePacket.ParcelData.PassHours = parcelData.passHours; 660 updatePacket.ParcelData.PassHours = parcelData.passHours;
@@ -616,7 +666,7 @@ namespace OpenSim.Region.Environment
616 updatePacket.ParcelData.RegionPushOverride = (((uint)m_world.RegionInfo.estateSettings.regionFlags & (uint)Simulator.RegionFlags.RestrictPushObject) > 0); 666 updatePacket.ParcelData.RegionPushOverride = (((uint)m_world.RegionInfo.estateSettings.regionFlags & (uint)Simulator.RegionFlags.RestrictPushObject) > 0);
617 updatePacket.ParcelData.RentPrice = 0; 667 updatePacket.ParcelData.RentPrice = 0;
618 updatePacket.ParcelData.RequestResult = request_result; 668 updatePacket.ParcelData.RequestResult = request_result;
619 updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented 669 updatePacket.ParcelData.SalePrice = parcelData.salePrice;
620 updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented 670 updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented
621 updatePacket.ParcelData.SelfCount = 0;//unemplemented 671 updatePacket.ParcelData.SelfCount = 0;//unemplemented
622 updatePacket.ParcelData.SequenceID = sequence_id; 672 updatePacket.ParcelData.SequenceID = sequence_id;
@@ -625,7 +675,7 @@ namespace OpenSim.Region.Environment
625 updatePacket.ParcelData.SnapSelection = snap_selection; 675 updatePacket.ParcelData.SnapSelection = snap_selection;
626 updatePacket.ParcelData.SnapshotID = parcelData.snapshotID; 676 updatePacket.ParcelData.SnapshotID = parcelData.snapshotID;
627 updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus; 677 updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus;
628 updatePacket.ParcelData.TotalPrims = 0; //unemplemented 678 updatePacket.ParcelData.TotalPrims = parcelData.ownerPrims + parcelData.groupPrims + parcelData.otherPrims;
629 updatePacket.ParcelData.UserLocation = parcelData.userLocation; 679 updatePacket.ParcelData.UserLocation = parcelData.userLocation;
630 updatePacket.ParcelData.UserLookAt = parcelData.userLookAt; 680 updatePacket.ParcelData.UserLookAt = parcelData.userLookAt;
631 remote_client.OutPacket((Packet)updatePacket); 681 remote_client.OutPacket((Packet)updatePacket);
@@ -900,6 +950,59 @@ namespace OpenSim.Region.Environment
900 } 950 }
901 #endregion 951 #endregion
902 952
953 public void resetParcelPrimCounts()
954 {
955 parcelData.groupPrims = 0;
956 parcelData.ownerPrims = 0;
957 parcelData.groupPrims = 0;
958 primsOverMe.Clear();
959 }
960
961 public void addPrimToCount(SceneObject obj)
962 {
963 LLUUID prim_owner = obj.rootPrimitive.OwnerID;
964 int prim_count = obj.primCount;
965
966 if(prim_owner == parcelData.ownerID)
967 {
968 parcelData.ownerPrims += prim_count;
969 }
970 else if (prim_owner == parcelData.groupID)
971 {
972 parcelData.groupPrims += prim_count;
973 }
974 else
975 {
976 parcelData.otherPrims += prim_count;
977 }
978 primsOverMe.Add(obj);
979
980 }
981
982 public void removePrimFromCount(SceneObject obj)
983 {
984 if (primsOverMe.Contains(obj))
985 {
986 LLUUID prim_owner = obj.rootPrimitive.OwnerID;
987 int prim_count = obj.primCount;
988
989 if (prim_owner == parcelData.ownerID)
990 {
991 parcelData.ownerPrims -= prim_count;
992 }
993 else if (prim_owner == parcelData.groupID)
994 {
995 parcelData.groupPrims -= prim_count;
996 }
997 else
998 {
999 parcelData.otherPrims -= prim_count;
1000 }
1001
1002 primsOverMe.Remove(obj);
1003 }
1004 }
1005
903 #endregion 1006 #endregion
904 1007
905 1008
diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs
index e20870f..79d5785 100644
--- a/OpenSim/Region/Environment/Scenes/Primitive.cs
+++ b/OpenSim/Region/Environment/Scenes/Primitive.cs
@@ -45,6 +45,8 @@ namespace OpenSim.Region.Environment.Scenes
45 public bool m_isRootPrim; 45 public bool m_isRootPrim;
46 public EntityBase m_Parent; 46 public EntityBase m_Parent;
47 47
48 private ParcelManager m_parcelManager;
49
48 #region Properties 50 #region Properties
49 /// <summary> 51 /// <summary>
50 /// If rootprim, will return world position 52 /// If rootprim, will return world position
@@ -130,10 +132,12 @@ namespace OpenSim.Region.Environment.Scenes
130 /// <param name="isRoot"></param> 132 /// <param name="isRoot"></param>
131 /// <param name="parent"></param> 133 /// <param name="parent"></param>
132 /// <param name="rootObject"></param> 134 /// <param name="rootObject"></param>
133 public Primitive(ulong regionHandle, Scene world, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject, PrimitiveBaseShape shape, LLVector3 pos) 135 public Primitive(ulong regionHandle, Scene world, ParcelManager parcelManager, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject, PrimitiveBaseShape shape, LLVector3 pos)
134 { 136 {
137
135 m_regionHandle = regionHandle; 138 m_regionHandle = regionHandle;
136 m_world = world; 139 m_world = world;
140 m_parcelManager = parcelManager;
137 inventoryItems = new Dictionary<LLUUID, InventoryItem>(); 141 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
138 this.m_Parent = parent; 142 this.m_Parent = parent;
139 this.m_isRootPrim = isRoot; 143 this.m_isRootPrim = isRoot;
@@ -141,6 +145,9 @@ namespace OpenSim.Region.Environment.Scenes
141 145
142 this.CreateFromShape(ownerID, localID, pos, shape); 146 this.CreateFromShape(ownerID, localID, pos, shape);
143 this.Rotation = Axiom.Math.Quaternion.Identity; 147 this.Rotation = Axiom.Math.Quaternion.Identity;
148
149
150 m_parcelManager.setPrimsTainted();
144 } 151 }
145 152
146 /// <summary> 153 /// <summary>
@@ -149,11 +156,19 @@ namespace OpenSim.Region.Environment.Scenes
149 /// <remarks>Empty constructor for duplication</remarks> 156 /// <remarks>Empty constructor for duplication</remarks>
150 public Primitive() 157 public Primitive()
151 { 158 {
152 159 m_parcelManager.setPrimsTainted();
153 } 160 }
154 161
155 #endregion 162 #endregion
156 163
164 #region Destructors
165
166 ~Primitive()
167 {
168 m_parcelManager.setPrimsTainted();
169 }
170 #endregion
171
157 #region Duplication 172 #region Duplication
158 173
159 public Primitive Copy(EntityBase parent, SceneObject rootParent) 174 public Primitive Copy(EntityBase parent, SceneObject rootParent)
@@ -260,6 +275,8 @@ namespace OpenSim.Region.Environment.Scenes
260 275
261 this.m_world.DeleteEntity(linkObject.rootUUID); 276 this.m_world.DeleteEntity(linkObject.rootUUID);
262 linkObject.DeleteAllChildren(); 277 linkObject.DeleteAllChildren();
278
279 m_parcelManager.setPrimsTainted();
263 } 280 }
264 281
265 /// <summary> 282 /// <summary>
@@ -335,6 +352,7 @@ namespace OpenSim.Region.Environment.Scenes
335 prim.m_pos += offset; 352 prim.m_pos += offset;
336 prim.updateFlag = 2; 353 prim.updateFlag = 2;
337 } 354 }
355 m_parcelManager.setPrimsTainted();
338 } 356 }
339 357
340 /// <summary> 358 /// <summary>
@@ -385,6 +403,8 @@ namespace OpenSim.Region.Environment.Scenes
385 403
386 this.Pos = newPos; 404 this.Pos = newPos;
387 this.updateFlag = 2; 405 this.updateFlag = 2;
406
407 m_parcelManager.setPrimsTainted();
388 } 408 }
389 409
390 /// <summary> 410 /// <summary>
@@ -419,6 +439,8 @@ namespace OpenSim.Region.Environment.Scenes
419 this.m_pos = newPos; 439 this.m_pos = newPos;
420 this.updateFlag = 2; 440 this.updateFlag = 2;
421 } 441 }
442
443 m_parcelManager.setPrimsTainted();
422 } 444 }
423 445
424 #endregion 446 #endregion
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 01e6752..81bab9a 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -59,6 +59,7 @@ namespace OpenSim.Region.Environment.Scenes
59 private uint _primCount = 702000; 59 private uint _primCount = 702000;
60 private System.Threading.Mutex _primAllocateMutex = new Mutex(false); 60 private System.Threading.Mutex _primAllocateMutex = new Mutex(false);
61 private int storageCount; 61 private int storageCount;
62 private int parcelPrimCheckCount;
62 private Mutex updateLock; 63 private Mutex updateLock;
63 64
64 protected AuthenticateSessionsBase authenticateHandler; 65 protected AuthenticateSessionsBase authenticateHandler;
@@ -144,6 +145,8 @@ namespace OpenSim.Region.Environment.Scenes
144 Terrain = new TerrainEngine(); 145 Terrain = new TerrainEngine();
145 146
146 ScenePresence.LoadAnims(); 147 ScenePresence.LoadAnims();
148
149 this.performParcelPrimCountUpdate();
147 this.httpListener = httpServer; 150 this.httpListener = httpServer;
148 } 151 }
149 #endregion 152 #endregion
@@ -211,6 +214,18 @@ namespace OpenSim.Region.Environment.Scenes
211 this.Backup(); 214 this.Backup();
212 storageCount = 0; 215 storageCount = 0;
213 } 216 }
217
218 this.parcelPrimCheckCount++;
219 if (this.parcelPrimCheckCount > 50) //check every 5 seconds for tainted prims
220 {
221 if (m_parcelManager.parcelPrimCountTainted)
222 {
223 //Perform parcel update of prim count
224 performParcelPrimCountUpdate();
225 this.parcelPrimCheckCount = 0;
226 }
227 }
228
214 } 229 }
215 catch (Exception e) 230 catch (Exception e)
216 { 231 {
@@ -441,7 +456,7 @@ namespace OpenSim.Region.Environment.Scenes
441 { 456 {
442 try 457 try
443 { 458 {
444 SceneObject sceneOb = new SceneObject(m_regionHandle, this, ownerID, this.PrimIDAllocate(), pos, shape); 459 SceneObject sceneOb = new SceneObject(m_regionHandle, this, this.m_eventManager,this.m_parcelManager, ownerID, this.PrimIDAllocate(), pos, shape);
445 this.Entities.Add(sceneOb.rootUUID, sceneOb); 460 this.Entities.Add(sceneOb.rootUUID, sceneOb);
446 461
447 // Trigger event for listeners 462 // Trigger event for listeners
@@ -809,6 +824,12 @@ namespace OpenSim.Region.Environment.Scenes
809 return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position); 824 return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
810 } 825 }
811 826
827 public void performParcelPrimCountUpdate()
828 {
829 m_parcelManager.resetAllParcelPrimCounts();
830 m_eventManager.TriggerParcelPrimCountUpdate();
831 m_parcelManager.parcelPrimCountTainted = false;
832 }
812 #endregion 833 #endregion
813 834
814 } 835 }
diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
index deecfd5..685ed8c 100644
--- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
@@ -19,6 +19,9 @@ namespace OpenSim.Region.Environment.Scenes
19 public delegate void OnRemovePresenceDelegate(LLUUID uuid); 19 public delegate void OnRemovePresenceDelegate(LLUUID uuid);
20 public event OnRemovePresenceDelegate OnRemovePresence; 20 public event OnRemovePresenceDelegate OnRemovePresence;
21 21
22 public delegate void OnParcelPrimCountUpdateDelegate();
23 public event OnParcelPrimCountUpdateDelegate OnParcelPrimCountUpdate;
24
22 public void TriggerOnFrame() 25 public void TriggerOnFrame()
23 { 26 {
24 if (OnFrame != null) 27 if (OnFrame != null)
@@ -48,5 +51,13 @@ namespace OpenSim.Region.Environment.Scenes
48 OnBackup(dstore); 51 OnBackup(dstore);
49 } 52 }
50 } 53 }
54
55 public void TriggerParcelPrimCountUpdate()
56 {
57 if (OnParcelPrimCountUpdate != null)
58 {
59 OnParcelPrimCountUpdate();
60 }
61 }
51 } 62 }
52} 63}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs
index d1a3e70..f4c4083 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObject.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs
@@ -47,6 +47,9 @@ namespace OpenSim.Region.Environment.Scenes
47 private PhysicsScene m_PhysScene; 47 private PhysicsScene m_PhysScene;
48 private PhysicsActor m_PhysActor; 48 private PhysicsActor m_PhysActor;
49 49
50 private EventManager m_eventManager;
51 private ParcelManager m_parcelManager;
52
50 public LLUUID rootUUID 53 public LLUUID rootUUID
51 { 54 {
52 get 55 get
@@ -65,38 +68,71 @@ namespace OpenSim.Region.Environment.Scenes
65 } 68 }
66 } 69 }
67 70
71 public int primCount
72 {
73 get
74 {
75 return this.ChildPrimitives.Count;
76 }
77 }
78
68 /// <summary> 79 /// <summary>
69 /// 80 ///
70 /// </summary> 81 /// </summary>
71 public SceneObject(ulong regionHandle, Scene world, LLUUID ownerID, uint localID, LLVector3 pos, PrimitiveBaseShape shape) 82 public SceneObject(ulong regionHandle, Scene world, EventManager eventManager, ParcelManager parcelManager, LLUUID ownerID, uint localID, LLVector3 pos, PrimitiveBaseShape shape)
72 { 83 {
73 m_regionHandle = regionHandle; 84 m_regionHandle = regionHandle;
74 m_world = world; 85 m_world = world;
86 m_eventManager = eventManager;
87 m_parcelManager = parcelManager;
88
75 this.Pos = pos; 89 this.Pos = pos;
76 this.CreateRootFromShape(ownerID, localID, shape, pos); 90 this.CreateRootFromShape(ownerID, localID, shape, pos);
77 91
78 // Setup a backup event listener 92 registerEvents();
79 world.EventManager.OnBackup += new EventManager.OnBackupDelegate(ProcessBackup); 93
94 }
95
96 /// <summary>
97 ///
98 /// </summary>
99 /// <remarks>Need a null constructor for duplication</remarks>
100 public SceneObject()
101 {
102
80 } 103 }
81 104
105 public void registerEvents()
106 {
107 m_eventManager.OnBackup += new EventManager.OnBackupDelegate(ProcessBackup);
108 m_eventManager.OnParcelPrimCountUpdate += new EventManager.OnParcelPrimCountUpdateDelegate(ProcessParcelPrimCountUpdate);
109 }
110 public void unregisterEvents()
111 {
112 m_eventManager.OnBackup -= new EventManager.OnBackupDelegate(ProcessBackup);
113 m_eventManager.OnParcelPrimCountUpdate -= new EventManager.OnParcelPrimCountUpdateDelegate(ProcessParcelPrimCountUpdate);
114 }
82 /// <summary> 115 /// <summary>
83 /// Processes backup 116 /// Processes backup
84 /// </summary> 117 /// </summary>
85 /// <param name="datastore"></param> 118 /// <param name="datastore"></param>
86 void ProcessBackup(OpenSim.Region.Interfaces.IRegionDataStore datastore) 119 public void ProcessBackup(OpenSim.Region.Interfaces.IRegionDataStore datastore)
87 { 120 {
88 datastore.StoreObject(this); 121 datastore.StoreObject(this);
89 } 122 }
90 123
124
91 /// <summary> 125 /// <summary>
92 /// 126 /// Sends my primitive info to the parcel manager for it to keep tally of all of the prims!
93 /// </summary> 127 /// </summary>
94 /// <remarks>Need a null constructor for duplication</remarks> 128 private void ProcessParcelPrimCountUpdate()
95 public SceneObject()
96 { 129 {
97 130 m_parcelManager.addPrimToParcelCounts(this);
98 } 131 }
99 132
133
134
135
100 /// <summary> 136 /// <summary>
101 /// 137 ///
102 /// </summary> 138 /// </summary>
@@ -105,7 +141,7 @@ namespace OpenSim.Region.Environment.Scenes
105 /// <param name="localID"></param> 141 /// <param name="localID"></param>
106 public void CreateRootFromShape(LLUUID agentID, uint localID, PrimitiveBaseShape shape, LLVector3 pos) 142 public void CreateRootFromShape(LLUUID agentID, uint localID, PrimitiveBaseShape shape, LLVector3 pos)
107 { 143 {
108 this.rootPrimitive = new Primitive(this.m_regionHandle, this.m_world, agentID, localID, true, this, this, shape, pos); 144 this.rootPrimitive = new Primitive(this.m_regionHandle, this.m_world,this.m_parcelManager, agentID, localID, true, this, this, shape, pos);
109 this.children.Add(rootPrimitive); 145 this.children.Add(rootPrimitive);
110 this.ChildPrimitives.Add(this.rootUUID, this.rootPrimitive); 146 this.ChildPrimitives.Add(this.rootUUID, this.rootPrimitive);
111 } 147 }
@@ -120,7 +156,7 @@ namespace OpenSim.Region.Environment.Scenes
120 } 156 }
121 157
122 /// <summary> 158 /// <summary>
123 /// 159 /// Copies a prim or group of prims (SceneObject) -- TODO: cleanup code
124 /// </summary> 160 /// </summary>
125 /// <returns>A complete copy of the object</returns> 161 /// <returns>A complete copy of the object</returns>
126 public new SceneObject Copy() 162 public new SceneObject Copy()
@@ -136,6 +172,8 @@ namespace OpenSim.Region.Environment.Scenes
136 dupe.Rotation = this.Rotation; 172 dupe.Rotation = this.Rotation;
137 LLUUID rootu= dupe.rootUUID; 173 LLUUID rootu= dupe.rootUUID;
138 uint rooti = dupe.rootLocalID; 174 uint rooti = dupe.rootLocalID;
175
176 dupe.registerEvents();
139 return dupe; 177 return dupe;
140 } 178 }
141 179
@@ -147,6 +185,7 @@ namespace OpenSim.Region.Environment.Scenes
147 this.children.Clear(); 185 this.children.Clear();
148 this.ChildPrimitives.Clear(); 186 this.ChildPrimitives.Clear();
149 this.rootPrimitive = null; 187 this.rootPrimitive = null;
188 unregisterEvents();
150 } 189 }
151 190
152 /// <summary> 191 /// <summary>
@@ -256,5 +295,6 @@ namespace OpenSim.Region.Environment.Scenes
256 295
257 client.OutPacket(proper); 296 client.OutPacket(proper);
258 } 297 }
298
259 } 299 }
260} 300}