From 0085403c956eca669db5f3a4b60b7bad56b6eb9f Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sat, 13 Nov 2021 07:55:33 +0100 Subject: [PATCH] NSSurfacePropEntity: Save/Restore for its attributes, OnBreak output etc. --- src/gs-entbase/server/NSPhysicsEntity.h | 1 - src/gs-entbase/server/NSPhysicsEntity.qc | 23 ------ src/gs-entbase/shared/NSSurfacePropEntity.h | 7 +- src/gs-entbase/shared/NSSurfacePropEntity.qc | 82 +++++++++++++++++++- 4 files changed, 87 insertions(+), 26 deletions(-) diff --git a/src/gs-entbase/server/NSPhysicsEntity.h b/src/gs-entbase/server/NSPhysicsEntity.h index 458afa6f..a8d510ef 100644 --- a/src/gs-entbase/server/NSPhysicsEntity.h +++ b/src/gs-entbase/server/NSPhysicsEntity.h @@ -44,7 +44,6 @@ class NSPhysicsEntity:NSSurfacePropEntity virtual void(void) touch; virtual void(void) TouchThink; virtual void(void) Pain; - virtual void(void) Death; virtual void(string, string) SpawnKey; virtual void(float) SetMass; diff --git a/src/gs-entbase/server/NSPhysicsEntity.qc b/src/gs-entbase/server/NSPhysicsEntity.qc index 8db706bd..eb5838d7 100644 --- a/src/gs-entbase/server/NSPhysicsEntity.qc +++ b/src/gs-entbase/server/NSPhysicsEntity.qc @@ -217,29 +217,6 @@ NSPhysicsEntity::Pain(void) } } -void -NSPhysicsEntity::Death(void) -{ - Hide(); - - string gibeffect = GetPropData(PROPINFO_BREAKMODEL); - int breakcount = GetPropData(PROPINFO_BREAKCOUNT); - BreakModel_Spawn(absmin, absmax, [0,0,0], 100, breakcount, gibeffect); - - /* handle explosions */ - float flExplodeMag, flExplodeRad; - flExplodeMag = GetPropData(PROPINFO_EXPLOSIVE_DMG); - flExplodeRad = GetPropData(PROPINFO_EXPLOSIVE_RADIUS); - - if (flExplodeMag) { - if (!flExplodeRad) - flExplodeRad = flExplodeMag * 2.5f; - - FX_Explosion(origin); - Damage_Radius(origin, this, flExplodeMag, flExplodeRad, TRUE, 0); - } -} - void NSPhysicsEntity::Respawn(void) { diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.h b/src/gs-entbase/shared/NSSurfacePropEntity.h index 388b47aa..f615c7e0 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.h +++ b/src/gs-entbase/shared/NSSurfacePropEntity.h @@ -21,6 +21,8 @@ class NSSurfacePropEntity:NSRenderableEntity /* overrides */ virtual void(string) SetModel; #ifdef SERVER + virtual void(float) Save; + virtual void(string, string) Restore; virtual void(void) Respawn; virtual void(entity, string, string) Input; virtual void(string, string) SpawnKey; @@ -35,6 +37,9 @@ class NSSurfacePropEntity:NSRenderableEntity float m_flBurnTime; float m_flBurnNext; + /* I/O */ + string m_strOnBreak; + nonvirtual void(entity, float, int) Ignite; nonvirtual void(void) Extinguish; nonvirtual int(void) IsOnFire; @@ -61,4 +66,4 @@ class NSSurfacePropEntity:NSRenderableEntity nonvirtual void(void) PropDataFinish; #endif -}; \ No newline at end of file +}; diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.qc b/src/gs-entbase/shared/NSSurfacePropEntity.qc index 033a6852..048958c4 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.qc +++ b/src/gs-entbase/shared/NSSurfacePropEntity.qc @@ -94,6 +94,54 @@ NSSurfacePropEntity::Respawn(void) health = GetSpawnHealth(); } +void +NSSurfacePropEntity::Save(float handle) +{ + SaveFloat(handle, "m_eBurner", num_for_edict(m_eBurner)); + SaveInt(handle, "m_iBurnWeapon", m_iBurnWeapon); + SaveFloat(handle,"m_flBurnTime", m_flBurnTime); + SaveFloat(handle, "m_flBurnNext", m_flBurnNext); + SaveString(handle, "m_strOnBreak", m_strOnBreak); + SaveFloat(handle, "m_oldHealth", m_oldHealth); + SaveInt(handle, "m_iMaterial", m_iMaterial); + SaveInt(handle, "m_iPropData", m_iPropData); + + super::Save(handle); +} + +void +NSSurfacePropEntity::Restore(string strKey, string strValue) +{ + switch (strKey) { + case "m_eBurner": + m_eBurner = edict_num(ReadFloat(strValue)); + break; + case "m_iBurnWeapon": + m_iBurnWeapon = ReadInt(strValue); + break; + case "m_flBurnTime": + m_flBurnTime = ReadFloat(strValue); + break; + case "m_flBurnNext": + m_flBurnNext = ReadFloat(strValue); + break; + case "m_strOnBreak": + m_strOnBreak = ReadInt(strValue); + break; + case "m_oldHealth": + m_oldHealth = ReadFloat(strValue); + break; + case "m_iMaterial": + m_iMaterial = ReadInt(strValue); + break; + case "m_iPropData": + m_iPropData = ReadInt(strValue); + break; + default: + super::Restore(strKey, strValue); + } +} + void NSSurfacePropEntity::Input(entity eAct, string strInput, string strData) { @@ -124,6 +172,13 @@ NSSurfacePropEntity::SpawnKey(string strKey, string strValue) case "materialdata": SetSurfaceData(strValue); break; + /* Input/Output system */ +#ifdef SERVER + case "OnBreak": + strValue = strreplace(",", ",_", strValue); + m_strOnBreak = strcat(m_strOnBreak, ",_", strValue); + break; +#endif default: NSRenderableEntity::SpawnKey(strKey, strValue); break; @@ -139,7 +194,29 @@ NSSurfacePropEntity::Pain(void) void NSSurfacePropEntity::Death(void) { - + Hide(); + + UseOutput(g_dmg_eAttacker, m_strOnBreak); + + if (HasPropData() == FALSE) + return; + + string gibeffect = GetPropData(PROPINFO_BREAKMODEL); + int breakcount = GetPropData(PROPINFO_BREAKCOUNT); + BreakModel_Spawn(absmin, absmax, [0,0,0], 100, breakcount, gibeffect); + + /* handle explosions */ + float flExplodeMag, flExplodeRad; + flExplodeMag = GetPropData(PROPINFO_EXPLOSIVE_DMG); + flExplodeRad = GetPropData(PROPINFO_EXPLOSIVE_RADIUS); + + if (flExplodeMag) { + if (!flExplodeRad) + flExplodeRad = flExplodeMag * 2.5f; + + FX_Explosion(origin); + Damage_Radius(origin, this, flExplodeMag, flExplodeRad, TRUE, 0); + } } void @@ -195,5 +272,8 @@ NSSurfacePropEntity::NSSurfacePropEntity(void) /* tokenization complete, now we can load propdata */ SurfaceDataFinish(); PropDataFinish(); + + /* Input/Output system */ + m_strOnBreak = CreateOutput(m_strOnBreak); #endif }