Идея для плагина. [Система выговоров]

N

nightcore

Помню в сампе была такая штука, называлась "Система выговоров". Тот, у кого иммунитет больше, может по команде !warn - выдавать выговоры админам /checkwarn(Для всех админов) - чекнуть выговоры, /resetwarns - обнулить выговоры и /unwarn - снять 1 выговор. Если выговоров больше 3, то админка снимается. Что-то не могу я такое найти под CSGO и с поддержкой sb/material admin.
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
вроде ж было что-то такое на форуме
 

Черная вдова

Участник
Сообщения
2,795
Реакции
670
Для владельцев, которые следят за администрацией, очень даже хорошая.
Если у тебя их 300, а если 30 и меньше, то нарушение администратора рассматривается на форуме, приложив доказательства
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Реализовал что-то похожее, причины не стал делать, лень.
И вместо того чтобы снимать админку, игрока будет банить навсегда при получении лимита предупреждений.

ReportSystem 1.0

Открыть меню предупреждений можно через админку или при помощи команды !report | Доступ к меню > флаг 'r'.
Администраторы отображаемые в меню > флаг 'Кика'.

PHP:
// Максимальное количество выдаваемых предупреждений игроку | Максимально предупреждений: 5
// -
// Default: "5"
// Minimum: "0.000000"
// Maximum: "5.000000"
AmountWarinings "5"

// Показывать сообщения плагина в чате? Пример: Такой то игрок выдал/снял такому то игроку предупреждение | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
ChatMessages "1"

// Логировать(записывать) сообщения о выдаче/снятии предупреждений игрока? | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
LogMessages "1"

upload_2017-6-28_8-27-55.png


upload_2017-6-28_8-28-12.png


upload_2017-6-28_8-28-28.png

PHP:
/
//#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);
        }
    }
}

// © Коты рулят
 

Вложения

  • ReportSystem.rar
    13.2 КБ · Просмотры: 27
Последнее редактирование:

Vladimir Serebrennikov

#говнокодер
Сообщения
388
Реакции
71
Реализовал что-то похожее, причины не стал делать, лень.
И вместо того чтобы снимать админку, игрока будет банить навсегда при получении лимита предупреждений.

ReportSystem 1.0

Открыть меню предупреждений можно через админку или при помощи команды !report | Доступ к меню > флаг 'r'.
Администраторы отображаемые в меню > флаг 'Кика'.

PHP:
// Максимальное количество выдаваемых предупреждений игроку | Максимально предупреждений: 5
// -
// Default: "5"
// Minimum: "0.000000"
// Maximum: "5.000000"
AmountWarinings "5"

// Показывать сообщения плагина в чате? Пример: Такой то игрок выдал/снял такому то игроку предупреждение | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
ChatMessages "1"

// Логировать(записывать) сообщения о выдаче/снятии предупреждений игрока? | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
LogMessages "1"


PHP:
/
//#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);
        }
    }
}

// © Коты рулят


Закинь в ресурсы.
Красота же.
Спасибо за старания!
 

September

Участник
Сообщения
5,238
Реакции
2,742
  • Команда форума
  • #11
Реализовал что-то похожее, причины не стал делать, лень.
И вместо того чтобы снимать админку, игрока будет банить навсегда при получении лимита предупреждений.

ReportSystem 1.0

Открыть меню предупреждений можно через админку или при помощи команды !report | Доступ к меню > флаг 'r'.
Администраторы отображаемые в меню > флаг 'Кика'.

PHP:
// Максимальное количество выдаваемых предупреждений игроку | Максимально предупреждений: 5
// -
// Default: "5"
// Minimum: "0.000000"
// Maximum: "5.000000"
AmountWarinings "5"

// Показывать сообщения плагина в чате? Пример: Такой то игрок выдал/снял такому то игроку предупреждение | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
ChatMessages "1"

// Логировать(записывать) сообщения о выдаче/снятии предупреждений игрока? | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
LogMessages "1"


PHP:
/
//#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);
        }
    }
}

// © Коты рулят

mysql бы прикрутить)
 
N

nightcore

Реализовал что-то похожее, причины не стал делать, лень.
И вместо того чтобы снимать админку, игрока будет банить навсегда при получении лимита предупреждений.

ReportSystem 1.0

Открыть меню предупреждений можно через админку или при помощи команды !report | Доступ к меню > флаг 'r'.
Администраторы отображаемые в меню > флаг 'Кика'.

PHP:
// Максимальное количество выдаваемых предупреждений игроку | Максимально предупреждений: 5
// -
// Default: "5"
// Minimum: "0.000000"
// Maximum: "5.000000"
AmountWarinings "5"

// Показывать сообщения плагина в чате? Пример: Такой то игрок выдал/снял такому то игроку предупреждение | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
ChatMessages "1"

// Логировать(записывать) сообщения о выдаче/снятии предупреждений игрока? | 0 - выключить / 1 - включить
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
LogMessages "1"


PHP:
/
//#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);
        }
    }
}

// © Коты рулят
Ууууух, красота, но бан - это слишком жёстко :D Замутите кто-нибудь снятие с админки в SB и возможность написать причину предупреждения
 

Vladimir Serebrennikov

#говнокодер
Сообщения
388
Реакции
71
Ууууух, красота, но бан - это слишком жёстко :D Замутите кто-нибудь снятие с админки в SB и возможность написать причину предупреждения

Может релизнет в ресурсы) и будет апдейтить его.
но это не точно)
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Закинь в ресурсы.
Красота же.
Спасибо за старания!
Лень.
mysql бы прикрутить)
Может быть, если желание появится. Mysql в плагинах не использовал еще ни разу.
Ууууух, красота, но бан - это слишком жёстко :D Замутите кто-нибудь снятие с админки в SB и возможность написать причину предупреждения
Тот же ответ что и September'y. Не использую SourceBans, для меня проще забанить администратора и он уже не сможет использовать админку, а разбанить секундное дело.
 
Сверху Снизу