Баг с переходом в игру

Статус
Новые ответы в этой теме размещать нельзя.

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#1
Здравствуйте. У меня проблемка.

Добавил в меню сервера пункт "Перейти в наблюдатели", если игрок в игре и "Вернутся в игру", если он в спектаторах. В наблюдатели переходит отлично, а вот с возвращением есть баги. После нажатия на пункт меню "Вернутся в игру" - игроку не присваивает команду и не сразу респаунит его. После 3-4 нажатий на пункт игрока возвращает в игру, а после в меню при нажатии "В наблюдатели" его заново респаунит.

P.S. Мод зомби, в идеале это должно было бы работать так: если игрок в наблюдателях и переходит в игру, но время для респауна в текущем раунде прошло - ему просто должно присваивать команду и ждать начала сл раунда. Если же игрок нажал "вернутся в игру" на протяжении первых 15 секунд (когда сервер дает возможность заспавниться в текущем раунде) - его ресало в игру сразу. Вот функция возвращения. Делал таском повторный респаун - тоже не сработало. Прошу вашей помощи, господа :)

Код:
public GoToPlay(id)
{
    new iCT;
    new iTT;
    new g_MaxPlayers;
    
    for(new i = 1 ; i <= g_MaxPlayers ; i++)
    {
        if(is_user_alive(i))
        {
            switch( get_user_team(i) )
            {
                case 1: iTT++;
                case 2: iCT++;
            }
        }
    }

    engclient_cmd(id, "jointeam 5; joinclass 5");
    
    if(iTT == iCT || iTT > iCT)
    {
        cs_set_user_team(id, CS_TEAM_CT, CS_DONTCHANGE);
    }
    else
    {
        cs_set_user_team(id, CS_TEAM_T, CS_DONTCHANGE);
    }
    return PLUGIN_HANDLED;
}
 

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
1.168
Симпатии
397
#2
Ну, гениально, что тут скажешь.
9 Янв 2020
rg_join_team
rg_get_join_team_priority
rg_set_user_team
engclient_cmd joinclass 5.
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#3
kapangaIII, от души, вроде заработало, но скомпилило с варнингами... прописал вот так, ругается на несоответствие тэгов, не подскажешь, в чем беда?) обозначил звездочкой строки, где есть эта ошибка

Код:
    * new iTeam = rg_get_join_team_priority();
    
    rg_set_user_team(id, iTeam, MODEL_AUTO, .send_teaminfo = true, .check_win_conditions = false);
    
   * rg_join_team(id, iTeam);
    
    return PLUGIN_HANDLED
9 Янв 2020
и присвоение команды происходит не моментально, почему то, а через рандомный интервал времени...
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#4
UPD: Переход в игру с наблюдателей все же не работает корректно. При попытке вернуться в игру в том же раунде (и не только) ничего не происходит, в консоль пишет следующее: Scoring will not start until both teams have players
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#5
UPD: Выявил причину, почему не переходило в игру обратно. проблема в логике меню. как оказалось. Вызывал через команду функции - все работает, однако из меню обратно в игру не переходит, где то в кейсах беда. Подскажите, пожалуйста, как поправить. Так же, не знаю, как грамотно сделать кнопку "Переход в спектора" доступной только по флагу t. Вот код:

Код:
public Server_Menu(id)
{
    static menu[650], iLen
    iLen = 0
    iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\wИмя сервера^n\yСайт:\r *******^n\r \yIP: \r********^n^n")

    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[1] \wМагазин^n")
    keys |= MENU_KEY_1

    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[2] \wСтатистика^n")
    keys |= MENU_KEY_2

    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[3] \rГолосовать за бан^n")
    keys |= MENU_KEY_3

    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[4] \wЗаткнуть игрока^n")
    keys |= MENU_KEY_4

    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[5] \wНоминировать карту^n")
    keys |= MENU_KEY_5
  
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[6] \wОписание сервера^n")
    keys |= MENU_KEY_6
  
    if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)
    {
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[7] \wВернуться в игру^n^n")
    keys |= MENU_KEY_7
    }
    else
    {
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[7] \wВ наблюдатели^n^n")
    keys |= MENU_KEY_8
    }
  
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r[0] \wВыход^n")
    keys |= MENU_KEY_0

    show_menu(id, keys, menu, -1, "Menu 1")
    return PLUGIN_HANDLED
}

public func_menu(id, key)
{
     switch(key)
     {
          case 0: client_cmd(id, "say /shop")
          case 1: client_cmd(id, "say /gameme")
          case 2: client_cmd(id, "say /voteban")
          case 3: client_cmd(id, "say /mute")
          case 4: client_cmd(id, "say /maps")
          case 5: client_cmd(id, "say /biomod")
          case 6: GoToSpec(id)
          case 7: GoToPlay(id)
     }
     return PLUGIN_HANDLED
}
 

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
1.168
Симпатии
397
#6
Скидыванием частей кода ничего не решится.
Воскресенье в 15:18
1578831502375.png
Ну а так, как думаешь, в чем проблема?
 

Вложения

  • 2 KB 32

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#7
kapangaIII, пробовал так
Код:
  if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)
{  
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[7] \wВернуться в игру^n^n")
keys |= MENU_KEY_7
}
 if(cs_get_user_team(id) != CS_TEAM_SPECTATOR)
{
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[7] \wВ наблюдатели^n^n")
keys |= MENU_KEY_7
}
Тоже не то. Но заметил одну вещь, что будучи в спекторах вернуться в игру есть клашива 8, а не 7. Тоесть, оно работает, просто смещен список кейсов... не совсем понимаю систему эту, по этому и туплю :(
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#10
kapangaIII, вроде правильно же в 1 посте присвоил ключ, счет же с нуля начинается

MENU_KEY_7 case 6: GoToSpec(id)
MENU_KEY_8 case 7: GoToPlay(id)
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#12
kapangaIII, спасибо, забыл про эту проверку чота)
а вот почему возвращение в игру висит на клавише 8 до сих пор не могу понять, ключи же правильно указаны...
и у меня на другом сервере в меню это прописано вот так и там на одной и той же кнопке два этих события. Тоесть, на 7ке и респаун и уход в спектора, в зависимости от команды игрока:

Код:
public CmdPlayerMenu(const iPlayer)
{



    if(!is_user_connected(iPlayer))
        return PLUGIN_CONTINUE

    new iMenu = menu_create("\yМеню сервера", "CmdPlayerMenuH");
    new iCb = menu_makecallback("CmdPlayerMenuCb");

    menu_additem(iMenu, "1-6 пункты", "0-5", _, iCb);
    ............
    if (cs_get_user_team(iPlayer) == CS_TEAM_SPECTATOR)
    menu_additem(iMenu, "Вернуться в игру", "6");
    if (is_user_alive(iPlayer))
    menu_additem(iMenu, "В наблюдатели", "7", ADMIN_LEVEL_H);
    menu_setprop (iMenu, MPROP_EXITNAME , "Выход" )
    menu_display(iPlayer, iMenu);
    return PLUGIN_HANDLED;

}

public CmdPlayerMenuH(id)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_CONTINUE
    }

    switch(item)
    {
        case 6: client_cmd(id, "say /respawn")
        case 7: client_cmd(id, "say /spec")
    }

    return PLUGIN_CONTINUE
}
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
205
Симпатии
5
Пол
Мужской
#14
kapangaIII, сорян, не знал, как проверку в кейсе делать, уже нашел пример, все сделал, все получилось. Огромное спасибо, дядка!

Решено, закройте, пожалуйста :)
 
Статус
Новые ответы в этой теме размещать нельзя.