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

Тема в разделе "Программирование / Скриптинг", создана пользователем santazx, 21 ноя 2015.

  1. santazx

    santazx

    Сообщения:
    19
    Симпатии:
    0
    Заранее спасибо и так к делу.
    Решил продолжить изучать 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_CancelVoteADMFLAG_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.0Timer_WelcomeMessageclient);
        }
    }

    public 
    Action:Timer_WelcomeMessage(Handle:timerany: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(clientannounce);
                }
                case 
    2
                {
                    
    PrintHintText(clientannounce);
                }
                case 
    3
                {
                    
    PrintCenterText(clientannounce);
                }
                default: 
                {
                    
    PrintToChat(clientannounce);
                }
            }
        }
    }

    public 
    Action:Command_Say(clientargs)
    {
        if(!
    client)
        {
            return 
    Plugin_Continue;
        }
        
        if(
    IsVoteInProgress())
        {
            
    PrintToChatAll("Ты не можешь использовать !cssvote пока идет голосование!");
        }
        else
        {
            
    decl String:text[192];
            if(!
    GetCmdArgString(textsizeof(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_mapMenuclient60);
    }

    public 
    Handle_CssMenu(Handle:hMenuMenuAction:actionclientiSlot)
    {
        if ( 
    action == MenuAction_Select )
        {
            if ( 
    IsPlayerAlive(client) )
            {
                
    //НИЖЕ ДЛЯ ПРИМЕРА В КАЖДОЙ ГРУППЕ НЕСКОЛЬКО КАРТ
                
    new Handle:mapMenu INVALID_HANDLE;
                
    mapMenu CreateMenu(Handle_MapVoteList);
                if ( 
    iSlot == )
                {
                    
    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_mapMenuclient60);
                    
    SetMenuExitButton(mapMenufalse);
                }
                else if ( 
    iSlot == )
                {
                    
    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_mapMenuclient60);
                    
    SetMenuExitButton(mapMenufalse);
                }
            }
        }
    }

    public 
    Handle_MapVoteList(Handle:mapMenuMenuAction:actionparam1param2)
    {
        if(
    action == MenuAction_Select)
        {
            
    decl String:map[64];
            
    GetMenuItem(mapMenuparam2mapsizeof(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(voteMenumap"Да");
        
    AddMenuItem(voteMenu"no""Нет");
        
    SetMenuExitButton(voteMenufalse);
        
        new 
    voteTime GetConVarInt(g_mapVoteTime);
        
    VoteMenuToAll(voteMenuvoteTime);
        
        
    PrintToChatAll("Голосование в процессе...");

    }

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

    public 
    Action:Command_CancelVote(clientargs)
    {
        
    CancelVote();
        
        return 
    Plugin_Handled;
    }

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Забыл параметр форматирования. Оффтоп
     
  3. santazx

    santazx

    Сообщения:
    19
    Симпатии:
    0
    Спасибо, но это я потом исправлю главное узнать почему карту не меняет. :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_CancelVoteADMFLAG_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.0Timer_WelcomeMessageclient);
        }
    }

    public 
    Action:Timer_WelcomeMessage(Handle:timerany: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(clientannounce);
                }
                case 
    2
                {
                    
    PrintHintText(clientannounce);
                }
                case 
    3
                {
                    
    PrintCenterText(clientannounce);
                }
                default: 
                {
                    
    PrintToChat(clientannounce);
                }
            }
        }
    }

    public 
    Action:Command_Say(clientargs)
    {
        if(!
    client)
        {
            return 
    Plugin_Continue;
        }
        
        if(
    IsVoteInProgress())
        {
            
    PrintToChatAll("Ты не можешь использовать !cssvote пока идет голосование!");
        }
        else
        {
            
    decl String:text[192];
            if(!
    GetCmdArgString(textsizeof(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_mapMenuclientMENU_TIME_FOREVER);
    }
    ///////////////////////////////////////////////////////////////////////

    public Handle_CssMenu(Handle:hMenuMenuAction:actionclientiSlot)
    {
        if ( 
    action == MenuAction_Select )
        {
            if ( 
    IsPlayerAlive(client) )
            {
                
    //НИЖЕ ДЛЯ ПРИМЕРА В КАЖДОЙ ГРУППЕ НЕСКОЛЬКО КАРТ
                
    if ( iSlot == )
                {
                    
    ShowVoteMenuGroup1(client);
                }
                else if ( 
    iSlot == )
                {
                    
    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(mapMenuclientMENU_TIME_FOREVER);
        
    SetMenuExitButton(mapMenufalse);
    }
    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(mapMenuclientMENU_TIME_FOREVER);
        
    SetMenuExitButton(mapMenufalse);
    }
    ///////////////////////////////////////////////////////////////////////

    public Handle_MapVoteList(Handle:mapMenuMenuAction:actionparam1param2)
    {
        if(
    action == MenuAction_Select)
        {
            
    decl String:map[64];
            
    GetMenuItem(mapMenuparam2mapsizeof(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(voteMenumap"Да");
        
    AddMenuItem(voteMenu"no""Нет");
        
    SetMenuExitButton(voteMenufalse);
        
        new 
    voteTime GetConVarInt(g_mapVoteTime);
        
    VoteMenuToAll(voteMenuvoteTime);
        
        
    PrintToChatAll("Голосование в процессе...");

    }

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

    public 
    Action:Command_CancelVote(clientargs)
    {
        
    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(voteMenumap"Да");
        
    AddMenuItem(voteMenu"no""Нет");
        
    SetMenuExitButton(voteMenufalse);
        
        new 
    voteTime GetConVarInt(g_mapVoteTime);
        
    VoteMenuToAll(voteMenuvoteTime);
        
        
    PrintToChatAll("Голосование в процессе...");

    }
     
    Последнее редактирование: 21 ноя 2015
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Если возникает ошибка в коде, которая фиксируется логом ошибок, то с этого места код автоматически заканчивается (прерывается, "стоп"). Следовательно, карта действительно не сменится, пока не исправить этот момент, пусть и всё остальное написано верно.
    Для этой функции
    Callback не совсем "верен" по параметрам. Заменяется, например, на:
    PHP:
    public Handle_VoteMenu(Handle:voteMenuMenuAction:actionvoteresultvotecountinfo)
    А далее, вместо:
    Нечто, вроде:
    PHP:
    else if (action == MenuAction_VoteEnd)
    {
        
    decl String:map[32], String:resultname[7], winvotecounttotalvotecount;
        
    GetMenuItem(votemenuvoteresultmapsizeof(map), _resultnamesizeof(resultname));
        
    GetMenuVoteInfo(votecountinfowinvotecounttotalvotecount);
        if (
    strcmp(map"no"))
        {
            
    PrintToChatAll("Голосование прошло успешно (\"%s\" проголосовало %i из %i)! Изменяем на %s"resultnamewinvotecounttotalvotecountmap);
            
    ServerCommand("changelevel %s"map);
        }
        else 
    PrintToChatAll("Голосование провалилось! За \"%s\" проголосовало %i из %i."resultnamewinvotecounttotalvotecount);
    }
     
  5. santazx

    santazx

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Я сам такое голосование лишь 2 раз пишу. Предпочитаю собственное, т.к. стандартное даст проголосовать лишь тем, кто был на сервере Оффтоп , а своё можно выдавать постоянно, пока все за определённое время не проголосуют, пусть и зашедшие позже.
     
  7. santazx

    santazx

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