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

BlackPro

Участник
Сообщения
75
Реакции
11
У меня в событии смерти игрока идёт сравнение двух строк.
C-подобный:
if (StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"))
Как видете если одно из условий верно, выполняем, т.е если жертва пострадала от молотова коктеля, или от зажигательной гранаты, делаем действие.
Вроде бы всё так, но на практике, это выполняется, только если у жертвы 1 HP, и смерть наступает не от сгорания, а от hurt'a от грены если можно так сказать.
Т.е кину грену она ударилась об игрока игрок скопытился, но не сгорел. Меня это тоже устраивает, но по мимо этого нужно ещё отлавливать смерть от огня коктеля, или зажигательной гранаты, ну надеюсь нормально объяснил. Фух.
Спасибо.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
У меня в событии смерти игрока идёт сравнение двух строк.
C-подобный:
if (StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"))
Как видете если одно из условий верно, выполняем, т.е если жертва пострадала от молотова коктеля, или от зажигательной гранаты, делаем действие.
Вроде бы всё так, но на практике, это выполняется, только если у жертвы 1 HP, и смерть наступает не от сгорания, а от hurt'a от грены если можно так сказать.
Т.е кину грену она ударилась об игрока игрок скопытился, но не сгорел. Меня это тоже устраивает, но по мимо этого нужно ещё отлавливать смерть от огня коктеля, или зажигательной гранаты, ну надеюсь нормально объяснил. Фух.
Спасибо.
Попробуй проверить на inferno
А вообще было бы неплохо в консоль или чат выводить оружие, от которого наступила смерть и писать код на этой основе
Надеюсь я правильно понял смысл темы
 

BlackPro

Участник
Сообщения
75
Реакции
11
Попробуй проверить на inferno
А вообще было бы неплохо в консоль или чат выводить оружие, от которого наступила смерть и писать код на этой основе
Надеюсь я правильно понял смысл темы
Всё правильно ты понял, спасибо сработало, я так понял брать оружку и пихать её в допустим чат, вот так???
C-подобный:
public Event_PlayerDeath(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
{
    int attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    if (attacker > 0 && IsPlayerAlive(attacker))
    {
        decl String:sWeapon[32];
        GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
        PrintToChat(attacker, "Weapons: %i", sWeapon);
    }
}
Я так понимаю нужная строка будет в чате.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Всё правильно ты понял, спасибо сработало, я так понял брать оружку и пихать её в допустим чат, вот так???
C-подобный:
public Event_PlayerDeath(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
{
    int attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    if (attacker > 0 && IsPlayerAlive(attacker))
    {
        decl String:sWeapon[32];
        GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
        PrintToChat(attacker, "Weapons: %i", sWeapon);
    }
}
Я так понимаю нужная строка будет в чате.
Всё верно, убиваете игрока/бота с чего душе угодно и в чате отобразиться содержимое строки
 

BlackPro

Участник
Сообщения
75
Реакции
11
Тогда ещё спрошу, в чём различие между: StrEqual и strcmp
А если быть точнее на предидущем примере:
C-подобный:
if(!strcmp(sWeapon, "inferno"))
или
if(StrEqual(sWeapon, "inferno"))
Судя по документации на sm
второе просто сравнивает строки на соответствие, если верно, то как бы окей, True)

А вот первое мне в двух словах расказали, но я не понял, а в доках написано что возврашает -1 if str1 < str2 0 if str1 == str2 1 if str1 > str2
Т.е 0 если строки равны, ну допустим равны а зачем мне инвертировать?
Сообщения автоматически склеены:

Ты выводишь текст через оператор целого числа %i вместо %s.
Буду знать. А какие ещё есть "операторы"? Помоему мне дорога в мануалы ребят по сорспавну, я видел тут есть)
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Тогда ещё спрошу, в чём различие между: StrEqual и strcmp
А если быть точнее на предидущем примере:
C-подобный:
if(!strcmp(sWeapon, "inferno"))
или
if(StrEqual(sWeapon, "inferno"))
Судя по документации на sm
второе просто сравнивает строки на соответствие, если верно, то как бы окей, True)

А вот первое мне в двух словах расказали, но я не понял, а в доках написано что возврашает -1 if str1 < str2 0 if str1 == str2 1 if str1 > str2
Т.е 0 если строки равны, ну допустим равны а зачем мне инвертировать?
C-подобный:
stock bool StrEqual(const char[] str1, const char[] str2, bool caseSensitive=true)
{
    return (strcmp(str1, str2, caseSensitive) == 0);
}
Прямиком из string.inc
StrEqual - просто обёртка над strcmp, создана скорее всего в качестве упрощенного для понимания варианта
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #8
в чём различие между: StrEqual и strcmp
Попробуйте в инклуду заглянуть, приличия ради:
C-подобный:
/**
 * Returns whether two strings are equal.
 *
 * @param str1          First string (left).
 * @param str2          Second string (right).
 * @param caseSensitive If true (default), comparison is case sensitive.
 *                      If false, comparison is case insensitive.
 * @return              True if equal, false otherwise.
 */
stock bool StrEqual(const char[] str1, const char[] str2, bool caseSensitive=true)
{
    return (strcmp(str1, str2, caseSensitive) == 0);
}
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
Тогда ещё спрошу, в чём различие между: StrEqual и strcmp
А если быть точнее на предидущем примере:
C-подобный:
if(!strcmp(sWeapon, "inferno"))
или
if(StrEqual(sWeapon, "inferno"))
Судя по документации на sm
второе просто сравнивает строки на соответствие, если верно, то как бы окей, True)

