Игрок определен в случайную команду поймать событие

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Когда игрок заходить на сервер изначально его определяет в команду 0 или CS_TEAM_NONE. Если игрок в течении н времени так и не выбрал команду его определяет в случайную команду. Проблема в том что при определении в случайную команду это не считается за событие "jointeam" то-есть код на игрока не отрабатывает. Нужно поймать событие когда игроку определило случайную команду и установить для него g_bCheckFirstConnection[iClient] = true;
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
это команда. а как же ивент?
"autoteam"
Код отрабатывает только если вести в консоль "autoteam". Кода игра определяет игрока в команду код не отрабатывает.
C-подобный:
public void OnPluginStart()
{
    AddCommandListener(Hook_AutoTeam, "autoteam");
}

public Action Hook_AutoTeam(int iClient, const char[] command, int iArgs)
{
    PrintToChatAll("Случайная команда")
}

или еще так
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_team", Event_player_team);
}

public Action Event_player_team(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(hEvent.GetBool("autoteam"))
        PrintToChatAll("Случайная команда")
}
Также код не отработал


Забыл упомянуть игра кс го.
 
Последнее редактирование:

DeathScore13

пирожок. пирожочек.
Сообщения
738
Реакции
409
Код отрабатывает только если вести в консоль "autoteam". Кода игра определяет игрока в команду код не отрабатывает.
C-подобный:
public void OnPluginStart()
{
    AddCommandListener(Hook_AutoTeam, "autoteam");
}

public Action Hook_AutoTeam(int iClient, const char[] command, int iArgs)
{
    PrintToChatAll("Случайная команда")
}

или еще так
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_team", Event_player_team);
}

public Action Event_player_team(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(hEvent.GetBool("autoteam"))
        PrintToChatAll("Случайная команда")
}
Также код не отработал


Забыл упомянуть игра кс го.
тогда проверяй ещё ввод jointeam. если его не было и вызвался player_team, то игрок перемещён автоматически
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
тогда проверяй ещё ввод jointeam. если его не было и вызвался player_team, то игрок перемещён автоматически
Только что проверил. Если игрок не выбрал команду она определяется автоматически "player_team" ловит.


C-подобный:
public Action Event_player_team(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Название ивента %s", sEvName)
    if(hEvent.GetBool("autoteam"))
        PrintToChatAll("Случайная команда")
}

Первый принт отрабатывает второй нет.
Сообщения автоматически склеены:

Хм похоже что-то сломано?

Попробовал
if(!hEvent.GetBool("autoteam"))
PrintToChatAll("Случайная команда")

При любой смене команды буть то автоматическая или игрок сам поменял, получаем hEvent.GetBool("autoteam") = 0
 
Последнее редактирование:

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@oleg_nelasy, сударь, вы откуда во всех ивентах откопали autoteam?
 

_wS_

Участник
Сообщения
383
Реакции
760
Правильно выше сказали, если не было вызова jointeam, но сработал player_team, то это скорее всего
принудительный выбор команды, при этом "autoteam" равен false.

Измени mp_force_pick_time на 604800 и принудительного выбора команды не будет (ну будет, но через неделю).
И лови jointeam, код уже давали, если он вызвался впервые после входа, то блокируй и кидай в spec.
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@oleg_nelasy, сударь, вы откуда во всех ивентах откопали autoteam?
1637318612559.png

Сообщения автоматически склеены:

C-подобный:
public Action Event_PlayerTeam(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Сработало событие PlayerTeam")

    int iUserID = hEvent.GetInt("userid");       
    int iClient = GetClientOfUserId(iUserID);


    if(!g_bCheckFirstConnection[iClient])
        g_bCheckFirstConnection[iClient] = true;
    
    int oldteam,newteam;
    
    oldteam = hEvent.GetInt("oldteam");
    newteam = hEvent.GetInt("team");
    
    PrintToChatAll("Старая команда %d", oldteam)
    PrintToChatAll("Новая команда %d", newteam)
    
    if(g_iStatusSwapTeams[iClient] && hEvent.GetInt("oldteam") != CS_TEAM_SPECTATOR)
    {   
        ChangeClientTeam(iClient, CS_TEAM_SPECTATOR);
        return Plugin_Handled;
    }
    
    return Plugin_Continue;
}

Если отрабатывает "if(g_iStatusSwapTeams[iClient] && hEvent.GetInt("oldteam") != CS_TEAM_SPECTATOR)" то код сам себя зацикливает. Почему-то После смены команды с помощью "ChangeClientTeam(iClient, CS_TEAM_SPECTATOR);"Старая команда не меняет свое значение на 1 при следующем вызове и происходит зацикливание. Как побороть?

