Weapon Respawn Fix

From Valve Developer Community
< De
Jump to navigation Jump to search
English (en)Deutsch (de)Русский (ru)Translate (Translate)

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.

Note.pngHinweis:Dies betrifft nur Mehrspieler Modifikationen, die auf dem HL2DM SDK basieren, Singleplayer Modifikationen können dies problemlos ignorieren.

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.