v1.7.8-alpha

feat: re-add `css_fexec` used for css-panel skins module
feat: Add KitsuneMenu & Remove MenuManager
update: Added StatusBlocker by @Slynx support to hide stealth admin from status
This commit is contained in:
Sachin 2025-09-25 01:20:57 +05:30
parent 1118939e62
commit a10a33edfd
36 changed files with 1055 additions and 722 deletions

View file

@ -1,32 +1,13 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Menu;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
public static class AdminMenu
{
public static IMenu? CreateMenu(string title, Action<CCSPlayerController>? backAction = null)
{
return Helper.CreateMenu(title, backAction);
// return CS2_SimpleAdmin.Instance.Config.UseChatMenu ? new ChatMenu(title) : new CenterHtmlMenu(title, CS2_SimpleAdmin.Instance);
}
public static void OpenMenu(CCSPlayerController player, IMenu menu)
{
menu.Open(player);
// switch (menu)
// {
// case CenterHtmlMenu centerHtmlMenu:
// MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, player, centerHtmlMenu);
// break;
// case ChatMenu chatMenu:
// MenuManager.OpenChatMenu(player, chatMenu);
// break;
// }
}
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
@ -42,7 +23,6 @@ public static class AdminMenu
return;
}
var menu = CreateMenu(localizer?["sa_title"] ?? "SimpleAdmin");
List<ChatMenuOptionData> options =
[
new ChatMenuOptionData(localizer?["sa_menu_players_manage"] ?? "Players Manage", () => ManagePlayersMenu.OpenMenu(admin)),
@ -59,12 +39,30 @@ public static class AdminMenu
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/root"))
options.Add(new ChatMenuOptionData(localizer?["sa_menu_admins_manage"] ?? "Admins Manage", () => ManageAdminsMenu.OpenMenu(admin)));
List<MenuItem> items = [];
var optionMap = new Dictionary<int, ChatMenuOptionData>();
int i = 0;
foreach (var menuOptionData in options)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
if (!menuOptionData.Disabled)
{
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(menuName)]));
optionMap[i++] = menuOptionData;
}
}
if (menu != null) OpenMenu(admin, menu);
if(i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(admin, localizer?["sa_title"] ?? "SimpleAdmin", items, (buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var menuOptionData))
{
menuOptionData.Action.Invoke();
}
}, false, freezePlayer: false, disableDeveloper: true);
}
}

View file

@ -2,6 +2,8 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -9,43 +11,50 @@ public static class CustomCommandsMenu
{
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
return;
if (!admin.IsValid) return;
var localizer = CS2_SimpleAdmin._localizer;
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic") == false)
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic"))
{
admin.PrintToChat(localizer?["sa_prefix"] ??
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command")
);
admin.PrintToChat(localizer?["sa_prefix"] ?? "[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command"));
return;
}
var menu = AdminMenu.CreateMenu(localizer?["sa_menu_custom_commands"] ?? "Custom Commands");
List<ChatMenuOptionData> options = [];
var customCommands = CS2_SimpleAdmin.Instance.Config.CustomServerCommands
.Where(c => !string.IsNullOrEmpty(c.DisplayName) && !string.IsNullOrEmpty(c.Command))
.Where(c => AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), c.Flag))
.ToList();
var customCommands = CS2_SimpleAdmin.Instance.Config.CustomServerCommands;
options.AddRange(from customCommand in customCommands
where !string.IsNullOrEmpty(customCommand.DisplayName) && !string.IsNullOrEmpty(customCommand.Command)
let hasRights = AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), customCommand.Flag)
where hasRights
select new ChatMenuOptionData(customCommand.DisplayName, () =>
{
Helper.TryLogCommandOnDiscord(admin, customCommand.Command);
if (customCommands.Count == 0) return;
if (customCommand.ExecuteOnClient)
admin.ExecuteClientCommandFromServer(customCommand.Command);
else
Server.ExecuteCommand(customCommand.Command);
}));
foreach (var menuOptionData in options)
var items = new List<MenuItem>();
for (int i = 0; i < customCommands.Count; i++)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action(); }, menuOptionData.Disabled);
var cmd = customCommands[i];
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(cmd.DisplayName)]));
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
localizer?["sa_menu_custom_commands"] ?? "Custom Commands",
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && selected.Option >= 0 && selected.Option < customCommands.Count)
{
var cmd = customCommands[selected.Option];
Helper.TryLogCommandOnDiscord(admin, cmd.Command);
if (cmd.ExecuteOnClient)
admin.ExecuteClientCommandFromServer(cmd.Command);
else
Server.ExecuteCommand(cmd.Command);
}
},
true,
freezePlayer: false,
disableDeveloper: true);
}
}

View file

