From ecf3bd9a3da78b6aaf8fdb77bc9b91b26233ff8b Mon Sep 17 00:00:00 2001 From: Giegue Date: Thu, 16 Mar 2023 15:58:09 -0300 Subject: [PATCH] Fixed tons of monsters not working/crashing when attacking HL monsters. --- src/dlls/bullsquid.cpp | 4 +++- src/dlls/controller.cpp | 4 ++++ src/dlls/gargantua.cpp | 24 +++++++++++++++++++++--- src/dlls/ggrenade.cpp | 15 ++++++++------- src/dlls/gonome.cpp | 6 ++++-- src/dlls/houndeye.cpp | 5 ++++- src/dlls/islave.cpp | 2 ++ src/dlls/pitdrone.cpp | 4 +++- src/dlls/shock.cpp | 4 +++- src/dlls/shockroach.cpp | 2 ++ src/dlls/squeakgrenade.cpp | 10 ++++++---- src/dlls/strooper.cpp | 2 ++ src/dlls/voltigore.cpp | 8 +++++++- 13 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/dlls/bullsquid.cpp b/src/dlls/bullsquid.cpp index 9064814..bbaaf94 100644 --- a/src/dlls/bullsquid.cpp +++ b/src/dlls/bullsquid.cpp @@ -113,7 +113,7 @@ void CSquidSpit::Shoot( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity pSpit->SetThink ( &CSquidSpit::Animate ); pSpit->pev->nextthink = gpGlobals->time + 0.1; - pSpit->SetTouch ( &CSquidSpit::SpitTouch ); + pSpit->SetTouch ( &CSquidSpit::SpitTouch ); } void CSquidSpit :: SpitTouch ( edict_t *pOther ) @@ -166,6 +166,8 @@ void CSquidSpit :: SpitTouch ( edict_t *pOther ) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TakeDamage ( pev, pev, gSkillData.bullsquidDmgSpit, DMG_GENERIC ); } + else + UTIL_TakeDamageExternal( pOther, pev, pev, gSkillData.bullsquidDmgSpit, DMG_GENERIC ); } SetThink ( &CSquidSpit::SUB_Remove ); diff --git a/src/dlls/controller.cpp b/src/dlls/controller.cpp index 60f5fe9..fd424f4 100644 --- a/src/dlls/controller.cpp +++ b/src/dlls/controller.cpp @@ -1185,6 +1185,8 @@ void CMControllerHeadBall :: HuntThink( void ) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(tr.pHit)); pMonster->TraceAttack( VARS(m_hOwner), gSkillData.controllerDmgZap, pev->velocity, &tr, DMG_SHOCK ); } + else + UTIL_TraceAttack( tr.pHit, VARS(m_hOwner), gSkillData.controllerDmgZap, pev->velocity, &tr, DMG_SHOCK ); ApplyMultiDamage( pev, VARS(m_hOwner) ); } @@ -1361,6 +1363,8 @@ void CMControllerZapBall::ExplodeTouch( edict_t *pOther ) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TraceAttack(pevOwner, gSkillData.controllerDmgBall, pev->velocity.Normalize(), &tr, DMG_ENERGYBEAM ); } + else + UTIL_TraceAttack(pOther, pevOwner, gSkillData.controllerDmgBall, pev->velocity.Normalize(), &tr, DMG_ENERGYBEAM ); ApplyMultiDamage( pevOwner, pevOwner ); UTIL_EmitAmbientSound( ENT(pev), tr.vecEndPos, "weapons/electro4.wav", 0.3, ATTN_NORM, 0, RANDOM_LONG( 90, 99 ) ); diff --git a/src/dlls/gargantua.cpp b/src/dlls/gargantua.cpp index 8f79e7b..4e66181 100644 --- a/src/dlls/gargantua.cpp +++ b/src/dlls/gargantua.cpp @@ -130,13 +130,23 @@ void CStomp::Think( void ) if ( tr.pHit && tr.pHit != pev->owner ) { - CMBaseEntity *pEntity = CMBaseEntity::Instance( tr.pHit ); + edict_t *pEntity = tr.pHit; entvars_t *pevOwner = pev; if ( pev->owner ) pevOwner = VARS(pev->owner); - if ( pEntity ) - pEntity->TakeDamage( pev, pevOwner, pev->dmg, DMG_SONIC ); + if (pEntity->v.takedamage) + { + if (UTIL_IsPlayer(pEntity)) + UTIL_TakeDamage(pEntity, pev, pevOwner, pev->dmg, DMG_SONIC); + else if (pEntity->v.euser4 != NULL) + { + CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); + pMonster->TakeDamage(pev, pevOwner, pev->dmg, DMG_SONIC); + } + else + UTIL_TakeDamageExternal(pEntity, pev, pevOwner, pev->dmg, DMG_SONIC); + } } // Accelerate the effect @@ -564,6 +574,8 @@ void CMGargantua :: FlameDamage( Vector vecStart, Vector vecEnd, entvars_t *pevI CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TraceAttack( pevInflictor, flAdjustedDamage, (tr.vecEndPos - vecSrc).Normalize(), &tr, bitsDamageType ); } + else + UTIL_TraceAttack( pEntity, pevInflictor, flAdjustedDamage, (tr.vecEndPos - vecSrc).Normalize(), &tr, bitsDamageType ); ApplyMultiDamage( pevInflictor, pevAttacker ); } else @@ -575,6 +587,8 @@ void CMGargantua :: FlameDamage( Vector vecStart, Vector vecEnd, entvars_t *pevI CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TakeDamage( pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType ); } + else + UTIL_TakeDamageExternal( pEntity, pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType ); } } } @@ -976,6 +990,8 @@ edict_t *CMGargantua::GargantuaCheckTraceHullAttack(float flDist, int iDamage, i CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(tr.pHit)); pMonster->TakeDamage( pev, pev, iDamage, iDmgType ); } + else + UTIL_TakeDamageExternal( tr.pHit, pev, pev, iDamage, iDmgType ); } return tr.pHit; @@ -1791,6 +1807,8 @@ edict_t *CMBabyGargantua::BabyGargCheckTraceHullAttack(float flDist, int iDamage CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(tr.pHit)); pMonster->TakeDamage( pev, pev, iDamage, iDmgType ); } + else + UTIL_TakeDamageExternal( tr.pHit, pev, pev, iDamage, iDmgType ); } return tr.pHit; diff --git a/src/dlls/ggrenade.cpp b/src/dlls/ggrenade.cpp index f0dc470..aa2f3d2 100644 --- a/src/dlls/ggrenade.cpp +++ b/src/dlls/ggrenade.cpp @@ -227,13 +227,15 @@ void CMGrenade::BounceTouch( edict_t *pOther ) TraceResult tr = UTIL_GetGlobalTrace( ); ClearMultiDamage( ); - if (UTIL_IsPlayer(pOther)) - UTIL_TraceAttack(pOther, pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); - else if (pOther->v.euser4 != NULL) - { + if (UTIL_IsPlayer(pOther)) + UTIL_TraceAttack(pOther, pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); + else if (pOther->v.euser4 != NULL) + { CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); - pMonster->TraceAttack(pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); - } + pMonster->TraceAttack(pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); + } + else + UTIL_TraceAttack(pOther, pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB); // lmao ApplyMultiDamage( pev, pevOwner); } @@ -277,7 +279,6 @@ void CMGrenade::BounceTouch( edict_t *pOther ) pev->framerate = 1; else if (pev->framerate < 0.5) pev->framerate = 0; - } diff --git a/src/dlls/gonome.cpp b/src/dlls/gonome.cpp index f534bdd..87a306c 100644 --- a/src/dlls/gonome.cpp +++ b/src/dlls/gonome.cpp @@ -134,12 +134,14 @@ void CGonomeGuts :: GutsTouch( edict_t *pOther ) else { if (UTIL_IsPlayer(pOther)) - UTIL_TakeDamage( pOther, pev, pev, gSkillData.gonomeDmgGuts, DMG_GENERIC ); + UTIL_TakeDamage( pOther, pev, VARS(pev->owner), gSkillData.gonomeDmgGuts, DMG_GENERIC ); else if (pOther->v.euser4 != NULL) { CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); - pMonster->TakeDamage ( pev, pev, gSkillData.gonomeDmgGuts, DMG_GENERIC ); + pMonster->TakeDamage ( pev, VARS(pev->owner), gSkillData.gonomeDmgGuts, DMG_GENERIC ); } + else + UTIL_TakeDamageExternal( pOther, pev, VARS(pev->owner), gSkillData.gonomeDmgGuts, DMG_GENERIC ); } SetThink( &CGonomeGuts::SUB_Remove ); diff --git a/src/dlls/houndeye.cpp b/src/dlls/houndeye.cpp index cf0ef2b..de64661 100644 --- a/src/dlls/houndeye.cpp +++ b/src/dlls/houndeye.cpp @@ -524,7 +524,8 @@ void CMHoundeye :: SonicAttack ( void ) { if ( pEntity->v.takedamage != DAMAGE_NO ) { - if ( strcmp(STRING(pEntity->v.model), "models/houndeye.mdl") != 0 ) + // don't compare by model because a mapper might change it + if ( strcmp(STRING(pEntity->v.classname), "monster_houndeye") != 0 ) {// houndeyes don't hurt other houndeyes with their attack // houndeyes do FULL damage if the ent in question is visible. Half damage otherwise. @@ -565,6 +566,8 @@ void CMHoundeye :: SonicAttack ( void ) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TakeDamage( pev, pev, flAdjustedDamage, DMG_SONIC | DMG_ALWAYSGIB ); } + else + UTIL_TakeDamageExternal( pEntity, pev, pev, flAdjustedDamage, DMG_SONIC | DMG_ALWAYSGIB ); } } } diff --git a/src/dlls/islave.cpp b/src/dlls/islave.cpp index 7230429..f3ae9fd 100644 --- a/src/dlls/islave.cpp +++ b/src/dlls/islave.cpp @@ -737,6 +737,8 @@ void CMISlave :: ZapBeam( int side ) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TraceAttack( pev, gSkillData.slaveDmgZap, vecAim, &tr, DMG_SHOCK ); } + else + UTIL_TraceAttack( pEntity, pev, gSkillData.slaveDmgZap, vecAim, &tr, DMG_SHOCK ); } UTIL_EmitAmbientSound( ENT(pev), tr.vecEndPos, "weapons/electro4.wav", 0.5, ATTN_NORM, 0, RANDOM_LONG( 140, 160 ) ); diff --git a/src/dlls/pitdrone.cpp b/src/dlls/pitdrone.cpp index 7474803..a1c3955 100644 --- a/src/dlls/pitdrone.cpp +++ b/src/dlls/pitdrone.cpp @@ -97,7 +97,9 @@ void CPitdroneSpike::SpikeTouch(edict_t *pOther) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TakeDamage( pev, pevOwner, gSkillData.pitdroneDmgSpit, DMG_GENERIC | DMG_NEVERGIB ); } - + else + UTIL_TakeDamageExternal( pOther, pev, pevOwner, gSkillData.pitdroneDmgSpit, DMG_GENERIC | DMG_NEVERGIB ); + if (RANDOM_LONG(0,1)) EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM, 0, iPitch); else diff --git a/src/dlls/shock.cpp b/src/dlls/shock.cpp index a7991d5..fb2bf60 100644 --- a/src/dlls/shock.cpp +++ b/src/dlls/shock.cpp @@ -142,7 +142,9 @@ void CMShock::Touch(edict_t *pOther) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TraceAttack( pevAttacker, pev->dmg, pev->velocity.Normalize(), &tr, damageType ); } - + else + UTIL_TraceAttack( pOther, pevAttacker, pev->dmg, pev->velocity.Normalize(), &tr, damageType ); + ApplyMultiDamage(pev, pevAttacker); } diff --git a/src/dlls/shockroach.cpp b/src/dlls/shockroach.cpp index 34d074d..b922984 100644 --- a/src/dlls/shockroach.cpp +++ b/src/dlls/shockroach.cpp @@ -131,6 +131,8 @@ void CMShockRoach::LeapTouch(edict_t *pOther) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH ); } + else + UTIL_TakeDamageExternal( pOther, pev, pev, GetDamageAmount(), DMG_SLASH ); } SetTouch(NULL); diff --git a/src/dlls/squeakgrenade.cpp b/src/dlls/squeakgrenade.cpp index 78d00b4..b9a7fe7 100644 --- a/src/dlls/squeakgrenade.cpp +++ b/src/dlls/squeakgrenade.cpp @@ -295,13 +295,15 @@ void CMSqueakGrenade::SuperBounceTouch( edict_t *pOther ) // ALERT( at_console, "hit enemy\n"); ClearMultiDamage( ); - if (UTIL_IsPlayer(pOther)) + if (UTIL_IsPlayer(pOther)) UTIL_TraceAttack(pOther, pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH ); - else if (pOther->v.euser4 != NULL) - { + else if (pOther->v.euser4 != NULL) + { CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TraceAttack(pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH ); - } + } + else + UTIL_TraceAttack(pOther, pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH ); ApplyMultiDamage( pev, pev ); diff --git a/src/dlls/strooper.cpp b/src/dlls/strooper.cpp index 09dc91d..9cc046f 100644 --- a/src/dlls/strooper.cpp +++ b/src/dlls/strooper.cpp @@ -330,6 +330,8 @@ void CMStrooper::HandleAnimEvent(MonsterEvent_t *pEvent) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pHurt)); pMonster->TakeDamage( pev, pev, gSkillData.strooperDmgKick, DMG_CLUB ); } + else + UTIL_TakeDamageExternal( pHurt, pev, pev, gSkillData.strooperDmgKick, DMG_CLUB ); } m_fRightClaw = !m_fRightClaw; diff --git a/src/dlls/voltigore.cpp b/src/dlls/voltigore.cpp index 8e030b6..0e93cb7 100644 --- a/src/dlls/voltigore.cpp +++ b/src/dlls/voltigore.cpp @@ -127,6 +127,8 @@ void CMVoltigoreEnergyBall::BallTouch(edict_t *pOther) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pOther)); pMonster->TakeDamage( pev, VARS( pev->owner ), gSkillData.voltigoreDmgBeam, DMG_SHOCK|DMG_ALWAYSGIB ); } + else + UTIL_TakeDamageExternal( pOther, pev, VARS(pev->owner), gSkillData.voltigoreDmgBeam, DMG_SHOCK | DMG_ALWAYSGIB ); } pev->velocity = Vector(0,0,0); @@ -154,6 +156,8 @@ void CMVoltigoreEnergyBall::FlyThink(void) CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TakeDamage( pev, pev, gSkillData.voltigoreDmgBeam/5, DMG_SHOCK ); } + else + UTIL_TakeDamageExternal( pEntity, pev, pev, gSkillData.voltigoreDmgBeam / 5, DMG_SHOCK ); } } @@ -387,7 +391,7 @@ BOOL CMVoltigore::CheckRangeAttack1(float flDot, float flDist) { if (IsMoving() && flDist >= 512) { - // voltigore will far too far behind if he stops running to spit at this distance from the enemy. + // voltigore will far too far behind if he stops running to spit at this distance from the enemy. return FALSE; } @@ -1020,6 +1024,8 @@ void CMVoltigore::GibBeamDamage() CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pEntity)); pMonster->TakeDamage( pev, pev, flAdjustedDamage, DMG_SHOCK ); } + else + UTIL_TakeDamageExternal( pEntity, pev, pev, flAdjustedDamage, DMG_SHOCK ); } } }