Вручную распределить игроков по командам

GermanIvanov

Участник
Сообщения
40
Реакции
1
Задумка заключается в том, чтобы скрыть окно выбора тима, а сразу запускать человека в игру, после входа в которую он автоматически присоединяется к команде по некоему признаку. В качестве примера возьмем ситуацию при которой все боты записываются в террористов, а все люди в контру.

Сначала я пытался перехватывать public OnClientPostAdminCheck(client) и оттуда вызывать ChangeClientTeam(client,team); Команда вроде срабатывала, окно выбора исчезало но после старта карты игрок оказывался в Unassign team.

Следующим шагом я попытался перехватить OnMapStart и там развести народ по своим местам.
public OnMapStart()
{
int team = 0;
for(new client = 1; client < MaxClients; client++)
if(IsClientInGame(client) && IsClientConnected(client))
{
GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
if(strcmp(steamid,"BOT")){ team=2;}else{team=3;}
ChangeClientTeam(client,team);
}
}

Ничего не произошло. Я пробовал вместо ChangeClientTeam использовать CS_SwitchTeam но она также не срабатывала.

Никто не подскажет, может следует перехватывать какое то другое cобытие, а не OnMapStart ?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
public OnClientPostAdminCheck(client)
Самое то.
после старта карты
Вызов выше идёт после каждой карты, когда игрок почти полностью подключён.
игрок оказывался в Unassign team
Не знаю, откуда вдруг такая проблема. С ботами/людьми или со всеми сразу?
может следует перехватывать какое то другое cобытие
Событие player_spawn идёт ещё позже всех стандартных вызовов SM. Но, лучше уж тогда player_activate для разового переброса при подключении игрока.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
как вариант отловить vgui с именем team, заблокировать его и переместить игрока в нужную команду
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
Не знаю, откуда вдруг такая проблема. С ботами/людьми или со всеми сразу?
с людьми, точнее со мной одним локальным во время отлаживания скрипта. может в обработчике не возвращаю в return что то нужное?

Но, лучше уж тогда player_activate
ага, спасибо попробую и отпишусь.

отловить vgui с именем team, заблокировать его
так далеко я еще не продвинулся в скрипте. Это как делается можно пример?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
может в обработчике не возвращаю в return что то нужное?
Все описанные здесь вызовы/события не требуют дополнительных "мучений".
Если тебе вообще нужно запретить выбор команды и после:
все боты записываются в террористов, а все люди в контру
То через:
PHP:
AddCommandListener(Callback, "jointeam");
В обратном вызове перекидываешь в нужную команду. Оффтоп
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
--- Добавлено позже ---
Событие player_spawn идёт ещё позже всех стандартных вызовов SM. Но, лучше уж тогда player_activate для разового переброса при подключении игрока.

Спасибо получилось!!! :drinks:
player_spawn - как выяснилось еще рано, а вот player_activate в самый раз. Игрок на несколько секунд вывешивается в unsigned, а затем переключается в террориста. Для тех кто будет набивать шишки вслед за мной вот рабочий код без излишеств.
PHP:
#include <sourcemod>
#define VERSION "1.0.0"
#define NAME "usercheck"
public Plugin:myinfo =
{
   name = NAME,
   author = "German",
   description = "Valid User checker",
   version = VERSION,
   url = ""
};
public OnPluginStart()
{
   HookEvent("player_activate", EventPlayerActivate);
}
public Action:EventPlayerActivate(Handle:event, const String:playername[], bool:dontBroadcast)
{
   int team = 0;
   decl String:steamid[32];
   int client = GetClientOfUserId(GetEventInt(event, "userid"));
   GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
   if(strcmp(steamid,"BOT")){
     team=CS_TEAM_T;     
   } else {
     team=CS_TEAM_CT;
 
}
ChangeClientTeam(client,team);
  
}
 
Последнее редактирование:

MaZa

Участник
Сообщения
1,732
Реакции
980
//// AutoTeam.sp
//
// AutoTeam.sp(23) : error 017: undefined symbol "CS_TEAM_T"
// AutoTeam.sp(25) : error 017: undefined symbol "CS_TEAM_CT"
// AutoTeam.sp(28) : warning 217: loose indentation
//
// 2 Errors.
//
// Compilation Time: 0,86 sec
// ----------------------------------------
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@MaZa_Mladwii, там инклюда #include <cstrike> в начале плагина не хватает
--- Добавлено позже ---
Вот тебе действительно без лишнего :ab:
PHP:
#include <cstrike>

public Plugin myinfo =
{
    name        = "usercheck",
    author        = "German",
    description    = "Valid User checker",
    version        = "1.0.1",
    url            = ""
};

public void OnPluginStart()
{
    HookEvent("player_activate", EventPlayerActivate);
}

public void EventPlayerActivate(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client) ChangeClientTeam(client, IsFakeClient(client) ? CS_TEAM_T : CS_TEAM_CT);
}
:ps: Раз начал использовать новый синтаксис, то используй его во всём плагине, а не в паре строчек
 
Последнее редактирование:

GermanIvanov

Участник
Сообщения
40
Реакции
1
Может, просто таймер стоило добавить на 1 секунду.
в принципе наверно можно, но это уже в финальной версии плагина.

Раз начал использовать новый синтаксис, то используй его во всём плагине, а не в паре строчек
Ага, так по-современней выглядит. А где нибудь можно скачать полный мануал по языку текущей версии, а то я все больше язык изучаю по фрагментам чужих плагинов.
 

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
@MaZa_Mladwii, там инклюда #include <cstrike> в начале плагина не хватает
--- Добавлено позже ---
Вот тебе действительно без лишнего :ab:
PHP:
#include <cstrike>

public Plugin myinfo =
{
    name        = "usercheck",
    author        = "German",
    description    = "Valid User checker",
    version        = "1.0.1",
    url            = ""
};

public void OnPluginStart()
{
    HookEvent("player_activate", EventPlayerActivate);
}

public void EventPlayerActivate(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client) ChangeClientTeam(client, IsFakeClient(client) ? CS_TEAM_T : CS_TEAM_CT);
}
:ps: Раз начал использовать новый синтаксис, то используй его во всём плагине, а не в паре строчек
#pragma newdecls required - и тебе даже не стоит говорить о новом синтаксисе ...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Vit_ amin,Оффтоп
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@AlmazON, при неверном UserID client будет равен "0"
поэтому и добавил на всякий пожарный
А выбор команды сделан так для более удобного редактирования: так проще значения менять
 
Сверху Снизу