Старая функция нанесения урона игроку. Имитация урона в 0 ХП.

Banana

Участник
Сообщения
892
Реакции
113
PHP:
void DealDamage(victim,damage,attacker=0,dmg_type=DMG_GENERIC,String:weapon[]="")
{
    if(victim>0 && IsValidEdict(victim) && IsClientInGame(victim) && IsPlayerAlive(victim) && damage>0)
    {
        new String:dmg_str[16];
        IntToString(damage,dmg_str,16);
        new String:dmg_type_str[32];
        IntToString(dmg_type,dmg_type_str,32);
        new pointHurt=CreateEntityByName("point_hurt");
        if(pointHurt)
        {
            DispatchKeyValue(victim,"targetname","war3_hurtme");
            DispatchKeyValue(pointHurt,"DamageTarget","war3_hurtme");
            DispatchKeyValue(pointHurt,"Damage",dmg_str);
            DispatchKeyValue(pointHurt,"DamageType",dmg_type_str);
            if(!StrEqual(weapon,""))
            {
                DispatchKeyValue(pointHurt,"classname",weapon);
            }
            DispatchSpawn(pointHurt);
            AcceptEntityInput(pointHurt,"Hurt",(attacker>0)?attacker:-1);
            DispatchKeyValue(pointHurt,"classname","point_hurt");
            DispatchKeyValue(victim,"targetname","war3_donthurtme");
            RemoveEdict(pointHurt);
        }
    }
}

Давным давно где-то нарыл эту функцию и без запар ею пользовался.. однако сейчас возникла необходимость сымитировать урон игроку в 0 хп. Т.е как будто бы нанеся урон но ХП не снялось.. подскажите как это сделать?
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Нанеси урон, и потом верну хп не подходит такой вариант?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
как на счёт
SlapPlayer(client, 0, false);
 

Muinez

Участник
Сообщения
132
Реакции
120
C++:
static int iHealthOffs;
if (!iHealthOffs)
{
    iHealthOffs = FindSendPropInfo("CBasePlayer", "m_iHealth");
}

SetEntData(client, iHealthOffs, GetEntData(client, iHealthOffs) + 1);
SDKHooks_TakeDamage(client, client, client, 1.0);
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Muinez, только в SetEntData() в конце м/б нужно добавить в конце true.
void SetEntData(int entity, int offset, any value, int size, bool changeState)
SetEntData(client, iHealthOffs, GetEntData(client, iHealthOffs) + 1, _, true);
 

Banana

Участник
Сообщения
892
Реакции
113
Спасибо, тыкнул бы лайк да мне эту функцию отключили почему-то) Проверю сообщу )
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
и ещё м/б броник так же нужно будет подлатывать перед использованием SDKHooks_TakeDamage()
Сообщения автоматически склеены:

отключили почему-то
вангую, что из-за злоупотреблении этой функцией 😏
 

Muinez

Участник
Сообщения
132
Реакции
120
перед использованием SDKHooks_TakeDamage()
ну не совсем

C++:
static int iHealthOffs, iArmorOffs;
if (!iHealthOffs)
{
    iHealthOffs = FindSendPropInfo("CBasePlayer", "m_iHealth");
    iArmorOffs = FindSendPropInfo("CCSPlayer", "m_ArmorValue");
}

int iArmor = GetEntData(client, iArmorOffs);
SetEntData(client, iArmorOffs, 0);
SetEntData(client, iHealthOffs, GetEntData(client, iHealthOffs) + 1);
SDKHooks_TakeDamage(client, client, client, 1.0);
SetEntData(client, iArmorOffs, iArmor);

так вроде норм работает и не хилит если есть армор
 
Сверху Снизу