internal class DuelChallengeMenu : Menu { public override int Id { get; set; } = -100010; public override string Name { get; set; } = "Duel Challenge"; private List _settings; private SSTextArea _selectedColorTextArea; public ServerSpecificSettingBase[] GetSettings() { _selectedColorTextArea ??= new SSTextArea(1, "No duel was sent"); var players = Player.List .Where(x => x.IsVerified || x.IsNPC) .ToArray(); var playerNames = players.Select(p => p.Nickname).ToArray(); var gamemodes = Project.Instance.Config.Gamemodes .Where(x => !string.IsNullOrEmpty(x.Name)) .Select(g => g.Name) .ToArray(); var arenas = Project.Instance.Config.Arenas .Select(a => a.Name) .ToArray(); _settings = new List { _selectedColorTextArea, new Dropdown( id: 1, label: "Pick Opponent", options: playerNames, hint: "Select a player to duel" ), new Dropdown( id: 2, label: "Select Gamemode", options: gamemodes, hint: "Which gamemode to queue for" ), new Dropdown( id: 3, label: "Select Arena", options: arenas, hint: "Which arena to queue in" ), new Button( id: 4, label: "Invite", buttonText: "Send Duel Invite", onClick: (h, _) => { Player player = Player.Get(h); // Opponent selection int oppIdx = h.GetParameter(1) .SyncSelectionIndexRaw; var target = players[oppIdx]; if (player == target) { _selectedColorTextArea.SendTextUpdate("You cannot send a duel request to yourself"); return; } if (target.GetFight().HasValue) { _selectedColorTextArea.SendTextUpdate("Wait until the player finishes their current fight"); return; } // Gamemode & arena selection int gmIdx = h.GetParameter(2) .SyncSelectionIndexRaw; int arIdx = h.GetParameter(3) .SyncSelectionIndexRaw; var selectedGm = gamemodes[gmIdx]; var selectedAr = arenas[arIdx]; // Validate blacklist var arenaCfg = Project.Instance.Config.Arenas .First(a => a.Name == selectedAr); if (arenaCfg.GamemodeBlacklisted .Any(x => x.Equals(selectedGm, StringComparison.OrdinalIgnoreCase))) { var supported = Project.Instance.Config.Gamemodes .Select(g => g.Name) .Where(n => !arenaCfg.GamemodeBlacklisted .Any(b => b.Equals(n, StringComparison.OrdinalIgnoreCase))) .ToArray(); _selectedColorTextArea.SendTextUpdate( $"❌ Gamemode “{selectedGm}” is not supported on “{selectedAr}”.\n" + $"Supported gamemodes: {string.Join(", ", supported)}" ); return; } InviteManager.SendDuelInvite(player, target, selectedGm, selectedAr); _selectedColorTextArea.SendTextUpdate($"Sent duel to {target.Nickname} ({selectedGm} @ {selectedAr})."); }, holdTimeSeconds: null, hint: "Send a duel invitation" ) }; return _settings.ToArray(); } public override ServerSpecificSettingBase[] Settings => GetSettings(); }