aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/LandManagement
diff options
context:
space:
mode:
authormingchen2007-12-20 02:36:27 +0000
committermingchen2007-12-20 02:36:27 +0000
commita596b7696a0d880cd322fcad864fc92b85a6a3b7 (patch)
tree4f8d26fcbf2f73b1560a5584d59c2703b2026664 /OpenSim/Region/Environment/LandManagement
parentAdded null check back into ModuleLoader.cs (diff)
downloadopensim-SC-a596b7696a0d880cd322fcad864fc92b85a6a3b7.zip
opensim-SC-a596b7696a0d880cd322fcad864fc92b85a6a3b7.tar.gz
opensim-SC-a596b7696a0d880cd322fcad864fc92b85a6a3b7.tar.bz2
opensim-SC-a596b7696a0d880cd322fcad864fc92b85a6a3b7.tar.xz
*Made a much more network friendly method of ban and pass line sending
*Added an event that is triggered when an agent enters a new parcel
Diffstat (limited to 'OpenSim/Region/Environment/LandManagement')
-rw-r--r--OpenSim/Region/Environment/LandManagement/Land.cs24
-rw-r--r--OpenSim/Region/Environment/LandManagement/LandManager.cs111
2 files changed, 94 insertions, 41 deletions
diff --git a/OpenSim/Region/Environment/LandManagement/Land.cs b/OpenSim/Region/Environment/LandManagement/Land.cs
index 4cfb0c1..da17a69 100644
--- a/OpenSim/Region/Environment/LandManagement/Land.cs
+++ b/OpenSim/Region/Environment/LandManagement/Land.cs
@@ -227,10 +227,14 @@ namespace OpenSim.Region.Environment.LandManagement
227 } 227 }
228 } 228 }
229 229
230 public bool isBannedFromLand(ParcelManager.ParcelAccessEntry entry, IClientAPI remote_client) 230 public bool isBannedFromLand(LLUUID avatar)
231 { 231 {
232 if ((this.landData.landFlags & (uint)Parcel.ParcelFlags.UseBanList) > 0) 232 if ((this.landData.landFlags & (uint)Parcel.ParcelFlags.UseBanList) > 0)
233 { 233 {
234 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
235 entry.AgentID = avatar;
236 entry.Flags = ParcelManager.AccessList.Ban;
237 entry.Time = new DateTime();
234 if (this.landData.parcelAccessList.Contains(entry)) 238 if (this.landData.parcelAccessList.Contains(entry))
235 { 239 {
236 //They are banned, so lets send them a notice about this parcel 240 //They are banned, so lets send them a notice about this parcel
@@ -239,6 +243,24 @@ namespace OpenSim.Region.Environment.LandManagement
239 } 243 }
240 return false; 244 return false;
241 } 245 }
246
247 public bool isRestrictedFromLand(LLUUID avatar)
248 {
249 if ((this.landData.landFlags & (uint)Parcel.ParcelFlags.UseAccessList) > 0)
250 {
251 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
252 entry.AgentID = avatar;
253 entry.Flags = ParcelManager.AccessList.Access;
254 entry.Time = new DateTime();
255 if (!this.landData.parcelAccessList.Contains(entry))
256 {
257 //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
258 return true;
259 }
260 }
261 return false;
262 }
263
242 public void sendLandUpdateToClient(IClientAPI remote_client) 264 public void sendLandUpdateToClient(IClientAPI remote_client)
243 { 265 {
244 sendLandProperties(0, false, 0, remote_client); 266 sendLandProperties(0, false, 0, remote_client);
diff --git a/OpenSim/Region/Environment/LandManagement/LandManager.cs b/OpenSim/Region/Environment/LandManagement/LandManager.cs
index 59bf7f8..5e243d1 100644
--- a/OpenSim/Region/Environment/LandManagement/LandManager.cs
+++ b/OpenSim/Region/Environment/LandManagement/LandManager.cs
@@ -76,35 +76,6 @@ namespace OpenSim.Region.Environment.LandManagement
76 76
77 #endregion 77 #endregion
78 78
79 #region Events and Triggers
80 public delegate void LandObjectAdded(Land newParcel, LLUUID regionUUID);
81 public delegate void LandObjectRemoved(LLUUID globalID);
82
83 public event LandObjectAdded OnLandObjectAdded;
84 public event LandObjectRemoved OnLandObjectRemoved;
85
86 public void triggerLandObjectAdded(Land newParcel)
87 {
88 if (OnLandObjectAdded != null)
89 {
90 OnLandObjectAdded(newParcel, m_scene.RegionInfo.RegionID);
91 }
92 }
93 public void triggerLandObjectRemoved(LLUUID globalID)
94 {
95 if (OnLandObjectRemoved != null)
96 {
97 OnLandObjectRemoved(globalID);
98 }
99 }
100 public void triggerLandObjectUpdated(uint localParcelID, Land newParcel)
101 {
102 //triggerLandObjectRemoved(localParcelID);
103 triggerLandObjectAdded(newParcel);
104 }
105
106 #endregion
107
108 #region Member Variables 79 #region Member Variables
109 80
110 public Dictionary<int, Land> landList = new Dictionary<int, Land>(); 81 public Dictionary<int, Land> landList = new Dictionary<int, Land>();
@@ -128,6 +99,8 @@ namespace OpenSim.Region.Environment.LandManagement
128 m_scene = scene; 99 m_scene = scene;
129 m_regInfo = reginfo; 100 m_regInfo = reginfo;
130 landIDList.Initialize(); 101 landIDList.Initialize();
102 scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(handleAvatarChangingParcel);
103
131 } 104 }
132 105
133 106
@@ -170,6 +143,7 @@ namespace OpenSim.Region.Environment.LandManagement
170 /// <returns></returns> 143 /// <returns></returns>
171 public Land createBaseLand() 144 public Land createBaseLand()
172 { 145 {
146
173 return new Land(LLUUID.Zero, false, m_scene); 147 return new Land(LLUUID.Zero, false, m_scene);
174 } 148 }
175 149
@@ -197,7 +171,7 @@ namespace OpenSim.Region.Environment.LandManagement
197 } 171 }
198 } 172 }
199 landList[lastLandLocalID].forceUpdateLandInfo(); 173 landList[lastLandLocalID].forceUpdateLandInfo();
200 triggerLandObjectAdded(new_land); 174 m_scene.EventManager.TriggerLandObjectAdded(new_land,m_scene.RegionInfo.RegionID);
201 return new_land; 175 return new_land;
202 } 176 }
203 177
@@ -219,7 +193,7 @@ namespace OpenSim.Region.Environment.LandManagement
219 } 193 }
220 } 194 }
221 195
222 triggerLandObjectRemoved(landList[local_id].landData.globalID); 196 m_scene.EventManager.TriggerLandObjectRemoved(landList[local_id].landData.globalID);
223 landList.Remove(local_id); 197 landList.Remove(local_id);
224 } 198 }
225 199
@@ -228,7 +202,7 @@ namespace OpenSim.Region.Environment.LandManagement
228 if (landList.ContainsKey(local_id)) 202 if (landList.ContainsKey(local_id))
229 { 203 {
230 landList[local_id].landData = newData.Copy(); 204 landList[local_id].landData = newData.Copy();
231 triggerLandObjectUpdated((uint)local_id, landList[local_id]); 205 m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landList[local_id]);
232 } 206 }
233 else 207 else
234 { 208 {
@@ -590,18 +564,70 @@ namespace OpenSim.Region.Environment.LandManagement
590 addLandObject(fullSimParcel); 564 addLandObject(fullSimParcel);
591 } 565 }
592 566
593 public void sendOutBannedNotices(IClientAPI avatar) 567 public List<Land> parcelsNearPoint(LLVector3 position)
568 {
569
570 List<Land> parcelsNear = new List<Land>();
571 int x, y;
572 for (x = -4; x <= 4; x += 4)
573 {
574 for (y = -4; y <= 4; y += 4)
575 {
576 Land check = getLandObject(position.X + x, position.Y + y);
577 if (!parcelsNear.Contains(check))
578 {
579 parcelsNear.Add(check);
580 }
581 }
582 }
583
584 return parcelsNear;
585
586 }
587
588 public void handleAvatarChangingParcel(ScenePresence avatar, int localLandID, LLUUID regionID)
594 { 589 {
595 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); 590 if (m_scene.RegionInfo.RegionID == regionID)
596 entry.AgentID = avatar.AgentId; 591 {
597 entry.Flags = ParcelManager.AccessList.Ban; 592 if (landList[localLandID] != null)
598 entry.Time = new DateTime(); 593 {
594 Land parcelAvatarIsEntering = landList[localLandID];
595 if (parcelAvatarIsEntering.isBannedFromLand(avatar.UUID))
596 {
597 avatar.ControllingClient.SendAlertMessage("You are not allowed on this parcel because you are banned. Please go away. <3 OpenSim Developers");
598
599 }
600 else if (parcelAvatarIsEntering.isRestrictedFromLand(avatar.UUID))
601 {
602 avatar.ControllingClient.SendAlertMessage("You are not allowed on this parcel because the land owner has restricted access. Please go away. <3 OpenSim Developers");
603 }
604 }
605 }
606 }
599 607
600 foreach (Land checkBan in landList.Values) 608 public void sendOutBannedNotices(IClientAPI avatar)
609 {
610
611 List<ScenePresence> avatars = m_scene.GetAvatars();
612 foreach (ScenePresence presence in avatars)
601 { 613 {
602 if (checkBan.isBannedFromLand(entry, avatar)) 614 if (presence.UUID == avatar.AgentId)
603 { 615 {
604 checkBan.sendLandProperties(-30000, false, (int)ParcelManager.ParcelResult.Single, avatar); 616 List<Land> checkLandParcels = parcelsNearPoint(presence.AbsolutePosition);
617 foreach (Land checkBan in checkLandParcels)
618 {
619 if (checkBan.isBannedFromLand(avatar.AgentId))
620 {
621 checkBan.sendLandProperties(-30000, false, (int)ParcelManager.ParcelResult.Single, avatar);
622 return; //Only send one
623 }
624 else if (checkBan.isRestrictedFromLand(avatar.AgentId))
625 {
626 checkBan.sendLandProperties(-40000, false, (int)ParcelManager.ParcelResult.Single, avatar);
627 return; //Only send one
628 }
629 }
630 return;
605 } 631 }
606 } 632 }
607 } 633 }
@@ -614,6 +640,11 @@ namespace OpenSim.Region.Environment.LandManagement
614 if (over != null) 640 if (over != null)
615 { 641 {
616 over.sendLandUpdateToClient(avatar.ControllingClient); 642 over.sendLandUpdateToClient(avatar.ControllingClient);
643 if (avatar.currentParcelUUID != over.landData.globalID)
644 {
645 avatar.currentParcelUUID = over.landData.globalID;
646 m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.landData.localID, this.m_scene.RegionInfo.RegionID);
647 }
617 } 648 }
618 649
619 } 650 }