AbsorbDamage

From ZDoom Wiki
Jump to navigation Jump to search


Inventory

virtual void AbsorbDamage (int damage, Name damageType, out int newdamage, Actor inflictor = null, Actor source = null, int flags = 0)

Usage

Allows inventory items to manipulate the damage an actor receives. It is called when an actor is damaged, provided the damage is not set up to bypass armor and is greater than zero. Note that the function is called after ModifyDamage, another similar function for damage manipulation.

This function's main usage is with armor, but could be used with any inventory item.

Parameters

  • int damage
The amount of damage the attack would deal without modification.
  • Name damageType
The damage type applied to the attack. Regular attacks use 'Normal', hitscan attacks use 'Hitscan'.
  • out int newdamage
The amount of damage the attack will deal after this function has been called. If nothing is done with this value, damage will be used unmodified. Note, if the idea is to use this function to obtain data without modifying the damage, calling newdamage = damage is redundant; it's enough to simply not do anything with newdamage at all.
  • Actor inflictor
The actor dealing the damage. This is the missile for projectiles and the puff for hitscan attacks. For monster melee attacks this is the same as the source.
  • Actor source
The actor responsible for the inflictor.
  • int flags - The damage flags to use in the attack:
  • DMG_NO_ARMOR - The attack doesn't call AbsorbDamage on any of the victim's inventory items.
  • DMG_NO_PAIN - The attack does not cause the victim to enter their Pain state sequence.
  • DMG_INFLICTOR_IS_PUFF - Used by ApplyKickback to determine whether the origin should be the source (if the flag is set) or the inflictor. Automatically set by hitscan attacks.
  • DMG_THRUSTLESS - The attack doesn't call ApplyKickback on the victim.
  • DMG_FORCED - The attack ignores all damage negation flags/properties the victim has, such as NODAMAGE, and doesn't call special damage functions e.g. TakeSpecialDamage. Players with the NODAMAGE flag, god2, or buddha2 cheats are immune due to potential abuse.
  • DMG_NO_FACTOR - The attack doesn't apply the victim's damage factors.
  • DMG_PLAYERATTACK - Set if the attack came from a hitscan weapon fired by a player.
  • DMG_FOILINVUL - The attack ignores the INVULNERABLE flag if the victim has it set.
  • DMG_FOILBUDDHA - The attack ignores the BUDDHA flag if the victim has it set.
  • DMG_NO_PROTECT - The attack doesn't call ModifyDamage or AbsorbDamage on any of the victim's inventory items.
  • DMG_NO_ENHANCE - The attack doesn't call ModifyDamage on any of the source's inventory items.
  • DMG_USEANGLE - The attack uses use the angle parameter when applying kickback instead of having ApplyKickback calculate the angle from the origin of the attack.
  • DMG_EXPLOSION - The attack is marked as splash damage from an explosion. This is set automatically if the damage came from an explosive projectile.
NOTE: While the list of flags is the same as used by DamageMobj, this function, naturally, won't be able to intercept attacks that are specifically set to bypass it, so DMG_NOPROTECT will never be readable.

Examples

This item fully absorbs damage from fire-based attacks, and half damage from ice-based attacks.

class FireAndIceProtection : Inventory
{
    Default
    {
        Inventory.Amount 1; //example values
        Inventory.MaxAmount 10; //example values
    }

    override void AbsorbDamage (int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags)
    {
        if (damageType == 'Fire')
        {
            newdamage = 0;
        }
        else if (damageType == 'Ice')
        {
            newdamage = damage / 2;
        }
    }

    States {
    Spawn:
        FIRP A -1; //example sprite name
        stop;
    }
}

See also