OnClientConnected вызывается каждый раз OnMapStart

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
OnClientPutInServer OnClientConnect OnClientConnected все это вызывается каждый раз в начале карты.
и причем Hook player_activate тоже.
Так и должно быть?
 

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
Все вызываются, кроме player_connect. Оффтоп
Спасибо. Проглядел его.

player_connect
Note: A new client connected

Name: player_connect
Structure:
string name player name
byte index player slot (entity index-1)
short userid user ID on server (unique on server)
string networkid player network (i.e steam) id
string address ip:port
short bot is a bot
player_connect_client
Note: A new client connected, only present in OB

Name: player_connect_client
Structure:
string name player name
byte index player slot (entity index-1)
short userid user ID on server (unique on server)
string networkid player network (i.e steam) id
short bot is a bot

Про этот прототип имеешь ввиду? Кроме как отсутствия ip:port разницы не вижу, в чем соль?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
OnClientPutInServer OnClientConnect OnClientConnected все это вызывается каждый раз в начале карты.
Сервер отключает игроков от себя каждый раз при смене карты, и в итоге они подключаются вновь после смены карты, поэтому эти форварды и вызываются каждую смену карты.
Если быть более точным, то эти события вызываются при каждой смене карты для каждого игрока:

Начало карты (вызываются примерно в таком порядке):
OnClientConnect
OnClientAuthorized
OnClientConnected
OnClientPutInServer
OnClientPreAdminCheck
OnClientPostAdminCheck
OnClientPostAdminFilter

Конец карты:
OnClientDisconnect
OnClientDisconnect_Post

Кроме как отсутствия ip:port разницы не вижу, в чем соль?
Нет разницы, просто добавили новое поле в событие.
 

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
Спасибо
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_connect", eV_player_connect);
}


public void eV_player_connect(Handle event, const char[] name, bool DB)
{
    int userid = GetEventInt(event, "userid");
    int client = GetClientOfUserId(userid);
    int client2 = GetEventInt(event, "index");
    char networkid[32];
    GetEventString(event, "networkid", networkid, sizeof(networkid));
    dbgMsg("%i %i %i %s", client, client2, userid, networkid);
}
В итоге получается
C-подобный:
0 0 20 STEAM_1:0:40849190
0 1 21 BOT
0 1 22 BOT
0 2 23 BOT
0 3 24 BOT
0 4 25 BOT
0 5 26 BOT
0 6 27 STEAM_1:0:77465821
GetClientOfUserId почему-то не срабатывает, а GetEventInt(event, "index") дает на 1 ниже
Так и должно быть?
И будет ли GetEventInt(event, "index") + 1 брать правильный индекс игрока?
 

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
Нельзя так получить индекс игрока в этом событии. Слишком рано, получение идёт от OnClientConnect.
GetEventInt(event, "index") + 1 будет ли правильным индексом.

В итоге мне нужно получить стимид и индекс игрока.
По идее можно сделать и так.
C-подобный:
public void OnClientAuthorized(int client, const char[] auth)
{
    if (GetClientTime(client) < 1.0)   // пробовал меньше секунды, может не успеть сработать.
    {
        char steamid[32];
        Format(steamid, sizeof(steamid), "%s", auth);
       dbgMsg("%i  %s", client,  auth);
    }
}
Какой способ рациональнее использовать в плане надежности и производительности?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Какой способ рациональнее использовать в плане надежности и производительности?
В плане надёжности рекомендуется получать стим вручную при помощи GetClientAuthId, поскольку OnClientAuthorized передает стим в формате, которое сделали Valve. Таким образом, при всех их сменах форматов (как это было при смене с Steam2 на Steam3) плагины продолжат работать корректно.
 

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
C-подобный:
public void OnPluginStart()
{
     HookEvent("player_connect", eV_player_connect);
}

public void eV_player_connect(Handle event, const char[] name, bool DB)
{
    int client = GetEventInt(event, "index") + 1;
    char steamid[32];
    GetEventString(event, "networkid", networkid, sizeof(steamid));
    dbgMsg("%i %s", client, steamid);
}
В общем такой вариант у меня в CS:GO работает, индексы берет верные, стимид получает в виде AuthId_Steam2, ну и самое главное в начале каждой карты не вызывается.

P.S. Правда не проверял будет ли работать GetClientAuthId на этом этапе
 
Сверху Снизу