@ -1,5 +1,7 @@
using CounterStrikeSharp.API.Core;
using CS2_SimpleAdmin.Models;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -7,26 +9,69 @@ public static class DurationMenu
{
public static void OpenMenu(CCSPlayerController admin, string menuName, CCSPlayerController player, Action<CCSPlayerController, CCSPlayerController, int> onSelectAction)
{
var menu = AdminMenu.CreateMenu(menuName);
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var durationItem in CS2_SimpleAdmin.Instance.Config.MenuConfigs.Durations)
{
menu?.AddMenuOption(durationItem.Name, (_, _) => { onSelectAction(admin, player, durationItem.Duration); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(durationItem.Name)]));
optionMap[i++] = () =>
{
onSelectAction(admin, player, durationItem.Duration);
};
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuName,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
{
action.Invoke();
}
},
true, freezePlayer: false, disableDeveloper: true);
}
public static void OpenMenu(CCSPlayerController admin, string menuName, DisconnectedPlayer player, Action<CCSPlayerController, DisconnectedPlayer, int> onSelectAction)
{
var menu = AdminMenu.CreateMenu(menuName);
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var durationItem in CS2_SimpleAdmin.Instance.Config.MenuConfigs.Durations)
{
menu?.AddMenuOption(durationItem.Name, (_, _) => { onSelectAction(admin, player, durationItem.Duration); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(durationItem.Name)]));
optionMap[i++] = () =>
{
onSelectAction(admin, player, durationItem.Duration);
};
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
}
if (i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuName,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
{
action.Invoke();
}
},
true, freezePlayer: false, disableDeveloper: true);
}
}

View file

