diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 3c6041758e..8b56626c02 100755 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -149,6 +149,8 @@ namespace OpenSim.Region.CoreModules.World.Land m_allowedForcefulBans = !disablebans; m_showBansLines = landManagementConfig.GetBoolean("ShowParcelBansLines", m_showBansLines); m_BanLineSafeHeight = landManagementConfig.GetFloat("BanLineSafeHeight", m_BanLineSafeHeight); + if(!m_allowedForcefulBans) + m_showBansLines = false; } } @@ -525,10 +527,10 @@ namespace OpenSim.Region.CoreModules.World.Land public void EventManagerOnSignificantClientMovement(ScenePresence avatar) { - if (avatar.IsChildAgent) + if (avatar.IsChildAgent || avatar.IsNPC) return; - if ( m_allowedForcefulBans && m_showBansLines && !m_scene.RegionInfo.EstateSettings.TaxFree) + if (m_showBansLines && !m_scene.RegionInfo.EstateSettings.TaxFree) SendOutNearestBanLine(avatar.ControllingClient); } diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 20f2b6f5c9..f856e4b573 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -796,8 +796,6 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsBannedFromLand(UUID avatar) { - ExpireAccessList(); - if (m_estateSettings.TaxFree) // region access control only return false; @@ -812,10 +810,11 @@ namespace OpenSim.Region.CoreModules.World.Land if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) { - foreach(LandAccessEntry e in LandData.ParcelAccessList) + int now = Util.UnixTimeSinceEpoch(); + foreach (LandAccessEntry e in LandData.ParcelAccessList) { if (e.Flags == AccessList.Ban && e.AgentID.Equals(avatar)) - return true; + return e.Expires == 0 || e.Expires > now; } } return false; @@ -891,12 +890,11 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsInLandAccessList(UUID avatar) { - ExpireAccessList(); - foreach(LandAccessEntry e in LandData.ParcelAccessList) { + int now = Util.UnixTimeSinceEpoch(); if (e.Flags == AccessList.Access && e.AgentID.Equals(avatar)) - return true; + return e.Expires == 0 || e.Expires > now; } return false; } @@ -972,27 +970,18 @@ namespace OpenSim.Region.CoreModules.World.Land #region AccessList Functions + //legacy public List CreateAccessListArrayByFlag(AccessList flag) { - ExpireAccessList(); - + int now = Util.UnixTimeSinceEpoch(); List list = new(); foreach (LandAccessEntry entry in LandData.ParcelAccessList) { - if (entry.Flags == flag) + if (entry.Flags == flag && (entry.Expires > now || entry.Expires == 0)) list.Add(entry); } if (list.Count == 0) - { - LandAccessEntry e = new() - { - AgentID = UUID.Zero, - Flags = 0, - Expires = 0 - }; - - list.Add(e); - } + list.Add(new LandAccessEntry()); return list; } @@ -1000,18 +989,35 @@ namespace OpenSim.Region.CoreModules.World.Land public void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client) { - - if ((flags & (uint) AccessList.Access) != 0) + int now = Util.UnixTimeSinceEpoch(); + List accesslist = new(); + List banlist = new(); + foreach (LandAccessEntry entry in LandData.ParcelAccessList) { - List accessEntries = CreateAccessListArrayByFlag(AccessList.Access); - remote_client.SendLandAccessListData(accessEntries,(uint) AccessList.Access,LandData.LocalID); + if(entry.Expires > now || entry.Expires == 0) + { + if (entry.Flags == AccessList.Access) + accesslist.Add(entry); + else if (entry.Flags == AccessList.Ban) + banlist.Add(entry); + } } - if ((flags & (uint) AccessList.Ban) != 0) + if (accesslist.Count == 0) { - List accessEntries = CreateAccessListArrayByFlag(AccessList.Ban); - remote_client.SendLandAccessListData(accessEntries, (uint)AccessList.Ban, LandData.LocalID); + remote_client.SendLandAccessListData(new List() { new LandAccessEntry() }, + (uint)AccessList.Access, LandData.LocalID); + } + else + remote_client.SendLandAccessListData(accesslist, (uint)AccessList.Access, LandData.LocalID); + + if (banlist.Count == 0) + { + remote_client.SendLandAccessListData(new List() { new LandAccessEntry() }, + (uint)AccessList.Ban, LandData.LocalID); } + else + remote_client.SendLandAccessListData(banlist, (uint)AccessList.Ban, LandData.LocalID); } public void UpdateAccessList(uint flags, UUID transactionID, List entries) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fc84ada543..69539290e2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7749,18 +7749,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(!UUID.TryParse(avatar, out UUID key) || key.IsZero()) return; - ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManagePasses, false)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManagePasses, false)) { int expires = (hours != 0) ? Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours) : 0; - foreach(LandAccessEntry e in land.LandData.ParcelAccessList) + LandData land = parcel.LandData; + foreach(LandAccessEntry e in land.ParcelAccessList) { if (e.Flags == AccessList.Access && e.AgentID.Equals(key)) { if (e.Expires != 0 && expires > e.Expires) { e.Expires = expires; - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); } return; } @@ -7772,10 +7773,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Flags = AccessList.Access, Expires = expires }; - - land.LandData.ParcelAccessList.Add(entry); - land.LandData.Flags |= (uint)ParcelFlags.UsePassList; - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + land.ParcelAccessList.Add(entry); + land.Flags |= (uint)ParcelFlags.UsePassList; + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); } ScriptSleep(m_sleepMsOnAddToLandPassList); } @@ -13308,19 +13308,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(avatar, out UUID key) || key.IsZero()) return; - ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned, false)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManageBanned, false)) { int expires = (hours != 0) ? Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours) : 0; - - foreach(LandAccessEntry e in land.LandData.ParcelAccessList) + LandData land = parcel.LandData; + foreach (LandAccessEntry e in land.ParcelAccessList) { if (e.Flags == AccessList.Ban && e.AgentID.Equals(key)) { if (e.Expires != 0 && e.Expires < expires) { e.Expires = expires; - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); } return; } @@ -13333,10 +13333,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Expires = expires }; - land.LandData.ParcelAccessList.Add(entry); - land.LandData.Flags |= (uint)ParcelFlags.UseBanList; + land.ParcelAccessList.Add(entry); + land.Flags |= (uint)ParcelFlags.UseBanList; - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); } ScriptSleep(m_sleepMsOnAddToLandBanList); } @@ -13346,21 +13346,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(avatar, out UUID key) || key.IsZero()) return; - ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManagePasses, false)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManagePasses, false)) { - int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(LandAccessEntry e) - { - if (e.Flags == AccessList.Access && e.AgentID.Equals(key)) - return true; - return false; - }); - - if (idx != -1) + LandData land = parcel.LandData; + for(int i = 0; i < land.ParcelAccessList.Count; ++i) { - land.LandData.ParcelAccessList.RemoveAt(idx); - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + LandAccessEntry e = land.ParcelAccessList[i]; + if (e.Flags == AccessList.Access && e.AgentID.Equals(key)) + { + land.ParcelAccessList.RemoveAt(i); + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); + break; + } } } ScriptSleep(m_sleepMsOnRemoveFromLandPassList); @@ -13371,21 +13369,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(avatar, out UUID key) || key.IsZero()) return; - ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned, false)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManageBanned, false)) { - int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(LandAccessEntry e) - { - if (e.Flags == AccessList.Ban && e.AgentID.Equals(key)) - return true; - return false; - }); - - if (idx != -1) + LandData land = parcel.LandData; + for (int i = 0; i < land.ParcelAccessList.Count; ++i) { - land.LandData.ParcelAccessList.RemoveAt(idx); - World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + LandAccessEntry e = land.ParcelAccessList[i]; + if (e.Flags == AccessList.Ban && e.AgentID.Equals(key)) + { + land.ParcelAccessList.RemoveAt(i); + World.EventManager.TriggerLandObjectUpdated((uint)land.LocalID, parcel); + break; + } } } ScriptSleep(m_sleepMsOnRemoveFromLandBanList); @@ -14010,9 +14006,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llResetLandBanList() { - LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition).LandData; - if (land.ParcelAccessList.Count > 0 && land.OwnerID.Equals(m_host.OwnerID)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManageBanned, false)) { + LandData land = parcel.LandData; var todelete = new List(); foreach (LandAccessEntry entry in land.ParcelAccessList) { @@ -14021,15 +14018,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } foreach (LandAccessEntry entry in todelete) land.ParcelAccessList.Remove(entry); + land.Flags &= ~(uint)ParcelFlags.UseBanList; } ScriptSleep(m_sleepMsOnResetLandBanList); } public void llResetLandPassList() { - LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition).LandData; - if (land.ParcelAccessList.Count > 0 && land.OwnerID.Equals(m_host.OwnerID)) + ILandObject parcel = World.LandChannel.GetLandObject(m_host.AbsolutePosition); + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, parcel, GroupPowers.LandManagePasses, false)) { + LandData land = parcel.LandData; var todelete = new List(); foreach (LandAccessEntry entry in land.ParcelAccessList) { @@ -14038,6 +14037,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } foreach (LandAccessEntry entry in todelete) land.ParcelAccessList.Remove(entry); + land.Flags &= ~(uint)ParcelFlags.UsePassList; } ScriptSleep(m_sleepMsOnResetLandPassList); }