Плагин не меняет карту, подскажите как исправить.

santazx

Участник
Сообщения
23
Реакции
5
Заранее спасибо и так к делу.
Решил продолжить изучать Source Pawn в итоге хотел сделать плагин но для примера нашел в интернете и сделал под себя.
В итоге сделал в нем группы и проверку когда идет голосование для css.
Но есть проблема когда нажимаю Да он не меняет карту когда уже все ответили Да, где и что я упустил? :blush2:

Приложение кода ниже:
PHP:
#pragma semicolon 1
#include <sourcemod>

#define PLUGIN_VERSION    "0.1"

new Handle:g_mapMenu = INVALID_HANDLE;
new Handle:g_mapVoteTime = INVALID_HANDLE;

public Plugin:myinfo =
{
    name = "[CSS] Map Vote Css",
    author = "",
    description = "",
    version = PLUGIN_VERSION,
    url = ""
}

public OnPluginStart()
{
    CreateConVar("css_mapvote_version", PLUGIN_VERSION, "[CSS] Map Vote Css Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    RegConsoleCmd("say", Command_Say);
    RegConsoleCmd("say_team", Command_Say);
    RegAdminCmd("sm_csscancelvote", Command_CancelVote, ADMFLAG_VOTE);
    g_mapVoteTime = CreateConVar("sm_mapvotetime", "20", "По умолчанию время на голосование.",FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFY);
    CreateConVar("css_vote_announce", "1", "Включает или нет анонс плагина.");
    CreateConVar("css_vote_message", "3", "Вид анонса (1 - Chat, 2 - Hint, 3 - Center text)");
}

public OnClientPutInServer(client)
{
    if(GetConVarInt(FindConVar("css_vote_announce")) != 0)
    {
        CreateTimer(50.0, Timer_WelcomeMessage, client);
    }
}

public Action:Timer_WelcomeMessage(Handle:timer, any:client) 
{
    new String:announce[] = "\x01[SM] Для голоса за карту, введи: \x04!cssvote\x01 в чат.";
    if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client)) 
    {
        switch (GetConVarInt(FindConVar("css_vote_message")))  
        {
            case 1: 
            {
                PrintToChat(client, announce);
            }
            case 2: 
            {
                PrintHintText(client, announce);
            }
            case 3: 
            {
                PrintCenterText(client, announce);
            }
            default: 
            {
                PrintToChat(client, announce);
            }
        }
    }
}

public Action:Command_Say(client, args)
{
    if(!client)
    {
        return Plugin_Continue;
    }
    
    if(IsVoteInProgress())
    {
        PrintToChatAll("Ты не можешь использовать !cssvote пока идет голосование!");
    }
    else
    {
        decl String:text[192];
        if(!GetCmdArgString(text, sizeof(text)))
        {
            return Plugin_Continue;
        }
    
        new startidx = 0;
        if(text[strlen(text)-1] == '"')
        {
            text[strlen(text)-1] = '\0';
            startidx = 1;
        }
    
        if(strcmp(text[startidx], "!cssvote", false) == 0)
        {
            DoMapVoteList(client);
        }
    }
    return Plugin_Continue;
}

//Выводим здесь группу?
DoMapVoteList(client)
{    
    g_mapMenu = CreateMenu(Handle_CssMenu);
    SetMenuTitle(g_mapMenu, "");
    AddMenuItem(g_mapMenu, "", "De Dust 2 группа 1");//0
    AddMenuItem(g_mapMenu, "", "De Dust группа 2");  //1
    DisplayMenu(g_mapMenu, client, 60);
}