Сработало событие PlayerTeam
Старая команда 3
Новая команда 1
Krab1k становится наблюдателем
Сработало событие PlayerTeam
Старая команда 3
Новая команда 1
Krab1k становится наблюдателем
Сработало событие PlayerTeam
Старая команда 3
Новая команда 1
Krab1k становится наблюдателем
Сообщения автоматически склеены:

И еще вопрос. Судя по тесту:

Сработало событие JoinTeam
Krab1k присоединяется к террористам
Сработало событие PlayerTeam

Сперва отрабатывает JoinTeam
потом игроку меняет команду и выводит сообщение "Krab1k присоединяется к террористам"
После срабатывает ивент PlayerTeam

Как заблокировать вывод сообщения "Krab1k присоединяется к террористам"?
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
как бы есть ещё параметр "team" и достаточно сравнить индекс команд
Так мне надо переместить игрок в наблюдатели. А "team" это куда перемещен. Если сделать так то код не отработает.
C-подобный:
При похожем условии у меня будет заблокировано в перемещение в "jointeam"
if(g_iStatusSwapTeams[iClient] && hEvent.GetInt("team") != CS_TEAM_SPECTATOR)
 { 
     ChangeClientTeam(iClient, CS_TEAM_SPECTATOR);
     return Plugin_Handled;
 }
То будет перемещать только когда игрок перемещен в наблюдатели и это событие я не блокирую.
При таком варианте выглядит как бред. Игрок и так переместился в наблюдатели и мы его снова перемещаем в наблюдатели.
  
if(g_iStatusSwapTeams[iClient] && hEvent.GetInt("team") == CS_TEAM_SPECTATOR)
    ChangeClientTeam(iClient, CS_TEAM_SPECTATOR);

Мне надо конкретно переместить игрока в наблюдатели. Если сработал "autoteam" тогда "team" будет равно 2 или 3. Если его не заблокировало по условию "g_iStatusSwapTeams[iClient]" в "jointeam" потому что при "autoteam" код "jointeam" не отрабатывает. Его надо переместить в наблюдатели чтоб при последующих попытках зайти за команду отрабатывал "jointeam". В "jointeam" все работает четко, единственный обход это реконект и не выбирать команду при входе. Тогда кинет за случайную и "jointeam" не отработает. mp_force_pick_time 604800 вариант но выглядит очень не красиво так как пока игрок в команде 0 у него не работает адекватно камера и он не отображается в табе.
 

_wS_

Участник
Сообщения
383
Реакции
760
mp_force_pick_time 604800 вариант но выглядит очень не красиво так как пока игрок в команде 0 у него не работает адекватно камера и он не отображается в табе
Он вошёл на сервер и ничего не делает/уснул, какое кому дело что у него там с камерой?
Зачем он в табе, если по логике, адекватные AFK plugin'ы должны его кикнуть?

Скорее всего у тебя проблема в том, что ChangeClientTeam не работает в player_team, т.к. в csgo нужно это делать с задержкой.
Вот кот, проверил, работает:

PHP:
bool g_bMovedToSpectatorsAfterJoin[MAXPLAYERS + 1] = {true, ...};

public void OnClientConnected(int client)
{
    g_bMovedToSpectatorsAfterJoin[client] = false;
}

public void Event_player_team(Event event, const char[] name, bool dontBroadcast)
{
    int userid = event.GetInt("userid");
    int client = GetClientOfUserId(userid);
   
    if(!g_bMovedToSpectatorsAfterJoin[client] && client)
    {
        g_bMovedToSpectatorsAfterJoin[client] = true;
       
        if (event.GetInt("team") != 1) {
            RequestFrame(MoveToSpectatorsAfterJoin, userid);
        }
    }
}

public void MoveToSpectatorsAfterJoin(any data)
{
    int client = GetClientOfUserId(view_as<int>(data));
    if (client && IsClientInGame(client)) {
        ChangeClientTeam(client, 1);
    }
}

public void OnPluginStart()
{
    HookEvent("player_team", Event_player_team, EventHookMode_Post);
}
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@_wS_ @Grey83 @DeathScore13 Большое спасибо за разъяснения. Проблему решил с помощью установки таймера при подключении игрока и сменой ему команды если он в команде 0 в команду 1 за 1 секунду то отработки "autoteam". Большое спасибо @Nekro
 
Сверху Снизу