Закрыть игроку меню выбора команды.

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Когда игрок заходит на сервер ему открывается меню выбора команды. В данный момент для игрока блокируются кнопки и по нажатию на кт т или наблюдатели отрабатывает код. Надо после нажатия для игрока закрыть меню выбора команды.

Сейчас работает так игрок зашел на сервер.
Ему открыло меню.
Игрок выбрал команду отработал код.
В зависимости от настроек игрок в той или иной команде.
Но меню остается открытым чтобы его закрыть игроку надо нажать "ESC".
Надо для игрока закрыть меню.

Если возможно физически закрыть или хотябы отработать от лица игрока нажатие на клавишу "ESC".
 

Deff

Участник
Сообщения
350
Реакции
137
Надо вовсе отключить меню выбора команды на сервере?
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Вот тат это сделано Skill Auto Balance
Нужен исходник sab-blockteams
Просмотрел не совсем понял где именно для игрока закрывают меню. У меня вроде как по логике примерно такой же код вышел.


Мой код:
bool g_bAllowTeamChange[MAXPLAYERS + 1];

void MovePlayerToTeam(int iClient, int team)
{
    if (GetClientTeam(iClient) == team)
        return;
    
    g_bAllowTeamChange[iClient] = true; // Allow client to pass inside Hook_ChangeTeamChange()
    
    if (team > CS_TEAM_SPECTATOR)
    {
        CS_SwitchTeam(iClient, team); // Switch team using cstrike extension
        
        if(team == CS_TEAM_CT) // Don't override hider models
            CS_UpdateClientModel(iClient); // Update CT skin
    }
    else ChangeClientTeam(iClient, team); // Silent team change is enought, the player will die anyway if alive
    
    g_bAllowTeamChange[iClient] = false; // We can reset this here already, the callback is instant
}

public Action Hook_ChangeTeamChange(int iClient, const char[] command, int iArgs)
{
    if(!Ready())
        return Plugin_Continue;
    
    CreateTimer(1.0, Timer_CheckRestart, _, TIMER_FLAG_NO_MAPCHANGE);
    
    if (iArgs < 1)
        return Plugin_Handled;
    
    // Bots will join anyway
    if(IsFakeClient(iClient))
        return Plugin_Continue;
    
    char sArg[4];
    GetCmdArg(1, sArg, sizeof(sArg));
    
    int team_to = StringToInt(sArg);
    int team_from = GetClientTeam(iClient);
    
    if(g_bAllowTeamChange[iClient])
        return Plugin_Continue; // Teamchange called by MovePlayerToTeam()
    
    if (team_to == CS_TEAM_SPECTATOR && team_from == CS_TEAM_NONE)
        return Plugin_Continue; // First team join (when player fully connected)
    
    // Late join?
    
    bool bCTs, bTs;
    if(!g_cvDeathSwapteam.BoolValue)
    {
        LoopIngameClients(i)
        {
            if(i == iClient)
                continue;
                
            if(GetClientTeam(i) != CS_TEAM_CT)
                continue;
                
            bCTs = true;
            break;
        }
    }   
    
    if(g_cvDeathSwapteam.BoolValue)
    {
        LoopIngameClients(i)
        {
            if(i == iClient)
                continue;
                
            if(GetClientTeam(i) != CS_TEAM_T)
                continue;
                
            bTs = true;
            break;
        }
    }   
    
    int iHideTime = PH_CanChangeModel();
    bool bAliveCTs;
    if(iHideTime > 0)
    {   
        LoopAlivePlayers(i)
        {
            if(i == iClient)
                continue;
            
            if(GetClientTeam(i) != CS_TEAM_CT)
                continue;
            
            bAliveCTs = true;
            break;
        }
        
        if(bAliveCTs)
        {
            // There is another alive CTs, let him pass
            if(team_to == CS_TEAM_T && !g_cvDeathSwapteam.BoolValue)
            {
                MovePlayerToTeam(iClient, CS_TEAM_T);
                CS_RespawnPlayer(iClient);
                return Plugin_Handled;
            }
            
            if(team_to > CS_TEAM_SPECTATOR && g_cvDeathSwapteam.BoolValue)
            {
                MovePlayerToTeam(iClient, CS_TEAM_T);
                CS_RespawnPlayer(iClient);
                return Plugin_Handled;
            }
        }
        
        if (team_to == CS_TEAM_T && team_from == CS_TEAM_CT && !bAliveCTs)
            return Plugin_Handled;
    }
    
    // From here we only handle manual team join requests
    
    if(team_to == CS_TEAM_CT && g_cvDeathSwapteam.BoolValue || team_to == CS_TEAM_CT && !bCTs && !g_cvDeathSwapteam.BoolValue)
    {
        return Plugin_Continue; // Always allow joining CT (fuck team spec glow wh, force all dead players to CT)
    }
    
    if(team_to == CS_TEAM_T && !g_cvDeathSwapteam.BoolValue || team_to == CS_TEAM_T && !bTs && g_cvDeathSwapteam.BoolValue)
    {
        if(GetClientTeam(iClient) != CS_TEAM_CT)
            return Plugin_Continue;
        else if(!IsPlayerAlive(iClient))
            return Plugin_Continue;
    }
    
    // Allow joining spectators and seekers always
    if(team_to == CS_TEAM_SPECTATOR)
    {
        if(GetClientTeam(iClient) != CS_TEAM_CT)
            MovePlayerToTeam(iClient, CS_TEAM_SPECTATOR);
        else if(!IsPlayerAlive(iClient))
            MovePlayerToTeam(iClient, CS_TEAM_SPECTATOR);
        return Plugin_Handled;
    }   
    
    // Don't allow to change team while alive
    if(IsPlayerAlive(iClient))
        return Plugin_Handled;
    
    // Move to default
    if(g_cvDeathSwapteam.BoolValue)
        MovePlayerToTeam(iClient, CS_TEAM_CT);
    else
        MovePlayerToTeam(iClient, CS_TEAM_T);
    
    
    return Plugin_Handled;
}
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #6
ТС, попробуйте решение из этой темы
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
ТС, попробуйте решение из этой темы
Это решение полностью отключает меню выбора. А мне нужно его просто закрыть для игрока чтобы если потребуется он потом смог его открыть. Есть способы отработать нажатие на кнопку от клиента игрока?
 

_wS_

Участник
Сообщения
383
Реакции
760
@oleg_nelasy Может поможет ShowVGUIPanel(client, "active", _, false); ?
Вместо "active" по смыслу ещё подходят "all", "class", "team" (все эти имена ЗДЕСЬ). В csgo ещё есть #define PANEL_SURVEY "surveypanel"
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@oleg_nelasy Может поможет ShowVGUIPanel(client, "active", _, false); ?
Вместо "active" по смыслу ещё подходят "all", "class", "team" (все эти имена ЗДЕСЬ). В csgo ещё есть #define PANEL_SURVEY "surveypanel"
Пробивал вызывать панели дабы подобрать нужную как-то панели не вызывались код проходил ошибки не было но и на экране нечего не менялось. Может что не так делал? Если закрывать все равно не отрабатывало с аргументом параметром не понял как это должно работать.

C-подобный:
public Action Cmd_RequestCT(int iClient, int iArgs)
{
    if(!Ready())
        return Plugin_Continue;
    
    ShowVGUIPanel(iClient, "team", _, true); //для теста попробовал разные параметры для второго аргумента не одна панель так и не вылезла.
    
    if(iClient && IsClientInGame(iClient) && GetClientTeam(iClient) > CS_TEAM_SPECTATOR)
        if(!g_iQueueCounterSeekerTeam[iClient])
            CPrintToChat(iClient, "%s %t", PREFIX , "You have been added to seeker team", AddClientToQueue(iClient));
        else CPrintToChat(iClient, "%s %t", PREFIX , "Queue Counter Seeker Team", g_iQueueCounterSeekerTeam[iClient]);
    else CPrintToChat(iClient, "%s %t", PREFIX , "Observers do not have access to the queue");   
    
    return Plugin_Handled;
}
 

_wS_

Участник
Сообщения
383
Реакции
760
Игрок зашел на сервер.
Ему открыло меню.
Игрок выбрал команду отработал код.
В зависимости от настроек игрок в той или иной команде.
Но меню остается открытым чтобы его закрыть игроку надо нажать "ESC".
Надо для игрока закрыть меню.

Это странно, что меню остаётся открытым. Проверил только что в css код:

PHP:
public void OnPluginStart()
{
    AddCommandListener(OnJointeam, "jointeam");
}

public Action OnJointeam(int client, const char[] command, int argc)
{
    return Plugin_Handled; // Лучше использовать Plugin_Stop.
}

Команду выбрать не даёт и меню закрывается.

Значит у тебя функция Ready() возвращает true и срабатывает Plugin_Continue, debug сообщения расставь.
Или другой plugin тоже ловит jointeam и в итоге конфликт.

И на 12 строке у тебя с логикой беда: "Игрока нет на сервере, но давай я ему сообщение отправлю, мб дойдёт".
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Сделал чистый сервер чтоб без мусора только голый sm и mm. Написал простенький проверочный код
C-подобный:
public void OnPluginStart()
{
    RegConsoleCmd("test", Cmd_test, "Test comand");
}

