Skip to main content

Damage

Namespace: DeadworksManaged.Api

Intercept, modify, and apply damage to entities.

OnTakeDamage Hook

Override in your plugin to intercept all damage on the server:

public override HookResult OnTakeDamage(TakeDamageEvent ev)
{
// ev.Entity — the entity taking damage
// ev.Info — full damage descriptor

// Block damage to the Patrons
if (ev.Entity.DesignerName == "npc_boss_tier3")
return HookResult.Stop;

return HookResult.Continue;
}

TakeDamageEvent

PropertyTypeDescription
EntityCBaseEntityThe entity taking damage
InfoCTakeDamageInfoFull damage descriptor (attacker, inflictor, amount, flags)

Applying Damage

Simple: Hurt()

Convenience wrapper for applying damage. All parameters except damage are optional:

// Minimal — damage is self-inflicted with no attacker credit
pawn.Hurt(50f);

// Attacker credited — shows in the kill feed
target.Hurt(100f, attacker: shooter);

// Full control
entity.Hurt(
100f, // damage amount
attacker, // attacking entity
inflictor, // entity that caused damage (weapon, projectile)
ability, // ability entity
damageType: 0 // damage type bits (int, see below)
);

If attacker is null, it falls back to the inflictor; if that is also null, the victim itself is credited (self-damage). Hurt always sets TakeDamageFlags.AllowSuicide, so self-damage can kill.

Advanced: CTakeDamageInfo

For full control, create a CTakeDamageInfo:

using var damageInfo = new CTakeDamageInfo(
damage: 200f,
attacker: attackerEntity,
inflictor: inflictorEntity,
ability: abilityEntity,
damageType: 0
);

targetEntity.TakeDamage(damageInfo);
// damageInfo is disposed automatically via using

CTakeDamageInfo

Method/ConstructorDescription
new CTakeDamageInfo(float damage, CBaseEntity? attacker, CBaseEntity? inflictor, CBaseEntity? ability, int damageType)Create new (must dispose)
FromExisting(nint)Wrap existing pointer (non-owning, e.g. from hook) — internal

Important: When creating via constructor, always use using or call Dispose().

Properties (Verified)

PropertyTypeDescription
DamagefloatDamage amount (get/set)
TotalledDamagefloatTotalled damage (mirrors Damage on creation)
DamageFlagsTakeDamageFlagsDamage flags (get/set)
DamageTypeintDamage type bits (get/set)
AttackerCBaseEntity?The attacking entity
InflictorCBaseEntity?The inflictor entity
AbilityCBaseEntity?The ability entity
OriginatorCBaseEntity?The originator (usually null on creation)

TakeDamageFlags

Managed [Flags] enum (TakeDamageFlags : ulong) that modifies how damage is applied. Commonly used values:

FlagValueDescription
None0No flags
SuppressHealthChanges0x1Don't change health
SuppressPhysicsForce0x2No knockback
SuppressEffects0x4No visual effects
PreventDeath0x8Cannot kill (clamp to 1HP)
ForceDeath0x10Guarantee kill
AlwaysGib0x20Always gib on death
NeverGib0x40Never gib on death
SuppressDamageModification0x100Ignore armor/resist
RadiusDmg0x400Area/splash damage
AllowSuicide0x40000Allow self-kill
SuppressKillCredit0x400000No kill credit
SuppressDeathCredit0x800000No death credit
HeavyMelee0x200000000Heavy melee hit
LightMelee0x400000000Light melee hit

The enum has ~70 members in total (IgnoreResistances, DoNotCrit, SuppressCritResistance, Ricochet, BonusDamage, IsHealthTransfer, …) — see TakeDamageFlags in the SDK for the full list.

tip

Combine TakeDamageFlags.ForceDeath | TakeDamageFlags.AllowSuicide for guaranteed kills.

Damage Type Bits

There is no managed enum for damage typesHurt(...) and the CTakeDamageInfo constructor take the raw engine bits as an int (damageType parameter). Values from the game's DamageTypes_t, for reference:

Engine flagValueDescription
generic0Generic damage
bullet2Bullet damage
slash4Slash/melee
burn8Fire/burn
fall32Fall damage
blast64Explosion
shock256Shock/electric
headshot524288Headshot
crit1048576Critical hit
dot4194304Damage over time
lethal16777216Lethal flag

See Also