change llResetLand*List exec rights so works with group owned, plus other cosmetics

This commit is contained in:
UbitUmarov
2023-05-08 18:54:51 +01:00
parent 9c8ac8c70b
commit 32028241d2
3 changed files with 83 additions and 75 deletions

View File

@@ -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);
}

View File

@@ -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<LandAccessEntry> CreateAccessListArrayByFlag(AccessList flag)
{
ExpireAccessList();
int now = Util.UnixTimeSinceEpoch();
List<LandAccessEntry> 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<LandAccessEntry> accesslist = new();
List<LandAccessEntry> banlist = new();
foreach (LandAccessEntry entry in LandData.ParcelAccessList)
{
List<LandAccessEntry> 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<LandAccessEntry> accessEntries = CreateAccessListArrayByFlag(AccessList.Ban);
remote_client.SendLandAccessListData(accessEntries, (uint)AccessList.Ban, LandData.LocalID);
remote_client.SendLandAccessListData(new List<LandAccessEntry>() { 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<LandAccessEntry>() { 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<LandAccessEntry> entries)

View File

@@ -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<LandAccessEntry>();
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<LandAccessEntry>();
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);
}