public Action Cmd_test(int iClient, int iArgs)
{      
    ShowVGUIPanel(iClient, "active", _, true);

    PrintToChatAll("Работает");
   
    return Plugin_Handled;
}

Окна также не открывает, похоже проблема в кс го или я дурак который делает что-то не так. Есть небольшое уточнение меню закрывается если по нему кликнуть 2 раза но и код отработает 1 раз. Другими словами первый клик закрывает окно если попали на return Plugin_Continue; второй закрывает само меню но код уже не отрабатывает. Если попали на return Plugin_Handled; окно остается функциональным и каждое нажатие отрабатывает код пока не попадем на Plugin_Continue. Насколько я понял мне надо перед Plugin_Handled; закрывать окно выбора команды для игрока, поскольку в конечном результате игроку все равно определяется команда.

Код немного правил прилагаю текущую версию на всякий случай.


C-подобный:
public Action Hook_ChangeTeamChange(int iClient, const char[] command, int iArgs)
{
    if(!Ready())
        return Plugin_Continue;
   
    CreateTimer(1.0, Timer_CheckRestart, _, TIMER_FLAG_NO_MAPCHANGE);
   
    if (iArgs < 1)
        return Plugin_Handled;
   
    // Bots will join anyway
    if(IsFakeClient(iClient))
        return Plugin_Continue;
   
    char sArg[4];
    GetCmdArg(1, sArg, sizeof(sArg));
   
    int team_to = StringToInt(sArg);
    int team_from = GetClientTeam(iClient);
   
    //PrintToChatAll("для игрока %N team_to = [%d]", iClient, team_to);
   
    if(g_bAllowTeamChange[iClient])
        return Plugin_Continue; // Teamchange called by MovePlayerToTeam()
   
    if (team_to == CS_TEAM_SPECTATOR && team_from == CS_TEAM_NONE)
        return Plugin_Continue; // First team join (when player fully connected)
   
    // Late join?
   
    bool bCTs, bTs;
    if(!g_cvDeathSwapteam.BoolValue)
    {
        LoopIngameClients(i)
        {
            if(i == iClient)
                continue;
               
            if(GetClientTeam(i) != CS_TEAM_CT)
                continue;
               
            bCTs = true;
            break;
        }
    }  
   
    //if(g_cvDeathSwapteam.BoolValue)
    LoopIngameClients(i)
    {
        if(i == iClient)
            continue;
           
        if(GetClientTeam(i) != CS_TEAM_T)
            continue;
           
        bTs = true;
        break;
    }
       
   
    int iHideTime = PH_CanChangeModel();
    bool bAliveCTs;
    if(iHideTime > 0)
    {  
        LoopAlivePlayers(i)
        {
            if(i == iClient)
                continue;
           
            if(GetClientTeam(i) != CS_TEAM_CT)
                continue;
           
            bAliveCTs = true;
            break;
        }
       
        if(bAliveCTs)
        {
            // There is another alive CTs, let him pass
            if(team_to == CS_TEAM_T && !g_cvDeathSwapteam.BoolValue && GetClientTeam(iClient) != CS_TEAM_CT || team_to == CS_TEAM_T && !g_cvDeathSwapteam.BoolValue && GetClientTeam(iClient) == CS_TEAM_CT && !IsPlayerAlive(iClient))
            {
                MovePlayerToTeam(iClient, CS_TEAM_T);
                CS_RespawnPlayer(iClient);
                return Plugin_Continue;
            }
           
            if(team_to > CS_TEAM_SPECTATOR && g_cvDeathSwapteam.BoolValue && GetClientTeam(iClient) != CS_TEAM_CT || team_to > CS_TEAM_SPECTATOR && g_cvDeathSwapteam.BoolValue && GetClientTeam(iClient) == CS_TEAM_CT && !IsPlayerAlive(iClient))
            {
                MovePlayerToTeam(iClient, CS_TEAM_T);
                CS_RespawnPlayer(iClient);
                return Plugin_Handled;
            }
        }
    }
   
    // From here we only handle manual team join requests
   
    if(team_to == CS_TEAM_CT && g_cvDeathSwapteam.BoolValue || team_to == CS_TEAM_CT && !bCTs && !g_cvDeathSwapteam.BoolValue)
    {
        return Plugin_Continue; // Always allow joining CT (fuck team spec glow wh, force all dead players to CT)
    }
   
    if(team_to == CS_TEAM_T && !g_cvDeathSwapteam.BoolValue || team_to == CS_TEAM_T && !bTs && g_cvDeathSwapteam.BoolValue)
    {
        if(GetClientTeam(iClient) != CS_TEAM_CT)
            return Plugin_Continue;
        else if(!IsPlayerAlive(iClient) || !bTs)
            return Plugin_Continue;

        return Plugin_Handled;
    }
   
    // Allow joining spectators and seekers always
    if(team_to == CS_TEAM_SPECTATOR)
    {
        if(GetClientTeam(iClient) != CS_TEAM_CT)
            return Plugin_Continue;
            //MovePlayerToTeam(iClient, CS_TEAM_SPECTATOR);
        else if(!IsPlayerAlive(iClient) || !bTs)
            return Plugin_Continue;
            //MovePlayerToTeam(iClient, CS_TEAM_SPECTATOR);
           
        return Plugin_Handled;
    }
   
    // Don't allow to change team while alive
    if(IsPlayerAlive(iClient))
        return Plugin_Handled;
   
    // Move to default
    if(g_cvDeathSwapteam.BoolValue)
        MovePlayerToTeam(iClient, CS_TEAM_CT);
   
    if(!g_cvDeathSwapteam.BoolValue)
    {
        MovePlayerToTeam(iClient, CS_TEAM_T);
        if(iHideTime > 0 && bAliveCTs)
            CS_RespawnPlayer(iClient);
    }      
   
    return Plugin_Handled;
}
 

