Change damage HL Egon

ssx

Сообщения
270
Реакции
71
Всем привет! Ломаю голову над простой задачей для ХЛ сервера - сделать 50% урон с EGON (пылесоса).

Не могу понять почему не работает. Подскажите знатоки.

Код:
#include <amxmodx>
#include <hl>
#include <reapi>

#define IsPlayer(%1)                (1 <= %1 <= g_iMaxPlayers)
new g_iMaxPlayers

public plugin_init()
{
    register_plugin("Damage Egon reAPI", "0.01", "ololo")
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", .post = false)
    g_iMaxPlayers = get_maxplayers()
}

public CBasePlayer_TakeDamage(const pPlayer, const pevInflictor, const pevAttacker, const Float:flDamage, const bitsDamageType)
{
    if(!IsPlayer(pevAttacker))
        return HC_CONTINUE
   
    if(get_user_weapon(pevAttacker) == HLW_EGON)
    {
        SetHookChainArg(4, ATYPE_FLOAT, flDamage * 0.5)
    }
   
    return HC_CONTINUE
}
 
Последнее редактирование:
Сообщения
580
Реакции
338
Предупреждения
1
Помог
9 раз(а)
Ты уверен, что проверка на HLW_EGON выполняется?
 
  • Нравится
Реакции: ssx

ssx

Сообщения
270
Реакции
71
steelzzz, Я тупанул, функция RG_CBasePlayer_TakeDamage то под reGameDLL а у меня HL без него.
Придётся довольствоваться Ham_TakeDamage

Тогда у меня пару вопросов по Ham

Код:
public TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
    if (attacker == 0 || attacker > _maxPlayers) // Действительно ли это нужно?!
        return HAM_IGNORED;

    // Check that damage was done with egon
    if (inflictor == attacker) // Действительно ли эта проверка на инфликтора нужна?!
    {
        if (get_user_weapon(attacker) != HLW_EGON) return HAM_IGNORED;
    }
    else
    {
        if (inflictor < _maxPlayers) return HAM_IGNORED; // Зачем проверки на класс оружия?
        new classname[64];
        pev(inflictor, pev_classname, classname, charsmax(classname));
        if (!equal(classname, "weapon_egon")) return HAM_IGNORED;
    }

    SetHamParamFloat(4, damage * 0.5);
    return HAM_HANDLED;
}
 
Сообщения
658
Реакции
230
Помог
11 раз(а)
get_user_weapon вернет только следующие оружие:


*не актуально, у вас HL
 
Последнее редактирование:
Сообщения
580
Реакции
338
Предупреждения
1
Помог
9 раз(а)
ssx, ты так и не ответил на мой вопрос
 

ssx

Сообщения
270
Реакции
71
steelzzz, На хаме всё хорошо. На reAPI нет ибо я уже увидел что RG_ под ReGAMEDLL который в ХЛ не поддерживается.
Есть пару вопросов (пост выше) по ХАМУ, зачем там такой сложный код?
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
Код:
if (attacker == 0 || attacker > _maxPlayers) // Действительно ли это нужно?!
    return HAM_IGNORED;
Нужно. Урон могут наносить не только игроки.

Код:
if (inflictor == attacker) // Действительно ли эта проверка на инфликтора нужна?!
Нужна. Инфликтор не равен аттакеру при нанесении урона с гранаты.

Код:
if (inflictor < _maxPlayers) return HAM_IGNORED; // Зачем проверки на класс оружия?
Если инфликтор оказался не равен аттакеру, через класс инфликтора узнаем что это за ентити.
 

ssx

Сообщения
270
Реакции
71
Ayk, но если проверяем конкретное оружие (egon) в руках то эти проверки ни к чему ?

То есть:
Нужно. Урон могут наносить не только игроки.
но с Egon пушки могут наносить урон только игроки.
Нужна. Инфликтор не равен аттакеру при нанесении урона с гранаты.
Опять же - проверка конкретно на Egon же
Если инфликтор оказался не равен аттакеру, через класс инфликтора узнаем что это за ентити.
При кокретной проверки на Egon в руках как может оказаться инфликтор != аттакер ?
 
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)
В уроне пылесоса инфликтор равен аттакеру. И есть ещё РадиусДемейдж для мультиплеера. Наверное самое точное будет (inflictor == attacker && (bitsDamageType & DMG_ENERGYBEAM) && get_member(activeItem, m_iId) == HLW_EGON).
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу