[Решено] Нужна помощь по Event: player_disconnect

dr lex

Участник
Сообщения
22
Реакции
5
Доброе время суток
Нужна помощь по событию player_disconnect
В сети мало информации именно по самому Event

Суть проблемы:
Нужно узнать причину выхода игрока
stringreason"self", "kick", "ban", "cheat", "error"

Сам код:
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

char sg_log[160];

public void OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
    BuildPath(Path_SM, sg_log, sizeof(sg_log)-1, "logs/hm_disconnect.log");
}

public Action Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if ((client != 0) && !IsFakeClient(client))
    {
        char reason[100];
        event.GetString("reason", reason, sizeof(reason));
        if (StrContains(reason, "self", false) != -1)
        {
            strcopy(reason, sizeof(reason), "self");
            LogToFileEx(sg_log, "self");
        }
        else if (StrContains(reason, "kick", false) != -1)
        {
            strcopy(reason, sizeof(reason), "kick");
            LogToFileEx(sg_log, "Kicked");
        }
        else if (StrContains(reason, "ban", false) != -1)
        {
            strcopy(reason, sizeof(reason), "ban");
            LogToFileEx(sg_log, "ban");
        }
        else if (StrContains(reason, "cheat", false) != -1)
        {
            strcopy(reason, sizeof(reason), "cheat");
            LogToFileEx(sg_log, "cheat");
        }
        else if (StrContains(reason, "error", false) != -1)
        {
            strcopy(reason, sizeof(reason), "error");
            LogToFileEx(sg_log, "error");
        }
        else
        {
            strcopy(reason, sizeof(reason), "???");
            LogToFileEx(sg_log, "???");
        }
     
        char player_name[MAX_NAME_LENGTH];
        event.GetString("name", player_name, sizeof(player_name));
        LogToFileEx(sg_log, "[%s] Disconnect (%s)", player_name, reason);
        if (!dontBroadcast)
        {
            SetEventBroadcast(event, true);
        }
    }
    return Plugin_Continue;
}

Нужно отловить именно причины: когда игрок сам вышел или по ошибке вылетел. Возможно ли это узнать в принципе?
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Игра какая? Там иногда от игры к игре разнится реализация.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@dr lex, в \left4dead2\pak01_dir.vpk путь \resource\serverevents.res
serverevents.res:
    "player_disconnect"            // a client was disconnected
    {
        "userid"    "short"        // user ID on server
        "reason"    "string"    // "self", "kick", "ban", "cheat", "error"
        "name"        "string"    // player name
        "xuid"        "uint64"    // player xuid
        "networkid"    "string"    // player network (i.e steam) id
        "bot"        "bool"        // is this a bot
        "reliable"  "1"            // this event is reliable
    }
 

dr lex

Участник
Сообщения
22
Реакции
5
@Grey83, туда я полез сразу после этого
Проблема что оно не воспринимается. Есть ещё какие-то названия:

"connection rejected"
"timed out"
"by console"
"by user"
"ping is too high"
"No Steam logon"
"Steam account is being used in another"
"Steam Connection lost"
"This Steam account does not own this game"
"Validation Rejected"
"Certificate Length"
"Pure server"

Но по ним я тоже нечего не добился!
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@dr lex, а посчему не просто так?
C-подобный:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_disconnect", Event_Disconnect);
}

public void Event_Disconnect(Event event, const char[] name, bool dontBroadcast)
{
    if(event.GetBool("bot")) return;

    static char path[PLATFORM_MAX_PATH], reason[PLATFORM_MAX_PATH], nick[PLATFORM_MAX_PATH], netid[PLATFORM_MAX_PATH];

    if(!path[0]) BuildPath(Path_SM, path, sizeof(path), "logs/hm_disconnect.log");

    event.GetString("name", nick, sizeof(nick));
    event.GetString("networkid", netid, sizeof(netid));
    event.GetString("reason", reason, sizeof(reason));
    LogToFileEx(path, "'%s' (%s) disconnected (reason: '%s')", nick, netid, reason);
}
 

dr lex

Участник
Сообщения
22
Реакции
5
@dr lex, а посчему не просто так?
C-подобный:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_disconnect", Event_Disconnect);
}

public void Event_Disconnect(Event event, const char[] name, bool dontBroadcast)
{
    if(event.GetBool("bot")) return;

    static char path[PLATFORM_MAX_PATH], reason[PLATFORM_MAX_PATH], nick[PLATFORM_MAX_PATH], netid[PLATFORM_MAX_PATH];

    if(!path[0]) BuildPath(Path_SM, path, sizeof(path), "logs/hm_disconnect.log");

    event.GetString("name", nick, sizeof(nick));
    event.GetString("networkid", netid, sizeof(netid));
    event.GetString("reason", reason, sizeof(reason));
    LogToFileEx(path, "'%s' (%s) disconnected (reason: '%s')", nick, netid, reason);
}
Так не показывает причину.
Мне нужно знать причину вылета игрока с сервера, а этого нет.
C-подобный:
L 11/29/2020 - 'dr lex' (STEAM_1:1:**************) disconnected (reason: '')
 
Сверху Снизу