diff --git a/plugins/ns/nscommands.sma b/plugins/ns/nscommands.sma new file mode 100755 index 00000000..ce5c9764 --- /dev/null +++ b/plugins/ns/nscommands.sma @@ -0,0 +1,381 @@ +/* AMX Mod X +* Natural-Selection Admin Commands Plugin +* +* by the AMX Mod X Development Team +* +* 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 + +#pragma tabsize 0 + +new g_TeamOneAck[12]; +new g_TeamTwoAck[12]; +new g_ReadyRoomAck[12]; +new g_AutoAssignAck[12]; +new g_StopCommAck[12]; + +enum { + PLAYERCLASS_NONE = 0, + PLAYERCLASS_ALIVE_MARINE, + PLAYERCLASS_ALIVE_HEAVY_MARINE, + PLAYERCLASS_ALIVE_LEVEL1, + PLAYERCLASS_ALIVE_LEVEL2, + PLAYERCLASS_ALIVE_LEVEL3, + PLAYERCLASS_ALIVE_LEVEL4, + PLAYERCLASS_ALIVE_LEVEL5, + PLAYERCLASS_ALIVE_DIGESTING, + PLAYERCLASS_ALIVE_GESTATING, + PLAYERCLASS_DEAD_MARINE, + PLAYERCLASS_DEAD_ALIEN, + PLAYERCLASS_COMMANDER, + PLAYERCLASS_REINFORCING, + PLAYERCLASS_SPECTATOR +}; +enum { + TEAM_UNKNOWN, + TEAM_MARINE1, + TEAM_ALIEN1, + TEAM_MARINE2, + TEAM_ALIEN2, + TEAM_SPECTATOR +}; + + +new g_Class[33]; // stored info from the "ScoreInfo" message +new g_Team[33]; +public plugin_init() { + register_plugin("NS Commands","1.0","sawce"); + // create our semi-random acknowledgement commands + format(g_TeamOneAck,11,"namx_a%c%c%c%c%c",random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z')); + format(g_TeamTwoAck,11,"namx_b%c%c%c%c%c",random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z')); + format(g_ReadyRoomAck,11,"namx_c%c%c%c%c%c",random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z')); + format(g_AutoAssignAck,11,"namx_d%c%c%c%c%c",random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z')); + format(g_StopCommAck,11,"namx_e%c%c%c%c%c",random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z'),random_num('a','z')); + + // register them.. + register_clcmd(g_TeamOneAck,"ack_team_one"); + register_clcmd(g_TeamTwoAck,"ack_team_two"); + register_clcmd(g_ReadyRoomAck,"ack_ready_room"); + register_clcmd(g_AutoAssignAck,"ack_auto_assign"); + register_clcmd(g_StopCommAck,"ack_stop_comm"); + + // register admin commands.. + register_concmd("amx_alien","cmdTeamTwo",ADMIN_LEVEL_H,""); + register_concmd("amx_marine","cmdTeamOne",ADMIN_LEVEL_H,""); + register_concmd("amx_uncomm","cmdUnComm",ADMIN_LEVEL_H," - force commander out of chair"); + register_concmd("amx_random","cmdRandom",ADMIN_LEVEL_H," - omit to do all in rr"); + register_concmd("amx_readyroom","cmdReadyRoom",ADMIN_LEVEL_H," - omit to do everybody"); + + // clear class info.. + new i=0; + while (i<33) { + g_Class[i]=0; + g_Team[i]=-1; + i++; + } + + // register ScoreInfo message.. + register_event("ScoreInfo","msgScoreInfo","a") +} +public msgScoreInfo() { + new id=read_data(1); + if (id>32||id<1) { + // just incase.. + return; + } + g_Class[id]=read_data(5); + g_Team[id]=read_data(7); +} +public client_disconnect(id) { + g_Class[id]=0; + g_Team[id]=-1; +} +public client_connect(id) { + g_Class[id]=0; + g_Team[id]=-1; +} +stock UTIL_FindCommander() { + new i=1; + while (i<32) { + if (g_Class[i]==PLAYERCLASS_COMMANDER) // this player is comm.. + return i; + i++; + } + return 0; + +} +stock UTIL_IsSpectator(id) { + if (id<1||id>get_maxplayers()) + return -1; + if (g_Class[id]==PLAYERCLASS_SPECTATOR) + return 1; + return 0; +} +// syntax: +public cmdRandom(id,level,cid) { + if (!cmd_access(id,level,cid,1)) + return PLUGIN_HANDLED + if (read_argc()>1) { // person is specified.. + new arg[32] + read_argv(1,arg,31) + new player = cmd_target(id,arg,5) + if (!player) return PLUGIN_HANDLED + new name[32],name_targ[32]; + new auth[32],auth_targ[32]; + get_user_name(id,name,31); + get_user_name(player,name_targ,31); + get_user_authid(id,auth,31); + get_user_authid(player,auth_targ,31); + log_amx("Cmd: ^"%s<%d><%s><>^" random ^"%s<%d><%s><>^"",name,get_user_userid(id),auth, name_targ,get_user_userid(player),auth_targ); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: random %s",name,name_targ); + case 1: client_print(0,print_chat,"ADMIN: random %s",name_targ); + } + client_cmd(player,g_AutoAssignAck); + } + else { + new cur=0; + new i=1; + while (i<%s><>^" random all",name,get_user_userid(id),auth); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: random all",name); + case 1: client_print(0,print_chat,"ADMIN: random all"); + } + randomStep(1); + } else { + client_print(id,print_chat,"[AMXX] There is nobody in the readyroom."); + } + } + return PLUGIN_HANDLED_MAIN; + +} + +public randomStep(index) { + new end = index+5 + while (index < end) { + if (g_Team[index] == 0 && !(get_user_flags(index) & ADMIN_IMMUNITY)) { + client_cmd(index,g_AutoAssignAck); + } + if (++index > get_maxplayers()) { + return PLUGIN_HANDLED_MAIN + } + } + set_task(0.1, "randomStep", index) + return PLUGIN_HANDLED_MAIN +} + + +// syntax: +public cmdReadyRoom(id,level,cid) { + if (!cmd_access(id,level,cid,1)) + return PLUGIN_HANDLED + if (read_argc()>1) { // person is specified.. + new arg[32] + read_argv(1,arg,31) + new player = cmd_target(id,arg,5) + if (!player) return PLUGIN_HANDLED + new name[32],name_targ[32]; + new auth[32],auth_targ[32]; + get_user_name(id,name,31); + get_user_name(player,name_targ,31); + get_user_authid(id,auth,31); + get_user_authid(player,auth_targ,31); + log_amx("Cmd: ^"%s<%d><%s><>^" ready room ^"%s<%d><%s><>^"",name,get_user_userid(id),auth, name_targ,get_user_userid(player),auth_targ); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: ready room %s",name,name_targ); + case 1: client_print(0,print_chat,"ADMIN: ready room %s",name_targ); + } + client_cmd(player,g_ReadyRoomAck); + } + else { + new cur=0; + new i=1; + while (i<%s><>^" ready room all",name,get_user_userid(id),auth); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: ready room all",name); + case 1: client_print(0,print_chat,"ADMIN: ready room all"); + } + rrStep(1); + } else { + client_print(id,print_chat,"[AMXX] There is nobody on a team."); + } + } + return PLUGIN_HANDLED_MAIN; + +} + +public rrStep(index) { + new end = index+5 + while (index < end) { + if (is_user_connected(index) && g_Team[index]!=0) { + client_cmd(index,g_ReadyRoomAck) + } + if (++index > get_maxplayers()) { + return PLUGIN_HANDLED_MAIN + } + } + set_task(0.1, "rrStep", index) + return PLUGIN_HANDLED_MAIN +} + + +public cmdTeamTwo(id,level,cid) { + if (!cmd_access(id,level,cid,2)) + return PLUGIN_HANDLED + if (read_argc()>1) { // person is specified.. + new arg[32] + read_argv(1,arg,31) + new player = cmd_target(id,arg,5) + if (!player) return PLUGIN_HANDLED + if (g_Team[id]==2 || g_Team[id]==4 /*i think 4 is team 2 in ava..*/) { + client_print(id,print_chat,"[AMXX] That user is already on team two."); + return PLUGIN_HANDLED_MAIN; + } + new name[32],name_targ[32]; + new auth[32],auth_targ[32]; + get_user_name(id,name,31); + get_user_name(player,name_targ,31); + get_user_authid(id,auth,31); + get_user_authid(player,auth_targ,31); + log_amx("Cmd: ^"%s<%d><%s><>^" alien ^"%s<%d><%s><>^"",name,get_user_userid(id),auth, name_targ,get_user_userid(player),auth_targ); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: alien %s",name,name_targ); + case 1: client_print(0,print_chat,"ADMIN: alien %s",name_targ); + } + client_cmd(player,g_TeamTwoAck); + } + return PLUGIN_HANDLED_MAIN; + +} + +public cmdTeamOne(id,level,cid) { + if (!cmd_access(id,level,cid,2)) + return PLUGIN_HANDLED + if (read_argc()>1) { // person is specified.. + new arg[32] + read_argv(1,arg,31) + new player = cmd_target(id,arg,5) + if (!player) return PLUGIN_HANDLED + if (g_Team[id]==1 || g_Team[id]==3 /*i think 3 is team 2 in mvm..*/) { + client_print(id,print_chat,"[AMXX] That user is already on team one."); + return PLUGIN_HANDLED_MAIN; + } + new name[32],name_targ[32]; + new auth[32],auth_targ[32]; + get_user_name(id,name,31); + get_user_name(player,name_targ,31); + get_user_authid(id,auth,31); + get_user_authid(player,auth_targ,31); + log_amx("Cmd: ^"%s<%d><%s><>^" marine ^"%s<%d><%s><>^"",name,get_user_userid(id),auth, name_targ,get_user_userid(player),auth_targ); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: marine %s",name,name_targ); + case 1: client_print(0,print_chat,"ADMIN: marine %s",name_targ); + } + client_cmd(player,g_TeamOneAck); + } + return PLUGIN_HANDLED_MAIN; + +} + + +// syntax: none - auto detect comm +public cmdUnComm(id,level,cid) { + if (!cmd_access(id,level,cid,1)) + return PLUGIN_HANDLED + new comm = UTIL_FindCommander(); + if (comm>0&&comm<=get_maxplayers()) { + client_cmd(comm,g_StopCommAck); + new name[32],name_targ[32]; + new auth[32],auth_targ[32]; + get_user_name(id,name,31); + get_user_name(comm,name_targ,31); + get_user_authid(id,auth,31); + get_user_authid(comm,auth_targ,31); + log_amx("Cmd: ^"%s<%d><%s><>^" uncomm ^"%s<%d><%s><>^"",name,get_user_userid(id),auth, name_targ,get_user_userid(comm),auth_targ); + switch (get_cvar_num("amx_show_activity")) { + case 2: client_print(0,print_chat,"ADMIN %s: uncomm %s",name,name_targ); + case 1: client_print(0,print_chat,"ADMIN: uncomm %s",name_targ); + } + + } else { + client_print(id,print_chat,"[AMXX] There is no commander to eject."); + } + return PLUGIN_HANDLED_MAIN; +} +public ack_team_one(id) { + engclient_cmd(id,"readyroom"); + engclient_cmd(id,"jointeamone"); + return PLUGIN_HANDLED_MAIN; +} +public ack_team_two(id) { + engclient_cmd(id,"readyroom"); + engclient_cmd(id,"jointeamtwo"); + return PLUGIN_HANDLED_MAIN; +} +public ack_ready_room(id) { + engclient_cmd(id,"readyroom"); + return PLUGIN_HANDLED_MAIN; +} +public ack_auto_assign(id) { + engclient_cmd(id,"readyroom"); + engclient_cmd(id,"autoassign"); + return PLUGIN_HANDLED_MAIN; +} +public ack_stop_comm(id) { + engclient_cmd(id,"stopcommandermode"); + return PLUGIN_HANDLED_MAIN; +}