Source SDK

Source SDK

Not enough ratings
Límites de las armas - Motor Source 2013 Master
By H-H-G-M
Este tutorial es para restringir las armas que los jugadores pueden llevar a la vez, un poco como la serie Bioshock.
guía original en ingles
https://developer.valvesoftware.com/wiki/Weapon_Limits
   
Award
Favorite
Favorited
Unfavorite
Requisitos previos
Este tutorial fue realizado en Source 2013 en la rama Singleplayer. Diferentes ramas pueden requerir una codificación diferente.
Paso 1: Activar el límite de armas incorporado
En hl2_player.cpp, deberías ver esta línea de código alrededor de la línea 74:

// Esto cambia entre el arma primaria única, y las armas múltiples con enfoque de cubos (jdw) #define HL2_SINGLE_PRIMARY_WEAPON_MODE 0;

Cambia el 0 por un 1 para habilitar este modo.

Lo que esto hace es habilitar un código que te restringe a sólo poder recoger un arma primaria. Este código incluye:

void CHL2_Player::Weapon_Equip( CBaseCombatWeapon *pWeapon ) { if ( pWeapon->GetSlot() == WEAPON_PRIMARY_SLOT) { Weapon_DropSlot(WEAPON_PRIMARY_SLOT); }

bool CHL2_Player::BumpWeapon( CBaseCombatWeapon *pWeapon ) { CBaseCombatCharacter *pOwner = pWeapon->GetOwner(); // Can I have this weapon type? if ( pOwner || !Weapon_CanUse( pWeapon ) || !g_pGameRules->CanHavePlayerItem( this, pWeapon ) ) { if ( gEvilImpulse101 ) { UTIL_Remove( pWeapon ); } return false; } // ---------------------------------------- // Si ya lo tengo solo toma la munición // ---------------------------------------- if (Weapon_OwnsThisType( pWeapon->GetClassname(), pWeapon->GetSubType())) { //Only remove the weapon if we attained ammo from it if ( Weapon_EquipAmmoOnly( pWeapon ) == false ) return false; // Only remove me if I have no ammo left // Can't just check HasAnyAmmo because if I don't use clips, I want to be removed, if ( pWeapon->UsesClipsForAmmo1() && pWeapon->HasPrimaryAmmo() ) return false; UTIL_Remove( pWeapon ); return false; } // ------------------------- // Si no, coge el arma // ------------------------- else { //Make sure we're not trying to take a new weapon type we already have if ( Weapon_SlotOccupied( pWeapon ) ) { CBaseCombatWeapon *pActiveWeapon = Weapon_GetSlot( WEAPON_PRIMARY_SLOT ); if ( pActiveWeapon != NULL && pActiveWeapon->HasAnyAmmo() == false && Weapon_CanSwitchTo( pWeapon ) ) { Weapon_Equip( pWeapon ); return true; } // Intentar coger munición si esta es el arma que tenemos ya if ( Weapon_OwnsThisType( pWeapon->GetClassname(), pWeapon->GetSubType() ) ) { Weapon_EquipAmmoOnly( pWeapon ); } return false; } pWeapon->CheckRespawn(); pWeapon->AddSolidFlags( FSOLID_NOT_SOLID ); pWeapon->AddEffects( EF_NODRAW ); Weapon_Equip( pWeapon ); EmitSound( "HL2Player.PickupWeapon" ); return true; }

bool CHL2_Player::ClientCommand( const CCommand &args ) //Suelta el arma principal if ( !Q_stricmp( args[0], "DropPrimary" ) ) { Weapon_DropSlot( WEAPON_PRIMARY_SLOT ); return true; }

// Comprobación de la recogida de armas if ( m_afButtonPressed & IN_USE ) { CBaseCombatWeapon *pWeapon = dynamic_cast<CBaseCombatWeapon *>(pUseEntity); if ( ( pWeapon != NULL ) && ( Weapon_CanSwitchTo( pWeapon ) ) ) { //Try to take ammo or swap the weapon if ( Weapon_OwnsThisType( pWeapon->GetClassname(), pWeapon->GetSubType() ) ) { Weapon_EquipAmmoOnly( pWeapon ); } else { Weapon_DropSlot( pWeapon->GetSlot() ); Weapon_Equip( pWeapon ); } usedSomething = true; } }
Paso 2: Restringir más tipos de armas
Los tipos de armas se definen por la ranura en la que están, como se muestra en hl2_player.h alrededor de la línea 48:

//---------------------------------------------------- // Definiciones de las ranuras para armas //---------------------------------------------------- #define WEAPON_MELEE_SLOT 0 #define WEAPON_SECONDARY_SLOT 1 #define WEAPON_PRIMARY_SLOT 2 #define WEAPON_EXPLOSIVE_SLOT 3 #define WEAPON_TOOL_SLOT 4

Esto significa que las armas que no se encuentran en la segunda ranura (mostrada en el juego como la tercera) no estarán restringidas. Vamos a cambiar eso.

Primer método: Cambiar las ranuras de las armas

Ve a la carpeta de scripts de tu mod y desplázate hacia abajo hasta que veas los archivos weapon_X.txt. Por ejemplo, busquemos en el archivo weapon_shotgun.txt:
// Shotgun WeaponData { // Los datos de las armas son cargados tanto por la DLL del juego como por la del cliente. "printname" "#HL2_Shotgun" "viewmodel" "models/weapons/v_shotgun.mdl" "playermodel" "models/weapons/w_shotgun.mdl" "anim_prefix" "shotgun" "bucket" "3" "bucket_position" "0" "bucket_360" "1" "bucket_position_360" "1"

El número de "bucket" es lo que queremos. Esta es la ranura en el eje X en la que se encuentra el arma en la interfaz de selección de armas y lo que determina qué tipo de arma es. Cambia el número de "bucket" a "2" para que sea un arma "Primaria". Ahora, cuando intentes recoger esa arma en el juego, tendrás que soltar tu arma primaria actual para coger esa. También es una buena idea cambiar la etiqueta "bucket_position" a 0 para que no haya ningún espacio innecesario en la interfaz de usuario de selección de armas.
Segundo método: Añadir la ranura del arma a la... greylist.
ara ello, vuelve a encontrar esto en hl2_player.cpp:

void CHL2_Player::Weapon_Equip( CBaseCombatWeapon *pWeapon ) { #if HL2_SINGLE_PRIMARY_WEAPON_MODE if ( pWeapon->GetSlot() == WEAPON_PRIMARY_SLOT) { Weapon_DropSlot(WEAPON_PRIMARY_SLOT); } #endif

Ahora añada esto encima o debajo de la declaración WEAPON_PRIMARY_SLOT:

if ( pWeapon->GetSlot() == WEAPON_X_SLOT) { Weapon_DropSlot(WEAPON_X_SLOT); }

Sustituye la X por la ranura que quieras:

0 en el código/1 en el juego = MELEE (palanca)

1/2 = SECUNDARIA (pistola)

2/3 = PRIMARIO (smg y pistola de pulso) [esto ya está incluido en el código así que no tienes que incluirlo de nuevo]

3/4 = EXPLOSIVO (granadas)

4/5 = HERRAMIENTA (bugbait)

Ahora sólo puedes recoger una de las armas en esa ranura. Si intentas coger otra arma en esa ranura, dejarás la actual y cogerás la nueva.
(deben ser los nombres en ingles de las categorías, no los números)