А вот первое мне в двух словах расказали, но я не понял, а в доках написано что возврашает -1 if str1 < str2 0 if str1 == str2 1 if str1 > str2
Т.е 0 если строки равны, ну допустим равны а зачем мне инвертировать?
StrEqual это сток того же strcmp, но в виде bool. Упрощенный вид, но за счет того, что идет сток > конвартация в bool, немного уступает по скорости.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Буду знать. А какие ещё есть "операторы"? Помоему мне дорога в мануалы ребят по сорспавну, я видел тут есть)
Верно

 

BlackPro

Участник
Сообщения
75
Реакции
11
C-подобный:
stock bool StrEqual(const char[] str1, const char[] str2, bool caseSensitive=true)
{
    return (strcmp(str1, str2, caseSensitive) == 0);
}
Прямиком из string.inc
StrEqual - просто обёртка над strcmp, создана скорее всего в качестве упрощенного для понимания варианта
Ну а вот если её использовать, насколько это криво с точки зрения машинного кода, я так понимаю компилятор всё ровно сделает всё сам, и разницы не будет в том использую я обёртку или нет, компилятор соберёт ведь всё ровно чисто, или я ошибаюсь?
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Ну а вот если её использовать, насколько это криво с точки зрения машинного кода, я так понимаю компилятор всё ровно сделает всё сам, и разницы не будет в том использую я обёртку или нет, компилятор соберёт ведь всё ровно чисто, или я ошибаюсь?
По опыту скажу: немного уступит в скорости, скорее всего останется лишний прыжок
+ там не машинный код, там байткод, SourcePawn - виртуальная машина, насколько мне известно
 

BlackPro

Участник
Сообщения
75
Реакции
11
Понял, парни да я просто не шарю, я понял что немножечко глупые вопросы задаю, ну просто не умею пользоватся документацией, и не всегда все конструкции языка мне ясны и понятны, вот по этому всё так)
Сообщения автоматически склеены:

@inklesspen, Я попробовал это:
C-подобный:
public Event_PlayerDeath(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
{
    int attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    if (attacker > 0 && IsPlayerAlive(attacker))
    {
        decl String:sWeapon[32];
        GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
        PrintToChat(attacker, "Weapons: %s", sWeapon);
    }
}
Не работает, в чат не пишет.
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
У меня в событии смерти игрока идёт сравнение двух строк.
C-подобный:
if (StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"))
Как видете если одно из условий верно, выполняем, т.е если жертва пострадала от молотова коктеля, или от зажигательной гранаты, делаем действие.
Вроде бы всё так, но на практике, это выполняется, только если у жертвы 1 HP, и смерть наступает не от сгорания, а от hurt'a от грены если можно так сказать.
Т.е кину грену она ударилась об игрока игрок скопытился, но не сгорел. Меня это тоже устраивает, но по мимо этого нужно ещё отлавливать смерть от огня коктеля, или зажигательной гранаты, ну надеюсь нормально объяснил. Фух.
Спасибо.
Как я понял вам необходимо понять от молотова был ли урон, иного выхода как SDKHook я не нашёл.
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
У меня в событии смерти игрока идёт сравнение двух строк.
C-подобный:
if (StrEqual(sWeapon, "molotov") || StrEqual(sWeapon, "incgrenade"))
Как видете если одно из условий верно, выполняем, т.е если жертва пострадала от молотова коктеля, или от зажигательной гранаты, делаем действие.
Вроде бы всё так, но на практике, это выполняется, только если у жертвы 1 HP, и смерть наступает не от сгорания, а от hurt'a от грены если можно так сказать.
Т.е кину грену она ударилась об игрока игрок скопытился, но не сгорел. Меня это тоже устраивает, но по мимо этого нужно ещё отлавливать смерть от огня коктеля, или зажигательной гранаты, ну надеюсь нормально объяснил. Фух.
Спасибо.
Если я всё верно понял то держи

Код:
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);
}
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Если я всё верно понял то держи