@ -2,6 +2,8 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -33,76 +35,76 @@ public static class FunActionsMenu
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
if (!admin.IsValid)
return;
var localizer = CS2_SimpleAdmin._localizer;
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic") == false)
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic"))
{
admin.PrintToChat(localizer?["sa_prefix"] ??
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command")
);
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command"));
return;
}
var menu = AdminMenu.CreateMenu(localizer?["sa_menu_fun_commands"] ?? "Fun Commands");
List<ChatMenuOptionData> options = [];
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
//var hasCheats = AdminManager.PlayerHasPermissions(admin, "@css/cheats");
//var hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay");
// options added in order
if (AdminManager.CommandIsOverriden("css_god")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_god"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/cheats"))
options.Add(new ChatMenuOptionData(localizer?["sa_godmode"] ?? "God Mode", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_godmode"] ?? "God Mode", GodMode)));
if (AdminManager.CommandIsOverriden("css_noclip")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_noclip"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/cheats"))
options.Add(new ChatMenuOptionData(localizer?["sa_noclip"] ?? "No Clip", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_noclip"] ?? "No Clip", NoClip)));
if (AdminManager.CommandIsOverriden("css_respawn")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_respawn"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/cheats"))
options.Add(new ChatMenuOptionData(localizer?["sa_respawn"] ?? "Respawn", () => PlayersMenu.OpenDeadMenu(admin, localizer?["sa_respawn"] ?? "Respawn", Respawn)));
if (AdminManager.CommandIsOverriden("css_give")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_give"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/cheats"))
options.Add(new ChatMenuOptionData(localizer?["sa_give_weapon"] ?? "Give Weapon", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_give_weapon"] ?? "Give Weapon", GiveWeaponMenu)));
if (AdminManager.CommandIsOverriden("css_strip")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_strip"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_strip_weapons"] ?? "Strip Weapons", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_strip_weapons"] ?? "Strip Weapons", StripWeapons)));
if (AdminManager.CommandIsOverriden("css_freeze")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_freeze"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_freeze"] ?? "Freeze", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_freeze"] ?? "Freeze", Freeze)));
if (AdminManager.CommandIsOverriden("css_hp")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_hp"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_set_hp"] ?? "Set Hp", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_hp"] ?? "Set Hp", SetHpMenu)));
if (AdminManager.CommandIsOverriden("css_speed")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_speed"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_set_speed"] ?? "Set Speed", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_speed"] ?? "Set Speed", SetSpeedMenu)));
if (AdminManager.CommandIsOverriden("css_gravity")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_gravity"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_set_gravity"] ?? "Set Gravity", () => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_gravity"] ?? "Set Gravity", SetGravityMenu)));
if (AdminManager.CommandIsOverriden("css_money")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_money"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay"))
options.Add(new ChatMenuOptionData(localizer?["sa_set_money"] ?? "Set Money", () => PlayersMenu.OpenMenu(admin, localizer?["sa_set_money"] ?? "Set Money", SetMoneyMenu)));
foreach (var menuOptionData in options)
void TryAddOption(string command, string defaultPermission, string localizerKey, Action action)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action(); }, menuOptionData.Disabled);
string[] permission = AdminManager.CommandIsOverriden(command)
? AdminManager.GetPermissionOverrides(command)
: [defaultPermission];
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), permission))
return;
string menuName = localizer?[localizerKey] ?? localizerKey;
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(menuName)]));
optionMap[i++] = action;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
// Add options
TryAddOption("css_god", "@css/cheats", "sa_godmode",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_godmode"] ?? "God Mode", GodMode));
TryAddOption("css_noclip", "@css/cheats", "sa_noclip",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_noclip"] ?? "No Clip", NoClip));
TryAddOption("css_respawn", "@css/cheats", "sa_respawn",
() => PlayersMenu.OpenDeadMenu(admin, localizer?["sa_respawn"] ?? "Respawn", Respawn));
TryAddOption("css_give", "@css/cheats", "sa_give_weapon",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_give_weapon"] ?? "Give Weapon", GiveWeaponMenu));
TryAddOption("css_strip", "@css/slay", "sa_strip_weapons",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_strip_weapons"] ?? "Strip Weapons", StripWeapons));
TryAddOption("css_freeze", "@css/slay", "sa_freeze",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_freeze"] ?? "Freeze", Freeze));
TryAddOption("css_hp", "@css/slay", "sa_set_hp",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_hp"] ?? "Set Hp", SetHpMenu));
TryAddOption("css_speed", "@css/slay", "sa_set_speed",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_speed"] ?? "Set Speed", SetSpeedMenu));
TryAddOption("css_gravity", "@css/slay", "sa_set_gravity",
() => PlayersMenu.OpenAliveMenu(admin, localizer?["sa_set_gravity"] ?? "Set Gravity", SetGravityMenu));
TryAddOption("css_money", "@css/slay", "sa_set_money",
() => PlayersMenu.OpenMenu(admin, localizer?["sa_set_money"] ?? "Set Money", SetMoneyMenu));
if (i == 0) return; // nothing to show
// Show menu using new ShowScrollableMenu method
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
localizer?["sa_menu_fun_commands"] ?? "Fun Commands",
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
{
action.Invoke();
}
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void GodMode(CCSPlayerController admin, CCSPlayerController player)
@ -122,14 +124,39 @@ public static class FunActionsMenu
private static void GiveWeaponMenu(CCSPlayerController admin, CCSPlayerController player)
{
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_give_weapon"] ?? "Give Weapon"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_give_weapon"] ?? "Give Weapon"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var weapon in GetWeaponsCache)
{
menu?.AddMenuOption(weapon.Value.ToString(), (_, _) => { GiveWeapon(admin, player, weapon.Value); });
string weaponName = weapon.Value.ToString();
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(weaponName)]));
optionMap[i++] = () =>
{
GiveWeapon(admin, player, weapon.Value);
};
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
{
action.Invoke();
}
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void GiveWeapon(CCSPlayerController admin, CCSPlayerController player, CsItem weaponValue)
@ -167,14 +194,38 @@ public static class FunActionsMenu
new Tuple<string, int>("999", 999)
};
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_set_hp"] ?? "Set Hp"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_set_hp"] ?? "Set Hp"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var (optionName, value) in hpArray)
{
menu?.AddMenuOption(optionName, (_, _) => { SetHp(admin, player, value); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(optionName)]));
optionMap[i++] = () =>
{
SetHp(admin, player, value);
};
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
{
action.Invoke();
}
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void SetHp(CCSPlayerController admin, CCSPlayerController player, int hp)
@ -196,14 +247,31 @@ public static class FunActionsMenu
new Tuple<string, float>("4", 4)
};
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_set_speed"] ?? "Set Speed"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_set_speed"] ?? "Set Speed"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var (optionName, value) in speedArray)
{
menu?.AddMenuOption(optionName, (_, _) => { SetSpeed(admin, player, value); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(optionName)]));
optionMap[i++] = () => SetSpeed(admin, player, value);
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void SetSpeed(CCSPlayerController admin, CCSPlayerController player, float speed)
@ -223,14 +291,31 @@ public static class FunActionsMenu
new Tuple<string, float>("2", 2)
};
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_set_gravity"] ?? "Set Gravity"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_set_gravity"] ?? "Set Gravity"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var (optionName, value) in gravityArray)
{
menu?.AddMenuOption(optionName, (_, _) => { SetGravity(admin, player, value); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(optionName)]));
optionMap[i++] = () => SetGravity(admin, player, value);
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void SetGravity(CCSPlayerController admin, CCSPlayerController player, float gravity)
@ -250,14 +335,31 @@ public static class FunActionsMenu
new Tuple<string, int>("$16000", 16000)
};
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_set_money"] ?? "Set Money"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_set_money"] ?? "Set Money"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var (optionName, value) in moneyArray)
{
menu?.AddMenuOption(optionName, (_, _) => { SetMoney(admin, player, value); });
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(optionName)]));
optionMap[i++] = () => SetMoney(admin, player, value);
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void SetMoney(CCSPlayerController admin, CCSPlayerController player, int money)

View file

@ -1,6 +1,8 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -8,52 +10,88 @@ public static class ManageAdminsMenu
{
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
if (!admin.IsValid)
return;
var localizer = CS2_SimpleAdmin._localizer;
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/root") == false)
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/root"))
{
admin.PrintToChat(localizer?["sa_prefix"] ??
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command")
);
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command"));
return;
}
var menu = AdminMenu.CreateMenu(localizer?["sa_menu_admins_manage"] ?? "Admins Manage");
List<ChatMenuOptionData> options =
[
new ChatMenuOptionData(localizer?["sa_admin_add"] ?? "Add Admin",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_admin_add"] ?? "Add Admin", AddAdminMenu)),
new ChatMenuOptionData(localizer?["sa_admin_remove"] ?? "Remove Admin",
() => PlayersMenu.OpenAdminPlayersMenu(admin, localizer?["sa_admin_remove"] ?? "Remove Admin", RemoveAdmin,
player => player != admin && admin.CanTarget(player))),
new ChatMenuOptionData(localizer?["sa_admin_reload"] ?? "Reload Admins", () => ReloadAdmins(admin))
];
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var menuOptionData in options)
void AddOption(string name, Action action, bool disabled = false)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
if (disabled) return; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
AddOption(localizer?["sa_admin_add"] ?? "Add Admin",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_admin_add"] ?? "Add Admin", AddAdminMenu));
AddOption(localizer?["sa_admin_remove"] ?? "Remove Admin",
() => PlayersMenu.OpenAdminPlayersMenu(admin, localizer?["sa_admin_remove"] ?? "Remove Admin",
RemoveAdmin, player => player != admin && admin.CanTarget(player)));
AddOption(localizer?["sa_admin_reload"] ?? "Reload Admins", () => ReloadAdmins(admin));
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
localizer?["sa_menu_admins_manage"] ?? "Admins Manage",
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void AddAdminMenu(CCSPlayerController admin, CCSPlayerController player)
{
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_admin_add"] ?? "Add Admin"}: {player.PlayerName}");
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_admin_add"] ?? "Add Admin"}: {player.PlayerName}";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
foreach (var adminFlag in CS2_SimpleAdmin.Instance.Config.MenuConfigs.AdminFlags)
{
var disabled = AdminManager.PlayerHasPermissions(player, adminFlag.Flag);
menu?.AddMenuOption(adminFlag.Name, (_, _) => { AddAdmin(admin, player, adminFlag.Flag); }, disabled);
bool disabled = AdminManager.PlayerHasPermissions(player, adminFlag.Flag);
if (disabled) continue; // skip disabled flags
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(adminFlag.Name)]));
int index = i++;
optionMap[index] = () => AddAdmin(admin, player, adminFlag.Flag);
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void AddAdmin(CCSPlayerController admin, CCSPlayerController player, string flag)
{
// TODO: Change default immunity?

View file

@ -3,6 +3,8 @@ using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Utils;
using CS2_SimpleAdminApi;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -10,101 +12,162 @@ public static class ManagePlayersMenu
{
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
return;
if (!admin.IsValid) return;
var localizer = CS2_SimpleAdmin._localizer;
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic") == false)
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic"))
{
admin.PrintToChat(localizer?["sa_prefix"] ??
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command")
);
admin.PrintToChat(localizer?["sa_prefix"] ?? "[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command"));
return;
}
var menu = AdminMenu.CreateMenu(localizer?["sa_menu_players_manage"] ?? "Manage Players");
List<ChatMenuOptionData> options = [];
var menuTitle = localizer?["sa_menu_players_manage"] ?? "Manage Players";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
// permissions
var hasSlay = AdminManager.CommandIsOverriden("css_slay") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_slay")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay");
var hasKick = AdminManager.CommandIsOverriden("css_kick") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_kick")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick");
var hasBan = AdminManager.CommandIsOverriden("css_ban") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_ban")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/ban");
var hasChat = AdminManager.CommandIsOverriden("css_gag") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_gag")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat");
void AddOption(string name, Action action, bool disabled = false)
{
if (disabled) return; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
// TODO: Localize options
// options added in order
// Permissions
var hasSlay = AdminManager.CommandIsOverriden("css_slay")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_slay"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/slay");
var hasKick = AdminManager.CommandIsOverriden("css_kick")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_kick"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick");
var hasBan = AdminManager.CommandIsOverriden("css_ban")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_ban"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/ban");
var hasChat = AdminManager.CommandIsOverriden("css_gag")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_gag"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat");
// Add menu options
if (hasSlay)
{
options.Add(new ChatMenuOptionData(localizer?["sa_slap"] ?? "Slap", () => PlayersMenu.OpenMenu(admin, localizer?["sa_slap"] ?? "Slap", SlapMenu)));
options.Add(new ChatMenuOptionData(localizer?["sa_slay"] ?? "Slay", () => PlayersMenu.OpenMenu(admin, localizer?["sa_slay"] ?? "Slay", Slay)));
AddOption(localizer?["sa_slap"] ?? "Slap", () => PlayersMenu.OpenMenu(admin, localizer?["sa_slap"] ?? "Slap", SlapMenu));
AddOption(localizer?["sa_slay"] ?? "Slay", () => PlayersMenu.OpenMenu(admin, localizer?["sa_slay"] ?? "Slay", Slay));
}
if (hasKick)
{
options.Add(new ChatMenuOptionData(localizer?["sa_kick"] ?? "Kick", () => PlayersMenu.OpenMenu(admin, localizer?["sa_kick"] ?? "Kick", KickMenu)));
AddOption(localizer?["sa_kick"] ?? "Kick", () => PlayersMenu.OpenMenu(admin, localizer?["sa_kick"] ?? "Kick", KickMenu));
}
if (AdminManager.CommandIsOverriden("css_warn")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_warn"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick"))
options.Add(new ChatMenuOptionData(localizer?["sa_warn"] ?? "Warn", () => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_warn"] ?? "Warn", (admin, player) => DurationMenu.OpenMenu(admin, $"{localizer?["sa_warn"] ?? "Warn"}: {player.PlayerName}", player, WarnMenu))));
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_warn"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick"))
{
AddOption(localizer?["sa_warn"] ?? "Warn",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_warn"] ?? "Warn",
(adminController, player) => DurationMenu.OpenMenu(adminController, $"{localizer?["sa_warn"] ?? "Warn"}: {player.PlayerName}", player, WarnMenu)));
}
if (hasBan)
options.Add(new ChatMenuOptionData(localizer?["sa_ban"] ?? "Ban", () => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_ban"] ?? "Ban", (admin, player) => DurationMenu.OpenMenu(admin, $"{localizer?["sa_ban"] ?? "Ban"}: {player.PlayerName}", player, BanMenu))));
{
AddOption(localizer?["sa_ban"] ?? "Ban",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_ban"] ?? "Ban",
(adminController, player) => DurationMenu.OpenMenu(adminController, $"{localizer?["sa_ban"] ?? "Ban"}: {player.PlayerName}", player, BanMenu)));
}
if (hasChat)
{
if (AdminManager.CommandIsOverriden("css_gag")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_gag"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
options.Add(new ChatMenuOptionData(localizer?["sa_gag"] ?? "Gag", () => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_gag"] ?? "Gag", (admin, player) => DurationMenu.OpenMenu(admin, $"{localizer?["sa_gag"] ?? "Gag"}: {player.PlayerName}", player, GagMenu))));
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_gag"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
{
AddOption(localizer?["sa_gag"] ?? "Gag",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_gag"] ?? "Gag",
(adminController, player) => DurationMenu.OpenMenu(adminController, $"{localizer?["sa_gag"] ?? "Gag"}: {player.PlayerName}", player, GagMenu)));
}
if (AdminManager.CommandIsOverriden("css_mute")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_mute"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
options.Add(new ChatMenuOptionData(localizer?["sa_mute"] ?? "Mute", () => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_mute"] ?? "Mute", (admin, player) => DurationMenu.OpenMenu(admin, $"{localizer?["sa_mute"] ?? "Mute"}: {player.PlayerName}", player, MuteMenu))));
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_mute"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
{
AddOption(localizer?["sa_mute"] ?? "Mute",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_mute"] ?? "Mute",
(adminController, player) => DurationMenu.OpenMenu(adminController, $"{localizer?["sa_mute"] ?? "Mute"}: {player.PlayerName}", player, MuteMenu)));
}
if (AdminManager.CommandIsOverriden("css_silence")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_silence"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
options.Add(new ChatMenuOptionData(localizer?["sa_silence"] ?? "Silence", () => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_silence"] ?? "Silence", (admin, player) => DurationMenu.OpenMenu(admin, $"{localizer?["sa_silence"] ?? "Silence"}: {player.PlayerName}", player, SilenceMenu))));
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_silence"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/chat"))
{
AddOption(localizer?["sa_silence"] ?? "Silence",
() => PlayersMenu.OpenRealPlayersMenu(admin, localizer?["sa_silence"] ?? "Silence",
(adminController, player) => DurationMenu.OpenMenu(adminController, $"{localizer?["sa_silence"] ?? "Silence"}: {player.PlayerName}", player, SilenceMenu)));
}
}
if (AdminManager.CommandIsOverriden("css_team")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_team"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick"))
options.Add(new ChatMenuOptionData(localizer?["sa_team_force"] ?? "Force Team", () => PlayersMenu.OpenMenu(admin, localizer?["sa_team_force"] ?? "Force Team", ForceTeamMenu)));
foreach (var menuOptionData in options)
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_team"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/kick"))
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
AddOption(localizer?["sa_team_force"] ?? "Force Team", () => PlayersMenu.OpenMenu(admin, localizer?["sa_team_force"] ?? "Force Team", ForceTeamMenu));
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (i == 0) return; // nothing to show
// Show scrollable menu
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player)
{
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_slap"] ?? "Slap"}: {player.PlayerName}");
List<ChatMenuOptionData> options =
[
// options added in order
new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0)),
new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1)),
new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5)),
new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10)),
new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50)),
new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100)),
];
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_slap"] ?? "Slap"}: {player.PlayerName}";
foreach (var menuOptionData in options)
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
void AddOption(string name, Action action, bool disabled = false)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
if (disabled) return; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
// Add slap options
AddOption("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0));
AddOption("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1));
AddOption("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5));
AddOption("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10));
AddOption("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50));
AddOption("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100));
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int damage)
@ -154,29 +217,25 @@ public static class ManagePlayersMenu
internal static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
{
ReasonMenu.OpenMenu(admin, PenaltyType.Ban,
$"{CS2_SimpleAdmin._localizer?["sa_ban"] ?? "Ban"}: {player.PlayerName}", player, (_, _, reason) =>
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_ban"] ?? "Ban"}: {player.PlayerName}";
// Open the reason menu as a scrollable menu
ReasonMenu.OpenMenu(
admin,
PenaltyType.Ban,
menuTitle,
player,
(_, _, reason) =>
{
if (player is { IsValid: true })
Ban(admin, player, duration, reason);
CS2_SimpleAdmin.MenuApi?.CloseMenu(admin);
});
// var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_ban"] ?? "Ban"}: {player?.PlayerName}");
//
// foreach (var option in CS2_SimpleAdmin.Instance.Config.MenuConfigs.BanReasons)
// {
// menu?.AddMenuOption(option, (_, _) =>
// {
// if (player is { IsValid: true })
// Ban(admin, player, duration, option);
// });
// }
//
// if (menu != null) AdminMenu.OpenMenu(admin, menu);
// Close menu after selection
CS2_SimpleAdmin.Menu.ClearMenus(admin);
});
}
private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason)
{
if (player is not { IsValid: true }) return;
@ -190,7 +249,9 @@ public static class ManagePlayersMenu
$"{CS2_SimpleAdmin._localizer?["sa_warn"] ?? "Warn"}: {player.PlayerName}", player, (_, _, reason) =>
{
if (player is { IsValid: true })
{
Warn(admin, player, duration, reason);
}
});
// var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_warn"] ?? "Warn"}: {player?.PlayerName}");
@ -308,25 +369,47 @@ public static class ManagePlayersMenu
private static void ForceTeamMenu(CCSPlayerController admin, CCSPlayerController player)
{
// TODO: Localize
var menu = AdminMenu.CreateMenu($"{CS2_SimpleAdmin._localizer?["sa_team_force"] ?? "Force Team"} {player.PlayerName}");
List<ChatMenuOptionData> options =
[
new ChatMenuOptionData(CS2_SimpleAdmin._localizer?["sa_team_ct"] ?? "CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist)),
new ChatMenuOptionData(CS2_SimpleAdmin._localizer?["sa_team_t"] ?? "T", () => ForceTeam(admin, player, "t", CsTeam.Terrorist)),
new ChatMenuOptionData(CS2_SimpleAdmin._localizer?["sa_team_swap"] ?? "Swap", () => ForceTeam(admin, player, "swap", CsTeam.Spectator)),
new ChatMenuOptionData(CS2_SimpleAdmin._localizer?["sa_team_spec"] ?? "Spec", () => ForceTeam(admin, player, "spec", CsTeam.Spectator)),
];
var menuTitle = $"{CS2_SimpleAdmin._localizer?["sa_team_force"] ?? "Force Team"} {player.PlayerName}";
foreach (var menuOptionData in options)
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
void AddOption(string name, Action action, bool disabled = false)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
if (disabled) return; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
AddOption(CS2_SimpleAdmin._localizer?["sa_team_ct"] ?? "CT",
() => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist));
AddOption(CS2_SimpleAdmin._localizer?["sa_team_t"] ?? "T",
() => ForceTeam(admin, player, "t", CsTeam.Terrorist));
AddOption(CS2_SimpleAdmin._localizer?["sa_team_swap"] ?? "Swap",
() => ForceTeam(admin, player, "swap", CsTeam.Spectator));
AddOption(CS2_SimpleAdmin._localizer?["sa_team_spec"] ?? "Spec",
() => ForceTeam(admin, player, "spec", CsTeam.Spectator));
if (i == 0) return; // nothing to show
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName, CsTeam teamNum)
{
if (player is not { IsValid: true }) return;

View file

@ -1,6 +1,8 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Entities;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
@ -8,70 +10,97 @@ public static class ManageServerMenu
{
public static void OpenMenu(CCSPlayerController admin)
{
if (admin.IsValid == false)
return;
if (!admin.IsValid) return;
var localizer = CS2_SimpleAdmin._localizer;
if (AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic") == false)
if (!AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/generic"))
{
admin.PrintToChat(localizer?["sa_prefix"] ??
"[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command")
);
admin.PrintToChat(localizer?["sa_prefix"] ?? "[SimpleAdmin] " +
(localizer?["sa_no_permission"] ?? "You do not have permissions to use this command"));
return;
}
var menu = AdminMenu.CreateMenu(localizer?["sa_menu_server_manage"] ?? "Server Manage");
List<ChatMenuOptionData> options = [];
string menuTitle = localizer?["sa_menu_server_manage"] ?? "Server Manage";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
// permissions
var hasMap = AdminManager.CommandIsOverriden("css_map") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_map")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/changemap");
var hasPlugins = AdminManager.CommandIsOverriden("css_pluginsmanager") ? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_pluginsmanager")) : AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/root");
//bool hasMap = AdminManager.PlayerHasPermissions(admin, "@css/changemap");
// options added in order
if (hasPlugins)
void AddOption(string name, Action action, bool disabled = false)
{
options.Add(new ChatMenuOptionData(localizer?["sa_menu_pluginsmanager_title"] ?? "Manage Plugins", () => admin.ExecuteClientCommandFromServer("css_pluginsmanager")));
if (disabled) return; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
// Permissions
var hasMap = AdminManager.CommandIsOverriden("css_map")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_map"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/changemap");
var hasPlugins = AdminManager.CommandIsOverriden("css_pluginsmanager")
? AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), AdminManager.GetPermissionOverrides("css_pluginsmanager"))
: AdminManager.PlayerHasPermissions(new SteamID(admin.SteamID), "@css/root");
// Menu options
if (hasPlugins)
AddOption(localizer?["sa_menu_pluginsmanager_title"] ?? "Manage Plugins", () => admin.ExecuteClientCommandFromServer("css_pluginsmanager"));
if (hasMap)
{
options.Add(new ChatMenuOptionData(localizer?["sa_changemap"] ?? "Change Map", () => ChangeMapMenu(admin)));
}
AddOption(localizer?["sa_changemap"] ?? "Change Map", () => ChangeMapMenu(admin));
options.Add(new ChatMenuOptionData(localizer?["sa_restart_game"] ?? "Restart Game", () => CS2_SimpleAdmin.RestartGame(admin)));
AddOption(localizer?["sa_restart_game"] ?? "Restart Game", () => CS2_SimpleAdmin.RestartGame(admin));
foreach (var menuOptionData in options)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
}
if (items.Count == 0) return; // nothing to show
if (menu != null) AdminMenu.OpenMenu(admin, menu);
// Show scrollable menu
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void ChangeMapMenu(CCSPlayerController admin)
{
var menu = AdminMenu.CreateMenu(CS2_SimpleAdmin._localizer?["sa_changemap"] ?? "Change Map");
List<ChatMenuOptionData> options = [];
string menuTitle = CS2_SimpleAdmin._localizer?["sa_changemap"] ?? "Change Map";
List<MenuItem> items = new();
var optionMap = new Dictionary<int, Action>();
int i = 0;
var maps = CS2_SimpleAdmin.Instance.Config.DefaultMaps;
options.AddRange(maps.Select(map => new ChatMenuOptionData(map, () => ExecuteChangeMap(admin, map, false))));
var wsMaps = CS2_SimpleAdmin.Instance.Config.WorkshopMaps;
options.AddRange(wsMaps.Select(map => new ChatMenuOptionData($"{map.Key} (WS)", () => ExecuteChangeMap(admin, map.Value?.ToString() ?? map.Key, true))));
foreach (var menuOptionData in options)
void AddOption(string name, Action action, bool disabled = false)
{
var menuName = menuOptionData.Name;
menu?.AddMenuOption(menuName, (_, _) => { menuOptionData.Action.Invoke(); }, menuOptionData.Disabled);
if (disabled) return;
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(name)]));
optionMap[i++] = action;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
var maps = CS2_SimpleAdmin.Instance.Config.DefaultMaps;
foreach (var map in maps)
AddOption(map, () => ExecuteChangeMap(admin, map, false));
var wsMaps = CS2_SimpleAdmin.Instance.Config.WorkshopMaps;
foreach (var map in wsMaps)
AddOption($"{map.Key} (WS)", () => ExecuteChangeMap(admin, map.Value?.ToString() ?? map.Key, true));
if (items.Count == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuTitle,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var action))
action.Invoke();
},
true, freezePlayer: false, disableDeveloper: true);
}
private static void ExecuteChangeMap(CCSPlayerController admin, string mapName, bool workshop)

View file

@ -1,5 +1,7 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using Menu;
using Menu.Enums;
using System.Web;
namespace CS2_SimpleAdmin.Menus;
@ -26,30 +28,47 @@ public static class PlayersMenu
OpenMenu(admin, menuName, onSelectAction, p => p.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE);
}
public static void OpenMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)
public static void OpenMenu(
CCSPlayerController admin,
string menuName,
Action<CCSPlayerController, CCSPlayerController> onSelectAction,
Func<CCSPlayerController, bool>? enableFilter = null)
{
var menu = AdminMenu.CreateMenu(menuName);
var players = Helper.GetValidPlayersWithBots();
List<MenuItem> items = new();
var optionMap = new Dictionary<int, CCSPlayerController>();
int i = 0;
foreach (var player in players)
{
var playerName = player != null && player.PlayerName.Length > 26 ? player.PlayerName[..26] : player?.PlayerName;
if (player == null) continue;
var playerName = player.PlayerName.Length > 26 ? player.PlayerName[..26] : player.PlayerName;
var optionName = HttpUtility.HtmlEncode(playerName);
if (player != null && enableFilter != null && enableFilter(player) == false)
continue;
var enabled = admin.CanTarget(player);
if (enableFilter != null && !enableFilter(player)) continue;
if (optionName != null)
menu?.AddMenuOption(optionName, (_, _) =>
{
if (player != null) onSelectAction.Invoke(admin, player);
},
enabled == false);
bool enabled = admin.CanTarget(player);
if (!enabled) continue; // skip disabled options
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(optionName)]));
optionMap[i++] = player;
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (items.Count == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuName,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && optionMap.TryGetValue(menu.Option, out var player))
onSelectAction(admin, player);
},
true,
freezePlayer: false,
disableDeveloper: true);
}
}

