added tfc plugins

This commit is contained in:
Lukasz Wlasinksi 2004-09-10 11:57:26 +00:00
parent 78c191b4c9
commit 1e1d479d76
7 changed files with 1933 additions and 0 deletions

201
plugins/tfc/menufront.sma Executable file
View File

@ -0,0 +1,201 @@
/* AMX Mod X
* Menus Front-End 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 <amxmodx>
#include <amxmisc>
new g_menuPosition[33]
#define MENUS_NUMBER 16
new g_menuBody[MENUS_NUMBER][] = {
"KICK_PLAYER",
"BAN_PLAYER",
"SLAP_SLAY",
"TEAM_PLAYER",
"CHANGEL",
"VOTE_MAPS",
"SPECH_STUFF",
"CLIENT_COM",
// Next Page
"SERVER_COM",
"CVARS_SET",
"CONFIG",
"LANG_SET",
"STATS_SET",
"PAUSE_PLUG",
"RES_WEAP",
"TELE_PLAYER" /* Last is Teleport menu - if you want to move it
change also code in displayMenu (look for fun module check) */
}
new g_menuCmd[MENUS_NUMBER][] = {
"amx_kickmenu",
"amx_banmenu",
"amx_slapmenu",
"amx_teammenu",
"amx_mapmenu",
"amx_votemapmenu",
"amx_speechmenu",
"amx_clcmdmenu",
// Next Page
"amx_cmdmenu",
"amx_cvarmenu",
"amx_cfgmenu",
"amx_setlangmenu",
"amx_statscfgmenu",
"amx_pausecfgmenu",
"amx_restmenu",
"amx_teleportmenu"
}
// Second value sets if menu is only for CS...
new g_menuAccess[MENUS_NUMBER][2] = {
{ADMIN_KICK,0},
{ADMIN_BAN,0},
{ADMIN_SLAY,0},
{ADMIN_LEVEL_A,0},
{ADMIN_MAP,0},
{ADMIN_MAP,0},
{ADMIN_MENU,0},
{ADMIN_LEVEL_A,0},
// Next Page
{ADMIN_MENU,0},
{ADMIN_CVAR,0},
{ADMIN_MENU,0},
{ADMIN_CFG,0},
{ADMIN_CFG,0},
{ADMIN_CFG,0},
{ADMIN_CFG,1},
{ADMIN_LEVEL_A,0}
}
new g_coloredMenus
new g_cstrikeRunning
new g_funModule
public plugin_init() {
register_plugin("Menus Front-End",AMXX_VERSION_STR,"AMXX Dev Team")
register_dictionary("menufront.txt")
register_dictionary("common.txt")
register_menucmd(register_menuid("AMX Mod X Menu"),1023,"actionMenu")
register_clcmd("amxmodmenu","cmdMenu",ADMIN_MENU,"- displays menus")
g_coloredMenus = colored_menus()
g_cstrikeRunning = cstrike_running()
g_funModule = is_module_loaded("Fun")
}
public actionMenu(id,key) {
switch (key) {
case 8: displayMenu(id,++g_menuPosition[id])
case 9: displayMenu(id,--g_menuPosition[id])
default: client_cmd(id, g_menuCmd[ g_menuPosition[id] * 8 + key ] )
}
return PLUGIN_HANDLED
}
displayMenu(id,pos) {
if (pos < 0) return
new menuBody[512]
new b = 0
new start = pos * 8
if ( start >= MENUS_NUMBER )
start = pos = g_menuPosition[id] = 0
new len = format(menuBody,511,
g_coloredMenus ? "\yAMX Mod X Menu\R%d/%d^n\w^n" : "AMX Mod X Menu %d/%d^n^n" , pos+1, 2 )
new end = start + 8
new keys = MENU_KEY_0
if (end > MENUS_NUMBER )
end = MENUS_NUMBER
new flags = get_user_flags(id)
for (new a = start; a < end; ++a) {
if ( a == MENUS_NUMBER - 1 && !g_funModule )
continue // checks if there is fun module for teleport menu
if ( (flags & g_menuAccess[a][0]) && ( g_menuAccess[a][1] ? g_cstrikeRunning : 1 ) ) {
keys |= (1<<b)
len += format(menuBody[len],511-len,"%d. %L^n",++b, id, g_menuBody[ a ] )
}
else {
++b
if ( g_coloredMenus )
len += format(menuBody[len],511-len, "\d%d. %L^n\w",b, id, g_menuBody[ a ] )
else
len += format(menuBody[len],511-len, "#. %L^n", id, g_menuBody[ a ] )
}
}
if (end != MENUS_NUMBER ) {
format(menuBody[len],511-len,"^n9. %L...^n0. %s", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %s", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody)
}
public cmdMenu(id,level,cid) {
if (cmd_access(id,level,cid,1))
displayMenu(id,g_menuPosition[id] = 0)
return PLUGIN_HANDLED
}

675
plugins/tfc/plmenu.sma Executable file
View File

@ -0,0 +1,675 @@
/* 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 <amxmodx>
#include <amxmisc>
#include <tfcx>
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 g_coloredMenus
new g_teamNames[5][] = { "", "Blue","Red","Yellow","Green" }
public plugin_init() {
register_plugin("Players Menu",AMXX_VERSION_STR,"AMXX Dev Team")
register_dictionary("plmenu.txt")
register_dictionary("common.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_coloredMenus = colored_menus()
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)
}
/* Ban menu */
public actionBanMenu(id,key) {
switch (key) {
case 7: {
++g_menuOption[id]
g_menuOption[id] %= 3
switch(g_menuOption[id]){
case 0: g_menuSettings[id] = 0
case 1: g_menuSettings[id] = 5
case 2: g_menuSettings[id] = 60
}
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] )
switch (get_cvar_num("amx_show_activity")) {
case 2: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_BAN_2",name,name2)
case 1: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_BAN_1",name2)
}
if (equal("4294967295",authid2)) { /* lan */
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, g_coloredMenus ?
"\y%L\R%d/%d^n\w^n" : "%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
if ( g_coloredMenus )
len += format(menuBody[len],511-len,"\d%d. %s^n\w",b,name)
else
len += format(menuBody[len],511-len,"#. %s^n",name)
}
else {
keys |= (1<<b)
len += format(menuBody[len],511-len,"%d. %s^n",++b,name)
}
}
if ( g_menuSettings[id] )
len += format(menuBody[len],511-len,"^n8. %L^n", id, "BAN_FOR_MIN", g_menuSettings[id] )
else
len += format(menuBody[len],511-len,"^n8. %L^n", id, "BAN_PERM" )
if (end != g_menuPlayersNum[id]) {
format(menuBody[len],511-len,"^n9. %L...^n0. %L", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody,-1,"Ban Menu")
}
public cmdBanMenu(id,level,cid) {
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED
g_menuOption[id] = 1
g_menuSettings[id] = 5
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] %= 4
switch (g_menuOption[id]) {
case 1: g_menuSettings[id] = 0
case 2: g_menuSettings[id] = 1
case 3: g_menuSettings[id] = 5
}
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 )
switch (get_cvar_num("amx_show_activity")) {
case 2: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_SLAP_2",name,name2,g_menuSettings[id])
case 1: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_SLAP_1",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 )
switch(get_cvar_num("amx_show_activity")) {
case 2: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_SLAY_2",name,name2)
case 1: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_SLAY_1",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]
new start = pos * 7
if (start >= g_menuPlayersNum[id])
start = pos = g_menuPosition[id] = 0
new len = format(menuBody,511, g_coloredMenus ?
"\y%L\R%d/%d^n\w^n" : "%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)
new iteam = get_user_team(i)
if ( !is_user_alive(i) || access(i,ADMIN_IMMUNITY) ) {
++b
if ( g_coloredMenus )
len += format(menuBody[len],511-len,"\d%d. %s\R%s^n\w", b,name,g_teamNames[iteam])
else
len += format(menuBody[len],511-len,"#. %s %s^n",name,g_teamNames[iteam])
}
else
{
keys |= (1<<b)
len += format(menuBody[len],511-len, g_coloredMenus ?
"%d. %s\y\R%s^n\w" : "%d. %s %s^n",++b,name,g_teamNames[iteam])
}
}
if ( g_menuOption[id] )
len += format(menuBody[len],511-len,"^n8. %L^n",id,"SLAP_WITH_DMG",g_menuSettings[id] )
else
len += format(menuBody[len],511-len,"^n8. %L^n",id,"SLAY")
if (end != g_menuPlayersNum[id]) {
format(menuBody[len],511-len,"^n9. %L...^n0. %L", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody,-1,"Slap/Slay Menu")
}
public cmdSlapMenu(id,level,cid)
{
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
g_menuOption[id] = 0
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 )
switch (get_cvar_num("amx_show_activity")) {
case 2: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_KICK_2",name,name2)
case 1: client_print(0,print_chat,"%L",LANG_PLAYER,"ADMIN_KICK_1",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, g_coloredMenus ?
"\y%L\R%d/%d^n\w^n" : "%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
if ( g_coloredMenus )
len += format(menuBody[len],511-len,"\d%d. %s^n\w",b,name)
else
len += format(menuBody[len],511-len,"#. %s^n",name)
}
else {
keys |= (1<<b)
len += format(menuBody[len],511-len,"%d. %s^n",++b,name)
}
}
if (end != g_menuPlayersNum[id]) {
format(menuBody[len],511-len,"^n9. %L...^n0. %L", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody,-1,"Kick Menu")
}
public cmdKickMenu(id,level,cid) {
if (cmd_access(id,level,cid,1))
displayKickMenu(id,g_menuPosition[id] = 0)
return PLUGIN_HANDLED
}
/* Team menu */
public actionTeamMenu(id,key) {
switch (key) {
case 7:{
g_menuOption[id]++
if( g_menuOption[id] > 4 )
g_menuOption[id] = 1
displayTeamMenu(id,g_menuPosition[id])
}
case 8: displayTeamMenu(id,++g_menuPosition[id])
case 9: displayTeamMenu(id,--g_menuPosition[id])
default: {
new player = g_menuPlayers[id][g_menuPosition[id] * 7 + key]
new authid[32],authid2[32], name[32], name2[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)
log_amx("Cmd: ^"%s<%d><%s><>^" transfer ^"%s<%d><%s><>^" (team ^"%s^")",
name,get_user_userid(id),authid, name2,get_user_userid(player),authid2, g_teamNames[g_menuOption[id]] )
switch (get_cvar_num("amx_show_activity")) {
case 2: client_print(0,print_chat,"%L",id,"ADMIN_TRANSF_2",name,name2, g_teamNames[g_menuOption[id]] )
case 1: client_print(0,print_chat,"%L",id,"ADMIN_TRANSF_1",name2, g_teamNames[g_menuOption[id]] )
}
new szCmd[2]
format(szCmd,2,"%d",g_menuOption[id])
tfc_userkill(player)
engclient_cmd(player,"jointeam" , szCmd )
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]
new start = pos * 7
if (start >= g_menuPlayersNum[id])
start = pos = g_menuPosition[id] = 0
new len = format(menuBody,511, g_coloredMenus ?
"\y%L\R%d/%d^n\w^n" : "%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 = get_user_team(i)
if ( (iteam == g_menuOption[id]) || access(i,ADMIN_IMMUNITY) ) {
++b
if ( g_coloredMenus )
len += format(menuBody[len],511-len,"\d%d. %s\R%s^n\w",b,name,g_teamNames[iteam])
else
len += format(menuBody[len],511-len,"#. %s %s^n",name,g_teamNames[iteam])
}
else {
keys |= (1<<b)
len += format(menuBody[len],511-len, g_coloredMenus ?
"%d. %s\y\R%s^n\w" : "%d. %s %s^n",++b,name,g_teamNames[iteam])
}
}
len += format(menuBody[len],511-len,"^n8. %L^n",id,"TRANSF_TO",g_teamNames[g_menuOption[id]] )
if (end != g_menuPlayersNum[id])
{
format(menuBody[len],511-len,"^n9. %L...^n0. %L", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody,-1,"Team Menu")
}
public cmdTeamMenu(id,level,cid) {
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
g_menuOption[id] = 1
displayTeamMenu(id,g_menuPosition[id] = 0)
return PLUGIN_HANDLED
}
/* Client cmds menu */
public actionClcmdMenu(id,key) {
switch (key) {
case 7:{
++g_menuOption[id]
g_menuOption[id] %= g_menuSelectNum[id]
displayClcmdMenu(id,g_menuPosition[id])
}
case 8: displayClcmdMenu(id,++g_menuPosition[id])
case 9: displayClcmdMenu(id,--g_menuPosition[id])
default: {
new player = g_menuPlayers[id][g_menuPosition[id] * 7 + key]
new flags = g_clcmdMisc[g_menuSelect[id][g_menuOption[id]]][1]
if (is_user_connected(player)) {
new command[64], authid[32], name[32], userid[32]
copy(command,63,g_clcmdCmd[g_menuSelect[id][g_menuOption[id]]])
get_user_authid(player,authid,31)
get_user_name(player,name,31)
num_to_str(get_user_userid(player),userid,31)
replace(command,63,"%userid%",userid)
replace(command,63,"%authid%",authid)
replace(command,63,"%name%",name)
if (flags & 1) {
server_cmd(command)
server_exec()
}
else if (flags & 2)
client_cmd(id,command)
else if (flags & 4)
client_cmd(player,command)
}
if (flags & 8) displayClcmdMenu(id,g_menuPosition[id])
}
}
return PLUGIN_HANDLED
}
displayClcmdMenu(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, g_coloredMenus ?
"\y%L\R%d/%d^n\w^n" : "%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
if ( g_coloredMenus )
len += format(menuBody[len],511-len,"\d%d. %s^n\w",b,name)
else
len += format(menuBody[len],511-len,"#. %s^n",name)
}
else {
keys |= (1<<b)
len += format(menuBody[len],511-len,"%d. %s^n",++b,name)
}
}
if ( g_menuSelectNum[id] )
len += format(menuBody[len],511-len,"^n8. %s^n", g_clcmdName[g_menuSelect[id][g_menuOption[id]]] )
else
len += format(menuBody[len],511-len,"^n8. %L^n",id,"NO_CMDS")
if (end != g_menuPlayersNum[id]) {
format(menuBody[len],511-len,"^n9. %L...^n0. %L", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menuBody[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menuBody,-1,"Client Cmds Menu")
}
public cmdClcmdMenu(id,level,cid) {
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED
new flags = get_user_flags(id)
g_menuSelectNum[id] = 0
for (new a = 0; a < g_clcmdNum; ++a)
if (g_clcmdMisc[a][0] & flags)
g_menuSelect[id][g_menuSelectNum[id]++] = a
g_menuOption[id] = 0
displayClcmdMenu(id,g_menuPosition[id] = 0)
return PLUGIN_HANDLED
}
load_settings( szFilename[] ) {
if ( !file_exists ( szFilename ) )
return 0
new text[256], szFlags[32], szAccess[32]
new a, pos = 0
while ( g_clcmdNum < MAX_CLCMDS && read_file (szFilename,pos++,text,255,a) ) {
if ( text[0] == ';' ) continue
if ( parse( text , g_clcmdName[g_clcmdNum] , 31 ,
g_clcmdCmd[g_clcmdNum] ,63,szFlags,31,szAccess,31 ) > 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
}
public plugin_modules()
{
require_module("tfcx")
}

676
plugins/tfc/stats.sma Executable file
View File

@ -0,0 +1,676 @@
/* AMX Mod script.
*
* (c) 2004, SidLuke
* This file is provided as is (no warranties).
*
* Plugin works with Stats Settings Plugin. Just run both of them.
* By amx_statscfg command (from Stats Settings Plugin)
* you will be able to set all settings and save them to a file.
*
* Example of usage for some options:
* amx_statscfg on SayTop15
* amx_statscfg on SayRank
*
* Accept able are also parts of name:
* amx_statscfg off say
* amx_statscfg on End
*/
#include <amxmodx>
#include <tfcx>
public EndPlayer // displays player stats at the end of map
public EndTop15 // displays top15 at the end of map
public SayStatsAll // displays players stats and rank
public SayTop15 // displays first 15. players ,cvar tfcstats_topvalue really:)
public SayRank // displays user position in rank
public SayStatsMe // displays user stats
public ShowAttackers // shows attackers
public ShowVictims // shows victims
public ShowKiller // shows killer
public KillerHp // displays killer hp to victim console and screen
public SayHP // displays information about user killer
public MultiKill
public MultiKillSound
public KnifeKill
public KnifeKillSound
public GrenadeKill
public GrenadeSuicide
public HeadShotKill
public HeadShotKillSound
public KillingStreak
public KillingStreakSound
public DoubleKill
public DoubleKillSound
public BulletDamage
public EndRoundStats
new g_streakKills[33][2]
new g_multiKills[33][2]
new Float:g_prevKill
new g_prevKillerId
new g_KillCount;
new g_userPosition[33]
new g_userState[33]
new g_userPlayers[33][32]
new g_Buffer[2048]
new g_Killers[33][4]
new Float:g_DeathStats[33]
new g_bodyParts[8][] = {
"whole body",
"head",
"chest",
"stomach",
"left arm",
"right arm",
"left leg",
"right leg"
}
new g_MultiKillMsg[7][] = {
"Multi-Kill! %s^nwith %d kills (%d hs)",
"Ultra-Kill!!! %s^nwith %d kills (%d hs)",
"%s IS ON A KILLING SPREE!!!^nwith %d kills (%d hs)",
"RAMPAGE!!! %s^nwith %d kills (%d hs)" ,
"%s IS UNSTOPPABLE!!!^nwith %d kills (%d hs)" ,
"%s IS A MONSTER!^nwith %d kills (%d hs)",
"%s IS GODLIKE!!!!^nwith %d kills (%d hs)"
}
new g_Sounds[7][] = {
"multikill",
"ultrakill",
"killingspree",
"rampage",
"unstoppable",
"monsterkill",
"godlike"
}
new g_KillingMsg[7][] = {
"%s: Multi-Kill!",
"%s: Ultra-Kill!!!",
"%s IS ON A KILLING SPREE!!!",
"%s: RAMPAGE!!!",
"%s IS UNSTOPPABLE!!!",
"%s IS A MONSTER!",
"%s IS GODLIKE!!!"
}
new g_KnifeMsg[4][] = {
"%s sliced and diced %s",
"%s pulled out knife and gutted %s",
"%s sneaks carefully behind and knifed %s",
"%s knived %s"
}
new g_HeMessages[4][] = {
"%s sends a little gift to %s",
"%s throws a small present to %s",
"%s made a precision throw to %s",
"%s got a big explosion for %s"
}
new g_SHeMessages[4][] = {
"%s detonated himself with a grenade",
"%s trys the effect of a grenade",
"%s kicked a grenade into his own ass",
"%s explodes!"
}
new g_HeadShots[7][] = {
"$kn killed $vn with a well^nplaced shot to the head!",
"$kn removed $vn's^nhead with the $wn",
"$kn turned $vn's head^ninto pudding with the $wn",
"$vn got pwned by $kn",
"$vn's head has been^nturned into red jello",
"$kn has superb aim with the $wn,^nas $vn well knows.",
"$vn's head stayed in $kn's^ncrosshairs a bit too long..."
}
new g_DoubleKillMsg[3][] = {
"Wow! $kn made a double kill !!!",
"Incredible! $kn made a triple kill !!!",
"Amazing! $kn made $kk kills at once !!!"
}
new g_DoubleKillSound[3][] = {
"doublekill",
"multikill",
"godlike"
}
public plugin_init() {
register_plugin("TFC Stats","0.20tfc","SidLuke")
register_event("30","eInterMission","a")
register_event("ResetHUD","eResetHud","b")
register_clcmd("say /hp","cmdKiller",0,"- displays info. about your killer")
register_clcmd("say /stats","cmdStats",0,"- displays others stats")
register_clcmd("say /statsme","cmdStatsMe",0,"- displays your stats")
register_clcmd("say /top15","cmdTop15",0,"- displays top 15 players")
register_clcmd("say /top10","cmdTop15",0,"- displays top 15 players") // for statsme users :)
register_clcmd("say /rank","cmdRank",0,"- displays your server stats")
register_cvar("tfcstats_topvalue","15")
register_cvar("tfcstats_maxmenupos","7")
register_cvar("tfcstats_statstime","5.0")
register_statsfwd(XMF_DAMAGE)
register_statsfwd(XMF_DEATH)
register_menucmd(register_menuid("Server Stats"),1023,"actionStatsMenu")
}
new g_addStast[] = "amx_statscfg add ^"%s^" %s"
new g_disabledMsg[] = "Server has disabled that option"
public plugin_cfg(){
server_cmd(g_addStast,"Stats at the end of map","EndPlayer")
server_cmd(g_addStast,"Top15 at the end of map","EndTop15")
server_cmd(g_addStast,"Say /stats","SayStatsAll")
server_cmd(g_addStast,"Say /top15","SayTop15")
server_cmd(g_addStast,"Say /rank","SayRank")
server_cmd(g_addStast,"Say /statsme","SayStatsMe")
server_cmd(g_addStast,"Show Attackers","ShowAttackers")
server_cmd(g_addStast,"Show Victims","ShowVictims")
server_cmd(g_addStast,"Show killer","ShowKiller")
server_cmd(g_addStast,"Show killer hp","KillerHp")
server_cmd(g_addStast,"Say /hp","SayHP")
server_cmd(g_addStast,"MultiKill","MultiKill")
server_cmd(g_addStast,"MultiKill Sound","MultiKillSound")
server_cmd(g_addStast,"Knife Kill","KnifeKill")
server_cmd(g_addStast,"Knife Kill Sound","KnifeKillSound")
server_cmd(g_addStast,"Grenade Kill","GrenadeKill")
server_cmd(g_addStast,"Grenade Suicide","GrenadeSuicide")
server_cmd(g_addStast,"HeadShot Kill","HeadShotKill")
server_cmd(g_addStast,"HeadShot Kill Sound","HeadShotKillSound")
server_cmd(g_addStast,"Killing Streak","KillingStreak")
server_cmd(g_addStast,"Killing Streak Sound","KillingStreakSound")
server_cmd(g_addStast,"Double Kill","DoubleKill")
server_cmd(g_addStast,"Double Kill Sound","DoubleKillSound")
server_cmd(g_addStast,"Bullet Damage","BulletDamage")
server_cmd(g_addStast,"End Round Stats","EndRoundStats")
}
public cmdStatsMe(id){
if ( !SayStatsMe || !isActive() ){
client_print(id,print_chat, g_disabledMsg )
return PLUGIN_HANDLED
}
displayStats(id,id)
return PLUGIN_CONTINUE
}
displayStats(id,dest) {
new name[32], stats[8], body[8]
get_user_wstats(id,0,stats,body)
new pos = format(g_Buffer,2047,"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n",
stats[0],stats[1],stats[3],stats[6],stats[5],stats[4])
new a
for( a = 1; a < TFCMAX_WEAPONS; a++) {
if (get_user_wstats(id,a,stats,body)){
if ( xmod_is_melee_wpn(a) )
stats[4] = -1;
xmod_get_wpnname(a,name,31)
pos += format(g_Buffer[pos],2047-pos,"%s shots: %d hits: %d damage: %d kills: %d deaths: %d^n",
name,stats[4],stats[5],stats[6],stats[0],stats[1])
}
}
get_user_name(id,name,31)
show_motd(dest,g_Buffer,name)
}
public cmdRank(id){
if ( !SayRank || !isActive() ){
client_print(id,print_chat, g_disabledMsg )
return PLUGIN_HANDLED
}
displayRank(id,id)
return PLUGIN_CONTINUE
}
displayRank(id,dest) {
new name[32], stats[8], body[8]
new rank_pos = get_user_stats(id,stats,body)
new pos = format(g_Buffer,2047,"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n",
stats[0],stats[1],stats[3],stats[6],stats[5],stats[4])
pos += format(g_Buffer[pos],2047-pos,"Hits:^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n^n",
g_bodyParts[1],body[1],g_bodyParts[2],body[2],g_bodyParts[3],body[3], g_bodyParts[4],body[4],
g_bodyParts[5],body[5],g_bodyParts[6],body[6],g_bodyParts[7],body[7])
format(g_Buffer[pos],2047-pos,"%s rank is %d of %d",(id==dest)?"Your":"His", rank_pos,get_statsnum())
get_user_name(id,name,31)
show_motd(dest,g_Buffer,name)
}
public cmdTop15(id) {
if ( !SayTop15 || !isActive() ){
client_print(id,print_chat, g_disabledMsg )
return PLUGIN_HANDLED
}
getTop15()
show_motd(id,g_Buffer,"Top 15")
return PLUGIN_CONTINUE
}
/* get top 15 */
getTop15(){
new stats[8], body[8], name[32]
new pos = copy(g_Buffer,2047,"# nick kills/deaths TKs hits/shots/headshots^n")
new imax = get_statsnum()
if (imax > 15) imax = 15
for(new a = 0; a < imax; ++a){
get_stats(a,stats,body,name,31)
pos += format(g_Buffer[pos],2047-pos,"%2d. %-28.27s %d/%d %d %d/%d/%d^n",a+1,name,stats[0],stats[1],stats[3],stats[5],stats[4],stats[2])
}
}
public endGameStats(){
if ( EndPlayer ){
new players[32], inum
get_players(players,inum)
for(new i = 0; i < inum; ++i){
displayStats(players[i],players[i])
}
}
else if ( EndTop15 ){
new players[32], inum
get_players(players,inum)
getTop15()
for(new i = 0; i < inum; ++i)
show_motd(players[i],g_Buffer,"Top 15")
}
}
public eInterMission()
if ( isActive() )
set_task(1.0,"endGameStats")
public cmdStats(id){
if ( !SayStatsAll || !isActive() ){
client_print(id,print_chat, g_disabledMsg )
return PLUGIN_HANDLED
}
showStatsMenu(id,g_userPosition[id]=0)
return PLUGIN_CONTINUE
}
/* build list of attackers */
getAttackers(id) {
new name[32],wpn[32], stats[8],body[8],found=0
new pos = copy(g_Buffer,2047,"Attackers:^n")
new amax = get_maxplayers()
for(new a = 1; a <= amax; ++a){
if(get_user_astats(id,a,stats,body,wpn,31)){
found = 1
if (stats[0])
format(wpn,31," -- %s",wpn)
else
wpn[0] = 0
get_user_name(a,name,31)
pos += format(g_Buffer[pos],2047-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn)
}
}
return found
}
/* build list of victims */
getVictims(id) {
new name[32],wpn[32], stats[8],body[8],found=0
new pos = copy(g_Buffer,2047,"Victims:^n")
new amax = get_maxplayers()
for(new a = 1; a <= amax; ++a){
if(get_user_vstats(id,a,stats,body,wpn,31)){
found = 1
if (stats[1])
format(wpn,31," -- %s",wpn)
else
wpn[0] = 0
get_user_name(a,name,31)
pos += format(g_Buffer[pos],2047-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn)
}
}
return found
}
/* build list of hita for AV List */
getHits(id,killer) {
new stats[8], body[8], pos = 0
g_Buffer[0] = 0
get_user_astats(id,killer,stats,body)
for(new a = 1; a < 8; ++a)
if(body[a])
pos += format(g_Buffer[pos],2047-pos,"%s: %d^n",g_bodyParts[a],body[a])
}
/* build list of hits for say hp */
getMyHits(id,killed) {
new name[32], stats[8], body[8], found = 0
get_user_name(killed,name,31)
new pos = format(g_Buffer,2047,"You hit %s in:",name)
get_user_vstats(id,killed,stats,body)
for(new a = 1; a < 8; ++a){
if(body[a]){
found = 1
pos += format(g_Buffer[pos],2047-pos," %s: %d ",g_bodyParts[a],body[a])
}
}
return found
}
public eResetHud( id )
g_Killers[ id ][0] = 0
public cmdKiller(id) {
if ( !SayHP ){
client_print(id,print_chat, g_disabledMsg )
return PLUGIN_HANDLED
}
if (g_Killers[id][0]) {
new name[32], stats[8], body[8], wpn[33], mstats[8], mbody[8]
get_user_name(g_Killers[id][0],name,31)
get_user_astats(id,g_Killers[id][0],stats,body,wpn,31)
client_print(id,print_chat,"%s killed you with %s from distance of %.2f meters", name,wpn,float(g_Killers[id][3]) * 0.0254 )
client_print(id,print_chat,"He did %d damage to you with %d hit%s and still had %dhp and %dap",
stats[6],stats[5],(stats[5]==1)?"":"s" , g_Killers[id][1],g_Killers[id][2] )
if ( get_user_vstats(id,g_Killers[id][0],mstats,mbody) ) {
client_print(id,print_chat,"You did %d damage to him with %d hit%s",mstats[6], mstats[5],(mstats[5]==1)?"":"s" )
getMyHits(id,g_Killers[id][0])
client_print(id,print_chat,g_Buffer)
}
else client_print(id,print_chat,"You did no damage to him")
}
else {
client_print(id,print_chat,"You have no killer...")
}
return PLUGIN_CONTINUE
}
public actionStatsMenu(id,key){
switch(key){
case 7: {
g_userState[id] = 1 - g_userState[id]
showStatsMenu(id,g_userPosition[id])
}
case 8: showStatsMenu(id,++g_userPosition[id])
case 9: showStatsMenu(id,--g_userPosition[id])
default:{
new option = g_userPosition[id] * get_cvar_num("tfcstats_maxmenupos") + key
new index = g_userPlayers[id][option]
if (is_user_connected(index)){
if (g_userState[id]){
displayRank(index,id)
}
else{
displayStats(index,id)
}
}
showStatsMenu(id,g_userPosition[id])
}
}
return PLUGIN_HANDLED
}
showStatsMenu(id,pos){
if (pos < 0) return PLUGIN_HANDLED
new max_menupos = get_cvar_num("tfcstats_maxmenupos")
new menu_body[512], inum, k = 0, start = pos * max_menupos
get_players(g_userPlayers[id],inum)
if (start >= inum) start = pos = g_userPosition[id] = 0
new len = format(menu_body,511,"Server Stats %d/%d^n^n",pos + 1,((inum/max_menupos)+((inum%max_menupos)?1:0)))
new name[32], end = start + max_menupos, keys = (1<<9)|(1<<7)
if (end > inum) end = inum
for(new a = start; a < end; ++a){
get_user_name(g_userPlayers[id][a],name,31)
keys |= (1<<k)
len += format(menu_body[len],511-len,"%d. %s^n",++k,name)
}
len += format(menu_body[len],511-len,"^n8. %s^n",g_userState[id] ? "Show rank" : "Show stats" )
if (end != inum){
len += format(menu_body[len],511-len,"^n9. More...^n0. %s" , pos ? "Back" : "Exit" )
keys |= (1<<8)
}
else len += format(menu_body[len],511-len,"^n0. %s" , pos ? "Back" : "Exit" )
show_menu(id,keys,menu_body)
return PLUGIN_HANDLED
}
public client_putinserver(id)
g_multiKills[id] = g_streakKills[ id ] = { 0 , 0 }
public client_damage(attacker,victim,damage,wpnindex,hitplace,TA){
if ( BulletDamage ) {
if ( attacker==victim || xmod_is_melee_wpn(wpnindex) ) return PLUGIN_CONTINUE
set_hudmessage(0, 100, 200, 0.45, 0.85, 2, 0.1, 4.0, 0.02, 0.02, 1)
show_hudmessage(attacker,"%i", damage)
set_hudmessage(200, 0, 0, 0.55, 0.85, 2, 0.1, 4.0, 0.02, 0.02, 2)
show_hudmessage(victim,"%i", damage)
}
return PLUGIN_CONTINUE
}
/* save state at death */
public client_death(killer,victim,wpnindex,hitplace,TK){
new killer_name[32]
get_user_name(killer,killer_name,31)
if ( KillingStreak || KillingStreakSound ){
g_streakKills[ victim ][ 1 ]++
g_streakKills[ victim ][ 0 ] = 0
}
new grenade = tfc_isgrenade(wpnindex)
new headshot = ( hitplace == HIT_HEAD ) ? 1:0
new selfKill = ( killer == victim ) ? 1:0
new victim_name[32]
get_user_name(victim,victim_name,31)
new Float:statstime = get_cvar_float("tfcstats_statstime")
if ( ShowVictims && getVictims(victim) ){
set_hudmessage(0,80,220,0.55,0.60,0, statstime, 12.0, 1.0, 2.0, 4)
show_hudmessage(victim,g_Buffer)
}
if ( ShowAttackers && getAttackers(victim)){
set_hudmessage(220,80,0,0.55,0.35,0, statstime, 12.0, 1.0, 2.0, 3)
show_hudmessage(victim,g_Buffer)
}
if ( selfKill && grenade && GrenadeSuicide ){
set_hudmessage(255, 100, 100, -1.0, 0.15, 1, 6.0, 6.0, 0.5, 0.15, 1)
show_hudmessage(0,g_SHeMessages[ random_num(0,3) ],victim_name)
}
if ( selfKill || TK )
return PLUGIN_CONTINUE
new vorigin[3], korigin[3]
get_user_origin(victim,vorigin)
get_user_origin(killer,korigin)
g_Killers[victim][0] = killer
g_Killers[victim][1] = get_user_health(killer)
g_Killers[victim][2] = get_user_armor(killer)
g_Killers[victim][3] = get_distance(vorigin,korigin)
g_DeathStats[victim] = get_gametime() + statstime
if ( ShowKiller && !(!get_cvar_num("tfcstats_rankbots") && (is_user_bot(killer) || is_user_bot(killer))) ){
new stats[8], body[8], wpn[33], mstats[8], mbody[8]
get_user_astats(victim,killer,stats,body,wpn,31)
get_user_vstats(victim,killer,mstats,mbody)
set_hudmessage(220,80,0,0.05,0.15,0, statstime, 12.0, 1.0, 2.0, 1)
getHits(victim,killer)
show_hudmessage(victim,"%s killed you with %s^nfrom distance of %.2f meters.^nHe did %d damage to you with %d hit(s)^nand still has %dhp and %dap.^nYou did %d damage to him with %d hit(s).^nHe hits you in:^n%s",
killer_name,wpn,float(g_Killers[victim][3]) * 0.0254, stats[6],stats[5],
g_Killers[victim][1],g_Killers[victim][2], mstats[6],mstats[5],g_Buffer )
}
if ( KillerHp ){
new kmsg[128]
format(kmsg,127,"%s still has %dhp and %d ap",killer_name,g_Killers[victim][1],g_Killers[victim][1])
client_print(victim,print_console,kmsg)
set_hudmessage(255,255,255,0.02,0.9,2, 1.5, 3.0, 0.02, 5.0, 2)
show_hudmessage(victim,kmsg)
}
if ( KillingStreak || KillingStreakSound ){
g_streakKills[ killer ][ 0 ]++
g_streakKills[ killer ][ 1 ] = 0
new a = g_streakKills[ killer ][ 0 ] - 3
if ( (a > -1) && !( a % 2 ) ) {
if ( (a >>= 1) > 6 ) a = 6
if ( KillingStreak ){
set_hudmessage(0, 100, 255, 0.05, 0.55, 2, 0.02, 6.0, 0.01, 0.1, 3)
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,g_KillingMsg[ a ], killer_name)
}
}
if ( KillingStreakSound ) client_cmd( 0 , "spk misc/%s" , g_Sounds[ a ] )
}
}
if ( MultiKill || MultiKillSound ) {
g_multiKills[killer][0]++
g_multiKills[killer][1] += headshot
new param[2]
param[0] = killer
param[1] = g_multiKills[killer][0]
set_task( 4.0 + float( param[1] ) ,"checkKills",0,param,2)
}
if ( xmod_is_melee_wpn(wpnindex) && ( KnifeKill || KnifeKillSound ) ){
if ( KnifeKill ){
set_hudmessage(255, 100, 100, -1.0, 0.15, 1, 6.0, 6.0, 0.5, 0.15, 1)
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,g_KnifeMsg[ random_num(0,3) ],killer_name,victim_name)
}
}
if ( KnifeKillSound ) client_cmd(0,"spk misc/humiliation")
}
else if ( grenade ){
if ( GrenadeKill ){
set_hudmessage(255, 100, 100, -1.0, 0.15, 1, 6.0, 6.0, 0.5, 0.15, 1)
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,g_HeMessages[ random_num(0,3)],killer_name,victim_name)
}
}
}
if ( headshot && (HeadShotKill || HeadShotKillSound) && !xmod_is_melee_wpn(wpnindex) ){
if ( HeadShotKill ){
new weapon[32], message[128]
xmod_get_wpnname(wpnindex,weapon,31)
copy( message, 127, g_HeadShots[ random_num(0,6) ] )
replace( message, 127 , "$vn", victim_name )
replace( message, 127 , "$wn", weapon )
replace( message, 127 , "$kn", killer_name )
set_hudmessage(100, 100, 255, -1.0, 0.19, 0, 6.0, 6.0, 0.5, 0.15, 1)
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,message)
}
}
if ( HeadShotKillSound ) client_cmd(0,"spk misc/headshot")
}
if ( DoubleKill || DoubleKillSound ){
new Float:nowtime = get_gametime()
if ( g_prevKill == nowtime && g_prevKillerId == killer ){
g_KillCount++
if ( DoubleKill || DoubleKillSound){
set_task(0.01,"showDoubleKill")
}
}
else g_KillCount = 1
g_prevKill = nowtime
g_prevKillerId = killer
}
return PLUGIN_CONTINUE
}
public showDoubleKill(){
new pos = g_KillCount - 2
if ( pos > 2 ) pos = 2
if ( DoubleKill ) {
new name[32],message[128]
get_user_name(g_prevKillerId,name,31)
copy( message, 127, g_DoubleKillMsg[pos] )
replace( message, 127 , "$kn", name )
if ( pos == 2 ){
new kills[3]
num_to_str(g_KillCount,kills,2)
replace( message, 127 , "$kk", kills )
}
set_hudmessage(65, 102, 158, -1.0, 0.25, 0, 6.0, 6.0, 0.5, 0.15, 3)
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,message)
}
}
if ( DoubleKillSound ) {
client_cmd(0,"spk misc/%s",g_DoubleKillSound[pos])
}
return PLUGIN_CONTINUE
}
public checkKills(param[]){
new id = param[0]
new a = param[1]
if (a == g_multiKills[id][0]){
a -= 3
if ( a > -1 ){
if ( MultiKill ) {
new name[32]
get_user_name(id,name,31)
set_hudmessage(255, 0, 100, 0.05, 0.65, 2, 0.02, 6.0, 0.01, 0.1, 2)
if ( a > 6 ) a = 6
for (new i=1;i<=get_maxplayers();i++){
if ( g_Killers[i][0] && g_DeathStats[i] > get_gametime() )
continue
show_hudmessage(i,g_MultiKillMsg[a],name,g_multiKills[id][0],g_multiKills[id][1])
}
}
if ( MultiKillSound ) client_cmd(0,"spk misc/%s",g_Sounds[a])
}
g_multiKills[id] = { 0,0 }
}
}
isActive(){
if ( get_cvar_num("tfcstats_pause") )
return 0
return 1
}
public plugin_modules()
{
require_module("tfcx")
}

87
plugins/tfc/stats_logging.sma Executable file
View File

@ -0,0 +1,87 @@
/* AMX Mod X
* Stats Logging Plugin
*
* by the AMX Mod X Development Team
* originally developed by JustinHoMi
*
* 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 <amxmodx>
#include <tfcx>
new g_pingSum[33]
new g_pingCount[33]
public plugin_init()
register_plugin("TFC Stats Logging","0.20tfc","AMXX Dev Team")
public client_disconnect(id) {
if ( is_user_bot( id ) ) return PLUGIN_CONTINUE
remove_task( id )
new szTeam[16],szName[32],szAuthid[32], iStats[8], iHits[8], szWeapon[24]
new iUserid = get_user_userid( id )
get_user_team(id, szTeam, 15 )
get_user_name(id, szName ,31 )
get_user_authid(id, szAuthid , 31 )
for(new i = 1 ; i < TFCMAX_WEAPONS ; ++i ) {
if( get_user_wstats( id , i ,iStats , iHits ) ) {
xmod_get_wpnlogname( i , szWeapon , 23 )
log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^")",
szName,iUserid,szAuthid,szTeam,szWeapon,iStats[4],iStats[5],iStats[0], iStats[2],iStats[3],iStats[6],iStats[1])
log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")",
szName,iUserid,szAuthid,szTeam,szWeapon,iHits[1],iHits[2],iHits[3], iHits[4],iHits[5],iHits[6],iHits[7])
}
}
new iTime = get_user_time( id , 1 )
log_message("^"%s<%d><%s><%s>^" triggered ^"time^" (time ^"%d:%02d^")",
szName,iUserid,szAuthid,szTeam, (iTime / 60), (iTime % 60) )
log_message("^"%s<%d><%s><%s>^" triggered ^"latency^" (ping ^"%d^")",
szName,iUserid,szAuthid,szTeam, (g_pingSum[id] / ( g_pingCount[id] ? g_pingCount[id] : 1 ) ) )
return PLUGIN_CONTINUE
}
public client_putinserver(id) {
if ( !is_user_bot( id ) ){
g_pingSum[ id ] = g_pingCount[ id ] = 0
set_task( 19.5 , "getPing" , id , "" , 0 , "b" )
}
}
public getPing( id ) {
new iPing, iLoss
get_user_ping( id , iPing, iLoss)
g_pingSum[ id ] += iPing
++g_pingCount[ id ]
}
public plugin_modules()
{
require_module("tfcx")
}

240
plugins/tfc/statscfg.sma Executable file
View File

@ -0,0 +1,240 @@
/* AMX Mod X
* Stats Configuration 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 <amxmodx>
#include <amxmisc>
#define MAX_MENU_DATA 64
new g_menuData[MAX_MENU_DATA][32]
new g_menuDataVar[MAX_MENU_DATA][32]
new g_menuDataId[MAX_MENU_DATA]
new g_menuDataNum
new g_menuPosition[33]
new g_fileToSave[64]
new bool:g_modified
public plugin_precache() {
register_clcmd("amx_statscfgmenu","cmdCfgMenu",ADMIN_CFG,"- displays stats configuration menu")
register_dictionary("statscfg.txt")
register_dictionary("common.txt")
register_concmd("amx_statscfg","cmdCfg",ADMIN_CFG,"- displays help for stats configuration")
}
public plugin_init() {
register_plugin("Stats Configuration",AMXX_VERSION_STR,"AMXX Dev Team")
register_menucmd(register_menuid("Stats Configuration"),1023,"actionCfgMenu")
get_configsdir(g_fileToSave, 63)
format(g_fileToSave, 63, "%s/stats.ini", g_fileToSave)
loadSettings(g_fileToSave)
}
public cmdCfg( id,level,cid ) {
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED
new cmds[32]
read_argv(1,cmds,31)
new option = equali(cmds, "on" ) ? 1 : 0
if ( !option ) option = equali(cmds, "off" ) ? 2 : 0
if ( read_argc() > 2 && option ) {
new var[32], enabled = 0
read_argv( 2 , var , 31 )
for ( new a = 0; a < g_menuDataNum; ++a ) {
if ( containi( g_menuDataVar[ a ] , var ) != -1 ) {
g_modified = true
++enabled
if ( option == 1 ) {
set_xvar_num( g_menuDataId[a] , 1 )
console_print(id,"Enabled %s" , g_menuData[a] )
}
else {
set_xvar_num( g_menuDataId[a] , 0 )
console_print(id,"Disabled %s" , g_menuData[a] )
}
}
}
if ( enabled )
console_print(id,"%L", id, "TOTAL_NUM", enabled )
else
console_print(id,"%L",id,"NO_OPTION",var )
}
else if ( equali(cmds, "save" ) ) {
if ( saveSettings( g_fileToSave ) ){
g_modified = false
console_print(id,"%L",id,"CONF_SAVED")
}
else
console_print(id,"%L",id,"CONF_FAILED")
}
else if ( equali(cmds, "load" ) ) {
if ( loadSettings( g_fileToSave ) ){
g_modified = false
console_print(id,"%L",id,"CONF_LOADED")
}
else
console_print(id,"%L",id,"CONF_FAIL_LOAD")
}
else if ( equali(cmds, "list" ) ) {
new arg1[8]
new start = read_argv(2,arg1,7) ? str_to_num(arg1) : 1
if (--start < 0) start = 0
if (start >= g_menuDataNum) start = g_menuDataNum - 1
new end = start + 10
if (end > g_menuDataNum) end = g_menuDataNum
new lName[16],lVariable[16],lStatus[16]
format(lName,15,"%L",id,"NAME")
format(lVariable,15,"%L",id,"VARIABLE")
format(lStatus,15,"%L",id,"STATUS")
console_print(id, "^n----- %L: -----",id,"STATS_CONF")
console_print(id, " %-29.28s %-24.23s %-9.8s",lName,lVariable,lStatus)
if ( start != -1 ) {
new lOnOff[16]
for (new a = start; a < end; ++a) {
format(lOnOff,15,"%L",id,get_xvar_num( g_menuDataId[ a ] ) ? "ON" : "OFF")
console_print(id, "%3d: %-29.28s %-24.23s %-9.8s",a + 1,
g_menuData[a], g_menuDataVar[a], lOnOff)
}
}
console_print(id,"----- %L -----",id,"ENTRIES_OF",start+1,end,g_menuDataNum)
if (end < g_menuDataNum)
console_print(id,"----- %L -----",id,"USE_MORE",end+1)
else
console_print(id,"----- %L -----",id,"USE_BEGIN")
}
else if ( equali(cmds, "add" ) && read_argc() > 3 ) {
if ( g_menuDataNum < MAX_MENU_DATA ) {
read_argv(2, g_menuData[g_menuDataNum] , 31 )
read_argv(3, g_menuDataVar[g_menuDataNum] , 31 )
g_menuDataId[g_menuDataNum] = get_xvar_id( g_menuDataVar[g_menuDataNum] )
++g_menuDataNum
}
else console_print(id, "%L",id,"CANT_ADD")
}
else {
console_print(id,"%L",id,"COM_USAGE")
console_print(id,"%L",id,"COM_COM")
console_print(id,"%L",id,"COM_ON")
console_print(id,"%L",id,"COM_OFF")
console_print(id,"%L",id,"COM_SAVE")
console_print(id,"%L",id,"COM_LOAD")
console_print(id,"%L",id,"COM_LIST")
console_print(id,"%L",id,"COM_ADD")
}
return PLUGIN_HANDLED
}
public cmdCfgMenu(id,level,cid) {
if (cmd_access(id,level,cid,1))
displayCfgMenu(id,g_menuPosition[id] = 0)
return PLUGIN_HANDLED
}
displayCfgMenu(id,pos) {
if (pos < 0) return
new menu_body[512], start = pos * 7
if (start >= g_menuDataNum) start = pos = g_menuPosition[id] = 0
new len = format(menu_body,511,"%L %d/%d^n^n",
id,"STATS_CONF",pos + 1,((g_menuDataNum/7)+((g_menuDataNum%7)?1:0)))
new end = start + 7, keys = MENU_KEY_0|MENU_KEY_8, k = 0
if (end > g_menuDataNum) end = g_menuDataNum
for (new a = start; a < end; ++a) {
keys |= (1<<k)
len += format(menu_body[len],511-len,"%d. %s %L^n",++k,
g_menuData[a], id, get_xvar_num( g_menuDataId[ a ] ) ? "ON" : "OFF" )
}
if ( g_menuDataNum == 0 )
len += format(menu_body[len],511-len,"%L ",id,"NO_STATS")
len += format(menu_body[len],511-len,"^n8. %L %s^n",id,"SAVE_CONF",g_modified ? "*" : "")
if (end != g_menuDataNum) {
format(menu_body[len],511-len,"^n9. %L...^n0. %s", id, "MORE", id, pos ? "BACK" : "EXIT")
keys |= MENU_KEY_9
}
else format(menu_body[len],511-len,"^n0. %L", id, pos ? "BACK" : "EXIT")
show_menu(id,keys,menu_body,-1,"Stats Configuration")
}
public actionCfgMenu(id,key) {
switch(key) {
case 7: {
if (saveSettings(g_fileToSave)) {
g_modified = false
client_print(id,print_chat,"* %L",id,"CONF_SAVED")
}
else
client_print(id,print_chat,"* %L",id,"CONF_FAILED")
displayCfgMenu(id,g_menuPosition[id])
}
case 8: displayCfgMenu(id,++g_menuPosition[id])
case 9: displayCfgMenu(id,--g_menuPosition[id])
default: {
g_modified = true
new a = g_menuPosition[id] * 7 + key
set_xvar_num( g_menuDataId[ a ] , 1 - get_xvar_num( g_menuDataId[ a ] ) )
displayCfgMenu( id , g_menuPosition[ id ] )
}
}
return PLUGIN_HANDLED
}
saveSettings(filename[]) {
if (file_exists(filename))
delete_file(filename)
if (!write_file(filename,";Generated by Stats Configuration Plugin. Do not modify!^n;Variable Description"))
return 0
new text[256]
for(new a = 0; a < g_menuDataNum; ++a){
if ( get_xvar_num( g_menuDataId[ a ] ) ) {
format(text,255,"%-24.23s ;%s",g_menuDataVar[a],g_menuData[a])
write_file(filename,text)
}
}
return 1
}
loadSettings(filename[]) {
if (!file_exists(filename))
return 0
new text[256], name[32]
new len, pos = 0, xid
while (read_file(filename,pos++,text,255,len)) {
if ( text[0] == ';' ) continue // line is a comment
parse( text , name , 31 )
if ( ( xid = get_xvar_id( name ) ) != -1 )
set_xvar_num( xid , 1 )
}
return 1
}

29
plugins/tfc/statssounds.sma Executable file
View File

@ -0,0 +1,29 @@
/*
* Plugin for sounds precache
*/
#include <amxmodx>
public plugin_precache(){
precache_sound( "misc/impressive.wav")
precache_sound( "misc/headshot.wav")
precache_sound( "misc/multikill.wav")
precache_sound( "misc/doublekill.wav")
precache_sound( "misc/godlike.wav")
precache_sound( "misc/ultrakill.wav")
precache_sound( "misc/killingspree.wav")
precache_sound( "misc/rampage.wav")
precache_sound( "misc/unstoppable.wav")
precache_sound( "misc/monsterkill.wav")
precache_sound( "misc/humiliation.wav")
precache_sound( "misc/takenlead.wav" )
precache_sound( "misc/tiedlead.wav" )
precache_sound( "misc/lostlead.wav" )
return PLUGIN_CONTINUE
}
public plugin_init() {
register_plugin("TFC Sounds Precache","0.20tfc","SidLuke")
}

25
plugins/tfc/tfcstats.sma Executable file
View File

@ -0,0 +1,25 @@
/* Get Score for TFC STATS.
*
* (c) 2004, SidLuke
* This file is provided as is (no warranties).
*
* Function calculates position in rank.
*
* Stats:
* 0 - kills
* 1 - deaths
* 2 - headshots
* 3 - teamkilling
* 4 - shots
* 5 - hits
* 6 - damage
*
* File location: $moddir/addons/amx
*/
#include <amxmodx>
public get_score(stats[8],body[8])
{
return stats[0] - stats[1] /* kills - deaths */
}