Как проверить сгорел ли игрок?

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
@MrQout, у тебя там проверки неправильно расположены (хотя скорей всего в них и нет особой надобности).
И отдельные переменные не нужны если значение используется в коде только один раз
Это понятно, делал же для человека который особо вообще не понимает в этом, а так функция IsValidPlayer не нужна вообще, ибо она 1 раз юзается, health переменная не нужна поскольку лишь 1 раз сравнивается в условии и что-то еще вроде бы. Но так намного приятнее смотрится как по мне да и новокекам понятнее. 😂
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@MrQout, ещё индекс игрока не должен у тебя получаться больше, чем MaxClients (потому как в таком случае должен возвращаться 0), да и индекс команды не должен быть ниже 1 (попробуй нанеси урон наблюдателю).

В общем достаточно вот этого, кмк:
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Pre);
}

public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(GetEventInt(event, "userid")))
//    || client != GetClientOfUserId(GetEventInt(event, "attacker"))    // Суицид
    || GetEventInt(event, "health") > 0)
        return;

    static char wpn[8];    // нас в любом случае интересует только первые 7 символов
    GetEventString(event, "weapon", wpn, sizeof(wpn));

    // Твой код...
    if(!wpn[0])    // Если убил мир
    {
    }
    // Если сгорел (inferno = weapon_molotov и weapon_incgrenade)
    else if(!strcmp(wpn, "inferno", false)) PrintToChatAll("Игрок %N сгорел по пьяни", client);
}
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
@MrQout, ещё индекс игрока не должен у тебя получаться больше, чем MaxClients (потому как в таком случае должен возвращаться 0), да и индекс команды не должен быть ниже 1 (попробуй нанеси урон наблюдателю).

В общем достаточно вот этого, кмк:
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Pre);
}

public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(GetEventInt(event, "userid")))
//    || client != GetClientOfUserId(GetEventInt(event, "attacker"))    // Суицид
    || GetEventInt(event, "health") > 0)
        return;

    static char wpn[8];    // нас в любом случае интересует только первые 7 символов
    GetEventString(event, "weapon", wpn, sizeof(wpn));

    // Твой код...
    if(!wpn[0])    // Если убил мир
    {
    }
    // Если сгорел (inferno = weapon_molotov и weapon_incgrenade)
    else if(!strcmp(wpn, "inferno", false)) PrintToChatAll("Игрок %N сгорел по пьяни", client);
}
позитивненький код вышел

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

игрок кинет молотов и выйдет > будет ошибки сыпать.
Ты про что? если про код который я приложил то у меня ошибок вроде бы не наблюдается никаких. (Но это не точно, если это действительно так, можешь объяснить логически почему это произойдет?)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@ironman, там юзерид только жертвы запрашивается.
Ошибка может появиться только если в момент смерти игрок вышел (да и то хз какая разница в тиках должна быть м/у этими двумя событиями).
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
@ironman, там юзерид только жертвы запрашивается.
Ошибка может появиться только если в момент смерти игрок вышел (да и то хз какая разница в тиках должна быть м/у этими двумя событиями).
я имел ввиду версию который постом выше, не обращал внимание на то, что есть снизу еще версии.
а так просто подметил, что такое может быть если не сделать проверку.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@ironman, так нужно было на сообщение ссыль делать
или цитировать его часть
 

BlackPro

Участник
Сообщения
75
Реакции
11
Если я всё верно понял то держи

Код:
public void OnPluginStart()
{
    HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Pre);
}

public void OnPluginEnd()
{
    // Не уверен в надобности, но всё таки...
    UnhookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Pre);
}

public Action Event_PlayerHurt(Handle hEvent, const char[] name, bool dontBroadcast)
{
    int
        iClient  = GetClientOfUserId(GetEventInt(hEvent, "userid")),
        Attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker")),
        Health   = GetEventInt(hEvent, "health");

    if (IsValidPlayer(iClient)
        /* && iClient == Attacker / Суицид */
        && Health < 1)
    {
        char WeaponName[64];
        GetEventString(hEvent, "weapon", WeaponName, sizeof(WeaponName));

        // Твой код...
        if (WeaponName[0] == '\0')
        {
                // Если убил мир
        }
        // Если сгорел
        // inferno = weapon_molotov и weapon_incgrenade
        if (!strcmp(WeaponName, "inferno", false))
            PrintToChatAll("Игрок %N - Сгорел попьяне", iClient);
    }

    return Plugin_Continue;
}

bool IsValidPlayer(int iClient)
{
    return (iClient > 0 && iClient <= MaxClients
        && IsClientInGame(iClient) && GetClientTeam(iClient) > 1);
}
Не чуть не правильно, у меня просто не отлавливалось убийство молотовым или зажигательной гранатой методом сгорания, т.е есть некоторые ситуации:
Одна когда игрок сгорел от брошеного огня, а другая когда у игрока остался 1 хп, и в него кинули гранату и он умер, и не от огня а от гранаты.
Вот последнее у меня получилось, а конкретно если игрок погибал от огня, посредством горения не получалось, собственно мне уже дали ответ надо было проверять не StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"), а StrEqual(sWeapon, "inferno") Конкретно в моём случае мой код выглядит так: if (StrEqual(sWeapon, "inferno") || StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"))
Сначала проверяем inferno сгорел ли игрок, это будет происходить чаще чем два остальных, по этому я проверяю это первым, если же это условие ложное, то есть два других molotov и incgrenade, как раз эти два условия проверяют не факт смерти от горения, а тупо смерть от брошеной гранаты, ну это что-то типа того когда один игрок убивал другого выброшенной C4. Как-то так.
 
Сверху Снизу