From 726332c78e05bd08f39e943fdd9b895dded43001 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Mon, 4 Oct 2021 13:22:40 +0200 Subject: [PATCH] CBaseEntity: Add Ignite(), Exinguish(), IsOnFire() methods according to the Source 2004 spec (controllable lifetimes etc.) --- src/gs-entbase/shared/baseentity.h | 9 ++++++ src/gs-entbase/shared/baseentity.qc | 44 +++++++++++++++++++++++++++++ src/shared/flags.h | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/gs-entbase/shared/baseentity.h b/src/gs-entbase/shared/baseentity.h index c2e24c4f..0ca62eb5 100644 --- a/src/gs-entbase/shared/baseentity.h +++ b/src/gs-entbase/shared/baseentity.h @@ -60,6 +60,15 @@ class CBaseEntity string m_parent; + /* fire */ + entity m_eBurner; + int m_iBurnWeapon; + float m_flBurnTime; + float m_flBurnNext; + nonvirtual void(entity, float, int) Ignite; + nonvirtual void(void) Extinguish; + nonvirtual int(void) IsOnFire; + /* Reliable APIs */ nonvirtual vector(void) GetSpawnOrigin; nonvirtual vector(void) GetSpawnAngles; diff --git a/src/gs-entbase/shared/baseentity.qc b/src/gs-entbase/shared/baseentity.qc index ac09afa5..e2edbcd6 100644 --- a/src/gs-entbase/shared/baseentity.qc +++ b/src/gs-entbase/shared/baseentity.qc @@ -613,6 +613,15 @@ CBaseEntity::Input(entity eAct, string strInput, string strData) case "EnableShadow": effects &= ~EF_NOSHADOW; break; + case "Ignite": + Ignite(eAct, 5000, 0); + break; + case "IgniteLifetime": + Ignite(eAct, stof(strData), 0); + break; + case "Extinguish": + Extinguish(); + break; default: if (strData != "") print(sprintf("^2%s::^3Input^7: Receives input %s from %s with data %s\n", @@ -770,6 +779,29 @@ CBaseEntity::Death(void) } +/* Burning, fire, flames, etc. */ +void +CBaseEntity::Ignite(entity attacker, float flLifetime, int iWeapon) +{ + flags |= FL_ONFIRE; + m_eBurner = attacker; + m_iBurnWeapon = iWeapon; + m_flBurnTime = time + flLifetime; +} +void +CBaseEntity::Extinguish(void) +{ + flags &= ~FL_ONFIRE; + m_eBurner = __NULL__; + m_iBurnWeapon = + m_flBurnTime = 0; +} +int +CBaseEntity::IsOnFire(void) +{ + return (flags & FL_ONFIRE) ? TRUE : FALSE; +} + void CBaseEntity::EvaluateEntity(void) { @@ -797,6 +829,18 @@ CBaseEntity::EvaluateEntity(void) void CBaseEntity::ParentUpdate(void) { + /* TODO: Move out */ + if (flags & FL_ONFIRE) { + if (m_flBurnNext < time) { + if (time > m_flBurnTime) { + flags &= ~FL_ONFIRE; + } + + Damage_Apply(this, m_eBurner, 5, m_iBurnWeapon, DMG_BURN); + m_flBurnNext = time + 0.5f; + } + } + EvaluateEntity(); frame1time += frametime; diff --git a/src/shared/flags.h b/src/shared/flags.h index af143b41..c3f3e191 100644 --- a/src/shared/flags.h +++ b/src/shared/flags.h @@ -39,5 +39,5 @@ #define FL_USE_RELEASED (1<<20) #define FL_NOATTACK (1<<21) #define FL_ONUSABLE (1<<22) -#define FL_RESERVED2 (1<<23) +#define FL_ONFIRE (1<<23) #define FL_RESERVED3 (1<<15)