#include <sdktools>
#include <cstrike>
int punish = 2; //наказание. 1 = не пускать в игру, держать в наблюдателях. 2 = шлепать кажды раунд.
bool bBlock[MAXPLAYERS + 1] = {false, ...}
Handle hQueryCvarsTimer;
int iCmdRate[MAXPLAYERS + 1], iUpdateRate[MAXPLAYERS + 1], iRate[MAXPLAYERS + 1], iCount[MAXPLAYERS + 1];
float fInterp[MAXPLAYERS + 1];
public Plugin myinfo = {
name = "Client Rates Manager",
author = "null",
description = "Rates checker",
}
public void OnPluginStart() {
AddCommandListener(Block, "");
HookEvent("round_start", RoundStart);
}
public void round_start() {
hQueryCvarsTimer = CreateTimer(20.0, OnQueryTimer, _, TIMER_REPEAT);
PrecacheSound("player/damage3.wav", true);
}
public void OnMapEnd() {
delete hQueryCvarsTimer;
}
public Action OnQueryTimer(Handle timer) {
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i)) {
QueryCvars(i);
}
}
public void OnClientPutInServer(int client) {
iCount[client] = 0;
QueryCvars(client);
}
public void RoundStart(Event event, const char[] name, bool dontBroadcast) {
if(punish == 2) {
CreateTimer(0.5, DoSlap, _, TIMER_FLAG_NO_MAPCHANGE);
}
}
public Action DoSlap(Handle timer) {
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i) && bBlock) {
Slap(i);
NotifyAdmin(i);
}
}
public Action Block(int client, const char[] command, int argc) {
if(punish == 1 && client > 0 && bBlock[client]) {
return Plugin_Handled;
}
return Plugin_Continue;
}
public void CvarResults(QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvar, const char[] cvarvalue, any value) {
if(result == ConVarQuery_Okay) {
if(cvar[3] == 'c') {
iCmdRate[client] = StringToInt(cvarvalue);
if(StringToInt(cvarvalue) != 66) {
iCount[client]++;
}
}
}
}
public void CvarResults2(QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvar, const char[] cvarvalue, any value) {
if(result == ConVarQuery_Okay) {
if(cvar[3] == 'u') {
iUpdateRate[client] = StringToInt(cvarvalue);
if(StringToInt(cvarvalue) != 66) {
iCount[client]++;
}
}
}
}
public void CvarResults3(QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvar, const char[] cvarvalue, any value) {
if(result == ConVarQuery_Okay) {
if(cvar[3] == 'i') {
fInterp[client] = StringToFloat(cvarvalue);
if(StringToFloat(cvarvalue) < 0.015 || StringToFloat(cvarvalue) > 0.031) {
iCount[client]++;
}
}
}
}
public void CvarResults4(QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvar, const char[] cvarvalue, any value) {
if(result == ConVarQuery_Okay) {
if(cvar[0] == 'r') {
iRate[client] = StringToInt(cvarvalue);
if(StringToInt(cvarvalue) < 30000 || StringToInt(cvarvalue) > 35000) {
iCount[client]++;
}
}
}
if(iCount[client] > 0) BlockClient(client);
else UnBlockClient(client);
iCount[client] = 0;
}
public void RatesPanel(int client) {
Panel panel = new Panel(GetMenuStyleHandle(MenuStyle_Radio));
char cBuffer[64];
panel.DrawItem("Пoжaлyйста cдeлайте cлeдyющие:", ITEMDRAW_RAWLINE);
panel.DrawItem("1.Включите консоль (Настройки > Клавиатура > Дополнительно)", ITEMDRAW_RAWLINE);
panel.DrawItem("2.Перейти в НАБЛЮДЕНИЕ, открыть консоль (нажмите ~ или Ё)", ITEMDRAW_RAWLINE);
panel.DrawItem("3.Напишите туда следующие значение:", ITEMDRAW_RAWLINE);
panel.DrawItem("", ITEMDRAW_SPACER);
if(iCmdRate[client] != 66) {
Format(cBuffer, sizeof(cBuffer), "cl_cmdrate 66", iCmdRate[client]);
panel.DrawItem(cBuffer, ITEMDRAW_RAWLINE);
}
if(iUpdateRate[client] != 66) {
Format(cBuffer, sizeof(cBuffer), "cl_updaterate 66", iUpdateRate[client]);
panel.DrawItem(cBuffer, ITEMDRAW_RAWLINE);
}
if(fInterp[client] < 0.015 || fInterp[client] > 0.031) {
Format(cBuffer, sizeof(cBuffer), "cl_interp 0.015", fInterp[client]);
panel.DrawItem(cBuffer, ITEMDRAW_RAWLINE);
}
if(iRate[client] < 30000 || iRate[client] > 35000) {
Format(cBuffer, sizeof(cBuffer), "rate 30000", iRate[client]);
panel.DrawItem(cBuffer, ITEMDRAW_RAWLINE);
}
panel.DrawItem("", ITEMDRAW_SPACER);
if(punish == 1) {
panel.DrawItem("Поменяйте рейты на эти значении чтобы играть!", ITEMDRAW_RAWLINE);
}
if(punish == 2) {
panel.DrawItem("Пропишите в консоль пожалуйста для комфортной игры.", ITEMDRAW_RAWLINE);
}
panel.SetKeys(1023);
panel.Send(client, MenuHandler_Panel, 10);
delete panel;
}
int MenuHandler_Panel(Menu menu, MenuAction action, int param1, int param2) {
if(action == MenuAction_Select || action == MenuAction_Cancel) {
if(bBlock[param1]) {
return;
}
else delete menu;
}
}
void QueryCvars(int client) {
QueryClientConVar(client, "cl_cmdrate", CvarResults);
QueryClientConVar(client, "cl_updaterate", CvarResults2);
QueryClientConVar(client, "cl_interp", CvarResults3);
QueryClientConVar(client, "rate", CvarResults4);
}
void BlockClient(int client) {
RatesPanel(client);
bBlock[client] = true;
}
void UnBlockClient(int client) {
bBlock[client] = false;
}
void Slap(int client) {
EmitSoundToClient(client, "player/damage3.wav");
}
void NotifyAdmin(int client) {
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetAdminFlag(GetUserAdmin(i), Admin_Ban)) {
PrintToChat(i, "Игрок %N был шлепнут за неправильные рейты", client);
}
}