public Handle_CssMenu(Handle:hMenu, MenuAction:action, client, iSlot)
{
    if ( action == MenuAction_Select )
    {
        if ( IsPlayerAlive(client) )
        {
            //НИЖЕ ДЛЯ ПРИМЕРА В КАЖДОЙ ГРУППЕ НЕСКОЛЬКО КАРТ
            new Handle:mapMenu = INVALID_HANDLE;
            mapMenu = CreateMenu(Handle_MapVoteList);
            if ( iSlot == 0 )
            {
                SetMenuTitle(mapMenu, "Смена карты");
                AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 1"); //0
                AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 2"); //0
                AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 3"); //0
                AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 4"); //0
                AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 5"); //0
                DisplayMenu(g_mapMenu, client, 60);
                SetMenuExitButton(mapMenu, false);
            }
            else if ( iSlot == 1 )
            {
                SetMenuTitle(mapMenu, "Смена карты");
                AddMenuItem(mapMenu, "de_dust", "De Dust + 1");    //1
                AddMenuItem(mapMenu, "de_dust", "De Dust + 2");    //1
                AddMenuItem(mapMenu, "de_dust", "De Dust + 3");    //1
                AddMenuItem(mapMenu, "de_dust", "De Dust + 4");    //1
                AddMenuItem(mapMenu, "de_dust", "De Dust + 5");    //1
                DisplayMenu(g_mapMenu, client, 60);
                SetMenuExitButton(mapMenu, false);
            }
        }
    }
}

public Handle_MapVoteList(Handle:mapMenu, MenuAction:action, param1, param2)
{
    if(action == MenuAction_Select)
    {
        decl String:map[64];
        GetMenuItem(mapMenu, param2, map, sizeof(map));
        DoVoteMenu (map);
    }
    else if (action == MenuAction_End)
    {
        CloseHandle(mapMenu);
    }
}
DoVoteMenu(const String:map[])
{
    if(IsVoteInProgress())
    {
        return;
    }
 
    new Handle:voteMenu = CreateMenu(Handle_VoteMenu);
    SetMenuTitle(voteMenu, "Сменить карту: %s?", map);
    AddMenuItem(voteMenu, map, "Да");
    AddMenuItem(voteMenu, "no", "Нет");
    SetMenuExitButton(voteMenu, false);
    
    new voteTime = GetConVarInt(g_mapVoteTime);
    VoteMenuToAll(voteMenu, voteTime);
    
    PrintToChatAll("Голосование в процессе...");

}

public Handle_VoteMenu(Handle:voteMenu, MenuAction:action, param1, param2)
{
    if(action == MenuAction_End)
    {
        CloseHandle(voteMenu);
    }
    else if(action == MenuAction_VoteEnd)
    {        
        decl String:map[64];
        GetMenuItem(voteMenu, param1, map, sizeof(map));
        PrintToChatAll("Голосование прошло успешно! Изменяем на %s");
        ServerCommand("changelevel %s", map);
    }
    else if(action == MenuAction_VoteCancel)
    {
        // Если не получаем голосов выводим сообщение.
        if (param1 == VoteCancel_NoVotes)
            {
            PrintToChatAll("Ошибка голосования!");
            }
            else
            {
                // Карта была отменена, нет действий.
            }
    }
}

public Action:Command_CancelVote(client, args)
{
    CancelVote();
    
    return Plugin_Handled;
}

И ещё раз спасибо. :beer:
P.S.: да я знаю что изобретаю велосипед и прикручиваю колеса повторно, но нужно начать надеюсь на вас. :)
 

santazx

Участник
Сообщения
23
Реакции
5
Забыл параметр форматирования. Оффтоп
Спасибо, но это я потом исправлю главное узнать почему карту не меняет. :beer:

Добавлено через 2 часа 55 минут
Всем спасибо все работает, выложу здесь код от плагина подправил.
Не хватает таймера на смену карты но это просто. :)
PHP:
#pragma semicolon 1
#include <sourcemod>

#define PLUGIN_VERSION    "0.1"

new Handle:g_mapMenu = INVALID_HANDLE;
new Handle:g_mapVoteTime = INVALID_HANDLE;

public Plugin:myinfo =
{
    name = "[CSS] Map Vote Css",
    author = "",
    description = "",
    version = PLUGIN_VERSION,
    url = ""
}

public OnPluginStart()
{
    CreateConVar("css_mapvote_version", PLUGIN_VERSION, "[CSS] Map Vote Css Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    RegConsoleCmd("say", Command_Say);
    RegConsoleCmd("say_team", Command_Say);
    RegAdminCmd("sm_csscancelvote", Command_CancelVote, ADMFLAG_VOTE);
    g_mapVoteTime = CreateConVar("sm_mapvotetime", "20", "По умолчанию время на голосование.",FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFY);
    CreateConVar("css_vote_announce", "1", "Включает или нет анонс плагина.");
    CreateConVar("css_vote_message", "3", "Вид анонса (1 - Chat, 2 - Hint, 3 - Center text)");
}

public OnClientPutInServer(client)
{
    if(GetConVarInt(FindConVar("css_vote_announce")) != 0)
    {
        CreateTimer(50.0, Timer_WelcomeMessage, client);
    }
}

public Action:Timer_WelcomeMessage(Handle:timer, any:client) 
{
    new String:announce[] = "\x01[SM] Для голоса за карту, введи: \x04!cssvote\x01 в чат.";
    if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client)) 
    {
        switch (GetConVarInt(FindConVar("css_vote_message")))  
        {
            case 1: 
            {
                PrintToChat(client, announce);
            }
            case 2: 
            {
                PrintHintText(client, announce);
            }
            case 3: 
            {
                PrintCenterText(client, announce);
            }
            default: 
            {
                PrintToChat(client, announce);
            }
        }
    }
}

public Action:Command_Say(client, args)
{
    if(!client)
    {
        return Plugin_Continue;
    }
    
    if(IsVoteInProgress())
    {
        PrintToChatAll("Ты не можешь использовать !cssvote пока идет голосование!");
    }
    else
    {
        decl String:text[192];
        if(!GetCmdArgString(text, sizeof(text)))
        {
            return Plugin_Continue;
        }
    
        new startidx = 0;
        if(text[strlen(text)-1] == '"')
        {
            text[strlen(text)-1] = '\0';
            startidx = 1;
        }
    
        if(strcmp(text[startidx], "!cssvote", false) == 0)
        {
            ShowVoteMenuMain(client);
        }
    }
    return Plugin_Continue;
}

///////////////////////////////////////////////////////////////////////
ShowVoteMenuMain(client)
{
    g_mapMenu = CreateMenu(Handle_CssMenu);
    SetMenuTitle(g_mapMenu, "Титул меню");
    AddMenuItem(g_mapMenu, "", "De Dust 2 группа 1");//0
    AddMenuItem(g_mapMenu, "", "De Dust группа 2");  //1
    DisplayMenu(g_mapMenu, client, MENU_TIME_FOREVER);
}
///////////////////////////////////////////////////////////////////////

public Handle_CssMenu(Handle:hMenu, MenuAction:action, client, iSlot)
{
    if ( action == MenuAction_Select )
    {
        if ( IsPlayerAlive(client) )
        {
            //НИЖЕ ДЛЯ ПРИМЕРА В КАЖДОЙ ГРУППЕ НЕСКОЛЬКО КАРТ
            if ( iSlot == 0 )
            {
                ShowVoteMenuGroup1(client);
            }
            else if ( iSlot == 1 )
            {
                ShowVoteMenuGroup2(client);
            }
        }
    }
}

