Админ плагин смены карты

Hollya

❤ GIRL SCRIPTER ❤
Сообщения
128
Реакции
32
Здравствуйте, помогите исправить, когда админ заходит в меню через админку и выбирает карту. - она сразу меняется.
Мне надо чтобы она именно ставилась в голосование как через команду sm_votemap
Чтобы у игроков сначала появилялось голосование типо "сменить карту на mg_LEGO? да / нет"
и только потом менялось.
На данный момент вот так сделано:
C-подобный:
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>
#include "include/admin_pr.inc" //inclide ot r1ko

#define FUNC    "map"

new Handle:g_MapMenu = INVALID_HANDLE;

public bool Admin_OnKvLoadSelect(KeyValues &kv, const char[] display, const char[] func, int level, int rang)
{
    if(StrEqual(FUNC,func))
    {
        return true;
    }
    return false;
}
public void Admin_OnMainMenuSelectItem(int client, const char[] display, const char[] func, int level, int rang)
{
    if(StrEqual(FUNC,func))
    {
        /* *********** */
        ShowMapMenu(client);
    }   
}
public OnMapStart()
{
    g_MapMenu = BuildMapMenu();
}

public OnMapEnd()
{
    if (g_MapMenu != INVALID_HANDLE)
    {
        CloseHandle(g_MapMenu);
        g_MapMenu = INVALID_HANDLE;
    }
}

Handle:BuildMapMenu()
{
    /* Open the file */
    new Handle:adtMaps = CreateArray(16, 0);
    new Handle:file = OpenFile("maplist.txt", "rt");
    if (file == INVALID_HANDLE)
    {
        file = OpenFile("cfg/maplist.txt", "rt");
        if (file == INVALID_HANDLE)
        {
            new serial = -1;
            new String:name[255];
            
            ReadMapList(adtMaps, serial, "allexistingmaps__", MAPLIST_FLAG_MAPSFOLDER | MAPLIST_FLAG_NO_DEFAULT);
            new mapcount = GetArraySize(adtMaps);
            
            if (mapcount > 0)
            {
                new Handle:menu = CreateMenu(Menu_ChangeMap);
                for (new i = 0; i < mapcount; i++)
                {
                    GetArrayString(adtMaps, i, name, 255);
                    AddMenuItem(menu, name, name);
                }
                SetMenuTitle(menu, "Выбирете карту:");
                // SetMenuTitle(menu, "%T", "AA_CHANGEMAP_Title", client);
                return menu;
            }
            else return INVALID_HANDLE;
        }
    }
    
    /* Create the menu Handle */
    new Handle:menu = CreateMenu(Menu_ChangeMap),
    String:mapname[255],
    len;
    while (!IsEndOfFile(file) && ReadFileLine(file, mapname, sizeof(mapname)))
    {
        if (mapname[0] == ';' || !IsCharAlpha(mapname[0]))
        {
            continue;
        }
        /* Cut off the name at any whitespace */
        len = strlen(mapname);
        for (new i = 0; i < len; i++)
        {
            if (IsCharSpace(mapname[i]))
            {
                mapname[i] = '\0';
                break;
            }
        }
        /* Check if the map is valid */
        if (!IsMapValid(mapname))
        {
            continue;
        }
        /* Add it to the menu */
        AddMenuItem(menu, mapname, mapname);
    }
    /* Make sure we close the file! */
    CloseHandle(file);
    
    /* Finally, set the title */
    SetMenuTitle(menu, "Выбирете карту:");
    
    return menu;
}

public Menu_ChangeMap(Handle:menu, MenuAction:action, param1, param2)
{
    if (action == MenuAction_Select)
    {
        new String:info[32];
        GetMenuItem(menu, param2, info, sizeof(info));
        ServerCommand("changelevel %s", info);
        PrintToChatAll("Карта меняется %s",info);
    }
}

ShowMapMenu(client)
{
    if (g_MapMenu == INVALID_HANDLE)
    {
        PrintToChat(client, "The maplist.txt or cfg/maplist.txt file was not found!");
        Admin_OpenMainMenu(client);
        return;
    }
    
    DisplayMenu(g_MapMenu, client, MENU_TIME_FOREVER);
    
    return;
}

