Change damage HL Egon

ssx

Сообщения
294
Реакции
86
Всем привет! Ломаю голову над простой задачей для ХЛ сервера - сделать 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
}
 
Последнее редактирование:
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
Ты уверен, что проверка на HLW_EGON выполняется?
 
  • Нравится
Реакции: ssx

ssx

Сообщения
294
Реакции
86
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;
}
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
get_user_weapon вернет только следующие оружие:


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

ssx

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

Ayk

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

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

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

ssx

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

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

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

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