API to easily create WASD menus.
This project incorporates code and architectural concepts derived from the Original WASDMenuAPI repository, created and copyrighted by @Interesting-exe under the MIT License.
The original license is included in this repository as LICENSE.
IWasdMenu
public interface IWasdMenu { public string Title { get; set; } public LinkedList<IWasdMenuOption>? Options { get; set; } public LinkedListNode<IWasdMenuOption>? Prev { get; set; } public LinkedListNode<IWasdMenuOption> Add(string display, Action<CCSPlayerController, IWasdMenuOption> onChoice); }IWasdMenuOption
public interface IWasdMenuManager { public IWasdMenu CreateMenu(string title = ""); public void CloseMenu(CCSPlayerController? player); public void CloseSubMenu(CCSPlayerController? player); public void CloseAllSubMenus(CCSPlayerController? player); public void OpenSubMenu(CCSPlayerController? player, IWasdMenu? menu); public void OpenMainMenu(CCSPlayerController? player, IWasdMenu? menu); }IWasdMenuManager
public interface IWasdMenuOption { public int Index { get; set; } public IWasdMenu? Parent { get; set; } public string? OptionDisplay { get; set; } public Action<CCSPlayerController, IWasdMenuOption>? OnChoose { get; set; } }// Included libraries using WASDSharedAPI; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; // Declare namespace namespace Example { // Define plugin class public class Plugin : BasePlugin { // Define plugin parameters public override string ModuleName => "Example"; public override string ModuleVersion => "1.0.0"; public override string ModuleAuthor => "Striker-Nick"; public override string ModuleDescription => "An example plugin"; // Define on load behavior public override void Load(bool hotReload) { Instance = this; Instance.AddCommand("css_maps", "Displays a list of maps.", OnMapsCommand); } // Define class properties public static Plugin? Instance; private IWasdMenu? mapWasdMenu; public PluginCapability<IWasdMenuManager> WasdMenuManager { get; } = new("wasdmenu:manager"); // Define on all plugins loaded behavior public override void OnAllPluginsLoaded(bool hotReload) { base.OnAllPluginsLoaded(hotReload); try { if (WasdMenuManager.Get() is null) return; } catch (Exception) { Logger.LogWarning("WASDSharedAPI plugin not found. WASD menus will not work."); return; } // Load WASD menus LoadWASDMenu(); } // Define method to unload plugin public override void Unload(bool hotReload) { base.Unload(hotReload); } // Define method to load WASDMenu public void LoadWASDMenu() { private List<string> maps = new() { "Dust2", "Ancient", "Anubis", "Inferno", "Vertigo", "Overpass", "Train", "Nuke", "Mirage" }; foreach (string map in maps) { mapWasdMenu?.Add(map, (player, option) => { // Close main menu example WasdMenuManager.Get()?.CloseMenu(player); player.PrintToChat($"You selected {map}"); // Open Submenu example // mapWasdSubMenu.Prev = option.Parent?.Options?.Find(option); // WasdMenuManager.Get()?.OpenSubMenu(player, mapWasdSubMenu); // Close submenu example // WasdMenuManager.Get()?.CloseSubMenu(player) }); } } // Define maps command handler [CommandHelper(whoCanExecute: CommandUsage.CLIENT_ONLY)] public void OnMapsCommand(CCSPlayerController? player, CommandInfo command) { if(player != null && mapWasdMenu != null) { WasdMenuManager.Get()?.OpenMainMenu(player, mapWasdMenu); } } } }