Senior Member
|
07-31-2010
, 16:48
Problem mit einem Plugin. Bitte Hilfe!
|
#1
|
Hi, wir haben ein plugin, das die rates der spieler prüft. Dieses Plugin funktioniert auf 3 anderen servern ohne Probleme.
Bei unserem Server leider nicht. Es lädt, aber es checkt und aendert die werte nicht. Ich habe alles versucht, was man versuchen kann als serveradmin.
Habs auf 3 Servern unseres Hosters getestet..überall das gleiche!!!
1.Unseren Addons ordner auf einem anderen server getestet: funktioniert
2.den cstrike ordner des anderen Servers auf unsrem Server: geht nicht
3.bei uns alle plugins aus ausser anti-lowrates. geht nicht (da unser addons ordner woander funktioniert, war der test nur verzweiflung)
4.Startparameter des Servers geaendert, unsere startparameter auf dem testserver getestet: testserver gehts, bei uns nicht.
5.hlds versionen sind gleich.
Es ist alles identisch amxx, metamod,hlds version usw....
Kann es sein, das es irgendwie an nem port liegt, da der server ja die werte der Spieler prüfen muss und auch aendern.Aber er tut beides nicht. Ich denke es könnte sein das nen ausgehender port blockiert ist.
Was meint ihr?
Danke
Amokossi
icq:298922990
Das Plugin ist eine abwandlung vom Client Checker.
Code:
/*
anti-lowrates
What does it do?
It can check client rates
It can check client CVARS which can be configured in a config file
It can show a (dis)connect message from clients (possibility to show from which country the player connects)
It can kick players with high ping (Used / Modified the HPK code)
CVARS:
* cc_connectmsg - Shows who is (dis)connecting
* cc_showgeoip - Shows connecting player country
* cc_ratecheck - Check client rates
* cc_cvarcheck - Check client cvars (using the config file)
* cc_pingcheck - High ping kick
* cc_writelog - Write invalid client settings and Admin actions to a log file
* cc_chkdelay - Delay between checks in seconds
* cc_maxping - Maximum allowed ping
* cc_maxpingwarns - Ping check cycles before kick
* cc_minupdaterate - Minimum allowed cl_updaterate
* cc_mincmdrate - Minimum allowed cl_cmdrate
* cc_minrate - Minimum allowed rate
* cc_messagetype - Show message about invalid settings to:
+ 0 = Nobody
+ 1 = AMX Admins
+ 2 = Checked Player + AMX Admins
+ 3 = All players
* cc_agreemenu - This will show the agreement menu
* cc_agreetimeout - How long the client has to accept
* cc_maxitems - This is to set how many cvars will be checked in one check cycle
* cc_writecfg - Write changes to the client checker config file
* cc_maxinvalid - Maximum allowed invalid changes of settings from a client before they will be kicked
* cc_showinfo - Show info in client console
* cc_realoadcfg - Reload the cvar checker config file
* cc_daystosave - How long the agreement of a client should be saved
CVAR Check Config:
cvar {
max_value - Use this for numeric values only
min_value - Use this for numeric values only
set_value - Value that will replace the invalid value (when using '*' as value it will set to the avg of the min and max value)
equal_to - Value must be equal to this, if not change it to the set_value
!equal_to - Value can not be equal to this, if it is change it to the set_value
contains - Value contains this. Change value to set_value (use comma to use spererate values)
!contains - Value does not contain this. Change value to set_value (use comma to use spererate values)
regex - Use a regex pattern (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm
}
Examples:
gl_polyoffset {
max_value 4
set_value 4
}
max_smokepuffs {
min_value 120
set_value 120
}
name {
contains fuck,shit,cunt
set_value BANNED_NAME
}
Requirements:
This plugin requires amxmodx 1.7 or later to work!
Change log:
1.0.1:
- Changed the CVAR checker config (it will still read its old config)
- Agree save is now using nvault to store steamid's. And it will remove entries older than 14 days by default (only if the SQL version is not used).
1.0.0:
- Added SQL support
0.0.9:
- Bugfix: Always showing agreement menu even while steamid was in saved list!
- Did some optimization
0.0.8 Optimized:
- Optimized the code
- Added option to show the info in console when client joins the server (cc_showinfo)
0.0.8:
- Bugfix: now using get_players instead of get_playersnum so all messages should be working now.
0.0.7:
- Changed the maximum save value to 512 (this is defined in the source code and can be changed to use a low or higher number)
- Added quick cvar check when a client joins the server.
- Added option to auto kick clients that keep changing there settings to an invalid value. (The number of invalid changes can be set in the config. And will only start after the first check).
- Added option to automaticly write admin changes to the config file.
0.0.6:
- Added option to show a agreement menu before the client checker starts. If the user doesnt agree he/she will be removed from the server.
- Added option to keep a little save file of the users who agreed (up to 64 records)
- Added a limit to maximum cvar checks in one check cycle. This is to prevent flooding with big cvar check lists. The maximum items to check can be set with "cc_maxitems".
0.0.5:
- Small bug fix with geoip when a bot joins the server. Also added some code to check if the country isnt matching error.
0.0.4:
- Fixed the cc_showgeoip cvar (it did not check if it was en/dis-abled)
- Added messages for High ping kick
- Added pcvars to make it faster
0.0.3:
- Fixed bug in Cvar checker
- Code revision (cleaned up some of the mess)
0.0.2: Public version
0.0.1: Private test version
*/
// Log file
new const logfile[] = "ClientChecker.log"
// Config file
new const cfgfile[] = "ClientChecker.cfg"
// CVARs config file
new const cvarsfile[] = "chk_cvars.cfg"
// Uncomment next line to make use of the SQL stuff
//#define USESQL
// Maximum cvar items 256 items should be enough
#define MAXITEMS 256
/*************************/
/* Code starts from here */
/*************************/
#include <amxmodx>
#include <amxmisc>
#include <geoip>
#include <nvault>
#include <regex>
#if defined USESQL
#include <dbi>
#define VERSION "1.0.1-SQL"
#else
#define VERSION "1.0.2"
#endif
#define PLUGIN "anti-lowrates"
#define AUTHOR "Crazed edit by Ossi"
new iPingkick[33] // High Ping count
new menu_timer[33] // Agree menu timer
new cvar_chkitem[33] // Current checked item (for fast chk)
new client_isettings[33] // Invalid settings count
new cvars_buf[MAXITEMS+1][64] // Holds all CVARs that needs to be checked
new cvar_items // CVAR item count
new bool:b_geoip // Holds true when GeoIP module is loaded
new keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9) // Menu keys
new bool:b_oldcfg // if set to true still use old cvar check stuff
new g_configfile[128]
new g_chkcvarfile[128]
#if !defined USESQL
new const g_savefile[] = "agreesavefile"
#endif
#if defined USESQL
new Sql:sql
new sql_host[256], sql_user[128], sql_pass[128], sql_dbname[128]
// SQL pcvars
new cvar_sqlhost, cvar_sqluser, cvar_sqlpass, cvar_sqldbname
#else
new cvar_daystosave
#endif
// pcvars
new cvar_connectmsg, cvar_ratecheck, cvar_pingcheck,
cvar_cvarcheck, cvar_messagetype, cvar_showgeoip,
cvar_writelog, cvar_chkdelay, cvar_maxping,
cvar_maxpingwarns, cvar_minupdaterate, cvar_mincmdrate,
cvar_minrate, cvar_agreetimeout, cvar_agreemenu,
cvar_maxitems, cvar_maxinvalid, cvar_writecfg,
cvar_showinfo
// enable / disable cvars
#define AdminCMDs1 9
static const array_enable_disable[AdminCMDs1][] =
{
"cc_connectmsg",
"cc_ratecheck",
"cc_pingcheck",
"cc_cvarcheck",
"cc_showgeoip",
"cc_writelog",
"cc_agreemenu",
"cc_writecfg",
"cc_showinfo"
}
// Other cvars
#define AdminCMDs2 11
static const array_cmd_cvars[AdminCMDs2][] = {
"cc_chkdelay",
"cc_maxping",
"cc_maxpingwarns",
"cc_minupdaterate",
"cc_mincmdrate",
"cc_minrate",
"cc_messagetype",
"cc_agreetimeout",
"cc_maxitems",
"cc_maxinvalid",
"cc_daystosave"
}
// Initiate Plugin
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
cvar_connectmsg = register_cvar("cc_connectmsg", "1")
cvar_ratecheck = register_cvar("cc_ratecheck", "1")
cvar_pingcheck = register_cvar("cc_pingcheck", "1")
cvar_cvarcheck = register_cvar("cc_cvarcheck", "1")
cvar_messagetype = register_cvar("cc_messagetype", "1")
cvar_showgeoip = register_cvar("cc_showgeoip", "1")
cvar_writelog = register_cvar("cc_writelog", "1")
cvar_chkdelay = register_cvar("cc_chkdelay", "3")
cvar_maxping = register_cvar("cc_maxping", "100")
cvar_maxpingwarns = register_cvar("cc_maxpingwarns", "5")
cvar_minupdaterate = register_cvar("cc_minupdaterate", "60")
cvar_mincmdrate = register_cvar("cc_mincmdrate", "60")
cvar_minrate = register_cvar("cc_minrate", "15000")
cvar_agreetimeout = register_cvar("cc_agreetimeout", "30")
cvar_agreemenu = register_cvar("cc_agreemenu", "1")
cvar_maxitems = register_cvar("cc_maxitems", "5")
cvar_maxinvalid = register_cvar("cc_maxinvalid", "10")
cvar_writecfg = register_cvar("cc_writecfg", "1")
cvar_showinfo = register_cvar("cc_showinfo", "1")
#if defined USESQL
cvar_sqlhost = register_cvar("cc_sqlhost", "localhost:3306")
cvar_sqluser = register_cvar("cc_sqluser", "my_user")
cvar_sqlpass = register_cvar("cc_sqlpass", "my_pass")
cvar_sqldbname = register_cvar("cc_sqldbname", "ClientChecker")
#else
cvar_daystosave = register_cvar("cc_daystosave", "14")
#endif
// agreement menu
register_menucmd(register_menuid("\yanti-lowrates"), 1023, "cc_menuhandle")
new i
// Register Admin Commands
for (i = 0;i < AdminCMDs1;i++)
register_concmd(array_enable_disable[i], "Admin_Commands", ADMIN_CFG)
for (i = 0;i < AdminCMDs2;i++)
register_concmd(array_cmd_cvars[i], "Admin_Commands", ADMIN_CFG)
register_concmd("cc_reloadcfg", "Admin_Commands", ADMIN_CFG)
// Check if the GeoIP Module is loaded
if (is_module_loaded("geoip") != -1)
b_geoip = true
}
// Plugin Configure
public plugin_cfg()
{
new cfgdir[32]
// Load CFG file
get_configsdir(cfgdir, 31)
formatex(g_configfile, 63, "%s/%s", cfgdir, cfgfile)
if (file_exists(g_configfile))
{
server_print("[ClientChecker] Loading %s", cfgfile)
server_cmd("exec %s", g_configfile)
}
// Load cvars + settings to buffer
formatex(g_chkcvarfile, 63, "%s/%s", cfgdir, cvarsfile)
if (file_exists(g_chkcvarfile))
{
server_print("[ClientChecker] Loading %s", cvarsfile)
load_cvarsconfig()
}
#if !defined USESQL
// Clear old entries
new vault = nvault_open(g_savefile)
nvault_prune(vault, 0, get_systime() - (get_pcvar_num(cvar_daystosave)*86400))
nvault_close(vault)
#endif
}
#if !defined USESQL
// Write Save file
Write_AgreeSave(id)
{
new auth[35]
get_user_authid(id, auth, 34)
new vault = nvault_open(g_savefile)
nvault_set(vault, auth, "1")
nvault_close(vault)
}
// Check if user has agreed in the past
Check_AgreeSave(id)
{
new auth[35], bool:out, timestamp, value[2]
get_user_authid(id, auth, 34)
new vault = nvault_open(g_savefile)
if (nvault_lookup(vault, auth, value, sizeof(value)-1, timestamp))
{
out = true
nvault_touch(vault, auth)
}
nvault_close(vault)
return out
}
#endif
// Client left the server
public client_disconnect(id)
{
// Print message about disconnecting user if enabled
if (get_pcvar_num(cvar_connectmsg))
{
new name[32]
get_user_name(id, name, 31)
client_print(0, print_chat, "%s, disconnected.", name)
}
// Remove checker task
if (task_exists(id))
remove_task(id)
return PLUGIN_CONTINUE
}
// Client put in server
public client_putinserver(id)
{
new is_bot = is_user_bot(id)
new is_hltv = is_user_hltv(id)
// Print message about connecting user if enabled
if (get_pcvar_num(cvar_connectmsg))
{
new name[32]
get_user_name(id, name, 31)
// Use GeoIP Module if it is loaded
if (b_geoip && get_pcvar_num(cvar_showgeoip) && !is_bot && !is_hltv)
{
// Check the GeoIP for country
new country[46], ip[33]
get_user_ip(id, ip, 32)
geoip_country(ip, country, 45)
if (!equali(country, "error"))
client_print(0, print_chat, "%s, connected. (%s)", name, country)
else
client_print(0, print_chat, "%s, connected.", name)
}
else
client_print(0, print_chat, "%s, connected.", name)
}
iPingkick[id] = 0 // Reset ping kick counter
cvar_chkitem[id] = 0 // Reset invalid settings counter
if (!is_bot && !is_hltv)
{
new param[1]
param[0] = id
if (get_pcvar_num(cvar_agreemenu))
{
#if defined USESQL
if (!sql_checkid(id))
set_task(0.5, "cc_showmenu", id, _,_, "b")
else
set_task(5.0, "startchk", id, param, 1)
#else
if (!Check_AgreeSave(id))
set_task(0.5, "cc_showmenu", id, _,_, "b")
else
set_task(5.0, "startchk", id, param, 1)
#endif
} else
set_task(5.0, "startchk", id, param, 1)
}
return PLUGIN_CONTINUE
}
// Format the menu for agreement
stock format_menu(id)
{
new menu[1024],tmp[256]
formatex(tmp, sizeof(tmp)-1, "\yanti-lowrates (%d secs)^n^n", menu_timer[id]) // Menu Topic
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "Dieser Server prueft deine rates.(rate,cl_cmdrate,cl_updaterate,cl_lw,cl_lc)^n") // Menu 1st rule
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "Das bedeutet: Sollten eure rates zu niedrig sein,^n") // Menu 2nd rule
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "werden sie auf die min-Werte gesetzt.^n") // Menu 3rd rule
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "Bist Du damit einverstanden?^n^n") // Menu 4th rule
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "1. Ja^n") // Menu 5th rule (Agree)
strcat(menu, tmp, sizeof(menu)-1)
formatex(tmp, sizeof(tmp)-1, "2. Nein (Serverkick!)") // Menu 6th rule (Disagree)
strcat(menu, tmp, sizeof(menu)-1)
return menu
}
// Show agreement menu
public cc_showmenu(id)
{
new team[16], teamID = get_user_team(id, team, 15);
if (teamID == 1 || teamID == 2 || equal(team, "SPECTATOR"))
{
// remove old task
if (task_exists(id))
remove_task(id)
menu_timer[id] = get_pcvar_num(cvar_agreetimeout)
show_menu(id, keys, format_menu(id))
set_task(1.0, "cc_updatemenu", id, _,_, "a", menu_timer[id]+1)
}
}
// Update agreement menu
public cc_updatemenu(id)
{
--menu_timer[id]
if (menu_timer[id] < 0) {
new name[32], uID = get_user_userid(id)
get_user_name(id, name, 31)
client_print(0, print_chat, "[ClientChecker] %s, hat nicht zugestimmt. (Time out)", name)
server_cmd("kick #%d ^"Du hast nicht zugestimmt! (Time out)^"", uID)
} else
show_menu(id, keys, format_menu(id))
}
// Handle the keys for agreement menu
public cc_menuhandle(id, key)
{
switch(key)
{
case 0: // Agree
{
// Remove Menu update task
if (task_exists(id))
remove_task(id)
new param[1];param[0] = id
startchk(param)
// save agreement
#if defined USESQL
sql_addid(id)
#else
if (!Check_AgreeSave(id))
{
Write_AgreeSave(id)
}
#endif
}
case 1: // Disagree
{
// Remove Menu update task
if (task_exists(id))
remove_task(id)
new name[32], uID = get_user_userid(id)
get_user_name(id, name, 31)
client_print(0, print_chat, "[ClientChecker] %s, did not agree with the agreement.", name)
server_cmd("kick #%d ^"You did not agree with the agreement!^"", uID)
}
default: // Wrong key press
cc_showmenu(id)
}
}
// Start Checks
public startchk(param[])
{
new id = param[0]
// Print crap in console
if (get_pcvar_num(cvar_showinfo))
{
client_print(id, print_console, "------[ anti-lowrates ]------")
client_print(id, print_console, "Version: %s", VERSION)
client_print(id, print_console, "Ping check: %s", get_num_str(cvar_pingcheck))
client_print(id, print_console, "Rate check: %s", get_num_str(cvar_ratecheck))
client_print(id, print_console, "Cvar check: %s", get_num_str(cvar_cvarcheck))
client_print(id, print_console, "------------------------------")
client_print(id, print_console, "Max Ping: %d", get_pcvar_num(cvar_maxping))
client_print(id, print_console, "Warnings: %d", get_pcvar_num(cvar_maxpingwarns))
client_print(id, print_console, "Min rate: %d", get_pcvar_num(cvar_minrate))
client_print(id, print_console, "Min updaterate: %d", get_pcvar_num(cvar_minupdaterate))
client_print(id, print_console, "Min cmdrate: %d", get_pcvar_num(cvar_mincmdrate))
client_print(id, print_console, "------------------------------")
}
// Ping check messages
if (get_pcvar_num(cvar_pingcheck))
client_print(id, print_chat, "[ClientChecker] Players with ping above %d will be kicked!", get_pcvar_num(cvar_maxping))
// Run all checks before check cycle starts.
set_task(0.5, "FastCheck", id, param, 1, "b")
}
public FastCheck(param[])
{
new id = param[0]
// Check rates
if ((get_pcvar_num(cvar_ratecheck)) && (cvar_chkitem[id] == 0))
{
query_client_cvar(id, "rate", "ClientCvarResult")
query_client_cvar(id, "cl_updaterate", "ClientCvarResult")
query_client_cvar(id, "cl_cmdrate", "ClientCvarResult")
}
// Check other cvars
if (get_pcvar_num(cvar_cvarcheck))
{
new left[64], right[64]
strtok(cvars_buf[cvar_chkitem[id]], left, 63,right,63,' ')
if (get_pcvar_num(cvar_showinfo))
client_print(id, print_console, "[ClientChecker] Checking: %s", left)
query_client_cvar(id, left, "ClientCvarResult")
}
if (!get_pcvar_num(cvar_cvarcheck) || (cvar_chkitem[id] >= cvar_items-1))
{
cvar_chkitem[id] = 0
remove_task(id)
// Set task to check every X seconds
set_task(float(get_pcvar_num(cvar_chkdelay)), "CheckClient", id, param, 1, "b")
return PLUGIN_HANDLED
}
cvar_chkitem[id]++
return PLUGIN_CONTINUE
}
get_num_str(pcvar) {
new tmp[9]
switch(get_pcvar_num(pcvar))
{
case 0:
tmp = "disabled"
case 1:
tmp = "enabled"
}
return tmp
}
public CheckClient(param[])
{
new id = param[0]
if (!is_user_connected(id))
{
remove_task(id)
return PLUGIN_HANDLED
}
// Ping Check if enabled
if (get_pcvar_num(cvar_pingcheck))
{
new ping, loss
get_user_ping(id, ping, loss)
if (ping > get_pcvar_num(cvar_maxping))
{
++iPingkick[id]
client_print(id, print_chat, "[ClientChecker] Your ping is to high! (%d/%d)", iPingkick[id],get_pcvar_num(cvar_maxpingwarns))
}
else if (iPingkick[id] > 0)
--iPingkick[id]
if (iPingkick[id] > get_pcvar_num(cvar_maxpingwarns))
KickPlayer(id)
}
// Check rates
if (get_pcvar_num(cvar_ratecheck))
{
query_client_cvar(id, "rate", "ClientCvarResult")
query_client_cvar(id, "cl_updaterate", "ClientCvarResult")
query_client_cvar(id, "cl_cmdrate", "ClientCvarResult")
}
// Check other cvars
if (get_pcvar_num(cvar_cvarcheck))
{
new left[64],right[64]
new tmp = cvar_chkitem[id] + get_pcvar_num(cvar_maxitems)
if (tmp > cvar_items)
tmp = cvar_items
for (new i = cvar_chkitem[id]; i < tmp; i++)
{
strtok(cvars_buf[i], left, 63,right,63,' ')
query_client_cvar(id, left, "ClientCvarResult")
}
if (tmp >= cvar_items)
cvar_chkitem[id] = 0
else
cvar_chkitem[id] += get_pcvar_num(cvar_maxitems)
}
return PLUGIN_CONTINUE
}
public ClientCvarResult(id, const cvar[], const value[])
{
new minrate, mincmdrate, minupdrate
minrate = get_pcvar_num(cvar_minrate)
mincmdrate = get_pcvar_num(cvar_mincmdrate)
minupdrate = get_pcvar_num(cvar_minupdaterate)
new Float:f_value = str_to_float(value)
if (equali(value, "Bad CVAR request"))
return PLUGIN_HANDLED
// Check Rates
else if ((equal(cvar, "rate")) && (f_value < minrate))
{
cc_messagetype(id, cvar, value)
console_cmd(id, "rate %d", minrate)
return PLUGIN_HANDLED
}
else if ((equal(cvar, "cl_updaterate")) && (f_value < minupdrate))
{
cc_messagetype(id, cvar, value)
console_cmd(id, "cl_updaterate %d", minupdrate)
return PLUGIN_HANDLED
}
else if ((equal(cvar, "cl_cmdrate")) && (f_value < mincmdrate))
{
cc_messagetype(id, cvar,value)
console_cmd(id, "cl_cmdrate %d", mincmdrate)
return PLUGIN_HANDLED
}
else
{
// Check Other Cvars
if (b_oldcfg)
{
new left[64], right[64], chkcvar[64], chkvalue[64], setvalue[64], methode[64]
new Float:f_chkvalue
for (new i = 1; i < cvar_items; i++)
{
strtok(cvars_buf[i], left, 63, right, 63, ';');chkcvar = left;setvalue = right
strtok(chkcvar, left, 63, right, 63, ' ',1);chkcvar = left;methode = right
strtok(methode, left, 63, right, 63, ' ',1);methode = left;chkvalue = right
f_chkvalue = str_to_float(chkvalue)
// cvar must be equal
if ((equal(methode, "=")) && (equal(chkcvar, cvar)) && (!equal(chkvalue, value)))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
}
// cvar must be bigger
else if ((equal(methode, ">")) && (equal(chkcvar, cvar)) && (f_value > f_chkvalue))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
}
// cvar must be smaller
else if ((equal(methode, "<")) && (equal(chkcvar, cvar)) && (f_value < f_chkvalue))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
}
// cvar can be all except
else if ((equal(methode, "!")) && (equal(chkcvar, cvar)) && (equal(value, chkvalue)))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
}
}
}
else
{
new v_value[1024], timestamp
new vault = nvault_open("CvarCheck")
new x = nvault_lookup(vault, cvar, v_value, sizeof(v_value)-1, timestamp)
nvault_close(vault)
if (!x)
return PLUGIN_HANDLED
new setvalue[32], getvalue[32]
new Float:maxvalue, Float:minvalue
copy(setvalue, sizeof(setvalue)-1, get_value(v_value,"set_value"))
if (contain(v_value, "min_value") >= 0)
{
copy(getvalue, sizeof(getvalue)-1, get_value(v_value, "min_value"))
minvalue = str_to_float(getvalue)
if (equal(setvalue, "*") && contain(v_value, "max_value") != -1)
{
copy(getvalue, sizeof(getvalue)-1, get_value(v_value, "max_value"))
maxvalue = str_to_float(getvalue)
if (f_value < minvalue || f_value > maxvalue)
{
new avgvalue[32]
float_to_str((minvalue+maxvalue)/2, avgvalue, sizeof(avgvalue)-1)
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, avgvalue)
return PLUGIN_HANDLED
}
}
else if (f_value < minvalue)
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "max_value") >= 0)
{
maxvalue = Float:str_to_float(get_value(v_value, "max_value"))
if (f_value > maxvalue)
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "equal_to") >= 0)
{
if (cc_compare(value, get_value(v_value, "equal_to"), 1))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "!equal_to") >= 0)
{
if (!cc_compare(value, get_value(v_value, "!equal_to"), 1))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "contains") >= 0)
{
if (cc_compare(value, get_value(v_value, "contains"), 2))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "!contains") >= 0)
{
if (!cc_compare(value, get_value(v_value, "!contains"), 2))
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
if (contain(v_value, "regex") >= 0)
{
new pattern[256], Regex:re, ret , error[128]
copy(pattern, sizeof(pattern)-1, get_value(v_value, "regex"))
re = regex_match(value, pattern, ret, error, sizeof(error)-1)
if (re >= REGEX_OK)
{
cc_messagetype(id,cvar,value)
console_cmd(id, "%s %s", cvar, setvalue)
return PLUGIN_HANDLED
}
}
}
}
return PLUGIN_CONTINUE
}
cc_messagetype(id, const cvar[], const value[])
{
new name[32], is_admin, is_hltv, num
get_user_name(id, name, 31)
new type = get_pcvar_num(cvar_messagetype)
/*
type 1: Admins only
type 2: Checked Player + Admins
type 3: All Players
*/
if (type == 3)
{
client_print(0, print_chat, "-=Werte angepasst=-")
client_print(0, print_chat, "%d %s: %s %s", id, name, cvar, value)
}
else
{
new players[32], player
get_players(players, num, "c")
for (new i = 0;i < num;i++)
{
player = players[i]
is_hltv = is_user_hltv(player)
if (!is_hltv)
{
is_admin = is_user_admin(player)
switch(type)
{
case 1:
{
if (is_admin)
client_print(player, print_chat, "%d %s: %s %s", id, name, cvar, value)
}
case 2:
{
client_print(id, print_chat, "%d %s: %s %s", id, name ,cvar, value)
if (is_admin && id != player)
client_print(player, print_chat, "%d %s: %s %s", id, name, cvar, value)
}
}
}
}
}
// Write log
if (get_pcvar_num(cvar_writelog))
{
new auth [35]
get_user_authid(id, auth, 34)
log_to_file(logfile, "(%s) %s: %s %s",auth, name, cvar, value)
}
// Invalid settings counter
num = get_pcvar_num(cvar_maxinvalid)
if (num > 0)
{
client_isettings[id]++
if (client_isettings[id] >= num)
{
new uID = get_user_userid(id)
server_cmd("banid 1 #%d", uID)
client_print(id, print_console, "Kicked: konstant falsche Werte!Bitte aendern!")
server_cmd("kick #%d ^"Kicked: konstant falsche Werte!^"", uID)
client_print(0, print_chat, "[ClientChecker] %s, wurde wegen lowrates gekicked!", name)
}
}
return PLUGIN_CONTINUE
}
KickPlayer(id)
{
new name[32]
get_user_name(id, name, 31)
new uID = get_user_userid(id)
server_cmd("banid 1 #%d", uID)
client_print(id, print_console, "Kicked due to high ping!")
server_cmd("kick #%d ^"Kicked due to high ping!^"", uID)
client_print(0, print_chat, "[ClientChecker] %s, got kicked due to high ping!", name)
}
// Admin Commands
public Admin_Commands(id)
{
new value[8], num_value, cmd[16], name[32], uID[35], uIP[32], i
if (!is_user_admin(id))
{
client_print(id, print_console, "Access denied!")
return PLUGIN_HANDLED
}
read_argv(1, value, 7)
read_argv(0, cmd, 15)
num_value = str_to_num(value)
get_user_name(id, name, 31)
get_user_ip(id, uIP, 31)
get_user_authid(id, uID, 34)
if (equali(cmd, "cc_reloadcfg"))
{
client_print(id, print_console, "Reloading CVAR Checker")
cvar_items = 0
load_cvarsconfig()
}
for (i = 0;i < AdminCMDs1;i++)
{
if (equali(array_enable_disable[i], cmd))
{
if (equali(value, ""))
{
client_print(id, print_console, "^"%s^" ^"%d^"", cmd, get_cvar_num(cmd))
}
else if (!is_str_num(value))
{
client_print(id, print_console, "0 = Disable")
client_print(id, print_console, "1 = Enable")
}
else if ((num_value == 0) || (num_value == 1))
{
if (get_cvar_num(cmd) != num_value)
{
set_cvar_num(cmd, num_value)
client_print(id, print_console, "Changed cvar: %s %d", cmd, num_value)
// Write to log (if enabled)
if (get_pcvar_num(cvar_writelog) || equali(cmd, "cc_writelog"))
log_to_file(logfile, "Changed cvar: %s %d (by %s : %s : %s)", cmd, num_value, name, uID, uIP)
// Write new setting to config (if enabled)
if (get_pcvar_num(cvar_writecfg) || equali(cmd, "cc_writecfg"))
write_cfg(id, cmd, value)
}
else
client_print(id, print_console, "Nothing to be changed")
}
else {
client_print(id, print_console, "0 = Disable")
client_print(id, print_console, "1 = Enable")
}
return PLUGIN_HANDLED
}
}
for (i = 0;i < AdminCMDs2;i++)
{
if (equali(array_cmd_cvars[i], cmd))
{
if (equali(value, "") || strlen(value) == 0)
{
client_print(id, print_console, "^"%s^" ^"%d^"", cmd, get_cvar_num(cmd))
}
else if (!is_str_num(value))
{
client_print(id, print_console, "No valid value given.")
}
// Check delay changed: Update tasks with new check delay
else if ((equali("cc_chkdelay", cmd)) && (get_pcvar_num(cvar_chkdelay) != num_value))
{
new players[32], num, player
get_players(players, num, "c")
for (i = 0; i < num;i++)
{
player = players[i]
if (task_exists(player))
change_task(player, str_to_float(value))
}
}
else if (get_cvar_num(cmd) != num_value)
{
set_cvar_num(cmd, num_value)
client_print(id, print_console, "Changed cvar: %s %d", cmd, num_value)
// Write to log (if enabled)
if (get_pcvar_num(cvar_writelog) || equali(cmd, "cc_writelog"))
log_to_file(logfile, "Changed cvar: %s %d (by %s : %s : %s)", cmd, num_value, name, uID, uIP)
// Write new setting to config (if enabled)
if (get_pcvar_num(cvar_writecfg) || equali(cmd, "cc_writecfg"))
write_cfg(id, cmd, value)
}
else
client_print(id, print_console, "Nothing to be changed")
break // Break the loop
}
}
return PLUGIN_HANDLED
}
// Write new setting to config file
write_cfg(id, const cmd[], const value[])
{
new buffer[1024], bool:b_wrote, line = 0, len
new bufsize = sizeof(buffer)-1
if (file_exists(g_configfile))
{
new left[64], right[32], data[1024]
while(read_file(g_configfile, line, buffer, bufsize, len))
{
strtok(buffer,left, 63, right, 31)
if (equal(left, cmd))
{
formatex(data, 1023, "%s %s", cmd, value)
write_file(g_configfile, data, line)
b_wrote = true
}
++line
}
if (strfind(buffer, "^n") == -1)
write_file(g_configfile, "")
}
if (!b_wrote)
{
formatex(buffer, bufsize, "%s %s", cmd, value)
write_file(g_configfile, buffer)
}
client_print(id, print_console, "Wrote ^"%s %s^" to ^"%s^"", cmd, value, cfgfile)
return PLUGIN_CONTINUE
}
cc_compare(const value1[], const value2[], method)
{
new left[128], right[1024]
new bool:loop = true
strtok(value2, left, sizeof(left)-1, right, sizeof(right)-1, ',')
while(loop)
{
switch(method)
{
case 1: // equal to
{
// check if value is numeric
if (is_str_num(left))
if (str_to_float(left) == str_to_float(value1))
return true
if (equali(left, value1))
return true
}
case 2: // contains
{
if (containi(value1,left) >= 0)
return true
}
}
strtok(right, left, sizeof(left)-1, right, sizeof(right)-1, ',')
if (contain(right, ",") == -1 && strlen(left) == 0)
loop = false
}
return false
}
get_value(const value[], const type[])
{
new pos = strfind(value, type)
new len = strlen(type)
new left[1024]
new right[2]
strtok(value[len+pos+1], left, sizeof(left)-1, right, sizeof(right)-1, ';')
return left
}
load_cvarsconfig()
{
new line, text[1024], txtlen, bool:b_open
// remove old nvault file
new nvault_file[92]
get_datadir(nvault_file, sizeof(nvault_file)-1)
format(nvault_file, sizeof(nvault_file)-1, "%s/vault/CvarCheck.vault", nvault_file)
if (file_exists(nvault_file))
delete_file(nvault_file)
new item[64], value[2048], timestamp
new vault = nvault_open("CvarCheck")
new left[64], right[256]
new Regex:re, ret, error[128]
while (read_file(g_chkcvarfile, line, text, sizeof(text)-1, txtlen))
{
trim(text)
if ((strfind(text, "//", 0, 0) != 0 || strfind(text, ";", 0, 0) != 0) && txtlen > 0)
{
// check if using the old config file
re = regex_match(text, ".+\s[=,>,<,!]\s.+;.+", ret, error, sizeof(error)-1)
if (re >= REGEX_OK)
{
server_print("[ClientChecker] Detected the old config file")
b_oldcfg = true
break
}
strtok(text, left, sizeof(left)-1, right, sizeof(right)-1) // split line
if (b_open)
{
if (equal(text, "}"))
{
b_open = false
nvault_set(vault, item, value)
copy(value, sizeof(value)-1, "") // Clear value
continue
}
else if (equal(left, "min_value"))
{
format(value, sizeof(value)-1, "%s;min_value:%s", value, right)
}
else if (equal(left, "max_value"))
{
format(value, sizeof(value)-1, "%s;max_value:%s", value, right)
}
else if (equal(left, "set_value"))
{
format(value, sizeof(value)-1, "set_value:%s%s", right, value)
}
else if (equal(left, "contains"))
{
format(value, sizeof(value)-1, "%s;contains:%s", value, right)
}
else if (equal(left, "!contains"))
{
format(value, sizeof(value)-1, "%s;!contains:%s", value, right)
}
else if (equal(left, "equal_to"))
{
format(value, sizeof(value)-1, "%s;equal_to:%s", value, right)
}
else if (equal(left, "!equal_to"))
{
format(value, sizeof(value)-1, "%s;!equal_to:%s", value, right)
}
else if(equal(left, "regex"))
{
format(value, sizeof(value)-1, "%s;regex:%s", value, right)
}
}
}
if (strlen(left) > 0 && equal(right, "{")) // Check line for "item {"
{
b_open = true
copy(item, sizeof(item)-1, left)
nvault_lookup(vault, item, value , sizeof(value)-1, timestamp)
cvars_buf[cvar_items] = item
cvar_items++
}
line++
}
nvault_close(vault)
if (b_oldcfg)
{
new buf[64]
new fp=fopen(g_chkcvarfile, "rt")
cvar_items = 0
new len, x
while (!feof(fp))
{
fgets(fp, buf, sizeof(buf)-1)
trim(buf)
len = strlen(buf)
if (len > 0)
{
// Check if line starts with comment sign
if (cvar_items == MAXITEMS)
break
x = strfind(buf, "//", 0, 0)
if (x != 0)
{
cvars_buf[cvar_items] = buf
cvar_items++
}
}
}
fclose(fp)
}
}
#if defined USESQL
public sql_connect()
{
new error[256]
get_pcvar_string(cvar_sqlhost, sql_host, sizeof(sql_host))
get_pcvar_string(cvar_sqluser, sql_user, sizeof(sql_user))
get_pcvar_string(cvar_sqlpass, sql_pass, sizeof(sql_pass))
get_pcvar_string(cvar_sqldbname, sql_dbname, sizeof(sql_dbname))
sql = dbi_connect(sql_host, sql_user, sql_pass, sql_dbname, error, sizeof(error)-1)
if (sql <= SQL_FAILED)
log_amx("SQL CONNECT ERROR: %s", error)
}
public sql_checkid(id)
{
sql_connect()
if (sql <= SQL_FAILED)
{
log_amx("Could not check database due to a connection error!")
return 0
}
else
{
new steamid[35]
get_user_authid(id, steamid, sizeof(steamid)-1)
new query[256]
formatex(query, sizeof(query)-1, "SELECT steamid FROM s_SteamIDs WHERE steamid = '%s'", steamid)
new Result:result = dbi_query(sql, query)
dbi_close(sql)
if (result >= RESULT_OK)
{
new temp[35]
dbi_result(result, "steamid", temp, sizeof(temp)-1)
dbi_free_result(result)
if (equali(temp, steamid))
return 1
}
}
return 0
}
public sql_addid(id)
{
sql_connect()
if (sql <= SQL_FAILED)
log_amx("Could not add a new steamid to the database due to a connection error!")
else
{
new steamid[35]
get_user_authid(id, steamid, sizeof(steamid)-1)
new query[256]
formatex(query, sizeof(query)-1, "INSERT INTO s_SteamIDs (steamid) values ('%s')", steamid)
new Result:result = dbi_query(sql, query)
if (result == RESULT_FAILED)
log_amx("SQL Failed to add new steamid to database")
}
dbi_close(sql)
}
#endif
Last edited by amokossi; 07-31-2010 at 17:21.
|
|