Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Игрок определен в случайную команду поймать событие
Когда игрок заходить на сервер изначально его определяет в команду 0 или CS_TEAM_NONE. Если игрок в течении н времени так и не выбрал команду его определяет в случайную команду. Проблема в том что при определении в случайную команду это не считается за событие "jointeam" то-есть код на игрока не отрабатывает. Нужно поймать событие когда игроку определило случайную команду и установить для него g_bCheckFirstConnection[iClient] = true;
Правильно выше сказали, если не было вызова jointeam, но сработал player_team, то это скорее всего
принудительный выбор команды, при этом "autoteam" равен false.
Измени mp_force_pick_time на 604800 и принудительного выбора команды не будет (ну будет, но через неделю).
И лови jointeam, код уже давали, если он вызвался впервые после входа, то блокируй и кидай в spec.
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 присоединяется к террористам"?
Так мне надо переместить игрок в наблюдатели. А "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 у него не работает адекватно камера и он не отображается в табе.
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);
}
@_wS_@Grey83@DeathScore13 Большое спасибо за разъяснения. Проблему решил с помощью установки таймера при подключении игрока и сменой ему команды если он в команде 0 в команду 1 за 1 секунду то отработки "autoteam". Большое спасибо @Nekro