diff --git a/src/game/shared/hl2mp/weapon_hl2mpbase.cpp b/src/game/shared/hl2mp/weapon_hl2mpbase.cpp index 15995a5be..b78c359fd 100644 --- a/src/game/shared/hl2mp/weapon_hl2mpbase.cpp +++ b/src/game/shared/hl2mp/weapon_hl2mpbase.cpp @@ -206,6 +206,31 @@ int CWeaponHL2MPBase::ObjectCaps() #endif +#ifdef GAME_DLL +void CWeaponHL2MPBase::FallThink( void ) +{ + // Prevent the common HL2DM weapon respawn bug from happening + // When a weapon is spawned, the following chain of events occurs: + // - Spawn() is called, which then calls FallInit() + // - FallInit() is called, and prepares the weapon's 'Think' function (CBaseCombatWeapon::FallThink()) + // - FallThink() is called, and performs several checks before deciding whether the weapon should Materialize() + // - Materialize() is called (the HL2DM version above), which sets the weapon's respawn location. + // The problem occurs when a weapon isn't placed properly by a level designer. + // If the weapon is unable to move from its location (e.g. if its bounding box is halfway inside a wall), Materialize() never gets called. + // Since Materialize() never gets called, the weapon's respawn location is never set, so if a person picks it up, it respawns forever at + // 0 0 0 on the map (infinite loop of fall, wait, respawn, not nice at all for performance and bandwidth!) + if ( HasSpawnFlags( SF_NORESPAWN ) == false ) + { + if ( GetOriginalSpawnOrigin() == vec3_origin ) + { + m_vOriginalSpawnOrigin = GetAbsOrigin(); + m_vOriginalSpawnAngles = GetAbsAngles(); + } + } + return BaseClass::FallThink(); +} +#endif // GAME_DLL + void CWeaponHL2MPBase::FallInit( void ) { #ifndef CLIENT_DLL @@ -262,7 +287,7 @@ void CWeaponHL2MPBase::FallInit( void ) SetPickupTouch(); - SetThink( &CBaseCombatWeapon::FallThink ); + SetThink( &CWeaponHL2MPBase::FallThink ); SetNextThink( gpGlobals->curtime + 0.1f ); diff --git a/src/game/shared/hl2mp/weapon_hl2mpbase.h b/src/game/shared/hl2mp/weapon_hl2mpbase.h index 0f21044b1..14f6448b3 100644 --- a/src/game/shared/hl2mp/weapon_hl2mpbase.h +++ b/src/game/shared/hl2mp/weapon_hl2mpbase.h @@ -45,6 +45,7 @@ public: void Materialize( void ); virtual int ObjectCaps( void ); + virtual void FallThink( void ); #endif // All predicted weapons need to implement and return true