///////////////////////////////////////////////////////////////////////
ShowVoteMenuGroup1(client)
{
    new Handle:mapMenu = INVALID_HANDLE;
    mapMenu = CreateMenu(Handle_MapVoteList);
    SetMenuTitle(mapMenu, "Смена карты");
    AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 1"); //0
    AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 2"); //0
    AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 3"); //0
    AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 4"); //0
    AddMenuItem(mapMenu, "de_dust2", "De Dust 2 + 5"); //0
    DisplayMenu(mapMenu, client, MENU_TIME_FOREVER);
    SetMenuExitButton(mapMenu, false);
}
ShowVoteMenuGroup2(client)
{
    new Handle:mapMenu = INVALID_HANDLE;
    mapMenu = CreateMenu(Handle_MapVoteList);
    SetMenuTitle(mapMenu, "Смена карты");
    AddMenuItem(mapMenu, "de_dust", "De Dust + 1");    //1
    AddMenuItem(mapMenu, "de_dust", "De Dust + 2");    //1
    AddMenuItem(mapMenu, "de_dust", "De Dust + 3");    //1
    AddMenuItem(mapMenu, "de_dust", "De Dust + 4");    //1
    AddMenuItem(mapMenu, "de_dust", "De Dust + 5");    //1
    DisplayMenu(mapMenu, client, MENU_TIME_FOREVER);
    SetMenuExitButton(mapMenu, false);
}
///////////////////////////////////////////////////////////////////////

public Handle_MapVoteList(Handle:mapMenu, MenuAction:action, param1, param2)
{
    if(action == MenuAction_Select)
    {
        decl String:map[64];
        GetMenuItem(mapMenu, param2, map, sizeof(map));
        DoVoteMenu (map);
    }
    else if (action == MenuAction_End)
    {
        CloseHandle(mapMenu);
    }
}
DoVoteMenu(const String:map[])
{
    if(IsVoteInProgress())
    {
        return;
    }
 
    new Handle:voteMenu = CreateMenu(Handle_VoteMenu);
    SetMenuTitle(voteMenu, "Сменить карту: %s?", map);
    AddMenuItem(voteMenu, map, "Да");
    AddMenuItem(voteMenu, "no", "Нет");
    SetMenuExitButton(voteMenu, false);
    
    new voteTime = GetConVarInt(g_mapVoteTime);
    VoteMenuToAll(voteMenu, voteTime);
    
    PrintToChatAll("Голосование в процессе...");

}

public Handle_VoteMenu(Handle:voteMenu, MenuAction:action, param1, param2)
{
    if(action == MenuAction_End)
    {
        CloseHandle(voteMenu);
    }
    else if(action == MenuAction_VoteEnd)
    {        
        decl String:map[64];
        GetMenuItem(voteMenu, param1, map, sizeof(map));
        PrintToChatAll("Голосование прошло успешно! Изменяем на %s", map);
        ServerCommand("changelevel %s", map);
    }
    else if(action == MenuAction_VoteCancel)
    {
        // Если не получаем голосов выводим сообщение.
        if (param1 == VoteCancel_NoVotes)
            {
            PrintToChatAll("Ошибка голосования!");
            }
            else
            {
                // Карта была отменена, нет действий.
            }
    }
}

public Action:Command_CancelVote(client, args)
{
    CancelVote();
    
    return Plugin_Handled;
}

