Weapon Respawn Fix
Einleitung
Wenn Waffen nicht richtig vom Level Designer platziert werden (z. B. wenn ihre Boundingbox mit einer anderen Entity oder der Weltgeometrie überlappt), Respawnen sie an einer falschen Position, nachdem sie von Spielern aufgehoben wurden. In den meisten Fällen spawnen die Waffen stattdessen an 0 0 0
auf der Map und werden ununterbrochen in einer Schleife des Fallens, des Wartens, des Respawnens und des erneuten Fallens stecken. Glücklicherweise ist die Behebung dieses üblichen Fehlers sehr einfach.
Voraussetzungen
- Der neuste Multiplayer OB SDK Code
Lösung
Öffne game/shared/hl2mp/weapon_hl2mpbase.h
und ändere diesen Block:
#ifdef GAME_DLL
DECLARE_DATADESC();
void Materialize( void );
virtual int ObjectCaps( void );
#endif
in diesen:
#ifdef GAME_DLL
DECLARE_DATADESC();
void Materialize( void );
virtual int ObjectCaps( void );
virtual void FallThink( void ); // lässt eine Waffe nach dem Spawnen auf den Boden fallen
#endif
Bearbeite nun game/shared/hl2mp/weapon_hl2mpbase.cpp
und ändere in CWeaponHL2MPBase::FallInit( void )
:
SetThink(&CBaseCombatWeapon::FallThink);
zu:
SetThink(&CWeaponHL2MPBase::FallThink);
Füge den folgenden Block unter CWeaponHL2MPBase::FallInit( void )
hinzu:
#ifdef GAME_DLL
void CWeaponHL2MPBase::FallThink(void)
{
// Vermeidet den üblichen HL2DM Waffen Respawn Bug
// Wenn eine Waffe spawnt, werden folgende Events auftreten:
// - Spawn() wird aufgerufen, welches FallInit() aufruft
// - FallInit() bereitet die 'Think'-Funktion der Waffe vor (CBaseCombatWeapon::FallThink())
// - FallThink() führt diverse Prüfungen durch, bevor entschieden wird, ob die Funktion Materialize() der Waffe aufgerufen werden soll
// - Materialize() (die HL2DM-Version oben), welche die Respawnposition der Waffe festlegt.
// Das Problem tritt auf, wenn eine Waffe vom Level Designer nicht richtig platziert wurde.
// Wenn die Waffe sich von der gegebenen Position nicht bewegen kann (z. B. wenn seine Bounding Box zur Hälfte in einer Wand steckt), wird Materialize() nie aufgerufen.
// Da Materialize() nie aufgerufen wird, wird die Respawnposition der Waffe nie gesetzt, also respawnt sie, wenn sie aufgehoben wird, für immer an
// 0 0 0 auf der Map (Endlosschleife aus Fallen, Warten, Respawnen - nicht schön für die Performance und die Bandbreite!)
if ( HasSpawnFlags( SF_NORESPAWN ) == false )
{
if ( GetOriginalSpawnOrigin() == vec3_origin )
{
m_vOriginalSpawnOrigin = GetAbsOrigin();
m_vOriginalSpawnAngles = GetAbsAngles();
}
}
return BaseClass::FallThink();
}
#endif // GAME_DLL
Und das ist alles dazu - falsch platzierte Waffen sollten nun an der richtigen Stelle respawnen und nicht an einer ungeschickten Position auf der Map.