From 25d95f1115162cb1c63f5871aff7aad10e8fac2c Mon Sep 17 00:00:00 2001 From: Steve Dudenhoeffer Date: Fri, 3 Aug 2007 02:59:46 +0000 Subject: [PATCH] Fix for amb183 - plmenu's team menu is not compatible with natural selection. --- plugins/ns/plmenu.sma | 964 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 964 insertions(+) create mode 100644 plugins/ns/plmenu.sma diff --git a/plugins/ns/plmenu.sma b/plugins/ns/plmenu.sma new file mode 100644 index 00000000..3132297e --- /dev/null +++ b/plugins/ns/plmenu.sma @@ -0,0 +1,964 @@ +/* AMX Mod X +* Players Menu Plugin +* +* by the AMX Mod X Development Team +* originally developed by OLO +* +* This file is part of AMX Mod X. +* +* +* 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 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +*/ + +#include +#include +#include + +new g_menuPosition[33] +new g_menuPlayers[33][32] +new g_menuPlayersNum[33] +new g_menuOption[33] +new g_menuSettings[33] + +new g_menuSelect[33][64] +new g_menuSelectNum[33] + +#define MAX_CLCMDS 24 + +new g_clcmdName[MAX_CLCMDS][32] +new g_clcmdCmd[MAX_CLCMDS][64] +new g_clcmdMisc[MAX_CLCMDS][2] +new g_clcmdNum + +new Array:g_bantimes; +new Array:g_slapsettings; + + +new NSGameplay:g_gametype; + +new g_TeamNames[4][32]; +new g_TeamCommands[4][40]; +new g_PrettyTeamNames[4][32]; +new g_AbbreviatedTeamNames[4][10]; + +// This function failsafes to the readyroom +stock GetNSTeam(id, abbreviation[], abrsize) +{ + if (!is_user_connected(id)) + { + copy(abbreviation, abrsize, g_AbbreviatedTeamNames[0]); + return 0; + } + + new team[32]; + ns_get_user_team(id, team, charsmax(team)); + + for (new i = 0; i < sizeof(g_TeamNames); i++) + { + if (equal(g_TeamNames[i], team)) + { + copy(abbreviation, abrsize, g_AbbreviatedTeamNames[i]); + return i; + } + } + + copy(abbreviation, abrsize, g_AbbreviatedTeamNames[0]); + return 0; +} +// engclient_cmd each function separated by semi colons +stock ExecuteString(id, const string[]) +{ + new tempbuff[128]; + + copy(tempbuff, charsmax(tempbuff), string); + + new len = strlen(tempbuff); + + new start = 0; + + for (new i = 0; i < len; i++) + { + if (tempbuff[i] == ';') + { + tempbuff[i] = '^0'; + engclient_cmd(id, tempbuff[start]); + + tempbuff[i] = ';'; + + start = i + 1; + } + } + + if (start != len) + { + // we had a left over command + engclient_cmd(id, tempbuff[start]); + } +} +public plugin_natives() +{ + set_module_filter("module_filter") + set_native_filter("native_filter") +} + +public plugin_init() +{ + register_plugin("Players Menu", AMXX_VERSION_STR, "AMXX Dev Team") + register_dictionary("common.txt") + register_dictionary("admincmd.txt") + register_dictionary("plmenu.txt") + + register_clcmd("amx_kickmenu", "cmdKickMenu", ADMIN_KICK, "- displays kick menu") + register_clcmd("amx_banmenu", "cmdBanMenu", ADMIN_BAN, "- displays ban menu") + register_clcmd("amx_slapmenu", "cmdSlapMenu", ADMIN_SLAY, "- displays slap/slay menu") + register_clcmd("amx_teammenu", "cmdTeamMenu", ADMIN_LEVEL_A, "- displays team menu") + register_clcmd("amx_clcmdmenu", "cmdClcmdMenu", ADMIN_LEVEL_A, "- displays client cmds menu") + + register_menucmd(register_menuid("Ban Menu"), 1023, "actionBanMenu") + register_menucmd(register_menuid("Kick Menu"), 1023, "actionKickMenu") + register_menucmd(register_menuid("Slap/Slay Menu"), 1023, "actionSlapMenu") + register_menucmd(register_menuid("Team Menu"), 1023, "actionTeamMenu") + register_menucmd(register_menuid("Client Cmds Menu"), 1023, "actionClcmdMenu") + + + g_bantimes = ArrayCreate(); + // Load up the old default values + ArrayPushCell(g_bantimes, 0); + ArrayPushCell(g_bantimes, 5); + ArrayPushCell(g_bantimes, 10); + ArrayPushCell(g_bantimes, 15); + ArrayPushCell(g_bantimes, 30); + ArrayPushCell(g_bantimes, 45); + ArrayPushCell(g_bantimes, 60); + + + g_slapsettings = ArrayCreate(); + // Old default values + ArrayPushCell(g_slapsettings, 0); // First option is ignored - it is slay + ArrayPushCell(g_slapsettings, 1); + ArrayPushCell(g_slapsettings, 5); + + + register_srvcmd("amx_plmenu_bantimes", "plmenu_setbantimes"); + register_srvcmd("amx_plmenu_slapdmg", "plmenu_setslapdmg"); + + + g_gametype = ns_get_gameplay(); + + new clcmds_ini_file[64] + get_configsdir(clcmds_ini_file, 63) + format(clcmds_ini_file, 63, "%s/clcmds.ini", clcmds_ini_file) + load_settings(clcmds_ini_file) + + // initialize the ns team names + copy(g_PrettyTeamNames[0], sizeof(g_PrettyTeamNames[]), "Ready Room"); + copy(g_TeamNames[0], sizeof(g_TeamNames[]), "undefinedteam"); + copy(g_TeamCommands[0], sizeof(g_TeamCommands[]), "readyroom;readyroom"); + copy(g_AbbreviatedTeamNames[0], sizeof(g_AbbreviatedTeamNames[]), "RR"); + + copy(g_PrettyTeamNames[3], sizeof(g_PrettyTeamNames[]), "Spectators"); + copy(g_TeamNames[3], sizeof(g_TeamNames[]), "spectatorteam"); + copy(g_TeamCommands[3], sizeof(g_TeamCommands[]), "readyroom;readyroom;spectate"); + copy(g_AbbreviatedTeamNames[3], sizeof(g_AbbreviatedTeamNames[]), "SP"); + + if (g_gametype == NSGame_CantTell || + g_gametype == NSGame_Unknown) + { + // Revert to the most common gametype if we hit an error + g_gametype = NSGame_MarineVAlien; + } + + switch (g_gametype) + { + case NSGame_MarineVAlien: + { + copy(g_TeamNames[1], sizeof(g_TeamNames[]), "marine1team"); + copy(g_PrettyTeamNames[1], sizeof(g_PrettyTeamNames[]), "Marines"); + copy(g_AbbreviatedTeamNames[1], sizeof(g_AbbreviatedTeamNames[]), "M"); + copy(g_TeamCommands[1], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamone"); + + copy(g_TeamNames[2], sizeof(g_TeamNames[]), "alien1team"); + copy(g_PrettyTeamNames[2], sizeof(g_PrettyTeamNames[]), "Aliens"); + copy(g_AbbreviatedTeamNames[2], sizeof(g_AbbreviatedTeamNames[]), "A"); + copy(g_TeamCommands[2], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamtwo"); + } + case NSGame_MarineVMarine: + { + copy(g_TeamNames[1], sizeof(g_TeamNames[]), "marine1team"); + copy(g_PrettyTeamNames[1], sizeof(g_PrettyTeamNames[]), "Marine Team 1"); + copy(g_AbbreviatedTeamNames[1], sizeof(g_AbbreviatedTeamNames[]), "M1"); + copy(g_TeamCommands[1], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamone"); + + copy(g_TeamNames[2], sizeof(g_TeamNames[]), "marine2team"); + copy(g_PrettyTeamNames[2], sizeof(g_PrettyTeamNames[]), "Marine Team 2"); + copy(g_AbbreviatedTeamNames[2], sizeof(g_AbbreviatedTeamNames[]), "M2"); + copy(g_TeamCommands[2], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamthree"); + } + case NSGame_AlienVAlien: + { + copy(g_TeamNames[1], sizeof(g_TeamNames[]), "alien1team"); + copy(g_PrettyTeamNames[1], sizeof(g_PrettyTeamNames[]), "Alien Team 1"); + copy(g_AbbreviatedTeamNames[1], sizeof(g_AbbreviatedTeamNames[]), "A1"); + copy(g_TeamCommands[1], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamtwo"); + + copy(g_TeamNames[2], sizeof(g_TeamNames[]), "alien2team"); + copy(g_PrettyTeamNames[2], sizeof(g_PrettyTeamNames[]), "Alien Team 2"); + copy(g_AbbreviatedTeamNames[2], sizeof(g_AbbreviatedTeamNames[]), "A2"); + copy(g_TeamCommands[2], sizeof(g_TeamCommands[]), "readyroom;readyroom;jointeamfour"); + } + } + +} +public plmenu_setbantimes() +{ + new buff[32]; + new args = read_argc(); + + if (args <= 1) + { + server_print("usage: amx_plmenu_bantimes [time2] [time3] ..."); + server_print(" use time of 0 for permanent."); + + return; + } + + ArrayClear(g_bantimes); + + for (new i = 1; i < args; i++) + { + read_argv(i, buff, charsmax(buff)); + + ArrayPushCell(g_bantimes, str_to_num(buff)); + + } + +} +public plmenu_setslapdmg() +{ + new buff[32]; + new args = read_argc(); + + if (args <= 1) + { + server_print("usage: amx_plmenu_slapdmg [dmg2] [dmg3] ..."); + server_print(" slay is automatically set for the first value."); + + return; + } + + ArrayClear(g_slapsettings); + + ArrayPushCell(g_slapsettings, 0); // compensate for slay + + for (new i = 1; i < args; i++) + { + read_argv(i, buff, charsmax(buff)); + + ArrayPushCell(g_slapsettings, str_to_num(buff)); + + } + +} +public module_filter(const module[]) +{ + if (equali(module, "cstrike")) + return PLUGIN_HANDLED + + return PLUGIN_CONTINUE +} + +public native_filter(const name[], index, trap) +{ + if (!trap) + return PLUGIN_HANDLED + + return PLUGIN_CONTINUE +} + +/* Ban menu */ + +public actionBanMenu(id, key) +{ + switch (key) + { + case 7: + { + /* BEGIN OF CHANGES BY MISTAGEE ADDED A FEW MORE OPTIONS */ + + ++g_menuOption[id] + g_menuOption[id] %= ArraySize(g_bantimes); + + g_menuSettings[id] = ArrayGetCell(g_bantimes, g_menuOption[id]); + + displayBanMenu(id, g_menuPosition[id]) + } + case 8: displayBanMenu(id, ++g_menuPosition[id]) + case 9: displayBanMenu(id, --g_menuPosition[id]) + default: + { + new player = g_menuPlayers[id][g_menuPosition[id] * 7 + key] + new name[32], name2[32], authid[32], authid2[32] + + get_user_name(player, name2, 31) + get_user_authid(id, authid, 31) + get_user_authid(player, authid2, 31) + get_user_name(id, name, 31) + + new userid2 = get_user_userid(player) + + log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%d^")", name, get_user_userid(id), authid, name2, userid2, authid2, g_menuSettings[id]) + + if (g_menuSettings[id]==0) // permanent + { + new maxpl = get_maxplayers(); + for (new i = 1; i <= maxpl; i++) + { + show_activity_id(i, id, name, "%L %s %L", i, "BAN", name2, i, "PERM"); + } + } + else + { + new tempTime[32]; + formatex(tempTime,sizeof(tempTime)-1,"%d",g_menuSettings[id]); + new maxpl = get_maxplayers(); + for (new i = 1; i <= maxpl; i++) + { + show_activity_id(i, id, name, "%L %s %L", i, "BAN", name2, i, "FOR_MIN", tempTime); + } + } + /* ---------- check for Steam ID added by MistaGee -------------------- + IF AUTHID == 4294967295 OR VALVE_ID_LAN OR HLTV, BAN PER IP TO NOT BAN EVERYONE */ + + if (equal("4294967295", authid2) + || equal("HLTV", authid2) + || equal("STEAM_ID_LAN", authid2) + || equali("VALVE_ID_LAN", authid2)) + { + /* END OF MODIFICATIONS BY MISTAGEE */ + new ipa[32] + get_user_ip(player, ipa, 31, 1) + + server_cmd("addip %d %s;writeip", g_menuSettings[id], ipa) + } + else + { + server_cmd("banid %d #%d kick;writeid", g_menuSettings[id], userid2) + } + + server_exec() + + displayBanMenu(id, g_menuPosition[id]) + } + } + + return PLUGIN_HANDLED +} + +displayBanMenu(id, pos) +{ + if (pos < 0) + return + + get_players(g_menuPlayers[id], g_menuPlayersNum[id]) + + new menuBody[512] + new b = 0 + new i + new name[32] + new start = pos * 7 + + if (start >= g_menuPlayersNum[id]) + start = pos = g_menuPosition[id] = 0 + + new len = format(menuBody, 511, "%L %d/%d^n^n", id, "BAN_MENU", pos + 1, (g_menuPlayersNum[id] / 7 + ((g_menuPlayersNum[id] % 7) ? 1 : 0))) + new end = start + 7 + new keys = MENU_KEY_0|MENU_KEY_8 + + if (end > g_menuPlayersNum[id]) + end = g_menuPlayersNum[id] + + for (new a = start; a < end; ++a) + { + i = g_menuPlayers[id][a] + get_user_name(i, name, 31) + + if (is_user_bot(i) || access(i, ADMIN_IMMUNITY)) + { + ++b + + len += format(menuBody[len], 511-len, "#. %s^n", name) + } else { + keys |= (1< 0) + { + g_menuSettings[id] = ArrayGetCell(g_bantimes, g_menuOption[id]); + } + else + { + // should never happen, but failsafe + g_menuSettings[id] = 0 + } + displayBanMenu(id, g_menuPosition[id] = 0) + + return PLUGIN_HANDLED +} + +/* Slap/Slay */ + +public actionSlapMenu(id, key) +{ + switch (key) + { + case 7: + { + ++g_menuOption[id] + + g_menuOption[id] %= ArraySize(g_slapsettings); + + g_menuSettings[id] = ArrayGetCell(g_slapsettings, g_menuOption[id]); + + displaySlapMenu(id, g_menuPosition[id]); + } + case 8: displaySlapMenu(id, ++g_menuPosition[id]) + case 9: displaySlapMenu(id, --g_menuPosition[id]) + default: + { + new player = g_menuPlayers[id][g_menuPosition[id] * 7 + key] + new name2[32] + + get_user_name(player, name2, 31) + + if (!is_user_alive(player)) + { + client_print(id, print_chat, "%L", id, "CANT_PERF_DEAD", name2) + displaySlapMenu(id, g_menuPosition[id]) + return PLUGIN_HANDLED + } + + new authid[32], authid2[32], name[32] + + get_user_authid(id, authid, 31) + get_user_authid(player, authid2, 31) + get_user_name(id, name, 31) + + if (g_menuOption[id]) + { + log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, g_menuSettings[id], name2, get_user_userid(player), authid2) + + show_activity_key("ADMIN_SLAP_1", "ADMIN_SLAP_2", name, name2, g_menuSettings[id]); + } else { + log_amx("Cmd: ^"%s<%d><%s><>^" slay ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, name2, get_user_userid(player), authid2) + + show_activity_key("ADMIN_SLAY_1", "ADMIN_SLAY_2", name, name2); + } + + if (g_menuOption[id]) + user_slap(player, (get_user_health(player) > g_menuSettings[id]) ? g_menuSettings[id] : 0) + else + user_kill(player) + + displaySlapMenu(id, g_menuPosition[id]) + } + } + + return PLUGIN_HANDLED +} + +displaySlapMenu(id, pos) +{ + if (pos < 0) + return + + get_players(g_menuPlayers[id], g_menuPlayersNum[id]) + + new menuBody[512] + new b = 0 + new i + new name[32], team[4] + new start = pos * 7 + + if (start >= g_menuPlayersNum[id]) + start = pos = g_menuPosition[id] = 0 + + new len = format(menuBody, 511, "%L %d/%d^n^n", id, "SLAP_SLAY_MENU", pos + 1, (g_menuPlayersNum[id] / 7 + ((g_menuPlayersNum[id] % 7) ? 1 : 0))) + new end = start + 7 + new keys = MENU_KEY_0|MENU_KEY_8 + + if (end > g_menuPlayersNum[id]) + end = g_menuPlayersNum[id] + + for (new a = start; a < end; ++a) + { + i = g_menuPlayers[id][a] + get_user_name(i, name, 31) + + get_user_team(i, team, 3) + + if (!is_user_alive(i) || access(i, ADMIN_IMMUNITY)) + { + ++b + + len += format(menuBody[len], 511-len, "#. %s %s^n", name, team) + } else { + keys |= (1< 0) + { + g_menuSettings[id] = ArrayGetCell(g_slapsettings, g_menuOption[id]); + } + else + { + // should never happen, but failsafe + g_menuSettings[id] = 0 + } + + displaySlapMenu(id, g_menuPosition[id] = 0) + + return PLUGIN_HANDLED +} + +/* Kick */ + +public actionKickMenu(id, key) +{ + switch (key) + { + case 8: displayKickMenu(id, ++g_menuPosition[id]) + case 9: displayKickMenu(id, --g_menuPosition[id]) + default: + { + new player = g_menuPlayers[id][g_menuPosition[id] * 8 + key] + new authid[32], authid2[32], name[32], name2[32] + + get_user_authid(id, authid, 31) + get_user_authid(player, authid2, 31) + get_user_name(id, name, 31) + get_user_name(player, name2, 31) + + new userid2 = get_user_userid(player) + + log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, name2, userid2, authid2) + + show_activity_key("ADMIN_KICK_1", "ADMIN_KICK_2", name, name2); + + + server_cmd("kick #%d", userid2) + server_exec() + + displayKickMenu(id, g_menuPosition[id]) + } + } + + return PLUGIN_HANDLED +} + +displayKickMenu(id, pos) +{ + if (pos < 0) + return + + get_players(g_menuPlayers[id], g_menuPlayersNum[id]) + + new menuBody[512] + new b = 0 + new i + new name[32] + new start = pos * 8 + + if (start >= g_menuPlayersNum[id]) + start = pos = g_menuPosition[id] = 0 + + new len = format(menuBody, 511, "%L %d/%d^n^n", id, "KICK_MENU", pos + 1, (g_menuPlayersNum[id] / 8 + ((g_menuPlayersNum[id] % 8) ? 1 : 0))) + new end = start + 8 + new keys = MENU_KEY_0 + + if (end > g_menuPlayersNum[id]) + end = g_menuPlayersNum[id] + + for (new a = start; a < end; ++a) + { + i = g_menuPlayers[id][a] + get_user_name(i, name, 31) + + if (access(i, ADMIN_IMMUNITY)) + { + ++b + + len += format(menuBody[len], 511-len, "#. %s^n", name) + } else { + keys |= (1<<%s><>^" transfer ^"%s<%d><%s><>^" (team ^"%s^")", name, get_user_userid(id), authid, name2, get_user_userid(player), authid2, g_PrettyTeamNames[g_menuOption[id]]) + + show_activity_key("ADMIN_TRANSF_1", "ADMIN_TRANSF_2", name, name2, g_PrettyTeamNames[g_menuOption[id]]); + + new limit_setting = get_cvar_num("mp_limitteams") + + set_cvar_num("mp_limitteams", 0) + ExecuteString(player, g_TeamCommands[g_menuOption[id]]); + set_cvar_num("mp_limitteams", limit_setting) + + displayTeamMenu(id, g_menuPosition[id]) + } + } + + return PLUGIN_HANDLED +} + +displayTeamMenu(id, pos) +{ + if (pos < 0) + return + + get_players(g_menuPlayers[id], g_menuPlayersNum[id]) + + new menuBody[512] + new b = 0 + new i, iteam + new name[32], team[4] + new start = pos * 7 + + if (start >= g_menuPlayersNum[id]) + start = pos = g_menuPosition[id] = 0 + + new len = format(menuBody, 511, "%L %d/%d^n^n", id, "TEAM_MENU", pos + 1, (g_menuPlayersNum[id] / 7 + ((g_menuPlayersNum[id] % 7) ? 1 : 0))) + new end = start + 7 + new keys = MENU_KEY_0|MENU_KEY_8 + + if (end > g_menuPlayersNum[id]) + end = g_menuPlayersNum[id] + + for (new a = start; a < end; ++a) + { + i = g_menuPlayers[id][a] + get_user_name(i, name, 31) + + iteam = GetNSTeam(i, team, 3) + + if (iteam == g_menuOption[id] || access(i, ADMIN_IMMUNITY)) + { + ++b + + len += format(menuBody[len], 511-len, "#. %s %s^n", name, team) + } else { + keys |= (1<= g_menuPlayersNum[id]) + start = pos = g_menuPosition[id] = 0 + + new len = format(menuBody, 511, "%L %d/%d^n^n", id, "CL_CMD_MENU", pos + 1, (g_menuPlayersNum[id] / 7 + ((g_menuPlayersNum[id] % 7) ? 1 : 0))) + new end = start + 7 + new keys = MENU_KEY_0|MENU_KEY_8 + + if (end > g_menuPlayersNum[id]) + end = g_menuPlayersNum[id] + + for (new a = start; a < end; ++a) + { + i = g_menuPlayers[id][a] + get_user_name(i, name, 31) + + if (!g_menuSelectNum[id] || access(i, ADMIN_IMMUNITY)) + { + ++b + + len += format(menuBody[len], 511-len, "#. %s^n", name) + } else { + keys |= (1< 3) + { + while (replace(g_clcmdCmd[g_clcmdNum], 63, "\'", "^"")) + { + // do nothing + } + + g_clcmdMisc[g_clcmdNum][1] = read_flags(szFlags) + g_clcmdMisc[g_clcmdNum][0] = read_flags(szAccess) + g_clcmdNum++ + } + } + + return 1 +}