Zu leeren Waffen wechseln

Aus the_Cr0w's Wiki
Wechseln zu: Navigation, Suche
Arrowup.png Ebene höher:
Programmierung

Die jenigen, die schon einmal Half-Life 2 oder die Multiplayervariante gespielt haben, werden festgestellt haben, dass man nicht zu leeren Waffen wechseln kann. Das heißt, wenn eine Waffe keine Munition hat kann man sie im HUD nicht mehr auswählen und sie nicht mehr benutzen. Auch wenn es sich im ersten Moment nutzlos anhören mag, ...

 Was mach ich mit einer Waffe, die leer is?

... kann es von Vorteil sein. Zum Beispiel wenn man Waffen fallen lassen kann (wie in Counter-Strike:Source). Wenn man die Waffen nicht mehr auswählen kann, kann man sie ja auch nicht fallen lassen.


Inhaltsverzeichnis

Anleitung

Eigentlich ist es ganz einfach. Es dauert nur etwas bis man alle Stellen gefunden hat, die man ändern muss.

shared\basecombatweapon_shared.cpp

Sucht nach der Funktion CBaseCombatWeapon::ReloadOrSwitchWeapons Dort sucht ihr nach

if ( ( (GetWeaponFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY) == false ) && ( g_pGameRules->SwitchToNextBestWeapon( pOwner, this ) ) )
{
	m_flNextPrimaryAttack = gpGlobals->curtime + 0.3;
	return true;
}

und kommentiert es aus. Das verhindert, dass die Waffe automatisch gewechselt wird.

Jetzt sucht in der gleichen Funktion, nur etwas weiter oben, nach

CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
Assert( pOwner );

und kommentiert es ebenfalls aus. Es wird nicht mehr benötigt und verursacht einen Fehler in Visual C++.

Sucht in der Funktion CBaseCombatWeapon::DefaultDeploy nach

if ( !HasAnyAmmo() && AllowsAutoSwitchFrom() )
	return false;

und kommentiert es aus. Dadurch wird das Model der Waffe angezeigt, auch wenn die Munition bei 0 steht.

Suche in der Funktion CBaseCombatWeapon::CanBeSelected nach

HasAmmo()

und ersetze es durch

true

client\weapon_selection.cpp

Sucht nach

if ( !GetSelectedWeapon()->CanBeSelected() )
{
	player->EmitSound( "Player.DenyWeaponSelection" );
}
else
{
	SetWeaponSelected();

	m_hSelectedWeapon = NULL;

	engine->ClientCmd( "cancelselect\n" );

	// Play the "weapon selected" sound
	player->EmitSound( "Player.WeaponSelected" );
}

und ersetzt es durch

SetWeaponSelected();

m_hSelectedWeapon = NULL;

engine->ClientCmd( "cancelselect\n" );

// Play the "weapon selected" sound
player->EmitSound( "Player.WeaponSelected" );

Ohne das kann man die Waffe zwar auswählen, aber nicht benutzen und es wird der falsche Sound abgespielt.

server\hl2\hl2_player.cpp

Sucht nach der Funktion

bool CHL2_Player::Weapon_CanSwitchTo( CBaseCombatWeapon *pWeapon )

Dort sucht ihr nach

if ( !pWeapon->HasAnyAmmo() && !GetAmmoCount( pWeapon->m_iPrimaryAmmoType ) )
	return false;

und kommentiert es aus. Jetzt kann man zur Waffe wechseln, obwohl sie keine Munition hat.

Erklärung

Eigentlich ist das ein ganz einfacher Hack. Alle Stellen an denen die Engine gesagt bekommt "Nein, diese Waffe darfst du nicht auswählen." wurden zu einem "Ja" umgeschrieben. An den meisten Stellen die geändert wurden, wird eigentlich nur geprüft ob noch Munition für die Waffe vorhanden ist und wir suggerieren der Engine, dass genau das immer der Fall ist. Am wichtigsten ist die Änderung der Funktion CBaseCombatWeapon::DefaultDeploy. Wenn sie false zurückgibt, dann verschwindet das Model der Waffe.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge