Source SDK

Source SDK

Not enough ratings
Bajar el arma al correr - Motor Source 2013
By Oitnemood
   
Award
Favorite
Favorited
Unfavorite
Más información
Este artículo proporciona una implementación básica de bajar el arma mientras se corre y evitar el disparo del arma mientras se hace.

Nota: Esto no funcionará si tu viewmodel no tiene la animación ACT_VM_IDLE_LOWERED declarada en algún lugar del archivo .qc.

Nota: Si tu weapon_yourweaponname.cpp está sobrescribiendo ItemPostFrame entonces tienes que colocar BaseClass::ProcessAnimationEvents(); en el ItemPostFrame de esa clase pero sólo si no estás llamando a BaseClass::ItemPostFrame();. ¡Por ejemplo en el weapon_shotgun.cpp tiene un override de ItemPostFrame lo que significa que el código de bajada del arma no será llamado para esta arma a menos que añadas una llamada a ella! Recuerda poner las declaraciones de Basecombatweapon_Shared.h bajo public o protected para que puedas hacer uso de estas variables en las clases que heredan de basecombatweapon_shared, como el ItemPostFrame de weapon_shotgun.cpp. Si no lo haces, obtendrás errores de identificadores no declarados
El Código
Nota: Esto ha sido probado con HL2MP, 2013 y Alien Swarm SDKS.
todo en el source 2013

BASECOMBATWEAPON_SHARED.CPP

Pulsa CTRL+F y busca este código:
void CBaseCombatWeapon::ItemPostFrame( void )

Luego copia y pega esto encima:

void CBaseCombatWeapon::ProcessAnimationEvents(void) { CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if (!pOwner) return; if ( !m_bWeaponIsLowered && (pOwner->m_nButtons & IN_SPEED ) ) { m_bWeaponIsLowered = true; SendWeaponAnim( ACT_VM_IDLE_LOWERED ); m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); m_flNextSecondaryAttack = m_flNextPrimaryAttack; } else if ( m_bWeaponIsLowered && !(pOwner->m_nButtons & IN_SPEED ) ) { m_bWeaponIsLowered = false; SendWeaponAnim( ACT_VM_IDLE ); m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); m_flNextSecondaryAttack = m_flNextPrimaryAttack; } if ( m_bWeaponIsLowered ) { if ( gpGlobals->curtime > m_flNextPrimaryAttack ) { SendWeaponAnim( ACT_VM_IDLE_LOWERED ); m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); m_flNextSecondaryAttack = m_flNextPrimaryAttack; } } }

Ahora para asegurarnos de que nuestro código es llamado añadimos ProcessAnimationEvents(); aquí:

void CBaseCombatWeapon::ItemPostFrame( void ) { //Añade esto debajo de la comprobación del accesorio pOwner. ProcessAnimationEvents(); }

BASECOMBATWEAPON_SHARED.H

Añade estas declaraciones bajo public en la línea 211 abajo bool IsViewModelSequenceFinished( void ); // Devuelve si la animación actual del viewmodel ha terminado:
Nota: Hacemos ProcessAnimationEvents virtual para poder anularlo en las clases que heredan esta clase.
virtual void ProcessAnimationEvents(void); bool m_bWeaponIsLowered;
Acabado
Ahora tu arma debería bajarse cuando pulses el botón de sprint y no podrás disparar hasta que sueltes el botón.

https://developer.valvesoftware.com/w/images/a/af/Sprint.gif