Код:
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)
{
    char WeaponName[64];

    int
        iClient  = GetClientOfUserId(GetEventInt(hEvent, "userid")),
        Attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker")),
        Health   = GetClientHealth(iClient);

    if (IsValidPlayer(iClient)
        /* && iClient == Attacker / Суицид */
        && Health < 1)
    {
        GetEventString(hEvent, "weapon", WeaponName, sizeof(WeaponName));
    
        // Твой код...

        // inferno = weapon_molotov и weapon_incgrenade
        if (strcmp(WeaponName, "inferno", false) >= 0)
            PrintToChatAll("Игрок %N - Сгорел попьяне", iClient);
    }

    return Plugin_Continue;
}

bool IsValidPlayer(int iClient)
{
    return (iClient > 0 && iClient <= MaxClients
        && IsClientInGame(iClient) && GetClientTeam(iClient) > 1);
}
А не будет ли он выдавать оружие которое в руках в данный момент, а не с какого попали?
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
А не будет ли он выдавать оружие которое в руках в данный момент, а не с какого попали?
Я чекал только что, всё работает как надо. 💜
Но могу дописать показ оружия которое сейчас в руках если тебе нужно.
Сообщения автоматически склеены:

А не будет ли он выдавать оружие которое в руках в данный момент, а не с какого попали?
Делать всё равно нечего, вот держи если надо.

Код:
public Action Event_PlayerHurt(Handle hEvent, const char[] name, bool dontBroadcast)
{
   char Keep_WeaponName[64];
  
   int
       iClient  = GetClientOfUserId(GetEventInt(hEvent, "userid")),
       Attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker")),
       Health   = GetEventInt(hEvent, "health");
  
   if (IsPlayerAlive(iClient))
   {
       GetClientWeapon(iClient, Keep_WeaponName, sizeof(Keep_WeaponName));
       Format(Keep_WeaponName, sizeof(Keep_WeaponName), " / Оружие в руках - %s", Keep_WeaponName);
   }
  
   if (IsValidPlayer(iClient)
       /* && iClient == Attacker / Суицид */
       && Health < 1)
   {
       char Death_WeaponName[64];
       GetEventString(hEvent, "weapon", Death_WeaponName, sizeof(Death_WeaponName));
      
       // ...
       if (Death_WeaponName[0] == '\0')
       {
           // Если убил мир
       }
       // Если сгорел
       else if (!strcmp(Death_WeaponName, "inferno", false))
           PrintToChatAll("%N - Сгорел попьяне.%s", iClient, Keep_WeaponName);
   }
  
   return Plugin_Continue;
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@MrQout, для чего получать в событии атакующего игрока и здоровье, если это нигде не используется?
И при выгрузке плагина делать UnhookEvent() смысла нет: при выгрузке это делается автоматически, емнип
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
@MrQout, для чего получать в событии атакующего игрока и здоровье, если это нигде не используется?
И при выгрузке плагина делать UnhookEvent() смысла нет: при выгрузке это делается автоматически, емнип
Насчет UnhookEvent комментарий оставил что точно не знаю имеет ли это смысл или нет.
насчет получения атакующего - комментарии чекни (/* && iClient == Attacker / Суицид */), также и про здоровье. Выше как я прочел надо действие когда игрок умирает, поэтому я и чекаю хп если оно ноль или меньше то чекаем от чего умер и воспроизводим действие.
 

Grey83

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