/
//#include <sourcemod>
#undef REQUIRE_PLUGIN
#include <adminmenu>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo =
{
name = "ReportSystem",
author = "Drumanid",
version = "1.0",
url = "http://vk.com/drumanid"
};
#define CONFIG "addons/sourcemod/data/ReportSystem.ini" // База данных
#define LOGS "addons/sourcemod/logs/ReportSystem.log" // Логи
TopMenu MenuReports = null;
TopMenuObject ReportCategory = INVALID_TOPMENUOBJECT;
Handle kv;
int warn[MAXPLAYERS +1];
ConVar AmountWarinings, LogMessages, ChatMessages;
public void OnPluginStart()
{
//RegAdminCmd("sm_report", ReportMenu, ADMFLAG_ROOT);
RegConsoleCmd("sm_report", ReportMenu);
kv = CreateKeyValues("ReportSystem");
if(!FileToKeyValues(kv, CONFIG)) KeyValuesToFile(kv, CONFIG);
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i)) CheckConfig(i);
AmountWarinings = CreateConVar("AmountWarinings", "5", "Максимальное количество выдаваемых предупреждений игроку | Максимально предупреждений: 5", _, true, 0.0, true, 5.0);
LogMessages = CreateConVar("LogMessages", "1", "Логировать(записывать) сообщения о выдаче/снятии предупреждений игрока? | 0 - выключить / 1 - включить", _, true, 0.0, true, 1.0);
ChatMessages = CreateConVar("ChatMessages", "1", "Показывать сообщения плагина в чате? Пример: Такой то игрок выдал/снял такому то игроку предупреждение | 0 - выключить / 1 - включить", _, true, 0.0, true, 1.0);
AutoExecConfig(true, "ReportSystem");
if(LibraryExists("adminmenu"))
{
TopMenu hTopMenu;
if((hTopMenu = GetAdminTopMenu()) != null) OnAdminMenuReady(hTopMenu);
}
}
public void OnLibraryRemoved(const char[] szName) {if(StrEqual(szName, "adminmenu")) MenuReports = null;}
public void OnAdminMenuReady(Handle aTopMenu)
{
TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);
if(hTopMenu == MenuReports) return;
MenuReports = hTopMenu;
ReportCategory = MenuReports.AddCategory("Reports", Handler_MenuReportAdmin, "sm_report", ADMFLAG_CUSTOM4, "ReportsMenu");
if(ReportCategory != INVALID_TOPMENUOBJECT)
{
MenuReports.AddItem("Warning", Handler_Warning, ReportCategory, "warning", ADMFLAG_CUSTOM4, "Выдача предупреждения");
MenuReports.AddItem("ClearWarning", Handler_ClearWarning, ReportCategory, "clearwarning", ADMFLAG_CUSTOM4, "Снятие предупреждения");
}
}
public void Handler_MenuReportAdmin(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int client, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DisplayOption: FormatEx(sBuffer, maxlength, "Меню предупреждений");
case TopMenuAction_DisplayTitle: FormatEx(sBuffer, maxlength, "Меню предупреждений \n \n");
}
}
public void Handler_Warning(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int client, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DisplayOption: FormatEx(sBuffer, maxlength, "Выдать предупреждение");
case TopMenuAction_SelectOption: Warning(client);
}
}
public void Handler_ClearWarning(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int client, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DisplayOption: FormatEx(sBuffer, maxlength, "Снять предупреждение");
case TopMenuAction_SelectOption: ClearWarning(client);
}
}
public void OnClientPostAdminCheck(int client) {CheckConfig(client);}
public void OnClientDisconnect(int client) {warn[client] = 0;}
public void CheckConfig(int client)
{
AdminId admin = GetUserAdmin(client);
if(GetAdminFlag(admin, Admin_Kick) && !IsFakeClient(client)) // флаг 'kick'
{
char steamid[32], name[32];
GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
GetClientName(client, name, sizeof(name));
if(KvJumpToKey(kv, steamid)) warn[client] = KvGetNum(kv, "warning");
else
{
KvJumpToKey(kv, steamid, true);
KvSetString(kv, "name", name);
warn[client] = 0;
KvSetNum(kv, "warning", 0);
}
KvRewind(kv);
KeyValuesToFile(kv, CONFIG);
}
}
public Action ReportMenu(int client, int args)
{
if(client > 0 && args < 1)
{
AdminId admin = GetUserAdmin(client);
if(GetAdminFlag(admin, Admin_Custom4)) Reports(client); // флаг 'r'
else PrintToChat(client, " \x07У вас нет доступа к этой функции!");
}
return Plugin_Handled;
}
public void Reports(int client)
{
Menu hMenu = new Menu(ReportOptions);
hMenu.ExitButton = true;
hMenu.SetTitle("Меню предупреждений\n \n");
hMenu.AddItem("", "Выдать предупреждение");
hMenu.AddItem("", "Снять предупреждение");
hMenu.Display(client, MENU_TIME_FOREVER);
}
public int ReportOptions(Menu hMenu, MenuAction action, int client, int option)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
switch(option)
{
case 0: Warning(client);
case 1: ClearWarning(client);
}
}
}
}
public void Warning(int client)
{
Menu hMenu = new Menu(WarningOptions);
hMenu.ExitButton = true;
hMenu.SetTitle("Выберите игрока: \nНикнейм | Количество предупреждений \n \n");
char id[15], name[32], Buffer[64];
for (int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && !IsClientSourceTV(i))
{
AdminId admin = GetUserAdmin(i);
if(GetAdminFlag(admin, Admin_Kick) && i != client)
{
IntToString(GetClientUserId(i), id, sizeof(id));
GetClientName(i, name, sizeof(name));
Format(Buffer, sizeof(Buffer), "%s | %i/%i", name, warn[i], GetConVarInt(AmountWarinings));
hMenu.AddItem(id, Buffer);
}
else PrintToChat(i, " \x07Администраторы не найдены!");
}
}
hMenu.Display(client, MENU_TIME_FOREVER);
}
public int WarningOptions(Menu hMenu, MenuAction action, int client, int option)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
char id[15];
hMenu.GetItem(option, id, sizeof(id));
int target = GetClientOfUserId(StringToInt(id));
warn[target] += 1;
char steamid[32], name[32];
GetClientAuthId(target, AuthId_Steam2, steamid, sizeof(steamid));
GetClientName(target, name, sizeof(name));
if(GetConVarBool(LogMessages)) LogToFile(LOGS, "%N - выдал %i из %i предупреждений администратору %s", client, warn[target], GetConVarInt(AmountWarinings), name);
if(GetConVarBool(ChatMessages))
{
PrintToChatAll(" \x04%N\x01 выдал предупреждение \x07%s", client, name);
PrintToChat(target, " У вас \x07%i \x01предупреждений из \x07%i", warn[target], GetConVarInt(AmountWarinings));
}
if(warn[target] == GetConVarInt(AmountWarinings))
{
KvJumpToKey(kv, steamid);
KvSetNum(kv, "warning", 0);
LogToFile(LOGS, "%s - был забанен, причина: %i-е предупреждение!", name, GetConVarInt(AmountWarinings));
PrintToChatAll(" \x07%s \x01- был забанен навсегда.", name);
PrintToChatAll(" Причина: \x07%i-е\x01 предупреждение.", GetConVarInt(AmountWarinings));
ServerCommand("sm_ban \"%s\" \"0\" \"Вы были забанены навсегда | %i предупреждений\"", name, GetConVarInt(AmountWarinings));
}
else
{
KvJumpToKey(kv, steamid);
KvSetNum(kv, "warning", warn[target]);
}
KvRewind(kv);
KeyValuesToFile(kv, CONFIG);
}
}
}
public void ClearWarning(int client)
{
Menu hMenu = new Menu(ClearWarningOptions);
hMenu.ExitButton = true;
hMenu.SetTitle("Выберите игрока: \nНикнейм | Количество предупреждений \n \n");
char id[15], name[32], Buffer[64];
for (int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && !IsClientSourceTV(i))
{
AdminId admin = GetUserAdmin(i);
if(GetAdminFlag(admin, Admin_Kick) && i != client)
{
IntToString(GetClientUserId(i), id, sizeof(id));
GetClientName(i, name, sizeof(name));
Format(Buffer, sizeof(Buffer), "%s | %i/%i", name, warn[i], GetConVarInt(AmountWarinings));
hMenu.AddItem(id, Buffer);
}
else PrintToChat(i, " \x07Администраторы не найдены!");
}
}
hMenu.Display(client, MENU_TIME_FOREVER);
}
public int ClearWarningOptions(Menu hMenu, MenuAction action, int client, int option)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
char id[15];
hMenu.GetItem(option, id, sizeof(id));
int target = GetClientOfUserId(StringToInt(id));
if(warn[target] > 0)
{
warn[target] -= 1;
char steamid[32], name[32];
GetClientAuthId(target, AuthId_Steam2, steamid, sizeof(steamid));
GetClientName(target, name, sizeof(name));
if(GetConVarBool(LogMessages)) LogToFile(LOGS, "%N - снял %i из %i предупреждений администратору %s", client, warn[target], GetConVarInt(AmountWarinings), name);
if(GetConVarBool(ChatMessages))
{
PrintToChatAll(" \x04%N\x01 снял предупреждение с \x07%s", client, name);
PrintToChat(target, " У вас \x07%i \x01предупреждений из \x07%i", warn[target], GetConVarInt(AmountWarinings));
}
KvJumpToKey(kv, steamid);
KvSetNum(kv, "warning", warn[target]);
}
else PrintToChat(client, " \x07У игрока нет предупреждений!");
KvRewind(kv);
KeyValuesToFile(kv, CONFIG);
}
}
}
// © Коты рулят