Help Menu Вырезать функцию

Тема в разделе "Программирование / Скриптинг", создана пользователем nuPAT, 22 авг 2016.

  1. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Всем привет. Вырежьте пожалуйста из плагина ф-цию "map rotation", отвечающую за показ списка карт в меню. Мне это не нужно т.к одна карта.

    Код:
    /*
    * In-game Help Menu
    * Written by chundo ([email protected])
    *
    * Licensed under the GPL version 2 or above
    */
    
    #pragma semicolon 1
    
    #include <sourcemod>
    
    #define PLUGIN_VERSION "0.3"
    
    enum ChatCommand {
        String:command[32],
        String:description[255]
    }
    
    enum HelpMenuType {
        HelpMenuType_List,
        HelpMenuType_Text
    }
    
    enum HelpMenu {
        String:name[32],
        String:title[128],
        HelpMenuType:type,
        Handle:items,
        itemct
    }
    
    // CVars
    new Handle:g_cvarWelcome = INVALID_HANDLE;
    new Handle:g_cvarAdmins = INVALID_HANDLE;
    
    // Help menus
    new Handle:g_helpMenus = INVALID_HANDLE;
    
    // Map cache
    new Handle:g_mapArray = INVALID_HANDLE;
    new g_mapSerial = -1;
    
    // Config parsing
    new g_configLevel = -1;
    
    public Plugin:myinfo =
    {
        name = "In-game Help Menu",
        author = "chundo",
        description = "Display a help menu to users",
        version = PLUGIN_VERSION,
        url = "http://www.mefightclub.com"
    };
    
    public OnPluginStart() {
        CreateConVar("sm_helpmenu_version", PLUGIN_VERSION, "Help menu version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        g_cvarWelcome = CreateConVar("sm_helpmenu_welcome", "1", "Show welcome message to newly connected users.", FCVAR_PLUGIN);
        g_cvarAdmins = CreateConVar("sm_helpmenu_admins", "1", "Show a list of online admins in the menu.", FCVAR_PLUGIN);
        RegConsoleCmd("sm_helpmenu", Command_HelpMenu, "Display the help menu.", FCVAR_PLUGIN);
    
        new String:hc[PLATFORM_MAX_PATH];
        BuildPath(Path_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
        g_mapArray = CreateArray(32);
        ParseConfigFile(hc);
    
        AutoExecConfig(false);
    }
    
    public OnMapStart() {
        new String:hc[PLATFORM_MAX_PATH];
        BuildPath(Path_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
        ParseConfigFile(hc);
    }
    
    public OnClientPutInServer(client) {
        if (GetConVarBool(g_cvarWelcome))
            CreateTimer(30.0, Timer_WelcomeMessage, client);
    }
    
    public Action:Timer_WelcomeMessage(Handle:timer, any:client) {
        if (GetConVarBool(g_cvarWelcome) && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client))
            PrintToChat(client, "\x01[SM] For help, type \x04!helpmenu\x01 in chat");
    }
    
    bool:ParseConfigFile(const String:file[]) {
        if (g_helpMenus != INVALID_HANDLE) {
            ClearArray(g_helpMenus);
            CloseHandle(g_helpMenus);
            g_helpMenus = INVALID_HANDLE;
        }
    
        new Handle:parser = SMC_CreateParser();
        SMC_SetReaders(parser, Config_NewSection, Config_KeyValue, Config_EndSection);
        SMC_SetParseEnd(parser, Config_End);
    
        new line = 0;
        new col = 0;
        new String:error[128];
        new SMCError:result = SMC_ParseFile(parser, file, line, col);
        CloseHandle(parser);
    
        if (result != SMCError_Okay) {
            SMC_GetErrorString(result, error, sizeof(error));
            LogError("%s on line %d, col %d of %s", error, line, col, file);
        }
    
        return (result == SMCError_Okay);
    }
    
    public SMCResult:Config_NewSection(Handle:parser, const String:section[], bool:quotes) {
        g_configLevel++;
        if (g_configLevel == 1) {
            new hmenu[HelpMenu];
            strcopy(hmenu[name], sizeof(hmenu[name]), section);
            hmenu[items] = CreateDataPack();
            hmenu[itemct] = 0;
            if (g_helpMenus == INVALID_HANDLE)
                g_helpMenus = CreateArray(sizeof(hmenu));
            PushArrayArray(g_helpMenus, hmenu[0]);
        }
        return SMCParse_Continue;
    }
    
    public SMCResult:Config_KeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes) {
        new msize = GetArraySize(g_helpMenus);
        new hmenu[HelpMenu];
        GetArrayArray(g_helpMenus, msize-1, hmenu[0]);
        switch (g_configLevel) {
            case 1: {
                if(strcmp(key, "title", false) == 0)
                    strcopy(hmenu[title], sizeof(hmenu[title]), value);
                if(strcmp(key, "type", false) == 0) {
                    if(strcmp(value, "text", false) == 0)
                        hmenu[type] = HelpMenuType_Text;
                    else
                        hmenu[type] = HelpMenuType_List;
                }
            }
            case 2: {
                WritePackString(hmenu[items], key);
                WritePackString(hmenu[items], value);
                hmenu[itemct]++;
            }
        }
        SetArrayArray(g_helpMenus, msize-1, hmenu[0]);
        return SMCParse_Continue;
    }
    public SMCResult:Config_EndSection(Handle:parser) {
        g_configLevel--;
        if (g_configLevel == 1) {
            new hmenu[HelpMenu];
            new msize = GetArraySize(g_helpMenus);
            GetArrayArray(g_helpMenus, msize-1, hmenu[0]);
            ResetPack(hmenu[items]);
        }
        return SMCParse_Continue;
    }
    
    public Config_End(Handle:parser, bool:halted, bool:failed) {
        if (failed)
            SetFailState("Plugin configuration error");
    }
    
    public Action:Command_HelpMenu(client, args) {
        Help_ShowMainMenu(client);
        return Plugin_Handled;
    }
    
    Help_ShowMainMenu(client) {
        new Handle:menu = CreateMenu(Help_MainMenuHandler);
        SetMenuExitBackButton(menu, false);
        SetMenuTitle(menu, "Help Menu\n ");
        new msize = GetArraySize(g_helpMenus);
        new hmenu[HelpMenu];
        new String:menuid[10];
        for (new i = 0; i < msize; ++i) {
            Format(menuid, sizeof(menuid), "helpmenu_%d", i);
            GetArrayArray(g_helpMenus, i, hmenu[0]);
            AddMenuItem(menu, menuid, hmenu[name]);
        }
        AddMenuItem(menu, "maplist", "Map Rotation");
        if (GetConVarBool(g_cvarAdmins))
            AddMenuItem(menu, "admins", "List Online Admins");
        DisplayMenu(menu, client, 30);
    }
    
    public Help_MainMenuHandler(Handle:menu, MenuAction:action, param1, param2) {
        if (action == MenuAction_End) {
            CloseHandle(menu);
        } else if (action == MenuAction_Select) {
            new String:buf[64];
            new msize = GetArraySize(g_helpMenus);
            if (param2 == msize) { // Maps
                new Handle:mapMenu = CreateMenu(Help_MenuHandler);
                SetMenuExitBackButton(mapMenu, true);
                ReadMapList(g_mapArray, g_mapSerial, "default");
                Format(buf, sizeof(buf), "Current Rotation (%d maps)\n ", GetArraySize(g_mapArray));
                SetMenuTitle(mapMenu, buf);
                if (g_mapArray != INVALID_HANDLE) {
                    new mapct = GetArraySize(g_mapArray);
                    new String:mapname[64];
                    for (new i = 0; i < mapct; ++i) {
                        GetArrayString(g_mapArray, i, mapname, sizeof(mapname));
                        AddMenuItem(mapMenu, mapname, mapname, ITEMDRAW_DISABLED);
                    }
                }
                DisplayMenu(mapMenu, param1, 30);
            } else if (param2 == msize+1) { // Admins
                new Handle:adminMenu = CreateMenu(Help_MenuHandler);
                SetMenuExitBackButton(adminMenu, true);
                SetMenuTitle(adminMenu, "Online Admins\n ");
                new maxc = GetMaxClients();
                new String:aname[64];
                for (new i = 1; i < maxc; ++i) {
                    if (IsClientConnected(i) && IsClientInGame(i) && !IsFakeClient(i) && (GetUserFlagBits(i) & ADMFLAG_GENERIC) == ADMFLAG_GENERIC) {
                        GetClientName(i, aname, sizeof(aname));
                        AddMenuItem(adminMenu, aname, aname, ITEMDRAW_DISABLED);
                    }
                }
                DisplayMenu(adminMenu, param1, 30);
            } else { // Menu from config file
                if (param2 <= msize) {
                    new hmenu[HelpMenu];
                    GetArrayArray(g_helpMenus, param2, hmenu[0]);
                    new String:mtitle[512];
                    Format(mtitle, sizeof(mtitle), "%s\n ", hmenu[title]);
                    if (hmenu[type] == HelpMenuType_Text) {
                        new Handle:cpanel = CreatePanel();
                        SetPanelTitle(cpanel, mtitle);
                        new String:text[128];
                        new String:junk[128];
                        for (new i = 0; i < hmenu[itemct]; ++i) {
                            ReadPackString(hmenu[items], junk, sizeof(junk));
                            ReadPackString(hmenu[items], text, sizeof(text));
                            DrawPanelText(cpanel, text);
                        }
                        for (new j = 0; j < 7; ++j)
                            DrawPanelItem(cpanel, " ", ITEMDRAW_NOTEXT);
                        DrawPanelText(cpanel, " ");
                        DrawPanelItem(cpanel, "Back", ITEMDRAW_CONTROL);
                        DrawPanelItem(cpanel, " ", ITEMDRAW_NOTEXT);
                        DrawPanelText(cpanel, " ");
                        DrawPanelItem(cpanel, "Exit", ITEMDRAW_CONTROL);
                        ResetPack(hmenu[items]);
                        SendPanelToClient(cpanel, param1, Help_MenuHandler, 30);
                        CloseHandle(cpanel);
                    } else {
                        new Handle:cmenu = CreateMenu(Help_CustomMenuHandler);
                        SetMenuExitBackButton(cmenu, true);
                        SetMenuTitle(cmenu, mtitle);
                        new String:cmd[128];
                        new String:desc[128];
                        for (new i = 0; i < hmenu[itemct]; ++i) {
                            ReadPackString(hmenu[items], cmd, sizeof(cmd));
                            ReadPackString(hmenu[items], desc, sizeof(desc));
                            new drawstyle = ITEMDRAW_DEFAULT;
                            if (strlen(cmd) == 0)
                                drawstyle = ITEMDRAW_DISABLED;
                            AddMenuItem(cmenu, cmd, desc, drawstyle);
                        }
                        ResetPack(hmenu[items]);
                        DisplayMenu(cmenu, param1, 30);
                    }
                }
            }
        }
    }
    
    public Help_MenuHandler(Handle:menu, MenuAction:action, param1, param2) {
        if (action == MenuAction_End) {
            CloseHandle(menu);
        } else if (menu == INVALID_HANDLE && action == MenuAction_Select && param2 == 8) {
            Help_ShowMainMenu(param1);
        } else if (action == MenuAction_Cancel) {
            if (param2 == MenuCancel_ExitBack)
                Help_ShowMainMenu(param1);
        }
    }
    
    public Help_CustomMenuHandler(Handle:menu, MenuAction:action, param1, param2) {
        if (action == MenuAction_End) {
            CloseHandle(menu);
        } else if (action == MenuAction_Select) {
            new String:itemval[32];
            GetMenuItem(menu, param2, itemval, sizeof(itemval));
            if (strlen(itemval) > 0)
                FakeClientCommand(param1, itemval);
        } else if (action == MenuAction_Cancel) {
            if (param2 == MenuCancel_ExitBack)
                Help_ShowMainMenu(param1);
        }
    }
    

    Кстати, может кто-нибудь посоветовать какой-нибудь аналогичный плагин?
     
  2. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Может так?

    PHP:
    #pragma semicolon 1

    #include <sourcemod>

    #define PLUGIN_VERSION "0.4"

    enum ChatCommand {
        
    String:command[32],
        
    String:description[255]
    }

    enum HelpMenuType {
        
    HelpMenuType_List,
        
    HelpMenuType_Text
    }

    enum HelpMenu {
        
    String:name[32],
        
    String:title[128],
        
    HelpMenuType:type,
        
    Handle:items,
        
    itemct
    }

    // CVars
    new Handle:g_cvarWelcome INVALID_HANDLE;
    new 
    Handle:g_cvarAdmins INVALID_HANDLE;

    // Help menus
    new Handle:g_helpMenus INVALID_HANDLE;


    // Config parsing
    new g_configLevel = -1;

    public 
    Plugin:myinfo =
    {
        
    name "In-game Help Menu",
        
    author "chundo",
        
    description "Display a help menu to users",
        
    version PLUGIN_VERSION,
        
    url "http://www.mefightclub.com"
    };

    public 
    OnPluginStart() {
        
    CreateConVar("sm_helpmenu_version"PLUGIN_VERSION"Help menu version"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        
    g_cvarWelcome CreateConVar("sm_helpmenu_welcome""1""Show welcome message to newly connected users."FCVAR_PLUGIN);
        
    g_cvarAdmins CreateConVar("sm_helpmenu_admins""1""Show a list of online admins in the menu."FCVAR_PLUGIN);
        
    RegConsoleCmd("sm_helpmenu"Command_HelpMenu"Display the help menu."FCVAR_PLUGIN);

        new 
    String:hc[PLATFORM_MAX_PATH];
        
    BuildPath(Path_SMhcsizeof(hc), "configs/helpmenu.cfg");
        
    ParseConfigFile(hc);

        
    AutoExecConfig(false);
    }

    public 
    OnMapStart() {
        new 
    String:hc[PLATFORM_MAX_PATH];
        
    BuildPath(Path_SMhcsizeof(hc), "configs/helpmenu.cfg");
        
    ParseConfigFile(hc);
    }

    public 
    OnClientPutInServer(client) {
        if (
    GetConVarBool(g_cvarWelcome))
            
    CreateTimer(30.0Timer_WelcomeMessageclient);
    }

    public 
    Action:Timer_WelcomeMessage(Handle:timerany:client) {
        if (
    GetConVarBool(g_cvarWelcome) && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client))
            
    PrintToChat(client"\x01[SM] For help, type \x04!helpmenu\x01 in chat");
    }

    bool:ParseConfigFile(const String:file[]) {
        if (
    g_helpMenus != INVALID_HANDLE) {
            
    ClearArray(g_helpMenus);
            
    CloseHandle(g_helpMenus);
            
    g_helpMenus INVALID_HANDLE;
        }

        new 
    Handle:parser SMC_CreateParser();
        
    SMC_SetReaders(parserConfig_NewSectionConfig_KeyValueConfig_EndSection);
        
    SMC_SetParseEnd(parserConfig_End);

        new 
    line 0;
        new 
    col 0;
        new 
    String:error[128];
        new 
    SMCError:result SMC_ParseFile(parserfilelinecol);
        
    CloseHandle(parser);

        if (
    result != SMCError_Okay) {
            
    SMC_GetErrorString(resulterrorsizeof(error));
            
    LogError("%s on line %d, col %d of %s"errorlinecolfile);
        }

        return (
    result == SMCError_Okay);
    }

    public 
    SMCResult:Config_NewSection(Handle:parser, const String:section[], bool:quotes) {
        
    g_configLevel++;
        if (
    g_configLevel == 1) {
            new 
    hmenu[HelpMenu];
            
    strcopy(hmenu[name], sizeof(hmenu[name]), section);
            
    hmenu[items] = CreateDataPack();
            
    hmenu[itemct] = 0;
            if (
    g_helpMenus == INVALID_HANDLE)
                
    g_helpMenus CreateArray(sizeof(hmenu));
            
    PushArrayArray(g_helpMenushmenu[0]);
        }
        return 
    SMCParse_Continue;
    }

    public 
    SMCResult:Config_KeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotesbool:value_quotes) {
        new 
    msize GetArraySize(g_helpMenus);
        new 
    hmenu[HelpMenu];
        
    GetArrayArray(g_helpMenusmsize-1hmenu[0]);
        switch (
    g_configLevel) {
            case 
    1: {
                if(
    strcmp(key"title"false) == 0)
                    
    strcopy(hmenu[title], sizeof(hmenu[title]), value);
                if(
    strcmp(key"type"false) == 0) {
                    if(
    strcmp(value"text"false) == 0)
                        
    hmenu[type] = HelpMenuType_Text;
                    else
                        
    hmenu[type] = HelpMenuType_List;
                }
            }
            case 
    2: {
                
    WritePackString(hmenu[items], key);
                
    WritePackString(hmenu[items], value);
                
    hmenu[itemct]++;
            }
        }
        
    SetArrayArray(g_helpMenusmsize-1hmenu[0]);
        return 
    SMCParse_Continue;
    }
    public 
    SMCResult:Config_EndSection(Handle:parser) {
        
    g_configLevel--;
        if (
    g_configLevel == 1) {
            new 
    hmenu[HelpMenu];
            new 
    msize GetArraySize(g_helpMenus);
            
    GetArrayArray(g_helpMenusmsize-1hmenu[0]);
            
    ResetPack(hmenu[items]);
        }
        return 
    SMCParse_Continue;
    }

    public 
    Config_End(Handle:parserbool:haltedbool:failed) {
        if (
    failed)
            
    SetFailState("Plugin configuration error");
    }

    public 
    Action:Command_HelpMenu(clientargs) {
        
    Help_ShowMainMenu(client);
        return 
    Plugin_Handled;
    }

    Help_ShowMainMenu(client) {
        new 
    Handle:menu CreateMenu(Help_MainMenuHandler);
        
    SetMenuExitBackButton(menufalse);
        
    SetMenuTitle(menu"Help Menu\n ");
        new 
    msize GetArraySize(g_helpMenus);
        new 
    hmenu[HelpMenu];
        new 
    String:menuid[10];
        for (new 
    0msize; ++i) {
            
    Format(menuidsizeof(menuid), "helpmenu_%d"i);
            
    GetArrayArray(g_helpMenusihmenu[0]);
            
    AddMenuItem(menumenuidhmenu[name]);
        }
        if (
    GetConVarBool(g_cvarAdmins))
            
    AddMenuItem(menu"admins""List Online Admins");
        
    DisplayMenu(menuclient30);
    }

    public 
    Help_MainMenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        }
        else if (
    action == MenuAction_Select)
        {
            new 
    msize GetArraySize(g_helpMenus);
            if (
    param2 == msize+1)
            { 
    // Admins
                
    new Handle:adminMenu CreateMenu(Help_MenuHandler);
                
    SetMenuExitBackButton(adminMenutrue);
                
    SetMenuTitle(adminMenu"Online Admins\n ");
                new 
    maxc GetMaxClients();
                new 
    String:aname[64];
                for (new 
    1maxc; ++i) {
                    if (
    IsClientConnected(i) && IsClientInGame(i) && !IsFakeClient(i) && (GetUserFlagBits(i) & ADMFLAG_GENERIC) == ADMFLAG_GENERIC) {
                        
    GetClientName(ianamesizeof(aname));
                        
    AddMenuItem(adminMenuanameanameITEMDRAW_DISABLED);
                    }
                }
                
    DisplayMenu(adminMenuparam130);
            }
            else { 
    // Menu from config file
                
    if (param2 <= msize) {
                    new 
    hmenu[HelpMenu];
                    
    GetArrayArray(g_helpMenusparam2hmenu[0]);
                    new 
    String:mtitle[512];
                    
    Format(mtitlesizeof(mtitle), "%s\n "hmenu[title]);
                    if (
    hmenu[type] == HelpMenuType_Text) {
                        new 
    Handle:cpanel CreatePanel();
                        
    SetPanelTitle(cpanelmtitle);
                        new 
    String:text[128];
                        new 
    String:junk[128];
                        for (new 
    0hmenu[itemct]; ++i) {
                            
    ReadPackString(hmenu[items], junksizeof(junk));
                            
    ReadPackString(hmenu[items], textsizeof(text));
                            
    DrawPanelText(cpaneltext);
                        }
                        for (new 
    07; ++j)
                            
    DrawPanelItem(cpanel" "ITEMDRAW_NOTEXT);
                        
    DrawPanelText(cpanel" ");
                        
    DrawPanelItem(cpanel"Back"ITEMDRAW_CONTROL);
                        
    DrawPanelItem(cpanel" "ITEMDRAW_NOTEXT);
                        
    DrawPanelText(cpanel" ");
                        
    DrawPanelItem(cpanel"Exit"ITEMDRAW_CONTROL);
                        
    ResetPack(hmenu[items]);
                        
    SendPanelToClient(cpanelparam1Help_MenuHandler30);
                        
    CloseHandle(cpanel);
                    } else {
                        new 
    Handle:cmenu CreateMenu(Help_CustomMenuHandler);
                        
    SetMenuExitBackButton(cmenutrue);
                        
    SetMenuTitle(cmenumtitle);
                        new 
    String:cmd[128];
                        new 
    String:desc[128];
                        for (new 
    0hmenu[itemct]; ++i) {
                            
    ReadPackString(hmenu[items], cmdsizeof(cmd));
                            
    ReadPackString(hmenu[items], descsizeof(desc));
                            new 
    drawstyle ITEMDRAW_DEFAULT;
                            if (
    strlen(cmd) == 0)
                                
    drawstyle ITEMDRAW_DISABLED;
                            
    AddMenuItem(cmenucmddescdrawstyle);
                        }
                        
    ResetPack(hmenu[items]);
                        
    DisplayMenu(cmenuparam130);
                    }
                }
            }
        }
    }

    public 
    Help_MenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        } else if (
    menu == INVALID_HANDLE && action == MenuAction_Select && param2 == 8) {
            
    Help_ShowMainMenu(param1);
        } else if (
    action == MenuAction_Cancel) {
            if (
    param2 == MenuCancel_ExitBack)
                
    Help_ShowMainMenu(param1);
        }
    }

    public 
    Help_CustomMenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        } else if (
    action == MenuAction_Select) {
            new 
    String:itemval[32];
            
    GetMenuItem(menuparam2itemvalsizeof(itemval));
            if (
    strlen(itemval) > 0)
                
    FakeClientCommand(param1itemval);
        } else if (
    action == MenuAction_Cancel) {
            if (
    param2 == MenuCancel_ExitBack)
                
    Help_ShowMainMenu(param1);
        }
    }
     
    nuPAT нравится это.
  3. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Спасибо, работает! Сможешь добавить еще команды через которые будет появляться это же меню, которое вызывается через !helpmenu ? Например просто !menu?
     
  4. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Просто под:
    RegConsoleCmd("sm_helpmenu", Command_HelpMenu, "Display the help menu.", FCVAR_PLUGIN);
    Добавь:
    RegConsoleCmd("sm_menu", Command_HelpMenu, "Display the help menu.", FCVAR_PLUGIN);
     
  5. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Это не прокатит... мне нужно для чат команды...
     
  6. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Не совсем понял чего ты хочешь
     
  7. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    884
    Симпатии:
    545
    @nuPAT, все команды вида sm_example доступны и из чата в виде !example
     
  8. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Ну или вот так.

    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <UTF-8-string>

    #define PLUGIN_VERSION "0.4"

    enum ChatCommand {
        
    String:command[32],
        
    String:description[255]
    }

    enum HelpMenuType {
        
    HelpMenuType_List,
        
    HelpMenuType_Text
    }

    enum HelpMenu {
        
    String:name[32],
        
    String:title[128],
        
    HelpMenuType:type,
        
    Handle:items,
        
    itemct
    }

    // CVars
    new Handle:g_cvarWelcome INVALID_HANDLE;
    new 
    Handle:g_cvarAdmins INVALID_HANDLE;

    // Help menus
    new Handle:g_helpMenus INVALID_HANDLE;

    new 
    String:sSay[2][] = {"say""say_team"};
    static const 
    char Triggers[8][] = {"!menu""!help""menu""help""меню""!меню""!помощь""помощь"}; // Сюда вписывать свои варианты. Чем больше вариантов, тем больше должен быть Triggers[8]

    // Config parsing
    new g_configLevel = -1;

    public 
    Plugin:myinfo =
    {
        
    name "In-game Help Menu",
        
    author "chundo",
        
    description "Display a help menu to users",
        
    version PLUGIN_VERSION,
        
    url "http://www.mefightclub.com"
    };

    public 
    OnPluginStart()
    {
        
    CreateConVar("sm_helpmenu_version"PLUGIN_VERSION"Help menu version"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        
    g_cvarWelcome CreateConVar("sm_helpmenu_welcome""1""Show welcome message to newly connected users."FCVAR_PLUGIN);
        
    g_cvarAdmins CreateConVar("sm_helpmenu_admins""1""Show a list of online admins in the menu."FCVAR_PLUGIN);
        
    RegConsoleCmd("sm_helpmenu"Command_HelpMenu"Display the help menu."FCVAR_PLUGIN);

        for(new 
    i=02i++) AddCommandListener(Say_CallbacksSay[i]);

        new 
    String:hc[PLATFORM_MAX_PATH];
        
    BuildPath(Path_SMhcsizeof(hc), "configs/helpmenu.cfg");
        
    ParseConfigFile(hc);

        
    AutoExecConfig(false);
    }

    public 
    OnMapStart() {
        new 
    String:hc[PLATFORM_MAX_PATH];
        
    BuildPath(Path_SMhcsizeof(hc), "configs/helpmenu.cfg");
        
    ParseConfigFile(hc);
    }

    public 
    OnClientPutInServer(client) {
        if (
    GetConVarBool(g_cvarWelcome))
            
    CreateTimer(30.0Timer_WelcomeMessageclient);
    }

    public 
    Action:Timer_WelcomeMessage(Handle:timerany:client) {
        if (
    GetConVarBool(g_cvarWelcome) && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client))
            
    PrintToChat(client"\x01[SM] For help, type \x04!helpmenu\x01 in chat");
    }

    bool:ParseConfigFile(const String:file[]) {
        if (
    g_helpMenus != INVALID_HANDLE) {
            
    ClearArray(g_helpMenus);
            
    CloseHandle(g_helpMenus);
            
    g_helpMenus INVALID_HANDLE;
        }

        new 
    Handle:parser SMC_CreateParser();
        
    SMC_SetReaders(parserConfig_NewSectionConfig_KeyValueConfig_EndSection);
        
    SMC_SetParseEnd(parserConfig_End);

        new 
    line 0;
        new 
    col 0;
        new 
    String:error[128];
        new 
    SMCError:result SMC_ParseFile(parserfilelinecol);
        
    CloseHandle(parser);

        if (
    result != SMCError_Okay) {
            
    SMC_GetErrorString(resulterrorsizeof(error));
            
    LogError("%s on line %d, col %d of %s"errorlinecolfile);
        }

        return (
    result == SMCError_Okay);
    }


    public 
    Action Say_Callback(client, const String:sCommand[], args)
    {
        if(
    client)
        {
            
    decl String:sText[32];
            
    GetCmdArgString(sTextsizeof(sText));
            
    StripQuotes(sText);
            for(
    int i6i++)
            {
                if(
    UTF8StrEqual(sTextTriggers[i], false))
                {
                    
    FakeClientCommand(client"sm_helpmenu");
                    return 
    Plugin_Handled;
                }
            }
        }
        return 
    Plugin_Continue;
    }

    public 
    SMCResult:Config_NewSection(Handle:parser, const String:section[], bool:quotes) {
        
    g_configLevel++;
        if (
    g_configLevel == 1) {
            new 
    hmenu[HelpMenu];
            
    strcopy(hmenu[name], sizeof(hmenu[name]), section);
            
    hmenu[items] = CreateDataPack();
            
    hmenu[itemct] = 0;
            if (
    g_helpMenus == INVALID_HANDLE)
                
    g_helpMenus CreateArray(sizeof(hmenu));
            
    PushArrayArray(g_helpMenushmenu[0]);
        }
        return 
    SMCParse_Continue;
    }

    public 
    SMCResult:Config_KeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotesbool:value_quotes) {
        new 
    msize GetArraySize(g_helpMenus);
        new 
    hmenu[HelpMenu];
        
    GetArrayArray(g_helpMenusmsize-1hmenu[0]);
        switch (
    g_configLevel) {
            case 
    1: {
                if(
    strcmp(key"title"false) == 0)
                    
    strcopy(hmenu[title], sizeof(hmenu[title]), value);
                if(
    strcmp(key"type"false) == 0) {
                    if(
    strcmp(value"text"false) == 0)
                        
    hmenu[type] = HelpMenuType_Text;
                    else
                        
    hmenu[type] = HelpMenuType_List;
                }
            }
            case 
    2: {
                
    WritePackString(hmenu[items], key);
                
    WritePackString(hmenu[items], value);
                
    hmenu[itemct]++;
            }
        }
        
    SetArrayArray(g_helpMenusmsize-1hmenu[0]);
        return 
    SMCParse_Continue;
    }
    public 
    SMCResult:Config_EndSection(Handle:parser) {
        
    g_configLevel--;
        if (
    g_configLevel == 1) {
            new 
    hmenu[HelpMenu];
            new 
    msize GetArraySize(g_helpMenus);
            
    GetArrayArray(g_helpMenusmsize-1hmenu[0]);
            
    ResetPack(hmenu[items]);
        }
        return 
    SMCParse_Continue;
    }

    public 
    Config_End(Handle:parserbool:haltedbool:failed) {
        if (
    failed)
            
    SetFailState("Plugin configuration error");
    }

    public 
    Action:Command_HelpMenu(clientargs) {
        
    Help_ShowMainMenu(client);
        return 
    Plugin_Handled;
    }

    Help_ShowMainMenu(client) {
        new 
    Handle:menu CreateMenu(Help_MainMenuHandler);
        
    SetMenuExitBackButton(menufalse);
        
    SetMenuTitle(menu"Help Menu\n ");
        new 
    msize GetArraySize(g_helpMenus);
        new 
    hmenu[HelpMenu];
        new 
    String:menuid[10];
        for (new 
    0msize; ++i) {
            
    Format(menuidsizeof(menuid), "helpmenu_%d"i);
            
    GetArrayArray(g_helpMenusihmenu[0]);
            
    AddMenuItem(menumenuidhmenu[name]);
        }
        if (
    GetConVarBool(g_cvarAdmins))
            
    AddMenuItem(menu"admins""List Online Admins");
        
    DisplayMenu(menuclient30);
    }

    public 
    Help_MainMenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        }
        else if (
    action == MenuAction_Select)
        {
            new 
    msize GetArraySize(g_helpMenus);
            if (
    param2 == msize+1)
            {
                new 
    Handle:adminMenu CreateMenu(Help_MenuHandler);
                
    SetMenuExitBackButton(adminMenutrue);
                
    SetMenuTitle(adminMenu"Online Admins\n ");
                new 
    maxc GetMaxClients();
                new 
    String:aname[64];
                for (new 
    1maxc; ++i) {
                    if (
    IsClientConnected(i) && IsClientInGame(i) && !IsFakeClient(i) && (GetUserFlagBits(i) & ADMFLAG_GENERIC) == ADMFLAG_GENERIC) {
                        
    GetClientName(ianamesizeof(aname));
                        
    AddMenuItem(adminMenuanameanameITEMDRAW_DISABLED);
                    }
                }
                
    DisplayMenu(adminMenuparam130);
            }
            else { 
    // Menu from config file
                
    if (param2 <= msize) {
                    new 
    hmenu[HelpMenu];
                    
    GetArrayArray(g_helpMenusparam2hmenu[0]);
                    new 
    String:mtitle[512];
                    
    Format(mtitlesizeof(mtitle), "%s\n "hmenu[title]);
                    if (
    hmenu[type] == HelpMenuType_Text) {
                        new 
    Handle:cpanel CreatePanel();
                        
    SetPanelTitle(cpanelmtitle);
                        new 
    String:text[128];
                        new 
    String:junk[128];
                        for (new 
    0hmenu[itemct]; ++i) {
                            
    ReadPackString(hmenu[items], junksizeof(junk));
                            
    ReadPackString(hmenu[items], textsizeof(text));
                            
    DrawPanelText(cpaneltext);
                        }
                        for (new 
    07; ++j)
                            
    DrawPanelItem(cpanel" "ITEMDRAW_NOTEXT);
                        
    DrawPanelText(cpanel" ");
                        
    DrawPanelItem(cpanel"Back"ITEMDRAW_CONTROL);
                        
    DrawPanelItem(cpanel" "ITEMDRAW_NOTEXT);
                        
    DrawPanelText(cpanel" ");
                        
    DrawPanelItem(cpanel"Exit"ITEMDRAW_CONTROL);
                        
    ResetPack(hmenu[items]);
                        
    SendPanelToClient(cpanelparam1Help_MenuHandler30);
                        
    CloseHandle(cpanel);
                    } else {
                        new 
    Handle:cmenu CreateMenu(Help_CustomMenuHandler);
                        
    SetMenuExitBackButton(cmenutrue);
                        
    SetMenuTitle(cmenumtitle);
                        new 
    String:cmd[128];
                        new 
    String:desc[128];
                        for (new 
    0hmenu[itemct]; ++i) {
                            
    ReadPackString(hmenu[items], cmdsizeof(cmd));
                            
    ReadPackString(hmenu[items], descsizeof(desc));
                            new 
    drawstyle ITEMDRAW_DEFAULT;
                            if (
    strlen(cmd) == 0)
                                
    drawstyle ITEMDRAW_DISABLED;
                            
    AddMenuItem(cmenucmddescdrawstyle);
                        }
                        
    ResetPack(hmenu[items]);
                        
    DisplayMenu(cmenuparam130);
                    }
                }
            }
        }
    }

    public 
    Help_MenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        } else if (
    menu == INVALID_HANDLE && action == MenuAction_Select && param2 == 8) {
            
    Help_ShowMainMenu(param1);
        } else if (
    action == MenuAction_Cancel) {
            if (
    param2 == MenuCancel_ExitBack)
                
    Help_ShowMainMenu(param1);
        }
    }

    public 
    Help_CustomMenuHandler(Handle:menuMenuAction:actionparam1param2) {
        if (
    action == MenuAction_End) {
            
    CloseHandle(menu);
        } else if (
    action == MenuAction_Select) {
            new 
    String:itemval[32];
            
    GetMenuItem(menuparam2itemvalsizeof(itemval));
            if (
    strlen(itemval) > 0)
                
    FakeClientCommand(param1itemval);
        } else if (
    action == MenuAction_Cancel) {
            if (
    param2 == MenuCancel_ExitBack)
                
    Help_ShowMainMenu(param1);
        }
    }

    Компилируется с [INC] UTF-8 string
     
    nuPAT нравится это.
  9. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Спасибо еще раз. Код почти что идеален: не работает команда помощь и !помощь, но это не сильно важно (хотя никакие другие плагины не используют эту команду). Я решил остановиться на твоем предыдущем варианте, дописав нужные строки.
     
  10. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    884
    Симпатии:
    545
    А и не будет. Сурсмод не понимает русские буквы в именах команд. Если очень надо, добавляешь листенер команды чата, как тебе предложили после варианта с добавлением строк, и туда прописываешь доп условия для своих помощей.
     
  11. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
     
  12. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    884
    Симпатии:
    545
    @TheSomeone,
    RegConsoleCmd() и его аналоги никогда не получают русские команды. Если отправить в консоли sm_помощь, то до сервера дойдёт только "sm_"
     
  13. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    [​IMG]

    PHP:
    #pragma semicolon 1

    #include <UTF-8-string>

    new String:sSay[2][] = {"say""say_team"};
    static const 
    char Triggers[6][] = {"!knife""!нож""knife""ws""!ws""!скины"};

    public 
    OnPluginStart()
    {
        for(new 
    i=02i++) AddCommandListener(Say_CallbacksSay[i]);
    }

    public 
    Action Say_Callback(client, const String:sCommand[], args)
    {
        if(
    client)
        {
            
    decl String:sText[32];
            
    GetCmdArgString(sTextsizeof(sText));
            
    StripQuotes(sText);
            for(
    int i6i++)
            {
                if(
    UTF8StrEqual(sTextTriggers[i], false))
                {
                    
    PrintToChat(client"[SM] Такого плагина нет на сервере!");
                }
            }
        }
        return 
    Plugin_Continue;
    }
     
  14. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    884
    Симпатии:
    545
    Услышь меня, пожалуйста. Я говорю про RegConsoleCmd() (как Пират и пытается зарегистрировать у себя): если через него зарегистрировать русскую команду, сервер её не поймает.
    --- Добавлено позже ---
    [​IMG]
    Код:
    #include <sourcemod>
    #pragma newdecls required
    
    public void OnPluginStart() {
        RegConsoleCmd("sm_", NotFound_RussianCommand);
        RegConsoleCmd("sm_команда", RussianCommand);
    }
    
    public Action NotFound_RussianCommand(int client, int args) {
        ReplyToCommand(client, "[SM] Команда не найдена");
        return Plugin_Handled;
    }
    
    public Action RussianCommand(int client, int args) {
        ReplyToCommand(client, "[SM] Ты нашёл скрытую команду. Поздравляю!");
        return Plugin_Handled;
    }
     
    Последнее редактирование: 23 авг 2016
  15. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.570
    Симпатии:
    1.152
    для чата есть ведь стандартная
    OnClientSayCommand(int client, const char[] command, const char[] sArgs)
     
    White Wolf нравится это.