From 07c487a28f6ce6d85cf32fba0c2ded724f7b5af7 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 2 Feb 2012 21:36:45 +0100 Subject: Make ban, eject, freeze and the scripted versions of those work. --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 14 +-- .../CoreModules/World/Land/LandManagementModule.cs | 6 +- .../Region/CoreModules/World/Land/LandObject.cs | 78 +++++++++++----- .../Server/IRCClientView.cs | 2 +- .../Region/OptionalModules/World/NPC/NPCAvatar.cs | 2 +- .../Shared/Api/Implementation/LSL_Api.cs | 101 ++++++++++++++------- 6 files changed, 136 insertions(+), 67 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index d126f5f..8c0a7e9 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4684,7 +4684,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply); replyPacket.Data.AgentID = AgentId; @@ -4693,12 +4693,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP replyPacket.Data.SequenceID = 0; List list = new List(); - foreach (UUID avatar in avatars) + foreach (LandAccessEntry entry in accessList) { ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock(); block.Flags = accessFlag; - block.ID = avatar; - block.Time = 0; + block.ID = entry.AgentID; + block.Time = entry.Expires; list.Add(block); } @@ -8641,13 +8641,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion - List entries = new List(); + List entries = new List(); foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + LandAccessEntry entry = new LandAccessEntry(); entry.AgentID = block.ID; entry.Flags = (AccessList)block.Flags; - entry.Time = Util.ToDateTime(block.Time); + entry.Expires = block.Time; entries.Add(entry); } diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 5db56b0..0f83d82 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -508,7 +508,7 @@ namespace OpenSim.Region.CoreModules.World.Land public void ClientOnParcelAccessListUpdateRequest(UUID agentID, uint flags, int landLocalID, UUID transactionID, int sequenceID, - int sections, List entries, + int sections, List entries, IClientAPI remote_client) { // Flags is the list to update, it can mean either the ban or @@ -1777,10 +1777,10 @@ namespace OpenSim.Region.CoreModules.World.Land if ((flags & 1) != 0) // Ban TODO: Remove magic number { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + LandAccessEntry entry = new LandAccessEntry(); entry.AgentID = targetAvatar.UUID; entry.Flags = AccessList.Ban; - entry.Time = new DateTime(); + entry.Expires = 0; // Perm land.LandData.ParcelAccessList.Add(entry); } diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 07b28c7..debf6d2 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -467,21 +467,26 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsBannedFromLand(UUID avatar) { + ExpireAccessList(); + if (m_scene.Permissions.IsAdministrator(avatar)) return false; if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) return false; + if (avatar == LandData.OwnerID) + return false; + if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) { if (LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == avatar && e.Flags == AccessList.Ban) return true; return false; - }) != -1 && LandData.OwnerID != avatar) + }) != -1) { return true; } @@ -491,21 +496,26 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsRestrictedFromLand(UUID avatar) { + ExpireAccessList(); + if (m_scene.Permissions.IsAdministrator(avatar)) return false; if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) return false; + if (avatar == LandData.OwnerID) + return false; + if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) { if (LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == avatar && e.Flags == AccessList.Access) return true; return false; - }) == -1 && LandData.OwnerID != avatar) + }) == -1) { if (!HasGroupAccess(avatar)) { @@ -570,19 +580,24 @@ namespace OpenSim.Region.CoreModules.World.Land #region AccessList Functions - public List CreateAccessListArrayByFlag(AccessList flag) + public List CreateAccessListArrayByFlag(AccessList flag) { - List list = new List(); - foreach (ParcelManager.ParcelAccessEntry entry in LandData.ParcelAccessList) + ExpireAccessList(); + + List list = new List(); + foreach (LandAccessEntry entry in LandData.ParcelAccessList) { if (entry.Flags == flag) - { - list.Add(entry.AgentID); - } + list.Add(entry); } if (list.Count == 0) { - list.Add(UUID.Zero); + LandAccessEntry e = new LandAccessEntry(); + e.AgentID = UUID.Zero; + e.Flags = 0; + e.Expires = 0; + + list.Add(e); } return list; @@ -594,20 +609,20 @@ namespace OpenSim.Region.CoreModules.World.Land if (flags == (uint) AccessList.Access || flags == (uint) AccessList.Both) { - List avatars = CreateAccessListArrayByFlag(AccessList.Access); - remote_client.SendLandAccessListData(avatars,(uint) AccessList.Access,LandData.LocalID); + List accessEntries = CreateAccessListArrayByFlag(AccessList.Access); + remote_client.SendLandAccessListData(accessEntries,(uint) AccessList.Access,LandData.LocalID); } if (flags == (uint) AccessList.Ban || flags == (uint) AccessList.Both) { - List avatars = CreateAccessListArrayByFlag(AccessList.Ban); - remote_client.SendLandAccessListData(avatars, (uint)AccessList.Ban, LandData.LocalID); + List accessEntries = CreateAccessListArrayByFlag(AccessList.Ban); + remote_client.SendLandAccessListData(accessEntries, (uint)AccessList.Ban, LandData.LocalID); } } public void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, - List entries, + List entries, IClientAPI remote_client) { LandData newData = LandData.Copy(); @@ -617,16 +632,16 @@ namespace OpenSim.Region.CoreModules.World.Land { m_listTransactions[flags] = transactionID; - List toRemove = - new List(); + List toRemove = + new List(); - foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList) + foreach (LandAccessEntry entry in newData.ParcelAccessList) { if (entry.Flags == (AccessList)flags) toRemove.Add(entry); } - foreach (ParcelManager.ParcelAccessEntry entry in toRemove) + foreach (LandAccessEntry entry in toRemove) { newData.ParcelAccessList.Remove(entry); } @@ -641,13 +656,13 @@ namespace OpenSim.Region.CoreModules.World.Land } } - foreach (ParcelManager.ParcelAccessEntry entry in entries) + foreach (LandAccessEntry entry in entries) { - ParcelManager.ParcelAccessEntry temp = - new ParcelManager.ParcelAccessEntry(); + LandAccessEntry temp = + new LandAccessEntry(); temp.AgentID = entry.AgentID; - temp.Time = entry.Time; + temp.Expires = entry.Expires; temp.Flags = (AccessList)flags; newData.ParcelAccessList.Add(temp); @@ -1164,5 +1179,20 @@ namespace OpenSim.Region.CoreModules.World.Land } #endregion + + private void ExpireAccessList() + { + List delete = new List(); + + foreach (LandAccessEntry entry in LandData.ParcelAccessList) + { + if (entry.Expires != 0 && entry.Expires < Util.UnixTimeSinceEpoch()) + delete.Add(entry); + } + foreach (LandAccessEntry entry in delete) + LandData.ParcelAccessList.Remove(entry); + + m_scene.EventManager.TriggerLandObjectUpdated((uint)LandData.LocalID, this); + } } } diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index d4d0ad7..8fe3199 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1260,7 +1260,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 17fd6b1..7f5372c 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -944,7 +944,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor,int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) { } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { } public void SendForceClientSelectObjects(List objectIDs) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3e9529f..b0b1b16 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6101,16 +6101,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llEjectFromLand(string pest) { m_host.AddScriptLPS(1); - UUID agentId = new UUID(); - if (UUID.TryParse(pest, out agentId)) + UUID agentID = new UUID(); + if (UUID.TryParse(pest, out agentID)) { - ScenePresence presence = World.GetScenePresence(agentId); + ScenePresence presence = World.GetScenePresence(agentID); if (presence != null) { // agent must be over the owners land - if (m_host.OwnerID == World.LandChannel.GetLandObject( - presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) - World.TeleportClientHome(agentId, presence.ControllingClient); + ILandObject land = World.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); + if (land == null) + return; + + if (m_host.OwnerID == land.LandData.OwnerID) + { + Vector3 pos = World.GetNearestAllowedPosition(presence, land); + presence.TeleportWithMomentum(pos); + presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); + } } } ScriptSleep(5000); @@ -6804,24 +6811,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); UUID key; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed)) + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + int expires = 0; + if (hours != 0) + expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours); + if (UUID.TryParse(avatar, out key)) { - if (land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + int idx = land.LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Access) return true; return false; - }) == -1) - { - entry.AgentID = key; - entry.Flags = AccessList.Access; - entry.Time = DateTime.Now.AddHours(hours); - land.LandData.ParcelAccessList.Add(entry); - } + }); + + if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires))) + return; + + if (idx != -1) + land.LandData.ParcelAccessList.RemoveAt(idx); + + LandAccessEntry entry = new LandAccessEntry(); + + entry.AgentID = key; + entry.Flags = AccessList.Access; + entry.Expires = expires; + + land.LandData.ParcelAccessList.Add(entry); + + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); } } ScriptSleep(100); @@ -10242,22 +10262,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + int expires = 0; + if (hours != 0) + expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours); + if (UUID.TryParse(avatar, out key)) { - if (land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + int idx = land.LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Ban) return true; return false; - }) == -1) - { - entry.AgentID = key; - entry.Flags = AccessList.Ban; - entry.Time = DateTime.Now.AddHours(hours); - land.LandData.ParcelAccessList.Add(entry); - } + }); + + if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires))) + return; + + if (idx != -1) + land.LandData.ParcelAccessList.RemoveAt(idx); + + LandAccessEntry entry = new LandAccessEntry(); + + entry.AgentID = key; + entry.Flags = AccessList.Ban; + entry.Expires = expires; + + land.LandData.ParcelAccessList.Add(entry); + + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); } } ScriptSleep(100); @@ -10273,7 +10306,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(avatar, out key)) { int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Access) return true; @@ -10281,7 +10314,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api }); if (idx != -1) + { land.LandData.ParcelAccessList.RemoveAt(idx); + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + } } } ScriptSleep(100); @@ -10297,7 +10333,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(avatar, out key)) { int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Ban) return true; @@ -10305,7 +10341,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api }); if (idx != -1) + { land.LandData.ParcelAccessList.RemoveAt(idx); + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + } } } ScriptSleep(100); @@ -10625,7 +10664,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; if (land.OwnerID == m_host.OwnerID) { - foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) + foreach (LandAccessEntry entry in land.ParcelAccessList) { if (entry.Flags == AccessList.Ban) { @@ -10642,7 +10681,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; if (land.OwnerID == m_host.OwnerID) { - foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) + foreach (LandAccessEntry entry in land.ParcelAccessList) { if (entry.Flags == AccessList.Access) { -- cgit v1.1