From c69d16a90e00aeadf66d9ecc4c9914f592584c29 Mon Sep 17 00:00:00 2001 From: Daniel Dias Rodrigues Date: Mon, 3 Jun 2024 19:42:52 -0300 Subject: [PATCH] fix: Fixes parsing booleans in commands. Adds ClearAll command (#1818) --- Projects/UOContent/Commands/ClearCommands.cs | 117 ++++++++++++++++++ .../Compilers/ConditionalCompiler.cs | 4 + Projects/UOContent/Commands/Handlers.cs | 112 ----------------- docs/commands/commands.7z | Bin 12646 -> 12687 bytes 4 files changed, 121 insertions(+), 112 deletions(-) create mode 100644 Projects/UOContent/Commands/ClearCommands.cs diff --git a/Projects/UOContent/Commands/ClearCommands.cs b/Projects/UOContent/Commands/ClearCommands.cs new file mode 100644 index 000000000..42fd9d21e --- /dev/null +++ b/Projects/UOContent/Commands/ClearCommands.cs @@ -0,0 +1,117 @@ +using Server.Gumps; +using Server.Network; +using System; +using System.Collections.Generic; + +namespace Server.Commands; + +public static class ClearCommands +{ + public static void Configure() + { + CommandSystem.Register("ClearFacet", AccessLevel.Owner, ClearFacet_OnCommand); + CommandSystem.Register("ClearAll", AccessLevel.Owner, ClearAll_OnCommand); + } + + [Usage("ClearFacet")] + [Description("Deletes all items and mobiles in your facet. Players and their inventory will not be deleted.")] + public static void ClearFacet_OnCommand(CommandEventArgs e) + { + var from = e.Mobile; + var map = from.Map; + var list = GetObjects(entity => entity.Map == map); + + DeleteObjects(list, from, map.Name); + } + + [Usage( "ClearAll" )] + [Description( "Deletes all items and mobiles in all facets. Players and their inventory will not be deleted." )] + public static void ClearAll_OnCommand(CommandEventArgs e) + { + var from = e.Mobile; + var list = GetObjects(); + + DeleteObjects(list, from, "globally"); + } + + private static List GetObjects(Predicate predicate = null) + { + List list = []; + + foreach (var item in World.Items.Values) + { + if (item.Parent == null && predicate?.Invoke(item) != false) + { + list.Add(item); + } + } + + foreach (var mob in World.Mobiles.Values) + { + if (!mob.Player && predicate?.Invoke(mob) != false) + { + list.Add(mob); + } + } + + return list; + } + + private static void DeleteObjects(List list, Mobile from, string facets) + { + if (list.Count <= 0) + { + from.SendMessage("There were no objects found to delete."); + return; + } + + CommandLogging.WriteLine( + from, + $"{from.AccessLevel} {CommandLogging.Format(from)} started cleaning {facets} ({list.Count} object{(list.Count == 1 ? "" : "s")})" + ); + + from.SendGump( + new DeleteObjectsNoticeGump( + list.Count, + facets, + okay => DeleteList_Callback(from, okay, list) + ) + ); + } + + private class DeleteObjectsNoticeGump : StaticWarningGump + { + public override int Width => 360; + public override int Height => 260; + + public override string Content { get; } + + public DeleteObjectsNoticeGump(int count, string facets, Action callback) : base(callback) => + Content = + $"You are about to delete {count} object{(count == 1 ? "" : "s")} from {facets}. Do you really wish to continue?"; + } + + public static void DeleteList_Callback(Mobile from, bool okay, List list) + { + if (!okay) + { + from.SendMessage("You have chosen not to delete those objects."); + return; + } + + CommandLogging.WriteLine( + from, + $"{from.AccessLevel} {CommandLogging.Format(from)} deleting {list.Count} object{(list.Count == 1 ? "" : "s")}" + ); + + NetState.FlushAll(); + + foreach (var entity in list) + { + entity.Delete(); + } + + from.SendMessage($"You have deleted {list.Count} object{(list.Count == 1 ? "" : "s")}."); + } +} + diff --git a/Projects/UOContent/Commands/Generic/Extensions/Compilers/ConditionalCompiler.cs b/Projects/UOContent/Commands/Generic/Extensions/Compilers/ConditionalCompiler.cs index 9722d6f36..18e2a6505 100644 --- a/Projects/UOContent/Commands/Generic/Extensions/Compilers/ConditionalCompiler.cs +++ b/Projects/UOContent/Commands/Generic/Extensions/Compilers/ConditionalCompiler.cs @@ -130,6 +130,10 @@ namespace Server.Commands.Generic { Value = Enum.Parse(Type, toParse, true); } + else if (Type == typeof(bool)) + { + Value = bool.Parse(toParse); + } else { MethodInfo parseMethod; diff --git a/Projects/UOContent/Commands/Handlers.cs b/Projects/UOContent/Commands/Handlers.cs index 9bd0a5023..de1e831e2 100644 --- a/Projects/UOContent/Commands/Handlers.cs +++ b/Projects/UOContent/Commands/Handlers.cs @@ -23,43 +23,24 @@ namespace Server.Commands CommandSystem.Prefix = ServerConfiguration.GetOrUpdateSetting("commandsystem.prefix", "["); Register("Go", AccessLevel.Counselor, Go_OnCommand); - Register("DropHolding", AccessLevel.Counselor, DropHolding_OnCommand); - Register("GetFollowers", AccessLevel.GameMaster, GetFollowers_OnCommand); - - Register("ClearFacet", AccessLevel.Developer, ClearFacet_OnCommand); - Register("Where", AccessLevel.Counselor, Where_OnCommand); - Register("AutoPageNotify", AccessLevel.Counselor, APN_OnCommand); - Register("Animate", AccessLevel.GameMaster, Animate_OnCommand); - Register("Cast", AccessLevel.Counselor, Cast_OnCommand); - Register("Stuck", AccessLevel.Counselor, Stuck_OnCommand); - Register("Help", AccessLevel.Player, Help_OnCommand); - Register("Move", AccessLevel.GameMaster, Move_OnCommand); Register("Client", AccessLevel.Counselor, Client_OnCommand); - Register("SMsg", AccessLevel.Counselor, StaffMessage_OnCommand); - Register("BCast", AccessLevel.GameMaster, BroadcastMessage_OnCommand); - Register("Bank", AccessLevel.GameMaster, Bank_OnCommand); - Register("Echo", AccessLevel.Counselor, Echo_OnCommand); - Register("Sound", AccessLevel.GameMaster, Sound_OnCommand); - Register("ViewEquip", AccessLevel.GameMaster, ViewEquip_OnCommand); - Register("Light", AccessLevel.Counselor, Light_OnCommand); Register("Stats", AccessLevel.Counselor, Stats_OnCommand); - Register("SpeedBoost", AccessLevel.Counselor, SpeedBoost_OnCommand); } @@ -181,99 +162,6 @@ namespace Server.Commands } } - public static void DeleteList_Callback(Mobile from, bool okay, List list) - { - if (okay) - { - CommandLogging.WriteLine( - from, - $"{from.AccessLevel} {CommandLogging.Format(from)} deleting {list.Count} object{(list.Count == 1 ? "" : "s")}" - ); - - NetState.FlushAll(); - - for (var i = 0; i < list.Count; ++i) - { - list[i].Delete(); - } - - if (list.Count == 1) - { - from.SendMessage($"You have deleted {list.Count} object."); - } - else - { - from.SendMessage($"You have deleted {list.Count} objects."); - } - } - else - { - from.SendMessage("You have chosen not to delete those objects."); - } - } - - [Usage("ClearFacet"), - Description("Deletes all items and mobiles in your facet. Players and their inventory will not be deleted.")] - public static void ClearFacet_OnCommand(CommandEventArgs e) - { - var from = e.Mobile; - var map = from.Map; - - if (map == null || map == Map.Internal) - { - from.SendMessage("You may not run that command here."); - return; - } - - var list = new List(); - - foreach (var item in World.Items.Values) - { - if (item.Map == map && item.Parent == null) - { - list.Add(item); - } - } - - foreach (var m in World.Mobiles.Values) - { - if (m.Map == map && !m.Player) - { - list.Add(m); - } - } - - if (list.Count > 0) - { - CommandLogging.WriteLine( - from, - $"{from.AccessLevel} {CommandLogging.Format(from)} starting facet clear of {map} ({list.Count} object{(list.Count == 1 ? "" : "s")})" - ); - - from.SendGump( - new DeleteObjectsNoticeGump( - list.Count, - okay => DeleteList_Callback(from, okay, list) - ) - ); - } - else - { - from.SendMessage("There were no objects found to delete."); - } - } - - private class DeleteObjectsNoticeGump : StaticWarningGump - { - public override int Header => 1060635; //
WARNING
- public override int Width => 360; - public override int Height => 260; - public override string Content { get; } - - public DeleteObjectsNoticeGump(int count, Action callback) : base(callback) => - Content = $"You are about to delete {count} object{(count == 1 ? "" : "s")} from this facet. Do you really wish to continue?"; - } - [Usage("GetFollowers")] [Description("Teleports all pets of a targeted player to your location.")] public static void GetFollowers_OnCommand(CommandEventArgs e) diff --git a/docs/commands/commands.7z b/docs/commands/commands.7z index 00e2f554f035ec639c7407af822f52dd0b9dd37c..d0d6c0e9bbb930aa761d0a8231b619b1ad87724e 100644 GIT binary patch delta 10488 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 F002PlD~SLA