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

nuPAT

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

C-подобный:
/*
* In-game Help Menu
* Written by chundo (chundo@mefightclub.com)
*
* 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);
    }
}

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

Someone

Участник
Сообщения
1,933
Реакции
1,653
Может так?

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_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
    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]);
    }
    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 msize = GetArraySize(g_helpMenus);
        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);
    }
}
 

nuPAT

Участник
Сообщения
163
Реакции
25
Может так?

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_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
    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]);
    }
    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 msize = GetArraySize(g_helpMenus);
        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);
    }
}
Спасибо, работает! Сможешь добавить еще команды через которые будет появляться это же меню, которое вызывается через !helpmenu ? Например просто !menu?
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Спасибо, работает! Сможешь добавить еще команды через которые будет появляться это же меню, которое вызывается через !helpmenu ? Например просто !menu?

Просто под:
RegConsoleCmd("sm_helpmenu", Command_HelpMenu, "Display the help menu.", FCVAR_PLUGIN);
Добавь:
RegConsoleCmd("sm_menu", Command_HelpMenu, "Display the help menu.", FCVAR_PLUGIN);
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #7
@nuPAT, все команды вида sm_example доступны и из чата в виде !example
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Ну или вот так.

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=0; i < 2; i++) AddCommandListener(Say_Callback, sSay[i]);

    new String:hc[PLATFORM_MAX_PATH];
    BuildPath(Path_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
    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 Action Say_Callback(client, const String:sCommand[], args)
{
    if(client)
    {
        decl String:sText[32];
        GetCmdArgString(sText, sizeof(sText));
        StripQuotes(sText);
        for(int i; i < 6; i++)
        {
            if(UTF8StrEqual(sText, Triggers[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_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]);
    }
    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 msize = GetArraySize(g_helpMenus);
        if (param2 == msize+1)
        {
            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);
    }
}

Компилируется с [INC] UTF-8 string
 

nuPAT

Участник
Сообщения
163
Реакции
25
Ну или вот так.

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=0; i < 2; i++) AddCommandListener(Say_Callback, sSay[i]);

    new String:hc[PLATFORM_MAX_PATH];
    BuildPath(Path_SM, hc, sizeof(hc), "configs/helpmenu.cfg");
    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 Action Say_Callback(client, const String:sCommand[], args)
{
    if(client)
    {
        decl String:sText[32];
        GetCmdArgString(sText, sizeof(sText));
        StripQuotes(sText);
        for(int i; i < 6; i++)
        {
            if(UTF8StrEqual(sText, Triggers[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_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]);
    }
    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 msize = GetArraySize(g_helpMenus);
        if (param2 == msize+1)
        {
            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);
    }
}

Компилируется с [INC] UTF-8 string
Спасибо еще раз. Код почти что идеален: не работает команда помощь и !помощь, но это не сильно важно (хотя никакие другие плагины не используют эту команду). Я решил остановиться на твоем предыдущем варианте, дописав нужные строки.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #10
не работает команда помощь и !помощь
А и не будет. Сурсмод не понимает русские буквы в именах команд. Если очень надо, добавляешь листенер команды чата, как тебе предложили после варианта с добавлением строк, и туда прописываешь доп условия для своих помощей.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
А и не будет. Сурсмод не понимает русские буквы в именах команд. Если очень надо, добавляешь листенер команды чата, как тебе предложили после варианта с добавлением строк, и туда прописываешь доп условия для своих помощей.

 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #12
@TheSomeone,
Код почти что идеален: не работает команда помощь и !помощь, но это не сильно важно (хотя никакие другие плагины не используют эту команду). Я решил остановиться на твоем предыдущем варианте, дописав нужные строки.
RegConsoleCmd() и его аналоги никогда не получают русские команды. Если отправить в консоли sm_помощь, то до сервера дойдёт только "sm_"
 

Someone

Участник
Сообщения
1,933
Реакции
1,653

UdQ04AKtyVo.jpg


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=0; i < 2; i++) AddCommandListener(Say_Callback, sSay[i]);
}

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

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #14
Услышь меня, пожалуйста. Я говорю про RegConsoleCmd() (как Пират и пытается зарегистрировать у себя): если через него зарегистрировать русскую команду, сервер её не поймает.
--- Добавлено позже ---
75a3644a07d1.png

C-подобный:
#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;
}
 
Последнее редактирование:

ivanms1337

Участник
Сообщения
69
Реакции
2
Кто может написать плагин?
Например я напишу команду !bost и такой команды нет, можно сделать что бы в чате писало что такой команды нет?
 

CAH4E3

Сосанчез.
Сообщения
1,597
Реакции
779
Кто может написать плагин?
Например я напишу команду !bost и такой команды нет, можно сделать что бы в чате писало что такой команды нет?
Кхм, ну такой плагин сверху есть.
Меняешь команды и все.
 

ivanms1337

Участник
Сообщения
69
Реакции
2
Кхм, ну такой плагин сверху есть.
Меняешь команды и все.
Мне нужно без добавление в плагин определенных команд, а просто что бы он сам определял такая команды есть или нет, а то каждую команду добавлять это бред.
 

MasterNagib

SourceРейсер
Сообщения
167
Реакции
37
Мне нужно без добавление в плагин определенных команд, а просто что бы он сам определял такая команды есть или нет, а то каждую команду добавлять это бред.
это не бред, это более разумно, чем писать плагин, о котором ты говоришь!
Пишешь несколько туда команд, пример: !gloves, !ws, !knife, !нож, !vip, !shop и т.д
 

ivanms1337

Участник
Сообщения
69
Реакции
2
это не бред, это более разумно, чем писать плагин, о котором ты говоришь!
Пишешь несколько туда команд, пример: !gloves, !ws, !knife, !нож, !vip, !shop и т.д
Получается если я напишу !dsa её в списке не будет значит отображение текста что команды такой нет не будет?
 
Сверху Снизу