Не получается. требуется ваша помощь =)
 

andreik

Участник
Сообщения
285
Реакции
53
меню админа голосование смена карты выбираешь карту (если 1 карта) нажимаешь назад и выводится голосование карты с выводом сменить да/нет (игра ксго)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
попробуй вот так
PHP:
#pragma semicolon 1


#include <sdktools>
#include "include/admin_pr.inc" //inclide ot r1ko
#include "basevotes.sp"

#define FUNC    "map"

Menu g_MapMenu;
char sCurrentMap[255];

public bool Admin_OnKvLoadSelect(KeyValues &kv, const char[] display, const char[] func, int level, int rang)
{
    return StrEqual(FUNC, func);
}
public void Admin_OnMainMenuSelectItem(int client, const char[] display, const char[] func, int level, int rang)
{
    if(StrEqual(FUNC, func)) ShowMapMenu(client);
}
public void OnMapStart()
{
    GetCurrentMap(sCurrentMap, sizeof(sCurrentMap));
    g_MapMenu = BuildMapMenu();
}

public void OnMapEnd()
{
    if(g_MapMenu != null)
    {
        CloseHandle(g_MapMenu);
        g_MapMenu = null;
    }
}

Menu BuildMapMenu()
{
    /* Open the file */
    ArrayList adtMaps = CreateArray(16, 0);
    File file = OpenFile("maplist.txt", "rt");
    if(file == null)
    {
        if((file = OpenFile("cfg/maplist.txt", "rt")) == null)
        {
            int serial = -1;
            char name[255];

            if(ReadMapList(adtMaps, serial, "allexistingmaps__", MAPLIST_FLAG_MAPSFOLDER|MAPLIST_FLAG_NO_DEFAULT) != null)
            {
                int mapcount = adtMaps.Length;
                Menu menu = new Menu(Menu_ChangeMap);
                for(int i; i < mapcount; i++)
                {
                    adtMaps.GetString(i, name, sizeof(name));

                    if(!StrEqual(sCurrentMap, name, false)) menu.AddItem(name, mapname);
                }
                menu.SetTitle("Выберите карту:");
                // SetMenuTitle(menu, "%T", "AA_CHANGEMAP_Title", client);
                return menu;
            }
            else return null;
        }
    }

    /* Create the menu Handle */
    Menu menu = new Menu(Menu_ChangeMap);
    char mapname[255];
    int len;
    while(!IsEndOfFile(file) && ReadFileLine(file, mapname, sizeof(mapname)))
    {
        if(mapname[0] == ';' || !IsCharAlpha(mapname[0])) continue;
        /* Cut off the name at any whitespace */
        len = strlen(mapname);
        for(int i; i < len; i++)
        {
            if(IsCharSpace(mapname[i]))
            {
                mapname[i] = '\0';
                break;
            }
        }
        /* Check if the map is valid */
        if(IsMapValid(mapname)) menu.AddItem(mapname, mapname);
    }
    /* Make sure we close the file! */
    CloseHandle(file);

    /* Finally, set the title */
    menu.SetTitle("Выберите карту:");

    return menu;
}

public int Menu_ChangeMap(Menu menu, MenuAction action, int param1, int param2)
{
    if(action == MenuAction_Select)
    {
        char info[2][32];
        GetMenuItem(menu, param2, info[0], sizeof(info[]));
/*        ServerCommand("changelevel %s", info);
        PrintToChatAll("Карта меняется на %s",info);*/
        if(IsMapValid(info[0])) DisplayVoteMapMenu(param1, 1, info[0]);    // какой смысл что-то выдумывать, когда можно заюзать базовый код SM?
    }
}

void ShowMapMenu(int client)
{
    if(g_MapMenu != null) DisplayMenu(g_MapMenu, client, MENU_TIME_FOREVER);
    else
    {
        PrintToChat(client, "The maplist.txt and cfg/maplist.txt file was not found or they are empty!");
        Admin_OpenMainMenu(client);
    }
}
 
Сверху Снизу