This commit is contained in:
SanyaSho 2022-08-04 00:33:45 +03:00
parent 3b475331f2
commit 29080d7649
2 changed files with 32 additions and 4 deletions

View File

@ -262,13 +262,40 @@ void CWeaponHL2MPBase::FallInit( void )
SetPickupTouch(); SetPickupTouch();
SetThink( &CBaseCombatWeapon::FallThink ); SetThink( &CWeaponHL2MPBase::FallThink );
SetNextThink( gpGlobals->curtime + 0.1f ); SetNextThink( gpGlobals->curtime + 0.1f );
#endif #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 (duh), 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
const CHL2MPSWeaponInfo &CWeaponHL2MPBase::GetHL2MPWpnData() const const CHL2MPSWeaponInfo &CWeaponHL2MPBase::GetHL2MPWpnData() const
{ {
const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const FileWeaponInfo_t *pWeaponInfo = &GetWpnData();

View File

@ -45,6 +45,7 @@ public:
void Materialize( void ); void Materialize( void );
virtual int ObjectCaps( void ); virtual int ObjectCaps( void );
virtual void FallThink( void );
#endif #endif
// All predicted weapons need to implement and return true // All predicted weapons need to implement and return true