View file

@ -1,15 +1,20 @@
using CounterStrikeSharp.API.Core;
using CS2_SimpleAdmin.Models;
using CS2_SimpleAdminApi;
using Menu;
using Menu.Enums;
namespace CS2_SimpleAdmin.Menus;
public static class ReasonMenu
{
public static void OpenMenu(CCSPlayerController admin, PenaltyType penaltyType, string menuName, CCSPlayerController player, Action<CCSPlayerController, CCSPlayerController, string> onSelectAction)
public static void OpenMenu(
CCSPlayerController admin,
PenaltyType penaltyType,
string menuName,
CCSPlayerController player,
Action<CCSPlayerController, CCSPlayerController, string> onSelectAction)
{
var menu = AdminMenu.CreateMenu(menuName);
var reasons = penaltyType switch
{
PenaltyType.Ban => CS2_SimpleAdmin.Instance.Config.MenuConfigs.BanReasons,
@ -21,18 +26,38 @@ public static class ReasonMenu
_ => CS2_SimpleAdmin.Instance.Config.MenuConfigs.BanReasons
};
foreach (var reason in reasons)
var items = new List<MenuItem>();
for (int i = 0; i < reasons.Count; i++)
{
menu?.AddMenuOption(reason, (_, _) => onSelectAction(admin, player, reason));
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(reasons[i])]));
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (items.Count == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuName,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && selected.Option >= 0 && selected.Option < reasons.Count)
{
onSelectAction(admin, player, reasons[selected.Option]);
}
},
true,
freezePlayer: false,
disableDeveloper: true);
}
public static void OpenMenu(CCSPlayerController admin, PenaltyType penaltyType, string menuName, DisconnectedPlayer player, Action<CCSPlayerController, DisconnectedPlayer, string> onSelectAction)
public static void OpenMenu(
CCSPlayerController admin,
PenaltyType penaltyType,
string menuName,
DisconnectedPlayer player,
Action<CCSPlayerController, DisconnectedPlayer, string> onSelectAction)
{
var menu = AdminMenu.CreateMenu(menuName);
var reasons = penaltyType switch
{
PenaltyType.Ban => CS2_SimpleAdmin.Instance.Config.MenuConfigs.BanReasons,
@ -42,11 +67,28 @@ public static class ReasonMenu
_ => CS2_SimpleAdmin.Instance.Config.MenuConfigs.BanReasons
};
foreach (var reason in reasons)
var items = new List<MenuItem>();
for (int i = 0; i < reasons.Count; i++)
{
menu?.AddMenuOption(reason, (_, _) => onSelectAction(admin, player, reason));
items.Add(new MenuItem(MenuItemType.Button, [new MenuValue(reasons[i])]));
}
if (menu != null) AdminMenu.OpenMenu(admin, menu);
if (items.Count == 0) return;
CS2_SimpleAdmin.Menu?.ShowScrollableMenu(
admin,
menuName,
items,
(buttons, menu, selected) =>
{
if (selected == null) return;
if (buttons == MenuButtons.Select && selected.Option >= 0 && selected.Option < reasons.Count)
{
onSelectAction(admin, player, reasons[selected.Option]);
}
},
true,
freezePlayer: false,
disableDeveloper: true);
}
}