Убрать повреждения от своей гранаты

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 2 ноя 2013.

Статус темы:
Закрыта.
  1. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    Собственно в названии всё сказано.

    Сделал так:
    PHP:
    public Action:Event_PlayerHurt(Handle:eventString:name[], bool:dontBroadcast)
    {
    new 
    victim GetClientOfUserId(GetEventInt(event"userid"));
    new 
    attacker GetClientOfUserId(GetEventInt(event"attacker"));
    if (
    attacker && attacker == victim)
    {
    decl String:weapon[64]; 
    GetEventString(event"weapon"weaponsizeof(weapon)-1);
    if(
    strcmp(weapon"hegrenade") == 0)
    {
    new 
    dhealth GetEventInt(event"dmg_health");
    new 
    darmor GetEventInt(event"dmg_armor");
    new 
    health GetEventInt(event"health");
    new 
    armor GetEventInt(event"armor");

    if (
    dhealth 0)
    SetEntProp(victimProp_Send"m_iHealth", (health dhealth), 1);
    if (
    darmor 0)
    SetEntProp(victimProp_Send"m_ArmorValue", (armor darmor), 1);
    return 
    Plugin_Changed;
    }
    }
    return 
    Plugin_Continue;
    }
    Но этот код имеет недостатки. К примеру, у игрока 30 хп, он кидает гранату и снимает себе -60 хп, в итоге у него становится 60 хп.

    Каким еще способом можно кбрать повреждение от своей гранаты?
     
    Последнее редактирование: 2 ноя 2013
  2. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Re: Убрать повреждение от своей гранаты

    Код:
    new         g_iHealthOffset,
                g_iArmorValueOffset;
    
    public OnPluginStart()
    {   
        g_iHealthOffset     = FindSendPropOffs("CCSPlayer", "m_iHealth");
        g_iArmorValueOffset = FindSendPropOffs("CCSPlayer", "m_ArmorValue");
        HookEvent("player_hurt", Ev_PlayerHurt, EventHookMode_Pre);
    }
    
    public Action:Ev_PlayerHurt(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
    {
        new iClient     = GetClientOfUserId(GetEventInt(hEvent, "userid")),
            iAttacker   = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
        
        if ( iClient == iAttacker )
        {
            decl String:sWeapon[32];
            GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon) - 1);
            
            if ( StrEqual(sWeapon, "hegrenade") )
            {
                new iDamage = GetEventInt(hEvent, "dmg_health"),
                    iArmor  = GetEventInt(hEvent, "dmg_armor"),
                    iHealth = GetEntData(iClient, g_iHealthOffset),
                    iArmor2 = GetEntData(iClient, g_iArmorValueOffset);
                
                if ( iDamage > 0 )
                {
                    SetEntData(iClient, g_iHealthOffset, (iHealth + iDamage));
                }
                if ( iArmor > 0 )
                {
                    SetEntData(iClient, g_iArmorValueOffset, (iArmor + iArmor2));
                }
            }
        }
        
        return Plugin_Continue;
    }
     
    Последнее редактирование: 2 ноя 2013
    Серый™ и R1KO нравится это.
  3. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    через sdkhooks намного проще будет
     
    SenatoR нравится это.
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    semjef, но нагрузка больше будет
     
    Последнее редактирование: 2 ноя 2013
  5. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    По моему лучше через сдк
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    closed.


    Reiko1231, Спасибо.
     
Статус темы:
Закрыта.