admin.sma
Код за потвърждение: Избери целия код
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Admin Base Plugin
//
// Uncomment for SQL version
// #define USING_SQL
#include <amxmodx>
#include <amxmisc>
#if defined USING_SQL
#include <sqlx>
#endif
//new Vector:AdminList;
new AdminCount;
new PLUGINNAME[] = "AMX Mod X"
#define ADMIN_LOOKUP (1<<0)
#define ADMIN_NORMAL (1<<1)
#define ADMIN_STEAM (1<<2)
#define ADMIN_IPADDR (1<<3)
#define ADMIN_NAME (1<<4)
new bool:g_CaseSensitiveName[MAX_PLAYERS + 1];
// pcvars
new amx_mode;
new amx_password_field;
new amx_default_access;
public plugin_init()
{
#if defined USING_SQL
register_plugin("Admin Base (SQL)", AMXX_VERSION_STR, "AMXX Dev Team")
#else
register_plugin("Admin Base", AMXX_VERSION_STR, "AMXX Dev Team")
#endif
register_dictionary("admin.txt")
register_dictionary("common.txt")
amx_mode=register_cvar("amx_mode", "1", FCVAR_PROTECTED)
amx_password_field=register_cvar("amx_password_field", "_pw", FCVAR_PROTECTED)
amx_default_access=register_cvar("amx_default_access", "", FCVAR_PROTECTED)
register_cvar("amx_vote_ratio", "0.02")
register_cvar("amx_vote_time", "10")
register_cvar("amx_vote_answers", "1")
register_cvar("amx_vote_delay", "60")
register_cvar("amx_last_voting", "0")
register_cvar("amx_show_activity", "2", FCVAR_PROTECTED)
register_cvar("amx_votekick_ratio", "0.40")
register_cvar("amx_voteban_ratio", "0.40")
register_cvar("amx_votemap_ratio", "0.40")
set_cvar_float("amx_last_voting", 0.0)
#if defined USING_SQL
register_srvcmd("amx_sqladmins", "adminSql")
register_cvar("amx_sql_table", "admins", FCVAR_PROTECTED)
#endif
register_cvar("amx_sql_host", "127.0.0.1", FCVAR_PROTECTED)
register_cvar("amx_sql_user", "root", FCVAR_PROTECTED)
register_cvar("amx_sql_pass", "", FCVAR_PROTECTED)
register_cvar("amx_sql_db", "amx", FCVAR_PROTECTED)
register_cvar("amx_sql_type", "mysql", FCVAR_PROTECTED)
register_cvar("amx_sql_timeout", "60", FCVAR_PROTECTED)
register_concmd("amx_reloadadmins", "cmdReload", ADMIN_CFG)
register_concmd("amx_addadmin", "addadminfn", ADMIN_RCON, "<playername|auth> <accessflags> [password] [authtype] - add specified player as an admin to users.ini")
remove_user_flags(0, read_flags("z")) // Remove 'user' flag from server rights
new configsDir[64]
get_configsdir(configsDir, charsmax(configsDir))
server_cmd("exec %s/sql.cfg", configsDir)
// Create a vector of 5 cells to store the info.
//AdminList=vector_create(5);
#if defined USING_SQL
server_cmd("amx_sqladmins")
#else
format(configsDir, 63, "%s/users.ini", configsDir)
loadSettings(configsDir) // Load admins accounts
#endif
}
public client_connect(id)
{
g_CaseSensitiveName[id] = false;
}
public addadminfn(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new idtype = ADMIN_STEAM | ADMIN_LOOKUP
if (read_argc() >= 5)
{
new t_arg[16]
read_argv(4, t_arg, charsmax(t_arg))
if (equali(t_arg, "steam") || equali(t_arg, "steamid") || equali(t_arg, "auth"))
{
idtype = ADMIN_STEAM
}
else if (equali(t_arg, "ip"))
{
idtype = ADMIN_IPADDR
}
else if (equali(t_arg, "name") || equali(t_arg, "nick"))
{
idtype = ADMIN_NAME
if (equali(t_arg, "name"))
idtype |= ADMIN_LOOKUP
} else {
console_print(id, "[%s] Unknown id type ^"%s^", use one of: steamid, ip, name", PLUGINNAME, t_arg)
return PLUGIN_HANDLED
}
}
new arg[33]
read_argv(1, arg, charsmax(arg))
new player = -1
if (idtype & ADMIN_STEAM)
{
if (containi(arg, "STEAM_0:") == -1)
{
idtype |= ADMIN_LOOKUP
player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS)
} else {
new _steamid[44]
static _players[MAX_PLAYERS], _num, _pv
get_players(_players, _num)
for (new _i=0; _i<_num; _i++)
{
_pv = _players[_i]
get_user_authid(_pv, _steamid, charsmax(_steamid))
if (!_steamid[0])
continue
if (equal(_steamid, arg))
{
player = _pv
break
}
}
if (player < 1)
{
idtype &= ~ADMIN_LOOKUP
}
}
}
else if (idtype & ADMIN_NAME)
{
player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS)
if (player)
idtype |= ADMIN_LOOKUP
else
idtype &= ~ADMIN_LOOKUP
}
else if (idtype & ADMIN_IPADDR)
{
new len = strlen(arg)
new dots, chars
for (new i = 0; i < len; i++)
{
if (arg[i] == '.')
{
if (!chars || chars > 3)
break
if (++dots > 3)
break
chars = 0
} else {
chars++
}
if (dots != 3 || !chars || chars > 3)
{
idtype |= ADMIN_LOOKUP
player = find_player("dh", arg)
}
}
}
if (idtype & ADMIN_LOOKUP && !player)
{
console_print(id, "%L", id, "CL_NOT_FOUND")
return PLUGIN_HANDLED
}
new flags[64]
read_argv(2, flags, charsmax(flags))
new password[64]
if (read_argc() >= 4) {
read_argv(3, password, charsmax(password))
}
new auth[33]
new Comment[MAX_NAME_LENGTH]; // name of player to pass to comment field
if (idtype & ADMIN_LOOKUP)
{
get_user_name(player, Comment, charsmax(Comment))
if (idtype & ADMIN_STEAM)
{
get_user_authid(player, auth, charsmax(auth))
}
else if (idtype & ADMIN_IPADDR)
{
get_user_ip(player, auth, charsmax(auth), 1)
}
else if (idtype & ADMIN_NAME)
{
get_user_name(player, auth, charsmax(auth))
}
} else {
copy(auth, charsmax(auth), arg)
}
new type[16], len
if (idtype & ADMIN_STEAM)
len += format(type[len], charsmax(type) - len, "c")
else if (idtype & ADMIN_IPADDR)
len += format(type[len], charsmax(type) - len, "d")
if (strlen(password) > 0)
len += format(type[len], charsmax(type) - len, "a")
else
len += format(type[len], charsmax(type) - len, "e")
AddAdmin(id, auth, flags, password, type, Comment)
cmdReload(id, ADMIN_CFG, 0)
if (player > 0)
{
new name[MAX_NAME_LENGTH]
get_user_info(player, "name", name, charsmax(name))
accessUser(player, name)
}
return PLUGIN_HANDLED
}
AddAdmin(id, auth[], accessflags[], password[], flags[], comment[]="")
{
#if defined USING_SQL
new error[128], errno
new Handle:info = SQL_MakeStdTuple()
new Handle:sql = SQL_Connect(info, errno, error, charsmax(error))
if (sql == Empty_Handle)
{
server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error)
//backup to users.ini
#endif
// Make sure that the users.ini file exists.
new configsDir[64]
get_configsdir(configsDir, charsmax(configsDir))
format(configsDir, charsmax(configsDir), "%s/users.ini", configsDir)
if (!file_exists(configsDir))
{
console_print(id, "[%s] File ^"%s^" doesn't exist.", PLUGINNAME, configsDir)
return
}
// Make sure steamid isn't already in file.
new line = 0, textline[256], len
const SIZE = 63
new line_steamid[SIZE + 1], line_password[SIZE + 1], line_accessflags[SIZE + 1], line_flags[SIZE + 1], parsedParams
// <name|ip|steamid> <password> <access flags> <account flags>
while ((line = read_file(configsDir, line, textline, charsmax(textline), len)))
{
if (len == 0 || equal(textline, ";", 1))
continue // comment line
parsedParams = parse(textline, line_steamid, SIZE, line_password, SIZE, line_accessflags, SIZE, line_flags, SIZE)
if (parsedParams != 4)
continue // Send warning/error?
if (containi(line_flags, flags) != -1 && equal(line_steamid, auth))
{
console_print(id, "[%s] %s already exists!", PLUGINNAME, auth)
return
}
}
// If we came here, steamid doesn't exist in users.ini. Add it.
new linetoadd[512]
if (comment[0]==0)
{
formatex(linetoadd, charsmax(linetoadd), "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
}
else
{
formatex(linetoadd, charsmax(linetoadd), "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^" ; %s", auth, password, accessflags, flags, comment)
}
console_print(id, "Adding:^n%s", linetoadd)
if (!write_file(configsDir, linetoadd))
console_print(id, "[%s] Failed writing to %s!", PLUGINNAME, configsDir)
#if defined USING_SQL
}
new table[32]
get_cvar_string("amx_sql_table", table, charsmax(table))
new Handle:query = SQL_PrepareQuery(sql, "SELECT * FROM `%s` WHERE (`auth` = '%s')", table, auth)
if (!SQL_Execute(query))
{
SQL_QueryError(query, error, charsmax(error))
server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
} else if (SQL_NumResults(query)) {
console_print(id, "[%s] %s already exists!", PLUGINNAME, auth)
} else {
console_print(id, "Adding to database:^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
SQL_QueryAndIgnore(sql, "REPLACE INTO `%s` (`auth`, `password`, `access`, `flags`) VALUES ('%s', '%s', '%s', '%s')", table, auth, password, accessflags, flags)
}
SQL_FreeHandle(query)
SQL_FreeHandle(sql)
SQL_FreeHandle(info)
#endif
}
loadSettings(szFilename[])
{
new File=fopen(szFilename,"r");
if (File)
{
new Text[512];
new Flags[32];
new Access[32]
new AuthData[44];
new Password[32];
while (!feof(File))
{
fgets(File, Text, charsmax(Text));
trim(Text);
// comment
if (Text[0]==';')
{
continue;
}
Flags[0]=0;
Access[0]=0;
AuthData[0]=0;
Password[0]=0;
// not enough parameters
if (parse(Text,AuthData,charsmax(AuthData),Password,charsmax(Password),Access,charsmax(Access),Flags,charsmax(Flags)) < 2)
{
continue;
}
admins_push(AuthData,Password,read_flags(Access),read_flags(Flags));
AdminCount++;
}
fclose(File);
}
if (AdminCount == 1)
{
server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMIN");
}
else
{
server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount);
}
return 1;
}
#if defined USING_SQL
public adminSql()
{
new table[32], error[128], type[12], errno
new Handle:info = SQL_MakeStdTuple()
new Handle:sql = SQL_Connect(info, errno, error, charsmax(error))
get_cvar_string("amx_sql_table", table, charsmax(table))
SQL_GetAffinity(type, charsmax(type))
if (sql == Empty_Handle)
{
server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error)
//backup to users.ini
new configsDir[64]
get_configsdir(configsDir, charsmax(configsDir))
format(configsDir, charsmax(configsDir), "%s/users.ini", configsDir)
loadSettings(configsDir) // Load admins accounts
return PLUGIN_HANDLED
}
new Handle:query
if (equali(type, "sqlite"))
{
if (!sqlite_TableExists(sql, table))
{
SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( auth TEXT NOT NULL DEFAULT '', password TEXT NOT NULL DEFAULT '', access TEXT NOT NULL DEFAULT '', flags TEXT NOT NULL DEFAULT '' )", table)
}
query = SQL_PrepareQuery(sql, "SELECT auth, password, access, flags FROM %s", table)
} else {
SQL_QueryAndIgnore(sql, "CREATE TABLE IF NOT EXISTS `%s` ( `auth` VARCHAR( 32 ) NOT NULL, `password` VARCHAR( 32 ) NOT NULL, `access` VARCHAR( 32 ) NOT NULL, `flags` VARCHAR( 32 ) NOT NULL ) COMMENT = 'AMX Mod X Admins'", table)
query = SQL_PrepareQuery(sql,"SELECT `auth`,`password`,`access`,`flags` FROM `%s`", table)
}
if (!SQL_Execute(query))
{
SQL_QueryError(query, error, charsmax(error))
server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
} else if (!SQL_NumResults(query)) {
server_print("[AMXX] %L", LANG_SERVER, "NO_ADMINS")
} else {
AdminCount = 0
/** do this incase people change the query order and forget to modify below */
new qcolAuth = SQL_FieldNameToNum(query, "auth")
new qcolPass = SQL_FieldNameToNum(query, "password")
new qcolAccess = SQL_FieldNameToNum(query, "access")
new qcolFlags = SQL_FieldNameToNum(query, "flags")
new AuthData[44];
new Password[44];
new Access[32];
new Flags[32];
while (SQL_MoreResults(query))
{
SQL_ReadResult(query, qcolAuth, AuthData, charsmax(AuthData));
SQL_ReadResult(query, qcolPass, Password, charsmax(Password));
SQL_ReadResult(query, qcolAccess, Access, charsmax(Access));
SQL_ReadResult(query, qcolFlags, Flags, charsmax(Flags));
admins_push(AuthData,Password,read_flags(Access),read_flags(Flags));
++AdminCount;
SQL_NextRow(query)
}
if (AdminCount == 1)
{
server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN")
}
else
{
server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount)
}
SQL_FreeHandle(query)
SQL_FreeHandle(sql)
SQL_FreeHandle(info)
}
return PLUGIN_HANDLED
}
#endif
public cmdReload(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
//strip original flags (patch submitted by mrhunt)
remove_user_flags(0, read_flags("z"))
admins_flush();
#if !defined USING_SQL
new filename[128]
get_configsdir(filename, charsmax(filename))
format(filename, charsmax(filename), "%s/users.ini", filename)
AdminCount = 0;
loadSettings(filename); // Re-Load admins accounts
if (id != 0)
{
if (AdminCount == 1)
{
console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMIN");
}
else
{
console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount);
}
}
#else
AdminCount = 0
adminSql()
if (id != 0)
{
if (AdminCount == 1)
console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN")
else
console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount)
}
#endif
new players[MAX_PLAYERS], num, pv
new name[MAX_NAME_LENGTH]
get_players(players, num)
for (new i=0; i<num; i++)
{
pv = players[i]
get_user_name(pv, name, charsmax(name))
accessUser(pv, name)
}
return PLUGIN_HANDLED
}
getAccess(id, name[], authid[], ip[], password[])
{
new index = -1
new result = 0
static Count;
static Flags;
static Access;
static AuthData[44];
static Password[32];
g_CaseSensitiveName[id] = false;
Count=admins_num();
for (new i = 0; i < Count; ++i)
{
Flags=admins_lookup(i,AdminProp_Flags);
admins_lookup(i,AdminProp_Auth,AuthData,charsmax(AuthData));
if (Flags & FLAG_AUTHID)
{
if (equal(authid, AuthData))
{
index = i
break
}
}
else if (Flags & FLAG_IP)
{
new c = strlen(AuthData)
if (AuthData[c - 1] == '.') /* check if this is not a xxx.xxx. format */
{
if (equal(AuthData, ip, c))
{
index = i
break
}
} /* in other case an IP must just match */
else if (equal(ip, AuthData))
{
index = i
break
}
}
else
{
if (Flags & FLAG_CASE_SENSITIVE)
{
if (Flags & FLAG_TAG)
{
if (contain(name, AuthData) != -1)
{
index = i
g_CaseSensitiveName[id] = true
break
}
}
else if (equal(name, AuthData))
{
index = i
g_CaseSensitiveName[id] = true
break
}
}
else
{
if (Flags & FLAG_TAG)
{
if (containi(name, AuthData) != -1)
{
index = i
break
}
}
else if (equali(name, AuthData))
{
index = i
break
}
}
}
}
if (index != -1)
{
Access=admins_lookup(index,AdminProp_Access);
if (Flags & FLAG_NOPASS)
{
result |= 8
new sflags[32]
get_flags(Access, sflags, charsmax(sflags))
set_user_flags(id, Access)
log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip)
}
else
{
admins_lookup(index,AdminProp_Password,Password,charsmax(Password));
if (equal(password, Password))
{
result |= 12
set_user_flags(id, Access)
new sflags[32]
get_flags(Access, sflags, charsmax(sflags))
log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip)
}
else
{
result |= 1
if (Flags & FLAG_KICK)
{
result |= 2
log_amx("Login: ^"%s<%d><%s><>^" kicked due to invalid password (account ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, ip)
}
}
}
}
else if (get_pcvar_float(amx_mode) == 2.0)
{
result |= 2
}
else
{
new defaccess[32]
get_pcvar_string(amx_default_access, defaccess, charsmax(defaccess))
if (!strlen(defaccess))
{
copy(defaccess, charsmax(defaccess), "z")
}
new idefaccess = read_flags(defaccess)
if (idefaccess)
{
result |= 8
set_user_flags(id, idefaccess)
}
}
return result
}
accessUser(id, name[] = "")
{
remove_user_flags(id)
new userip[32], userauthid[32], password[32], passfield[32], username[MAX_NAME_LENGTH]
get_user_ip(id, userip, charsmax(userip), 1)
get_user_authid(id, userauthid, charsmax(userauthid))
if (name[0])
{
copy(username, charsmax(username), name)
}
else
{
get_user_name(id, username, charsmax(username))
}
get_pcvar_string(amx_password_field, passfield, charsmax(passfield))
get_user_info(id, passfield, password, charsmax(password))
new result = getAccess(id, username, userauthid, userip, password)
if (result & 1)
{
engclient_print(id, engprint_console, "* %L", id, "INV_PAS")
}
if (result & 2)
{
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "NO_ENTRY")
return PLUGIN_HANDLED
}
if (result & 4)
{
engclient_print(id, engprint_console, "* %L", id, "PAS_ACC")
}
if (result & 8)
{
engclient_print(id, engprint_console, "* %L", id, "PRIV_SET")
}
return PLUGIN_CONTINUE
}
public client_infochanged(id)
{
if (!is_user_connected(id) || !get_pcvar_num(amx_mode))
{
return PLUGIN_CONTINUE
}
new newname[MAX_NAME_LENGTH], oldname[MAX_NAME_LENGTH]
get_user_name(id, oldname, charsmax(oldname))
get_user_info(id, "name", newname, charsmax(newname))
if (g_CaseSensitiveName[id])
{
if (!equal(newname, oldname))
{
accessUser(id, newname)
}
}
else
{
if (!equali(newname, oldname))
{
accessUser(id, newname)
}
}
return PLUGIN_CONTINUE
}
public client_authorized(id)
return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE
public client_putinserver(id)
{
if (!is_dedicated_server() && id == 1)
return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE
return PLUGIN_CONTINUE
}
Код за потвърждение: Избери целия код
/* AMX Mod X
* Admin Commands 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>
// This is not a dynamic array because it would be bad for 24/7 map servers.
#define OLD_CONNECTION_QUEUE 10
new g_pauseCon
new Float:g_pausAble
new bool:g_Paused
new bool:g_PauseAllowed = false
new g_addCvar[] = "amx_cvar add %s"
new pausable;
new rcon_password;
// Old connection queue
new g_Names[OLD_CONNECTION_QUEUE][32];
new g_SteamIDs[OLD_CONNECTION_QUEUE][32];
new g_IPs[OLD_CONNECTION_QUEUE][32];
new g_Access[OLD_CONNECTION_QUEUE];
new g_Tracker;
new g_Size;
new log_kick
new log_slap
new log_slay
new log_cvar
new log_rcon
new log_leave
new log_map
stock InsertInfo(id)
{
// Scan to see if this entry is the last entry in the list
// If it is, then update the name and access
// If it is not, then insert it again.
if (g_Size > 0)
{
new ip[32]
new auth[32];
get_user_authid(id, auth, charsmax(auth));
get_user_ip(id, ip, charsmax(ip), 1/*no port*/);
new last = 0;
if (g_Size < sizeof(g_SteamIDs))
{
last = g_Size - 1;
}
else
{
last = g_Tracker - 1;
if (last < 0)
{
last = g_Size - 1;
}
}
if (equal(auth, g_SteamIDs[last]) &&
equal(ip, g_IPs[last])) // need to check ip too, or all the nosteams will while it doesn't work with their illegitimate server
{
get_user_name(id, g_Names[last], charsmax(g_Names[]));
g_Access[last] = get_user_flags(id);
return;
}
}
// Need to insert the entry
new target = 0; // the slot to save the info at
// Queue is not yet full
if (g_Size < sizeof(g_SteamIDs))
{
target = g_Size;
++g_Size;
}
else
{
target = g_Tracker;
++g_Tracker;
// If we reached the end of the array, then move to the front
if (g_Tracker == sizeof(g_SteamIDs))
{
g_Tracker = 0;
}
}
get_user_authid(id, g_SteamIDs[target], charsmax(g_SteamIDs[]));
get_user_name(id, g_Names[target], charsmax(g_Names[]));
get_user_ip(id, g_IPs[target], charsmax(g_IPs[]), 1/*no port*/);
g_Access[target] = get_user_flags(id);
}
stock GetInfo(i, name[], namesize, auth[], authsize, ip[], ipsize, &access)
{
if (i >= g_Size)
{
abort(AMX_ERR_NATIVE, "GetInfo: Out of bounds (%d:%d)", i, g_Size);
}
new target = (g_Tracker + i) % sizeof(g_SteamIDs);
copy(name, namesize, g_Names[target]);
copy(auth, authsize, g_SteamIDs[target]);
copy(ip, ipsize, g_IPs[target]);
access = g_Access[target];
}
public client_disconnect(id)
{
if (!is_user_bot(id))
{
InsertInfo(id);
}
}
public plugin_init()
{
register_plugin("Admin Commands", AMXX_VERSION_STR, "AMXX Dev Team")
register_dictionary("admincmd.txt")
register_dictionary("common.txt")
register_dictionary("adminhelp.txt")
register_concmd("amx_kick", "cmdKick", ADMIN_KICK, "<name or #userid> [reason]")
register_concmd("amx_ban", "cmdBan", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
register_concmd("amx_banip", "cmdBanIP", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
register_concmd("amx_addban", "cmdAddBan", ADMIN_BAN, "<^"authid^" or ip> <minutes> [reason]")
register_concmd("amx_unban", "cmdUnban", ADMIN_BAN, "<^"authid^" or ip>")
register_concmd("amx_slay", "cmdSlay", ADMIN_SLAY, "<name or #userid>")
register_concmd("amx_slap", "cmdSlap", ADMIN_SLAY, "<name or #userid> [power]")
register_concmd("amx_leave", "cmdLeave", ADMIN_KICK, "<tag> [tag] [tag] [tag]")
register_concmd("amx_pause", "cmdPause", ADMIN_CVAR, "- pause or unpause the game")
register_concmd("amx_who", "cmdWho", ADMIN_ADMIN, "- displays who is on server")
register_concmd("amx_cvar", "cmdCvar", ADMIN_CVAR, "<cvar> [value]")
register_concmd("amx_plugins", "cmdPlugins", ADMIN_ADMIN)
register_concmd("amx_modules", "cmdModules", ADMIN_ADMIN)
register_concmd("amx_map", "cmdMap", ADMIN_MAP, "<mapname>")
register_concmd("amx_cfg", "cmdCfg", ADMIN_CFG, "<filename>")
register_concmd("amx_nick", "cmdNick", ADMIN_SLAY, "<name or #userid> <new nick>")
register_concmd("amx_last", "cmdLast", ADMIN_BAN, "- list the last few disconnected clients info");
register_clcmd("amx_rcon", "cmdRcon", ADMIN_RCON, "<command line>")
register_clcmd("amx_showrcon", "cmdShowRcon", ADMIN_RCON, "<command line>")
register_clcmd("pauseAck", "cmdLBack")
log_kick = register_cvar("amx_logkick", "1")
log_slap = register_cvar("amx_logslap", "1")
log_cvar = register_cvar("amx_logcvar", "1")
log_leave = register_cvar("amx_logleave", "1")
log_rcon = register_cvar("amx_logrcon", "1")
log_map = register_cvar("amx_logmap", "1")
log_slay = register_cvar("amx_logslay", "1")
rcon_password=get_cvar_pointer("rcon_password");
pausable=get_cvar_pointer("pausable");
}
public plugin_cfg()
{
// Cvars which can be changed only with rcon access
server_cmd(g_addCvar, "rcon_password")
server_cmd(g_addCvar, "amx_show_activity")
server_cmd(g_addCvar, "amx_mode")
server_cmd(g_addCvar, "amx_password_field")
server_cmd(g_addCvar, "amx_default_access")
server_cmd(g_addCvar, "amx_reserved_slots")
server_cmd(g_addCvar, "amx_reservation")
server_cmd(g_addCvar, "amx_sql_table");
server_cmd(g_addCvar, "amx_sql_host");
server_cmd(g_addCvar, "amx_sql_user");
server_cmd(g_addCvar, "amx_sql_pass");
server_cmd(g_addCvar, "amx_sql_db");
server_cmd(g_addCvar, "amx_sql_type");
}
public cmdKick(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32]
read_argv(1, arg, 31)
new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
if (!player)
return PLUGIN_HANDLED
new authid[32], authid2[32], name2[32], name[32], userid2, reason[32], time[32],szLog[256]
get_user_authid(id, authid, 31)
get_user_authid(player, authid2, 31)
get_user_name(player, name2, 31)
get_user_name(id, name, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
userid2 = get_user_userid(player)
read_argv(2, reason, 31)
remove_quotes(reason)
log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, reason)
show_activity_key("ADMIN_KICK_1", "ADMIN_KICK_2", name, name2);
if (is_user_bot(player))
server_cmd("kick #%d", userid2)
else
{
if (reason[0])
server_cmd("kick #%d ^"%s^"", userid2, reason)
else
server_cmd("kick #%d", userid2)
}
console_print(id, "[www.lspublic.com] Client ^"%s^" kicked", name2)
if(get_pcvar_num(log_kick) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/Kick_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"Users Kick logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"Player %s with steamid %s has kicked by admin %s with steamid %s Reason[^"%s^"] Date/Time[%s]",name2,authid2,name,authid,reason,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public cmdUnban(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32], authid[32], name[32]
read_argv(1, arg, 31)
if (contain(arg, ".") != -1)
{
server_cmd("removeip ^"%s^";writeip", arg)
console_print(id, "[www.lspublic.com] %L", id, "IP_REMOVED", arg)
} else {
server_cmd("removeid %s;writeid", arg)
console_print(id, "[www.lspublic.com] %L", id, "AUTHID_REMOVED", arg)
}
get_user_name(id, name, 31)
show_activity_key("ADMIN_UNBAN_1", "ADMIN_UNBAN_2", name, arg);
get_user_authid(id, authid, 31)
log_amx("Cmd: ^"%s<%d><%s><>^" unban ^"%s^"", name, get_user_userid(id), authid, arg)
return PLUGIN_HANDLED
}
/* amx_addban is a special command now.
* If a user with rcon uses it, it bans the user. No questions asked.
* If a user without rcon but with ADMIN_BAN uses it, it will scan the old
* connection queue, and if it finds the info for a player in it, it will
* check their old access. If they have immunity, it will not ban.
* If they do not have immunity, it will ban. If the user is not found,
* it will refuse to ban the target.
*/
public cmdAddBan(id, level, cid)
{
if (!cmd_access(id, level, cid, 3, true)) // check for ADMIN_BAN access
{
if (get_user_flags(id) & level) // Getting here means they didn't input enough args
{
return PLUGIN_HANDLED;
}
if (!cmd_access(id, ADMIN_RCON, cid, 3)) // If somehow they have ADMIN_RCON without ADMIN_BAN, continue
{
return PLUGIN_HANDLED;
}
}
new arg[32], authid[32], name[32], minutes[32], reason[32]
read_argv(1, arg, 31)
read_argv(2, minutes, 31)
read_argv(3, reason, 31)
if (!(get_user_flags(id) & ADMIN_RCON))
{
new bool:canban = false;
new bool:isip = false;
// Limited access to this command
if (equali(arg, "STEAM_ID_PENDING") ||
equali(arg, "STEAM_ID_LAN") ||
equali(arg, "HLTV") ||
equali(arg, "4294967295") ||
equali(arg, "VALVE_ID_LAN") ||
equali(arg, "VALVE_ID_PENDING"))
{
// Hopefully we never get here, so ML shouldn't be needed
console_print(id, "Cannot ban %s", arg);
return PLUGIN_HANDLED;
}
if (contain(arg, ".") != -1)
{
isip = true;
}
// Scan the disconnection queue
if (isip)
{
new IP[32];
new Name[32];
new dummy[1];
new Access;
for (new i = 0; i < g_Size; i++)
{
GetInfo(i, Name, charsmax(Name), dummy, 0, IP, charsmax(IP), Access);
if (equal(IP, arg))
{
if (Access & ADMIN_IMMUNITY)
{
console_print(id, "[www.lspublic.com] %s : %L", IP, id, "CLIENT_IMM", Name);
return PLUGIN_HANDLED;
}
// User did not have immunity
canban = true;
}
}
}
else
{
new Auth[32];
new Name[32];
new dummy[1];
new Access;
for (new i = 0; i < g_Size; i++)
{
GetInfo(i, Name, charsmax(Name), Auth, charsmax(Auth), dummy, 0, Access);
if (equal(Auth, arg))
{
if (Access & ADMIN_IMMUNITY)
{
console_print(id, "[www.lspublic.com] %s : %L", Auth, id, "CLIENT_IMM", Name);
return PLUGIN_HANDLED;
}
// User did not have immunity
canban = true;
}
}
}
if (!canban)
{
console_print(id, "[www.lspublic.com] You may only ban recently disconnected clients. Use ^"amx_last^" to view.");
return PLUGIN_HANDLED;
}
}
// User has access to ban their target
if (contain(arg, ".") != -1)
{
server_cmd("addip ^"%s^" ^"%s^";wait;writeip", minutes, arg)
console_print(id, "[www.lspublic.com] Ip ^"%s^" added to ban list", arg)
} else {
server_cmd("banid %s %s;wait;writeid", minutes, arg)
console_print(id, "[www.lspublic.com] Authid ^"%s^" added to ban list", arg)
}
get_user_name(id, name, 31)
show_activity_key("ADMIN_ADDBAN_1", "ADMIN_ADDBAN_2", name, arg);
get_user_authid(id, authid, 31)
log_amx("Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, arg, minutes, reason)
return PLUGIN_HANDLED
}
public cmdBan(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new target[32], minutes[8], reason[64]
read_argv(1, target, 31)
read_argv(2, minutes, 7)
read_argv(3, reason, 63)
new player = cmd_target(id, target, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS | CMDTARGET_ALLOW_SELF)
if (!player)
return PLUGIN_HANDLED
new authid[32], name2[32], authid2[32], name[32]
new userid2 = get_user_userid(player)
get_user_authid(player, authid2, 31)
get_user_authid(id, authid, 31)
get_user_name(player, name2, 31)
get_user_name(id, name, 31)
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)
new temp[64], banned[16], nNum = str_to_num(minutes)
if (nNum)
format(temp, 63, "%L", player, "FOR_MIN", minutes)
else
format(temp, 63, "%L", player, "PERM")
format(banned, 15, "%L", player, "BANNED")
if (reason[0])
server_cmd("kick #%d ^"%s (%s %s)^";wait;banid %s %s;wait;writeid", userid2, reason, banned, temp, minutes, authid2)
else
server_cmd("kick #%d ^"%s %s^";wait;banid %s %s;wait;writeid", userid2, banned, temp, minutes, authid2)
// Display the message to all clients
new msg[256];
new len;
new maxpl = get_maxplayers();
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(i))
{
len = formatex(msg, charsmax(msg), "%L", i, "BAN");
len += formatex(msg[len], charsmax(msg) - len, " %s ", name2);
if (nNum)
{
len += formatex(msg[len], charsmax(msg) - len, "%L", i, "FOR_MIN", minutes);
}
else
{
len += formatex(msg[len], charsmax(msg) - len, "%L", i, "PERM");
}
if (strlen(reason) > 0)
{
formatex(msg[len], charsmax(msg) - len, " (%L: %s)", i, "REASON", reason);
}
show_activity_id(i, id, name, msg);
}
}
console_print(id, "[www.lspublic.com] %L", id, "CLIENT_BANNED", name2)
return PLUGIN_HANDLED
}
public cmdBanIP(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new target[32], minutes[8], reason[64]
read_argv(1, target, 31)
read_argv(2, minutes, 7)
read_argv(3, reason, 63)
new player = cmd_target(id, target, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS | CMDTARGET_ALLOW_SELF)
if (!player)
{
// why is this here?
// no idea
// player = cmd_target(id, target, 9);
return PLUGIN_HANDLED
}
new authid[32], name2[32], authid2[32], name[32]
new userid2 = get_user_userid(player)
get_user_authid(player, authid2, 31)
get_user_authid(id, authid, 31)
get_user_name(player, name2, 31)
get_user_name(id, name, 31)
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)
new temp[64], banned[16], nNum = str_to_num(minutes)
if (nNum)
format(temp, 63, "%L", player, "FOR_MIN", minutes)
else
format(temp, 63, "%L", player, "PERM")
format(banned, 15, "%L", player, "BANNED")
new address[32]
get_user_ip(player, address, 31, 1)
if (reason[0])
server_cmd("kick #%d ^"%s (%s %s)^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, reason, banned, temp, minutes, address)
else
server_cmd("kick #%d ^"%s %s^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, banned, temp, minutes, address)
// Display the message to all clients
new msg[256];
new len;
new maxpl = get_maxplayers();
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(i))
{
len = formatex(msg, charsmax(msg), "%L", i, "BAN");
len += formatex(msg[len], charsmax(msg) - len, " %s ", name2);
if (nNum)
{
formatex(msg[len], charsmax(msg) - len, "%L", i, "FOR_MIN", minutes);
}
else
{
formatex(msg[len], charsmax(msg) - len, "%L", i, "PERM");
}
if (strlen(reason) > 0)
{
formatex(msg[len], charsmax(msg) - len, " (%L: %s)", i, "REASON", reason);
}
show_activity_id(i, id, name, msg);
}
}
console_print(id, "[www.lspublic.com] %L", id, "CLIENT_BANNED", name2)
return PLUGIN_HANDLED
}
public cmdSlay(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32]
read_argv(1, arg, 31)
new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF | CMDTARGET_ONLY_ALIVE)
if (!player)
return PLUGIN_HANDLED
user_kill(player)
new authid[32], name2[32], authid2[32], name[32], time[32],szLog[256]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_user_authid(player, authid2, 31)
get_user_name(player, name2, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
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);
console_print(id, "[www.lspublic.com] %L", id, "CLIENT_SLAYED", name2)
if(get_pcvar_num(log_slay) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/slay_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"Users slay logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"Player %s with steamid %s was slayed by admin %s with steamid %s Date/Time[%s]",name2,authid2,name,authid,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public cmdSlap(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32]
read_argv(1, arg, 31)
new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF | CMDTARGET_ONLY_ALIVE)
if (!player)
return PLUGIN_HANDLED
new spower[32], authid[32], name2[32], authid2[32], name[32], time[32],szLog[256]
read_argv(2, spower, 31)
new damage = str_to_num(spower)
user_slap(player, damage)
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_user_authid(player, authid2, 31)
get_user_name(player, name2, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, damage, name2, get_user_userid(player), authid2)
show_activity_key("ADMIN_SLAP_1", "ADMIN_SLAP_2", name, name2, damage);
console_print(id, "[www.lspublic.com] %L", id, "CLIENT_SLAPED", name2, damage)
if(get_pcvar_num(log_slap) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/slap_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"Users slaped logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"Player %s with steamid %s was slaped by admin %s with steamid %s Date/Time[%s]",name2,authid2,name,authid,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public chMap(map[])
{
server_cmd("changelevel %s", map)
}
public cmdMap(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32]
new arglen = read_argv(1, arg, 31)
if (!is_map_valid(arg))
{
console_print(id, "[www.lspublic.com] %L", id, "MAP_NOT_FOUND")
return PLUGIN_HANDLED
}
new authid[32], name[32], time[32],szLog[256]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
show_activity_key("ADMIN_MAP_1", "ADMIN_MAP_2", name, arg);
log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^"", name, get_user_userid(id), authid, arg)
new _modName[10]
get_modname(_modName, 9)
if (!equal(_modName, "zp"))
{
message_begin(MSG_ALL, SVC_INTERMISSION)
message_end()
}
set_task(2.0, "chMap", 0, arg, arglen + 1)
if(get_pcvar_num(log_map) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/map_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"Map change logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"admin %s with steamid %s was change map %s Date/Time[%s]",name,authid,arg,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
stock bool:onlyRcon(const name[])
{
new ptr=get_cvar_pointer(name);
if (ptr && get_pcvar_flags(ptr) & FCVAR_PROTECTED)
{
return true;
}
return false;
}
public cmdCvar(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32], arg2[64]
read_argv(1, arg, 31)
read_argv(2, arg2, 63)
new pointer;
if (equal(arg, "add") && (get_user_flags(id) & ADMIN_RCON))
{
if ((pointer=get_cvar_pointer(arg2))!=0)
{
new flags=get_pcvar_flags(pointer);
if (!(flags & FCVAR_PROTECTED))
{
set_pcvar_flags(pointer,flags | FCVAR_PROTECTED);
}
}
return PLUGIN_HANDLED
}
if ((pointer=get_cvar_pointer(arg))==0)
{
console_print(id, "[www.lspublic.com] %L", id, "UNKNOWN_CVAR", arg)
return PLUGIN_HANDLED
}
if (onlyRcon(arg) && !(get_user_flags(id) & ADMIN_RCON))
{
// Exception for the new onlyRcon rules:
// sv_password is allowed to be modified by ADMIN_PASSWORD
if (!(equali(arg,"sv_password") && (get_user_flags(id) & ADMIN_PASSWORD)))
{
console_print(id, "[www.lspublic.com] %L", id, "CVAR_NO_ACC")
return PLUGIN_HANDLED
}
}
if (read_argc() < 3)
{
get_pcvar_string(pointer, arg2, 63)
console_print(id, "[www.lspublic.com] %L", id, "CVAR_IS", arg, arg2)
return PLUGIN_HANDLED
}
new authid[32], name[32], time[32],szLog[256]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
log_amx("Cmd: ^"%s<%d><%s><>^" set cvar (name ^"%s^") (value ^"%s^")", name, get_user_userid(id), authid, arg, arg2)
set_cvar_string(arg, arg2)
// Display the message to all clients
new cvar_val[64];
new maxpl = get_maxplayers();
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(i))
{
if (get_pcvar_flags(pointer) & FCVAR_PROTECTED || equali(arg, "rcon_password"))
{
formatex(cvar_val, charsmax(cvar_val), "*** %L ***", i, "PROTECTED");
}
else
{
copy(cvar_val, charsmax(cvar_val), arg2);
}
show_activity_id(i, id, name, "%L", i, "SET_CVAR_TO", "", arg, cvar_val);
}
}
console_print(id, "[www.lspublic.com] %L", id, "CVAR_CHANGED", arg, arg2)
if(get_pcvar_num(log_cvar) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/cvar_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"cvar Used logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"admin %s with steamid %s changed cvar %s [%s] Date/Time[%s]",name,authid,arg,arg2,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public cmdPlugins(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
if (id==0) // If server executes redirect this to "amxx plugins" for more in depth output
{
server_cmd("amxx plugins");
server_exec();
return PLUGIN_HANDLED;
}
new name[32], version[32], author[32], filename[32], status[32]
new lName[32], lVersion[32], lAuthor[32], lFile[32], lStatus[32]
format(lName, 31, "%L", id, "NAME")
format(lVersion, 31, "%L", id, "VERSION")
format(lAuthor, 31, "%L", id, "AUTHOR")
format(lFile, 31, "%L", id, "FILE")
format(lStatus, 31, "%L", id, "STATUS")
new StartPLID=0;
new EndPLID;
new Temp[96]
new num = get_pluginsnum()
if (read_argc() > 1)
{
read_argv(1,Temp,sizeof(Temp)-1);
StartPLID=str_to_num(Temp)-1; // zero-based
}
EndPLID=min(StartPLID + 10, num);
new running = 0
console_print(id, "----- %L -----", id, "LOADED_PLUGINS")
console_print(id, "%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s", lName, lVersion, lAuthor, lFile, lStatus)
new i=StartPLID;
while (i <EndPLID)
{
get_plugin(i++, filename, 31, name, 31, version, 31, author, 31, status, 31)
console_print(id, "%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s", name, version, author, filename, status)
if (status[0]=='d' || status[0]=='r') // "debug" or "running"
running++
}
console_print(id, "%L", id, "PLUGINS_RUN", EndPLID-StartPLID, running)
console_print(id, "----- %L -----",id,"HELP_ENTRIES",StartPLID + 1,EndPLID,num);
if (EndPLID < num)
{
formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_MORE", EndPLID + 1);
replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
console_print(id,"%s",Temp);
}
else
{
formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_BEGIN");
replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
console_print(id,"%s",Temp);
}
return PLUGIN_HANDLED
}
public cmdModules(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new name[32], version[32], author[32], status, sStatus[16]
new lName[32], lVersion[32], lAuthor[32], lStatus[32];
format(lName, 31, "%L", id, "NAME")
format(lVersion, 31, "%L", id, "VERSION")
format(lAuthor, 31, "%L", id, "AUTHOR")
format(lStatus, charsmax(lStatus), "%L", id, "STATUS")
new num = get_modulesnum()
console_print(id, "%L:", id, "LOADED_MODULES")
console_print(id, "%-23.22s %-11.10s %-20.19s %-11.10s", lName, lVersion, lAuthor, lStatus)
for (new i = 0; i < num; i++)
{
get_module(i, name, 31, author, 31, version, 31, status)
switch (status)
{
case module_loaded: copy(sStatus, 15, "running")
default:
{
copy(sStatus, 15, "bad load");
copy(name, charsmax(name), "unknown");
copy(author, charsmax(author), "unknown");
copy(version, charsmax(version), "unknown");
}
}
console_print(id, "%-23.22s %-11.10s %-20.19s %-11.10s", name, version, author, sStatus)
}
console_print(id, "%L", id, "NUM_MODULES", num)
return PLUGIN_HANDLED
}
public cmdCfg(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[128]
read_argv(1, arg, 127)
if (!file_exists(arg))
{
console_print(id, "[www.lspublic.com] %L", id, "FILE_NOT_FOUND", arg)
return PLUGIN_HANDLED
}
new authid[32], name[32]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
log_amx("Cmd: ^"%s<%d><%s><>^" execute cfg (file ^"%s^")", name, get_user_userid(id), authid, arg)
console_print(id, "[www.lspublic.com] Executing file ^"%s^"", arg)
server_cmd("exec %s", arg)
show_activity_key("ADMIN_CONF_1", "ADMIN_CONF_2", name, arg);
return PLUGIN_HANDLED
}
public cmdLBack()
{
if (!g_PauseAllowed)
return PLUGIN_CONTINUE
new paused[25]
format(paused, 24, "%L", g_pauseCon, g_Paused ? "UNPAUSED" : "PAUSED")
set_cvar_float("pausable", g_pausAble)
console_print(g_pauseCon, "[www.lspublic.com] Server %s", paused)
g_PauseAllowed = false
if (g_Paused)
g_Paused = false
else
g_Paused = true
return PLUGIN_HANDLED
}
public cmdPause(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new authid[32], name[32], slayer = id
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
if (pausable!=0)
{
g_pausAble = get_pcvar_float(pausable)
}
if (!slayer)
slayer = find_player("h")
if (!slayer)
{
console_print(id, "[www.lspublic.com] %L", id, "UNABLE_PAUSE")
return PLUGIN_HANDLED
}
set_cvar_float("pausable", 1.0)
g_PauseAllowed = true
client_cmd(slayer, "pause;pauseAck")
log_amx("Cmd: ^"%s<%d><%s><>^" %s server", name, get_user_userid(id), authid, g_Paused ? "unpause" : "pause")
console_print(id, "[www.lspublic.com] %L", id, g_Paused ? "UNPAUSING" : "PAUSING")
// Display the message to all clients
new maxpl = get_maxplayers();
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(i))
{
show_activity_id(i, id, name, "%L server", i, g_Paused ? "UNPAUSE" : "PAUSE");
}
}
g_pauseCon = id
return PLUGIN_HANDLED
}
public cmdShowRcon(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new password[64]
get_pcvar_string(rcon_password, password, 63)
if (!password[0])
{
cmdRcon(id, level, cid)
} else {
new args[128]
read_args(args, 127)
client_cmd(id, "rcon_password %s", password)
client_cmd(id, "rcon %s", args)
}
return PLUGIN_HANDLED
}
public cmdRcon(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[128], authid[32], name[32], time[32],szLog[256]
read_args(arg, 127)
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")", name, get_user_userid(id), authid, arg)
console_print(id, "[www.lspublic.com] %L", id, "COM_SENT_SERVER", arg)
server_cmd("%s", arg)
if(get_pcvar_num(log_rcon) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/rcon_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"used rcon logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"admin %s with steamid %s was use rcon [%s] Date/Time[%s]",name,authid,arg,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public cmdWho(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new players[32], inum, cl_on_server[64], authid[32], name[32], flags, sflags[32]
new lImm[16], lRes[16], lAccess[16], lYes[16], lNo[16]
format(lImm, 15, "%L", id, "IMMU")
format(lRes, 15, "%L", id, "RESERV")
format(lAccess, 15, "%L", id, "ACCESS")
format(lYes, 15, "%L", id, "YES")
format(lNo, 15, "%L", id, "NO")
get_players(players, inum)
format(cl_on_server, 63, "%L", id, "CLIENTS_ON_SERVER")
console_print(id, "^n%s:^n # %-16.15s %-20s %-8s %-4.3s %-4.3s %s", cl_on_server, "nick", "authid", "userid", lImm, lRes, lAccess)
for (new a = 0; a < inum; ++a)
{
get_user_authid(players[a], authid, 31)
get_user_name(players[a], name, 31)
flags = get_user_flags(players[a])
get_flags(flags, sflags, 31)
console_print(id, "%2d %-16.15s %-20s %-8d %-6.5s %-6.5s %s", players[a], name, authid,
get_user_userid(players[a]), (flags&ADMIN_IMMUNITY) ? lYes : lNo, (flags&ADMIN_RESERVATION) ? lYes : lNo, sflags)
}
console_print(id, "%L", id, "TOTAL_NUM", inum)
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
log_amx("Cmd: ^"%s<%d><%s><>^" ask for players list", name, get_user_userid(id), authid)
return PLUGIN_HANDLED
}
hasTag(name[], tags[4][32], tagsNum)
{
for (new a = 0; a < tagsNum; ++a)
if (contain(name, tags[a]) != -1)
return a
return -1
}
public cmdLeave(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new argnum = read_argc()
new ltags[4][32]
new ltagsnum = 0
for (new a = 1; a < 5; ++a)
{
if (a < argnum)
read_argv(a, ltags[ltagsnum++], 31)
else
ltags[ltagsnum++][0] = 0
}
new nick[32], ires, pnum = get_maxplayers() + 1, count = 0, lReason[128]
for (new b = 1; b < pnum; ++b)
{
if (!is_user_connected(b) && !is_user_connecting(b)) continue
get_user_name(b, nick, 31)
ires = hasTag(nick, ltags, ltagsnum)
if (ires != -1)
{
console_print(id, "[www.lspublic.com] %L", id, "SKIP_MATCH", nick, ltags[ires])
continue
}
if (get_user_flags(b) & ADMIN_IMMUNITY)
{
console_print(id, "[www.lspublic.com] %L", id, "SKIP_IMM", nick)
continue
}
console_print(id, "[www.lspublic.com %L", id, "KICK_PL", nick)
if (is_user_bot(b))
server_cmd("kick #%d", get_user_userid(b))
else
{
format(lReason, 127, "%L", b, "YOU_DROPPED")
server_cmd("kick #%d ^"%s^"", get_user_userid(b), lReason)
}
count++
}
console_print(id, "[www.lspublic.com] %L", id, "KICKED_CLIENTS", count)
new authid[32], name[32], time[32],szLog[256]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_time("%m.%d.%Y -- %H:%M:%S",time,53);
log_amx("Kick: ^"%s<%d><%s><>^" leave some group (tag1 ^"%s^") (tag2 ^"%s^") (tag3 ^"%s^") (tag4 ^"%s^")", name, get_user_userid(id), authid, ltags[0], ltags[1], ltags[2], ltags[3])
show_activity_key("ADMIN_LEAVE_1", "ADMIN_LEAVE_2", name, ltags[0], ltags[1], ltags[2], ltags[3]);
if(get_pcvar_num(log_leave) ==1 )
{
new szFile[128];
get_configsdir(szFile,127);
formatex(szFile,127,"%s/leave_logs.txt",szFile);
if(!file_exists(szFile))
{
write_file(szFile,"Leave logs",-1);
write_file(szFile," ",-1)
}
formatex(szLog,255,"admin %s with steamid %s was leaved with %s Date/Time[%s]",name,authid,ltags,time);
write_file(szFile,szLog,-1);
}
return PLUGIN_HANDLED
}
public cmdNick(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new arg1[32], arg2[32], authid[32], name[32], authid2[32], name2[32]
read_argv(1, arg1, 31)
read_argv(2, arg2, 31)
new player = cmd_target(id, arg1, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
if (!player)
return PLUGIN_HANDLED
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
get_user_authid(player, authid2, 31)
get_user_name(player, name2, 31)
client_cmd(player, "name ^"%s^"", arg2)
log_amx("Cmd: ^"%s<%d><%s><>^" change nick to ^"%s^" ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, arg2, name2, get_user_userid(player), authid2)
show_activity_key("ADMIN_NICK_1", "ADMIN_NICK_2", name, name2, arg2);
console_print(id, "[www.lspublic.com] %L", id, "CHANGED_NICK", name2, arg2)
return PLUGIN_HANDLED
}
public cmdLast(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
{
return PLUGIN_HANDLED;
}
new name[32];
new authid[32];
new ip[32];
new flags[32];
new access;
// This alignment is a bit weird (it should grow if the name is larger)
// but otherwise for the more common shorter name, it'll wrap in server console
// Steam client display is all skewed anyway because of the non fixed font.
console_print(id, "%19s %20s %15s %s", "name", "authid", "ip", "access");
for (new i = 0; i < g_Size; i++)
{
GetInfo(i, name, charsmax(name), authid, charsmax(authid), ip, charsmax(ip), access);
get_flags(access, flags, charsmax(flags));
console_print(id, "%19s %20s %15s %s", name, authid, ip, flags);
}
console_print(id, "%d old connections saved.", g_Size);
return PLUGIN_HANDLED;
}