From 451beedb0ca07b2fcb74d019a3c84e81b9c724c8 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Tue, 21 Sep 2021 21:11:02 +0200 Subject: [PATCH] CBasePhysics: add support for explosions upon destruction, provided via propdata. --- src/gs-entbase/server/basephysics.qc | 18 +++++++++++++++--- src/gs-entbase/shared/baseentity.qc | 2 +- src/shared/propdata.qc | 7 +++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/gs-entbase/server/basephysics.qc b/src/gs-entbase/server/basephysics.qc index 4fc778b2..05acf4e6 100644 --- a/src/gs-entbase/server/basephysics.qc +++ b/src/gs-entbase/server/basephysics.qc @@ -32,8 +32,8 @@ CBasePhysics::PhysicsDisable(void) if (physics_supported() == TRUE) { physics_enable(this, FALSE); } else { - SetMovetype(MOVETYPE_NONE); - SetSolid(SOLID_NOT); + SetMovetype(MOVETYPE_BOUNCE); + SetSolid(SOLID_CORPSE); } m_iEnabled = FALSE; } @@ -184,7 +184,6 @@ CBasePhysics::Pain(void) makevectors(vectoangles(origin - trace_endpos)); ApplyForceOffset(v_forward * 20, origin - trace_endpos); - if (!HasPropData()) { health = 100000; } @@ -198,6 +197,19 @@ CBasePhysics::Death(void) string gibeffect = GetPropData(PROPINFO_BREAKMODEL); int breakcount = GetPropData(PROPINFO_BREAKCOUNT); BreakModel_Spawn(origin, [0,0,0], [100,100], 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 diff --git a/src/gs-entbase/shared/baseentity.qc b/src/gs-entbase/shared/baseentity.qc index d4d623d2..ac09afa5 100644 --- a/src/gs-entbase/shared/baseentity.qc +++ b/src/gs-entbase/shared/baseentity.qc @@ -967,7 +967,7 @@ CBaseEntity::SetModel(string newModel) SetSendFlags(BASEFL_CHANGED_MODELINDEX); if (model && m_iPropData == -1) { - PropData_ForModel(model); + m_iPropData = PropData_ForModel(model); } } void diff --git a/src/shared/propdata.qc b/src/shared/propdata.qc index aee41b5a..d39c4f30 100644 --- a/src/shared/propdata.qc +++ b/src/shared/propdata.qc @@ -140,7 +140,7 @@ PropData_Parse(int i, string line, string type) /* name/identifer of our message */ t_name = strtolower(key); - if (t_name == type) { + if (t_name == "prop_data") { /* I guess it's what we want */ g_propdata[i].name = type; } else { @@ -197,9 +197,10 @@ PropData_ForModel(string modelname) } while ((line = fgets(fh))) { /* when we found it, quit */ - if (PropData_Parse(index, line, "prop_data") == TRUE) { + if (PropData_Parse(index, line, modelname) == TRUE) { fclose(fh); hash_add(g_hashpropdata, modelname, (int)index); + print(sprintf("adding propdata %s at %i\n", modelname, index)); return index; } } @@ -427,8 +428,6 @@ BreakModel_Spawn(vector pos, vector dir, vector spread, float speed, int count, float x = tokenize(g_breakmodel[index].data); int modelcount = x / 2; - print(sprintf("breakmodel: %s, %i\n", type, count)); - for (int i = 0; i < count; i++) { string mname; float fadetime;