Вложения

  • 1635674730507.png
    1635674730507.png
    3.4 КБ · Просмотры: 88
Последнее редактирование:

_wS_

Участник
Сообщения
383
Реакции
760
Похоже ShowVGUIPanel не работает в csgo и простого способа закрыть teammenu (cmd) после Plugin_Stop/Plugin_Handled что-то не видно =) Это нужно копать какие-то слитые исхи csgo и рассчитывать на удачу. Но полагаться на jointeam хук в csgo вряд ли стоит, т.к. например, после mp_force_pick_time секунд игроку автоматом присваивается какая-то команда (при этом jointeam даже не вызывается). Может тебе просто делать все проверки в player_spawn/player_team, и там, при необходимости, менять игроку команду. Ещё в jointeam можно restrict звук какой-то проиграть короткий при Plugin_Stop/Plugin_Handled, это увеличит шансы на то, что игрок догадается, что нужно нажать ESC/отмена.

Выше советовали m_bIsQueuedMatchmaking, если это работает, то может можно что-то вроде:

PHP:
public Action Cmd_test(int iClient, int iArgs)
{
    GameRules_SetProp("m_bIsQueuedMatchmaking", 1);
    RequestFrame(EnableTeamMenu);
    return Plugin_Handled; // Возможно m_bIsQueuedMatchmaking 1 нужно делать после return Plugin_Handled;
}

public void EnableTeamMenu()
{
    GameRules_SetProp("m_bIsQueuedMatchmaking", 0);
}

Только исправить код на более продуманный, чтобы не было конфликтов, если это возможно.
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Похоже ShowVGUIPanel не работает в csgo и простого способа закрыть teammenu (cmd) после Plugin_Stop/Plugin_Handled что-то не видно =) Это нужно копать какие-то слитые исхи csgo и рассчитывать на удачу. Но полагаться на jointeam хук в csgo вряд ли стоит, т.к. например, после mp_force_pick_time секунд игроку автоматом присваивается какая-то команда (при этом jointeam даже не вызывается). Может тебе просто делать все проверки в player_spawn/player_team, и там, при необходимости, менять игроку команду. Ещё в jointeam можно restrict звук какой-то проиграть короткий при Plugin_Stop/Plugin_Handled, это увеличит шансы на то, что игрок догадается, что нужно нажать ESC/отмена.

Выше советовали m_bIsQueuedMatchmaking, если это работает, то может можно что-то вроде:

PHP:
public Action Cmd_test(int iClient, int iArgs)
{
    GameRules_SetProp("m_bIsQueuedMatchmaking", 1);
    RequestFrame(EnableTeamMenu);
    return Plugin_Handled; // Возможно m_bIsQueuedMatchmaking 1 нужно делать после return Plugin_Handled;
}

public void EnableTeamMenu()
{
    GameRules_SetProp("m_bIsQueuedMatchmaking", 0);
}

Только исправить код на более продуманный, чтобы не было конфликтов, если это возможно.
"m_bIsQueuedMatchmaking" в принципе запрещает меню выбора команды.
 
Последнее редактирование:

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@oleg_nelasy, Панорама - чисто клиентский обработчик HTML, и работает он тоже только на клиенте. Вероятно никак
 
Сверху Снизу