From 9a6c46c674aac96388aa37301c78f62fac794b06 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Sat, 8 Oct 2016 03:57:07 +0700 Subject: [PATCH] Added reset for trigger_hurt and func_pushable (Fixes #64) --- regamedll/dlls/func_break.cpp | 28 +++++++++++++++++++++++++ regamedll/dlls/func_break.h | 6 +++++- regamedll/dlls/triggers.cpp | 7 +++++++ regamedll/dlls/triggers.h | 5 +++++ regamedll/extra/cssdk/dlls/func_break.h | 1 + regamedll/extra/cssdk/dlls/triggers.h | 2 ++ 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/func_break.cpp b/regamedll/dlls/func_break.cpp index 4c8d5d02a..c17c39b90 100644 --- a/regamedll/dlls/func_break.cpp +++ b/regamedll/dlls/func_break.cpp @@ -884,6 +884,10 @@ void CPushable::__MAKE_VHOOK(Spawn)() pev->origin.z += 1; UTIL_SetOrigin(pev, pev->origin); +#ifdef REGAMEDLL_FIXES + pev->oldorigin = pev->origin; +#endif + // Multiply by area of the box's cross-section (assume 1000 units^3 standard volume) pev->skin = int((pev->skin * (pev->maxs.x - pev->mins.x) * (pev->maxs.y - pev->mins.y)) * 0.0005); m_soundTime = 0; @@ -902,6 +906,30 @@ void CPushable::__MAKE_VHOOK(Precache)() } } +#ifdef REGAMEDLL_FIXES +void CPushable::Restart() +{ + if (pev->spawnflags & SF_PUSH_BREAKABLE) + CBreakable::Restart(); + + pev->movetype = MOVETYPE_PUSHSTEP; + pev->solid = SOLID_BBOX; + + SET_MODEL(ENT(pev), STRING(pev->model)); + + if (pev->friction > 399) + pev->friction = 399; + + m_soundTime = 0; + m_maxSpeed = 400 - pev->friction; + + pev->flags |= FL_FLOAT; + pev->friction = 0; + + UTIL_SetOrigin(pev, pev->oldorigin); +} +#endif + void CPushable::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "size")) diff --git a/regamedll/dlls/func_break.h b/regamedll/dlls/func_break.h index e0d497dac..df07d275d 100644 --- a/regamedll/dlls/func_break.h +++ b/regamedll/dlls/func_break.h @@ -148,11 +148,15 @@ class CPushable: public CBreakable virtual void KeyValue(KeyValueData *pkvd); virtual int Save(CSave &save); virtual int Restore(CRestore &restore); - virtual int ObjectCaps() { return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_CONTINUOUS_USE; } + virtual int ObjectCaps() { return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_CONTINUOUS_USE | FCAP_MUST_RESET; } virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); virtual void Touch(CBaseEntity *pOther); virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); +#ifdef REGAMEDLL_FIXES + virtual void Restart(); +#endif + #ifdef HOOK_GAMEDLL void Spawn_(); diff --git a/regamedll/dlls/triggers.cpp b/regamedll/dlls/triggers.cpp index 2f7cf0234..f3d6a6240 100644 --- a/regamedll/dlls/triggers.cpp +++ b/regamedll/dlls/triggers.cpp @@ -720,6 +720,13 @@ void CTriggerHurt::__MAKE_VHOOK(Spawn)() UTIL_SetOrigin(pev, pev->origin); } +#ifdef REGAMEDLL_FIXES +void CTriggerHurt::Restart() +{ + Spawn(); +} +#endif + // trigger hurt that causes radiation will do a radius // check and set the player's geiger counter level // according to distance from center of trigger diff --git a/regamedll/dlls/triggers.h b/regamedll/dlls/triggers.h index 9cb180ca3..636356499 100644 --- a/regamedll/dlls/triggers.h +++ b/regamedll/dlls/triggers.h @@ -275,6 +275,11 @@ class CTriggerHurt: public CBaseTrigger public: virtual void Spawn(); +#ifdef REGAMEDLL_FIXES + virtual void Restart(); + virtual int ObjectCaps() { return (CBaseTrigger::ObjectCaps() | FCAP_MUST_RESET); } +#endif + #ifdef HOOK_GAMEDLL void Spawn_(); diff --git a/regamedll/extra/cssdk/dlls/func_break.h b/regamedll/extra/cssdk/dlls/func_break.h index b2f597812..c1e9ddb04 100644 --- a/regamedll/extra/cssdk/dlls/func_break.h +++ b/regamedll/extra/cssdk/dlls/func_break.h @@ -101,6 +101,7 @@ class CPushable: public CBreakable { public: virtual void Spawn() = 0; virtual void Precache() = 0; + virtual void Restart() = 0; virtual void KeyValue(KeyValueData *pkvd) = 0; virtual int Save(CSave &save) = 0; virtual int Restore(CRestore &restore) = 0; diff --git a/regamedll/extra/cssdk/dlls/triggers.h b/regamedll/extra/cssdk/dlls/triggers.h index cdde9750b..e71cb1e57 100644 --- a/regamedll/extra/cssdk/dlls/triggers.h +++ b/regamedll/extra/cssdk/dlls/triggers.h @@ -150,6 +150,8 @@ class CBaseTrigger: public CBaseToggle { class CTriggerHurt: public CBaseTrigger { public: virtual void Spawn() = 0; + virtual void Restart() = 0; + virtual int ObjectCaps() = 0; }; class CTriggerMonsterJump: public CBaseTrigger {