From 4479555156ebc69795be681644c74151f05d26a8 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 10 Feb 2024 20:31:25 -0800 Subject: [PATCH] fix: Fixes missing methods. Adds more admin gump world building (#1675) ### Summary - Fixe commands missing in helpinfo. - Adds more admin gump world building options. ### Screenshots --- .../Server/Network/NetState/DumpNetStates.cs | 2 +- Projects/UOContent/Commands/ExportWSC.cs | 22 +- Projects/UOContent/Commands/GenCommands.cs | 2 +- Projects/UOContent/Commands/HelpInfo.cs | 51 ++--- .../Commands/Object Creation/DecorateMag.cs | 2 +- .../UOContent/Engines/ConPVP/DuelContext.cs | 3 + .../UOContent/Engines/Doom/GenGauntlet.cs | 4 + .../Doom/LeverPuzzle/LeverPuzzleController.cs | 5 +- .../Engines/Factions/Core/Faction.cs | 8 + .../Engines/Factions/Core/Generator.cs | 3 + .../UOContent/Engines/Factions/Core/Town.cs | 2 + .../UOContent/Engines/Khaldun/KhaldunGen.cs | 2 + Projects/UOContent/Engines/Party/Party.cs | 2 + .../UOContent/Engines/Pathing/MovementPath.cs | 2 + .../Commands/ConvertPremiumSpawners.cs | 2 + .../Commands/GenerateSpawnersCommand.cs | 18 +- .../Engines/Spawners/SpawnerControllerGump.cs | 5 +- Projects/UOContent/Gumps/AdminGump.cs | 82 +++++--- .../UOContent/Items/Addons/SHTeleporter.cs | 192 ++++++++---------- Projects/UOContent/Items/Misc/WayPoint.cs | 2 + Projects/UOContent/Misc/AutoRestart.cs | 2 + docs/commands/commands.7z | Bin 11821 -> 12416 bytes 22 files changed, 212 insertions(+), 201 deletions(-) diff --git a/Projects/Server/Network/NetState/DumpNetStates.cs b/Projects/Server/Network/NetState/DumpNetStates.cs index 24b98b9eb..be3c2bdea 100644 --- a/Projects/Server/Network/NetState/DumpNetStates.cs +++ b/Projects/Server/Network/NetState/DumpNetStates.cs @@ -21,7 +21,7 @@ public static class DumpNetStates { public static void Configure() { - CommandSystem.Register("DumpNetStates", AccessLevel.Administrator, DumpNetStatesCommand); + CommandSystem.Register("DumpNetStates", AccessLevel.Developer, DumpNetStatesCommand); } public static void DumpNetStatesCommand(CommandEventArgs args) diff --git a/Projects/UOContent/Commands/ExportWSC.cs b/Projects/UOContent/Commands/ExportWSC.cs index 5b870cf92..3d08afc18 100644 --- a/Projects/UOContent/Commands/ExportWSC.cs +++ b/Projects/UOContent/Commands/ExportWSC.cs @@ -6,20 +6,30 @@ namespace Server.Commands { public static class ExportCommand { - private const string ExportFile = @"C:\Uo\WorldForge\items.wsc"; - public static void Configure() { - CommandSystem.Register("ExportWSC", AccessLevel.Administrator, Export_OnCommand); + CommandSystem.Register("ExportWSC", AccessLevel.Developer, Export_OnCommand); } + [Usage("ExportWSC ")] + [Description("Exports all static items to a WSC file. This will delete all static items in the world. Please make a backup.")] public static void Export_OnCommand(CommandEventArgs e) { - var w = new StreamWriter(ExportFile); + if (e.Arguments.Length < 1) + { + e.Mobile.SendMessage("Usage: [ExportWSC ]"); + return; + } + + var exportFilePath = e.GetString(0); + var fi = new FileInfo(exportFilePath); + fi.Directory.EnsureDirectory(); + + var w = new StreamWriter(exportFilePath); var remove = new List(); var count = 0; - e.Mobile.SendMessage($"Exporting all static items to \"{ExportFile}\"..."); + e.Mobile.SendMessage($"Exporting all static items to \"{exportFilePath}\"..."); e.Mobile.SendMessage("This will delete all static items in the world. Please make a backup."); foreach (var item in World.Items.Values) @@ -60,7 +70,7 @@ namespace Server.Commands item.Delete(); } - e.Mobile.SendMessage($"Export complete. Exported {count} statics."); + e.Mobile.SendMessage($"Export complete. Exported {count} statics."); } } } diff --git a/Projects/UOContent/Commands/GenCommands.cs b/Projects/UOContent/Commands/GenCommands.cs index 5268e6322..22fab6953 100644 --- a/Projects/UOContent/Commands/GenCommands.cs +++ b/Projects/UOContent/Commands/GenCommands.cs @@ -15,7 +15,7 @@ public static class GenCommands CommandSystem.Register("GenCommands", AccessLevel.Developer, GenCommandsWebpage_OnCommand); } - [Usage("GenCommands []")] + [Usage("GenCommands")] [Aliases("GenCmdWeb")] [Description("Generates a webpage to the web folder with a list of all commands.")] private static void GenCommandsWebpage_OnCommand(CommandEventArgs e) diff --git a/Projects/UOContent/Commands/HelpInfo.cs b/Projects/UOContent/Commands/HelpInfo.cs index 2f49d79eb..f3768e9df 100644 --- a/Projects/UOContent/Commands/HelpInfo.cs +++ b/Projects/UOContent/Commands/HelpInfo.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Reflection; using Server.Commands.Generic; using Server.Gumps; using Server.Network; @@ -87,36 +88,23 @@ public static class HelpInfo var mi = e.Handler.Method; - var attrs = mi.GetCustomAttributes(typeof(UsageAttribute), false); + var usageAttr = mi.GetCustomAttribute(typeof(UsageAttribute), false) as UsageAttribute; + var usage = usageAttr?.Usage; - if (attrs.Length == 0) - { - continue; - } - - var usage = attrs[0] as UsageAttribute; - - attrs = mi.GetCustomAttributes(typeof(DescriptionAttribute), false); - - if (attrs.Length == 0) - { - continue; - } - - if (usage == null || attrs[0] is not DescriptionAttribute desc) - { - continue; - } - - attrs = mi.GetCustomAttributes(typeof(AliasesAttribute), false); - - var aliases = attrs.Length == 0 ? null : attrs[0] as AliasesAttribute; - - var descString = desc.Description + var descAttr = mi.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute; + var desc = descAttr?.Description .ReplaceOrdinal("<", "(") .ReplaceOrdinal(">", ")"); - list.Add(new CommandInfo(e.AccessLevel, e.Command, aliases?.Aliases, usage.Usage, null, descString)); + if (e.Handler.Target == null && usage == null && desc == null) + { + continue; + } + + var aliasesAttr = mi.GetCustomAttribute(typeof(AliasesAttribute), false) as AliasesAttribute; + var aliases = aliasesAttr?.Aliases; + + list.Add(new CommandInfo(e.AccessLevel, e.Command, aliases, usage, null, desc)); } for (var i = 0; i < TargetCommands.AllCommands.Count; ++i) @@ -165,16 +153,11 @@ public static class HelpInfo { var command = commandImpls[i]; - var usage = command.Usage; - var desc = command.Description; - - if (usage == null || desc == null) - { - continue; - } - var cmds = command.Accessors; var cmd = cmds[0]; + + var desc = command.Description ?? "No description available."; + var usage = command.Usage ?? cmd; var aliases = new string[cmds.Length - 1]; for (var j = 0; j < aliases.Length; ++j) diff --git a/Projects/UOContent/Commands/Object Creation/DecorateMag.cs b/Projects/UOContent/Commands/Object Creation/DecorateMag.cs index 66c66ddc6..8a19d146a 100644 --- a/Projects/UOContent/Commands/Object Creation/DecorateMag.cs +++ b/Projects/UOContent/Commands/Object Creation/DecorateMag.cs @@ -24,7 +24,7 @@ namespace Server.Commands } [Usage("DecorateMag")] - [Description("Generates world decoration.")] + [Description("Generates world decoration for Magincia after it was ruined.")] private static void DecorateMag_OnCommand(CommandEventArgs e) { m_Mobile = e.Mobile; diff --git a/Projects/UOContent/Engines/ConPVP/DuelContext.cs b/Projects/UOContent/Engines/ConPVP/DuelContext.cs index 2b9402313..025178f2c 100644 --- a/Projects/UOContent/Engines/ConPVP/DuelContext.cs +++ b/Projects/UOContent/Engines/ConPVP/DuelContext.cs @@ -1239,6 +1239,9 @@ namespace Server.Engines.ConPVP CommandSystem.Register("vli", AccessLevel.GameMaster, vli_oc); } + [Usage("vli")] + [Aliases("ViewLadderInfo")] + [Description("View ladder information.")] private static void vli_oc(CommandEventArgs e) { e.Mobile.BeginTarget(-1, false, TargetFlags.None, vli_ot); diff --git a/Projects/UOContent/Engines/Doom/GenGauntlet.cs b/Projects/UOContent/Engines/Doom/GenGauntlet.cs index ea37ee5f8..c770afa85 100644 --- a/Projects/UOContent/Engines/Doom/GenGauntlet.cs +++ b/Projects/UOContent/Engines/Doom/GenGauntlet.cs @@ -12,6 +12,8 @@ namespace Server.Engines.Doom CommandSystem.Register("RemGauntlet", AccessLevel.Developer, RemoveGauntlet); } + [Usage("RemGauntlet")] + [Description("Removes the Gauntlet from Dungeon Doom.")] public static void RemoveGauntlet(CommandEventArgs e) { RemoveMobile(387, 400); @@ -45,6 +47,8 @@ namespace Server.Engines.Doom RemoveItem(433, 326, 4); } + [Usage("GenGauntlet")] + [Description("Generates the Gauntlet in Dungeon Doom.")] public static void GenGauntlet_OnCommand(CommandEventArgs e) { RemoveGauntlet(e); diff --git a/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs b/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs index 7e97095b3..8af67df58 100644 --- a/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs +++ b/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs @@ -192,10 +192,11 @@ public partial class LeverPuzzleController : Item public static void Configure() { - CommandSystem.Register("GenLeverPuzzle", AccessLevel.Administrator, GenLampPuzzle_OnCommand); + CommandSystem.Register("GenLeverPuzzle", AccessLevel.Developer, GenLampPuzzle_OnCommand); } - [Usage("GenLeverPuzzle"), Description("Generates lamp room and lever puzzle in doom.")] + [Usage("GenLeverPuzzle")] + [Description("Generates lamp room and lever puzzle in doom.")] public static void GenLampPuzzle_OnCommand(CommandEventArgs e) { foreach (var item in Map.Malas.GetItemsAt(lp_Center)) diff --git a/Projects/UOContent/Engines/Factions/Core/Faction.cs b/Projects/UOContent/Engines/Factions/Core/Faction.cs index 15f7a79f4..c0bb0b049 100644 --- a/Projects/UOContent/Engines/Factions/Core/Faction.cs +++ b/Projects/UOContent/Engines/Factions/Core/Faction.cs @@ -657,6 +657,8 @@ namespace Server.Factions Timer.DelayCall(TimeSpan.FromSeconds(30.0), TimeSpan.FromSeconds(30.0), ProcessTick); } + [Usage("FactionTownReset")] + [Description("Resets all faction town data in the world.")] public static void FactionTownReset_OnCommand(CommandEventArgs e) { var monoliths = BaseMonolith.Monoliths; @@ -715,6 +717,8 @@ namespace Server.Factions } } + [Usage("FactionReset")] + [Description("Resets all faction data in the world.")] public static void FactionReset_OnCommand(CommandEventArgs e) { var monoliths = BaseMonolith.Monoliths; @@ -787,6 +791,8 @@ namespace Server.Factions } } + [Usage("FactionItemReset")] + [Description("Resets all faction items in the world.")] public static void FactionItemReset_OnCommand(CommandEventArgs e) { var items = new List(); @@ -869,6 +875,8 @@ namespace Server.Factions } } + [Usage("FactionElection")] + [Description("Opens the election properties for the targeted faction stone.")] public static void FactionElection_OnCommand(CommandEventArgs e) { e.Mobile.SendMessage("Target a faction stone to open its election properties."); diff --git a/Projects/UOContent/Engines/Factions/Core/Generator.cs b/Projects/UOContent/Engines/Factions/Core/Generator.cs index 6cd6fbe0f..97f3a0e40 100644 --- a/Projects/UOContent/Engines/Factions/Core/Generator.cs +++ b/Projects/UOContent/Engines/Factions/Core/Generator.cs @@ -9,6 +9,9 @@ namespace Server.Factions CommandSystem.Register("GenerateFactions", AccessLevel.Developer, GenerateFactions_OnCommand); } + [Usage("GenerateFactions")] + [Aliases("FactionGen", "GenFactions")] + [Description("Enables and generates factions.")] public static void GenerateFactions_OnCommand(CommandEventArgs e) { var from = e.Mobile; diff --git a/Projects/UOContent/Engines/Factions/Core/Town.cs b/Projects/UOContent/Engines/Factions/Core/Town.cs index 2a13fa11f..480b60f16 100644 --- a/Projects/UOContent/Engines/Factions/Core/Town.cs +++ b/Projects/UOContent/Engines/Factions/Core/Town.cs @@ -544,6 +544,8 @@ namespace Server.Factions return null; } + [Usage("GrantTownSilver ")] + [Description("Grants silver to the town of the current region.")] public static void GrantTownSilver_OnCommand(CommandEventArgs e) { var town = FromRegion(e.Mobile.Region); diff --git a/Projects/UOContent/Engines/Khaldun/KhaldunGen.cs b/Projects/UOContent/Engines/Khaldun/KhaldunGen.cs index 3057a9c43..5ee4316a7 100644 --- a/Projects/UOContent/Engines/Khaldun/KhaldunGen.cs +++ b/Projects/UOContent/Engines/Khaldun/KhaldunGen.cs @@ -113,6 +113,8 @@ namespace Server.Commands m_Count++; } + [Usage("GenKhaldun")] + [Description("Generates Khaldun Puzzles")] public static void GenKhaldun_OnCommand(CommandEventArgs e) { m_Count = 0; diff --git a/Projects/UOContent/Engines/Party/Party.cs b/Projects/UOContent/Engines/Party/Party.cs index 03c28b130..4b86149c8 100644 --- a/Projects/UOContent/Engines/Party/Party.cs +++ b/Projects/UOContent/Engines/Party/Party.cs @@ -105,6 +105,8 @@ namespace Server.Engines.PartySystem CommandSystem.Register("ListenToParty", AccessLevel.GameMaster, ListenToParty_OnCommand); } + [Usage("ListenToParty")] + [Description("Listen to the targeted player's party chat.")] public static void ListenToParty_OnCommand(CommandEventArgs e) { e.Mobile.BeginTarget(-1, false, TargetFlags.None, ListenToParty_OnTarget); diff --git a/Projects/UOContent/Engines/Pathing/MovementPath.cs b/Projects/UOContent/Engines/Pathing/MovementPath.cs index 1652dd053..2ae2e714b 100644 --- a/Projects/UOContent/Engines/Pathing/MovementPath.cs +++ b/Projects/UOContent/Engines/Pathing/MovementPath.cs @@ -61,6 +61,8 @@ namespace Server CommandSystem.Register("Path", AccessLevel.GameMaster, Path_OnCommand); } + [Usage("Path")] + [Description("Draws a path from your current location to a targeted location.")] public static void Path_OnCommand(CommandEventArgs e) { e.Mobile.BeginTarget(-1, true, TargetFlags.None, Path_OnTarget); diff --git a/Projects/UOContent/Engines/Spawners/Commands/ConvertPremiumSpawners.cs b/Projects/UOContent/Engines/Spawners/Commands/ConvertPremiumSpawners.cs index 57238a1b3..9afa835a3 100644 --- a/Projects/UOContent/Engines/Spawners/Commands/ConvertPremiumSpawners.cs +++ b/Projects/UOContent/Engines/Spawners/Commands/ConvertPremiumSpawners.cs @@ -34,6 +34,8 @@ namespace Server.Engines.Spawners CommandSystem.Register("ConvertPremiumSpawners", AccessLevel.Developer, ConvertPremiumSpawners_OnCommand); } + [Usage("ConvertPremiumSpawners ")] + [Description("Converts Nerun's Premium Spawners to JSON.")] private static void ConvertPremiumSpawners_OnCommand(CommandEventArgs args) { var from = args.Mobile; diff --git a/Projects/UOContent/Engines/Spawners/Commands/GenerateSpawnersCommand.cs b/Projects/UOContent/Engines/Spawners/Commands/GenerateSpawnersCommand.cs index f0743e7de..2b43e2fa0 100644 --- a/Projects/UOContent/Engines/Spawners/Commands/GenerateSpawnersCommand.cs +++ b/Projects/UOContent/Engines/Spawners/Commands/GenerateSpawnersCommand.cs @@ -1,18 +1,3 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2023 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: GenerateSpawnersCommand.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - using System; using System.Collections.Generic; using System.Diagnostics; @@ -37,6 +22,9 @@ namespace Server.Engines.Spawners CommandSystem.Register("GenerateSpawners", AccessLevel.Developer, GenerateSpawners_OnCommand); } + [Usage("GenerateSpawners ")] + [Aliases("ImportSpawners", "GenSpawners", "GenSpawns")] + [Description("Generates spawners from JSON files. Supports basic globbing.")] private static void GenerateSpawners_OnCommand(CommandEventArgs e) { var from = e.Mobile; diff --git a/Projects/UOContent/Engines/Spawners/SpawnerControllerGump.cs b/Projects/UOContent/Engines/Spawners/SpawnerControllerGump.cs index 387acc492..a1ecb8156 100644 --- a/Projects/UOContent/Engines/Spawners/SpawnerControllerGump.cs +++ b/Projects/UOContent/Engines/Spawners/SpawnerControllerGump.cs @@ -34,9 +34,12 @@ public class SpawnerControllerGump : GumpGrid public static void Configure() { - CommandSystem.Register("Spawn", AccessLevel.GameMaster, OpenSpawnGump_OnCommand); + CommandSystem.Register("SpawnAdmin", AccessLevel.GameMaster, OpenSpawnGump_OnCommand); } + [Usage("Spawn")] + [Aliases("Spawn")] + [Description("Opens the spawn administration gump.")] public static void OpenSpawnGump_OnCommand(CommandEventArgs e) { e.Mobile.SendGump(new SpawnerControllerGump(e.Mobile)); diff --git a/Projects/UOContent/Gumps/AdminGump.cs b/Projects/UOContent/Gumps/AdminGump.cs index 607c65281..66846478f 100644 --- a/Projects/UOContent/Gumps/AdminGump.cs +++ b/Projects/UOContent/Gumps/AdminGump.cs @@ -264,12 +264,23 @@ namespace Server.Gumps AddButtonLabeled(20, 175, GetButtonID(3, 101), "Teleporters"); AddButtonLabeled(220, 175, GetButtonID(3, 102), "Moongates"); - AddButtonLabeled(20, 200, GetButtonID(3, 103), "Generate Spawns"); - AddButtonLabeled(220, 200, GetButtonID(3, 106), "Decoration"); + AddButtonLabeled(20, 200, GetButtonID(3, 103), "Spawners"); + AddButtonLabeled(220, 200, GetButtonID(3, 106), "Decorations"); AddButtonLabeled(20, 225, GetButtonID(3, 104), "Doors"); AddButtonLabeled(220, 225, GetButtonID(3, 105), "Signs"); + AddButtonLabeled(20, 250, GetButtonID(3, 107), "Champions"); + AddButtonLabeled(220, 250, GetButtonID(3, 108), "Magincia (AOS+)"); + + AddButtonLabeled(20, 275, GetButtonID(3, 109), "Stealable Artifacts"); + AddButtonLabeled(220, 275, GetButtonID(3, 110), "SH Teleporters"); + + AddButtonLabeled(20, 300, GetButtonID(3, 111), "Secret Locations"); + AddButtonLabeled(220, 300, GetButtonID(3, 112), "Doom"); + + AddButtonLabeled(20, 325, GetButtonID(3, 113), "Khaldun Puzzles"); + goto case AdminGumpPage.Administer; } case AdminGumpPage.Administer_Server: @@ -400,9 +411,6 @@ namespace Server.Gumps AddButtonLabeled(20, 250, GetButtonID(3, 408), "Squelch"); AddButtonLabeled(220, 250, GetButtonID(3, 409), "Unsquelch"); - AddButtonLabeled(20, 270, GetButtonID(3, 410), "Freeze"); - AddButtonLabeled(220, 270, GetButtonID(3, 411), "Unfreeze"); - AddButtonLabeled(20, 290, GetButtonID(3, 412), "Hide"); AddButtonLabeled(220, 290, GetButtonID(3, 413), "Unhide"); @@ -2135,20 +2143,50 @@ namespace Server.Gumps case 106: { InvokeCommand("Decorate"); - notice = "Decoration has been generated."; + notice = "Decorations have been generated."; + break; + } + case 107: + { + InvokeCommand("GenChamps"); + notice = "Champions have been generated."; + break; + } + case 108: + { + InvokeCommand("DecorateMag"); + notice = "Magincia Ruins decorations have been generated."; + break; + } + case 109: + { + InvokeCommand("GenStealArties"); + notice = "Stealable Artifacts have been generated."; break; } - case 110: { - InvokeCommand("Freeze"); - notice = "Target bounding points."; + InvokeCommand("SHTelGen"); + notice = "Solen Hive teleporters have been generated."; break; } - case 120: + case 111: { - InvokeCommand("Unfreeze"); - notice = "Target bounding points."; + InvokeCommand("SecretLocGen"); + notice = "Secret Locations have been generated."; + break; + } + case 112: + { + InvokeCommand("GenLeverPuzzle"); + InvokeCommand("GenGauntlet"); + notice = "Doom has been generated."; + break; + } + case 113: + { + InvokeCommand("GenKhaldun"); + notice = "Khaldun puzzles have been generated."; break; } @@ -2489,26 +2527,6 @@ namespace Server.Gumps InvokeCommand("Add"); break; } - case 111: - { - InvokeCommand("FreezeWorld"); - break; - } - case 112: - { - InvokeCommand("FreezeMap"); - break; - } - case 121: - { - InvokeCommand("UnfreezeWorld"); - break; - } - case 122: - { - InvokeCommand("UnfreezeMap"); - break; - } } break; diff --git a/Projects/UOContent/Items/Addons/SHTeleporter.cs b/Projects/UOContent/Items/Addons/SHTeleporter.cs index 38102dd4c..f34f9cb85 100644 --- a/Projects/UOContent/Items/Addons/SHTeleporter.cs +++ b/Projects/UOContent/Items/Addons/SHTeleporter.cs @@ -171,19 +171,8 @@ namespace Server.Items [Usage("SHTelGen"), Description("Generates solen hives teleporters.")] public static void SHTelGen_OnCommand(CommandEventArgs e) { - World.Broadcast(0x35, true, "Solen hives teleporters are being generated, please wait."); - - var startTime = Core.Now; - - var count = new SHTeleporterCreator().CreateSHTeleporters(); - - var endTime = Core.Now; - - World.Broadcast( - 0x35, - true, - $"{count} solen hives teleporters have been created. The entire process took {(endTime - startTime).TotalSeconds:0.#} seconds." - ); + CreateSHTeleporters(); + e.Mobile.SendMessage("Solen Hive teleporters have been created."); } public void ChangeActive(bool active) @@ -259,128 +248,115 @@ namespace Server.Items m_Changing = false; } - public class SHTeleporterCreator + public static SHTeleporter FindSHTeleporter(Map map, Point3D p) { - private int m_Count; - - public SHTeleporterCreator() => m_Count = 0; - - public static SHTeleporter FindSHTeleporter(Map map, Point3D p) + foreach (var teleporter in map.GetItemsAt(p)) { - foreach (var teleporter in map.GetItemsAt(p)) + if (teleporter.Z == p.Z) { - if (teleporter.Z == p.Z) - { - return teleporter; - } + return teleporter; } - - return null; } - public SHTeleporter AddSHT(Map map, bool ext, int x, int y, int z) + return null; + } + + public static SHTeleporter AddSHT(Map map, bool ext, int x, int y, int z) + { + var p = new Point3D(x, y, z); + var tele = FindSHTeleporter(map, p); + + if (tele == null) { - var p = new Point3D(x, y, z); - var tele = FindSHTeleporter(map, p); - - if (tele == null) - { - tele = new SHTeleporter(ext); - tele.MoveToWorld(p, map); - - m_Count++; - } - - return tele; + tele = new SHTeleporter(ext); + tele.MoveToWorld(p, map); } - public static void Link(SHTeleporter tele1, SHTeleporter tele2) - { - tele1.ChangeDest(tele2); - tele2.ChangeDest(tele1); - } + return tele; + } - public void AddSHTCouple(Map map, bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2) - { - var tele1 = AddSHT(map, ext1, x1, y1, z1); - var tele2 = AddSHT(map, ext2, x2, y2, z2); + public static void Link(SHTeleporter tele1, SHTeleporter tele2) + { + tele1.ChangeDest(tele2); + tele2.ChangeDest(tele1); + } - Link(tele1, tele2); - } + public static void AddSHTCouple(Map map, bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2) + { + var tele1 = AddSHT(map, ext1, x1, y1, z1); + var tele2 = AddSHT(map, ext2, x2, y2, z2); - public void AddSHTCouple(bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2) - { - AddSHTCouple(Map.Trammel, ext1, x1, y1, z1, ext2, x2, y2, z2); - AddSHTCouple(Map.Felucca, ext1, x1, y1, z1, ext2, x2, y2, z2); - } + Link(tele1, tele2); + } - public int CreateSHTeleporters() - { - SHTeleporter tele1, tele2; + public static void AddSHTCouple(bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2) + { + AddSHTCouple(Map.Trammel, ext1, x1, y1, z1, ext2, x2, y2, z2); + AddSHTCouple(Map.Felucca, ext1, x1, y1, z1, ext2, x2, y2, z2); + } - AddSHTCouple(true, 2608, 763, 0, false, 5918, 1794, 0); - AddSHTCouple(false, 5897, 1877, 0, false, 5871, 1867, 0); - AddSHTCouple(false, 5852, 1848, 0, false, 5771, 1867, 0); + public static void CreateSHTeleporters() + { + AddSHTCouple(true, 2608, 763, 0, false, 5918, 1794, 0); + AddSHTCouple(false, 5897, 1877, 0, false, 5871, 1867, 0); + AddSHTCouple(false, 5852, 1848, 0, false, 5771, 1867, 0); - tele1 = AddSHT(Map.Trammel, false, 5747, 1895, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Trammel, false, 5658, 1898, 0); - Link(tele1, tele2); + var tele1 = AddSHT(Map.Trammel, false, 5747, 1895, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + var tele2 = AddSHT(Map.Trammel, false, 5658, 1898, 0); + Link(tele1, tele2); - tele1 = AddSHT(Map.Felucca, false, 5747, 1895, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Felucca, false, 5658, 1898, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Felucca, false, 5747, 1895, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Felucca, false, 5658, 1898, 0); + Link(tele1, tele2); - AddSHTCouple(false, 5727, 1894, 0, false, 5756, 1794, 0); - AddSHTCouple(false, 5784, 1929, 0, false, 5700, 1929, 0); + AddSHTCouple(false, 5727, 1894, 0, false, 5756, 1794, 0); + AddSHTCouple(false, 5784, 1929, 0, false, 5700, 1929, 0); - tele1 = AddSHT(Map.Trammel, false, 5711, 1952, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Trammel, false, 5657, 1954, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Trammel, false, 5711, 1952, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Trammel, false, 5657, 1954, 0); + Link(tele1, tele2); - tele1 = AddSHT(Map.Felucca, false, 5711, 1952, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Felucca, false, 5657, 1954, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Felucca, false, 5711, 1952, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Felucca, false, 5657, 1954, 0); + Link(tele1, tele2); - tele1 = AddSHT(Map.Trammel, false, 5655, 2018, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Trammel, true, 1690, 2789, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Trammel, false, 5655, 2018, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Trammel, true, 1690, 2789, 0); + Link(tele1, tele2); - tele1 = AddSHT(Map.Felucca, false, 5655, 2018, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Felucca, true, 1690, 2789, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Felucca, false, 5655, 2018, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Felucca, true, 1690, 2789, 0); + Link(tele1, tele2); - AddSHTCouple(false, 5809, 1905, 0, false, 5876, 1891, 0); + AddSHTCouple(false, 5809, 1905, 0, false, 5876, 1891, 0); - tele1 = AddSHT(Map.Trammel, false, 5814, 2015, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Trammel, false, 5913, 1893, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Trammel, false, 5814, 2015, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Trammel, false, 5913, 1893, 0); + Link(tele1, tele2); - tele1 = AddSHT(Map.Felucca, false, 5814, 2015, 0); - tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); - tele2 = AddSHT(Map.Felucca, false, 5913, 1893, 0); - Link(tele1, tele2); + tele1 = AddSHT(Map.Felucca, false, 5814, 2015, 0); + tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0); + tele2 = AddSHT(Map.Felucca, false, 5913, 1893, 0); + Link(tele1, tele2); - AddSHTCouple(false, 5919, 2021, 0, true, 1724, 814, 0); + AddSHTCouple(false, 5919, 2021, 0, true, 1724, 814, 0); - tele1 = AddSHT(Map.Trammel, false, 5654, 1791, 0); - tele2 = AddSHT(Map.Trammel, true, 730, 1451, 0); - Link(tele1, tele2); - AddSHT(Map.Trammel, false, 5734, 1859, 0).ChangeDest(tele2); + tele1 = AddSHT(Map.Trammel, false, 5654, 1791, 0); + tele2 = AddSHT(Map.Trammel, true, 730, 1451, 0); + Link(tele1, tele2); + AddSHT(Map.Trammel, false, 5734, 1859, 0).ChangeDest(tele2); - tele1 = AddSHT(Map.Felucca, false, 5654, 1791, 0); - tele2 = AddSHT(Map.Felucca, true, 730, 1451, 0); - Link(tele1, tele2); - AddSHT(Map.Felucca, false, 5734, 1859, 0).ChangeDest(tele2); - - return m_Count; - } + tele1 = AddSHT(Map.Felucca, false, 5654, 1791, 0); + tele2 = AddSHT(Map.Felucca, true, 730, 1451, 0); + Link(tele1, tele2); + AddSHT(Map.Felucca, false, 5734, 1859, 0).ChangeDest(tele2); } } } diff --git a/Projects/UOContent/Items/Misc/WayPoint.cs b/Projects/UOContent/Items/Misc/WayPoint.cs index f193b59c8..547d33ada 100644 --- a/Projects/UOContent/Items/Misc/WayPoint.cs +++ b/Projects/UOContent/Items/Misc/WayPoint.cs @@ -31,6 +31,8 @@ public partial class WayPoint : Item CommandSystem.Register("WayPointSeq", AccessLevel.GameMaster, WayPointSeq_OnCommand); } + [Usage("WayPointSeq")] + [Description("Creates a sequence of way points.")] public static void WayPointSeq_OnCommand(CommandEventArgs arg) { arg.Mobile.SendMessage("Target the position of the first way point."); diff --git a/Projects/UOContent/Misc/AutoRestart.cs b/Projects/UOContent/Misc/AutoRestart.cs index c91605068..881504baf 100644 --- a/Projects/UOContent/Misc/AutoRestart.cs +++ b/Projects/UOContent/Misc/AutoRestart.cs @@ -57,6 +57,8 @@ namespace Server.Misc CommandSystem.Register("Restart", AccessLevel.Administrator, Restart_OnCommand); } + [Usage("Restart")] + [Description("Initiates a server restart. The world is not saved before the restart.")] public static void Restart_OnCommand(CommandEventArgs e) { if (Restarting) diff --git a/docs/commands/commands.7z b/docs/commands/commands.7z index 79a0f30208a65b29b6687537cbbd3e5a43fef443..fea48884078405e2fd085341626bea63a2be1392 100644 GIT binary patch delta 10094 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 QT-pH@1_1yd000000E7{{yZ`_I delta 9494 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