Добавлено через 5 часов 56 минут
С таймером разобрался, пишу как только проснулся :)
Подскажите как реализовать голосование в том меню при нажатии Да.
Сейчас любой может нажать Да и сменить сразу карту без набора голосов. :(

PHP:
DoVoteMenu(const String:map[])
{
    if(IsVoteInProgress())
    {
        return;
    }
 
    new Handle:voteMenu = CreateMenu(Handle_VoteMenu);
    SetMenuTitle(voteMenu, "Сменить карту: %s?", map);
    AddMenuItem(voteMenu, map, "Да");
    AddMenuItem(voteMenu, "no", "Нет");
    SetMenuExitButton(voteMenu, false);
    
    new voteTime = GetConVarInt(g_mapVoteTime);
    VoteMenuToAll(voteMenu, voteTime);
    
    PrintToChatAll("Голосование в процессе...");

}
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
это я потом исправлю главное узнать почему карту не меняет
Если возникает ошибка в коде, которая фиксируется логом ошибок, то с этого места код автоматически заканчивается (прерывается, "стоп"). Следовательно, карта действительно не сменится, пока не исправить этот момент, пусть и всё остальное написано верно.
Для этой функции
public Handle_VoteMenu(Handle:voteMenu, MenuAction:action, param1, param2)
Callback не совсем "верен" по параметрам. Заменяется, например, на:
PHP:
public Handle_VoteMenu(Handle:voteMenu, MenuAction:action, voteresult, votecountinfo)
А далее, вместо:
C-подобный:
else if(action == MenuAction_VoteEnd)    {                decl String:map[64];        GetMenuItem(voteMenu, param1, map, sizeof(map));        PrintToChatAll("Голосование прошло успешно! Изменяем на %s", map);        ServerCommand("changelevel %s", map);
Нечто, вроде:
PHP:
else if (action == MenuAction_VoteEnd)
{
	decl String:map[32], String:resultname[7], winvotecount, totalvotecount;
	GetMenuItem(votemenu, voteresult, map, sizeof(map), _, resultname, sizeof(resultname));
	GetMenuVoteInfo(votecountinfo, winvotecount, totalvotecount);
	if (strcmp(map, "no"))
	{
		PrintToChatAll("Голосование прошло успешно (\"%s\" проголосовало %i из %i)! Изменяем на %s", resultname, winvotecount, totalvotecount, map);
		ServerCommand("changelevel %s", map);
	}
	else PrintToChatAll("Голосование провалилось! За \"%s\" проголосовало %i из %i.", resultname, winvotecount, totalvotecount);
}
 

santazx

Участник
Сообщения
23
Реакции
5
Если возникает ошибка в коде, которая фиксируется логом ошибок, то с этого места код автоматически заканчивается (прерывается, "стоп"). Следовательно, карта действительно не сменится, пока не исправить этот момент, пусть и всё остальное написано верно.
Для этой функции
Callback не совсем "верен" по параметрам. Заменяется, например, на:
PHP:
public Handle_VoteMenu(Handle:voteMenu, MenuAction:action, voteresult, votecountinfo)
А далее, вместо:
Нечто, вроде:
PHP:
else if (action == MenuAction_VoteEnd)
{
    decl String:map[32], String:resultname[7], winvotecount, totalvotecount;
    GetMenuItem(votemenu, voteresult, map, sizeof(map), _, resultname, sizeof(resultname));
    GetMenuVoteInfo(votecountinfo, winvotecount, totalvotecount);
    if (strcmp(map, "no"))
    {
        PrintToChatAll("Голосование прошло успешно (\"%s\" проголосовало %i из %i)! Изменяем на %s", resultname, winvotecount, totalvotecount, map);
        ServerCommand("changelevel %s", map);
    }
    else PrintToChatAll("Голосование провалилось! За \"%s\" проголосовало %i из %i.", resultname, winvotecount, totalvotecount);
}

В очередной раз убеждаюсь что ещё многое нужно изучить огромное спасибо. :beer:
P.S.: я бы поставил спасибо здесь ещё, но не вижу кнопки. :(
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
В очередной раз убеждаюсь что ещё многое нужно изучить
Я сам такое голосование лишь 2 раз пишу. Предпочитаю собственное, т.к. стандартное даст проголосовать лишь тем, кто был на сервере Оффтоп, а своё можно выдавать постоянно, пока все за определённое время не проголосуют, пусть и зашедшие позже.
 

santazx

Участник
Сообщения
23
Реакции
5
Я сам такое голосование лишь 2 раз пишу. Предпочитаю собственное, т.к. стандартное даст проголосовать лишь тем, кто был на сервере Оффтоп, а своё можно выдавать постоянно, пока все за определённое время не проголосуют, пусть и зашедшие позже.

Ну главное что стало на ещё 1 вариант голосования больше, меня просто не устраивали большие вроде Ultimate Mapchooser. :beer:
 
Сверху Снизу