Lowering your weapon on sprint: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
{{lang|title=Abaixando sua arma enquanto correndo}}
This article provides a basic implementation of weapon lowering while sprinting, and preventing weapon fire while doing so.
Este artigo fornece uma implementação básica de abaixamento de armas durante a corrida e prevenção de disparos de armas ao fazê-lo.


{{note|Isso não funcionará se seu modelo de visualização não tiver animação ACT_VM_IDLE_LOWERED declarada em algum lugar do arquivo .qc.}}
{{note|This will not work if your viewmodel doesn't have ACT_VM_IDLE_LOWERED animation declared somewhere in the .qc file.}}


{{note|Se sua gun_yourweaponname.cpp estiver substituindo ItemPostFrame, você deverá colocar BaseClass::ProcessAnimationEvents(); no ItemPostFrame dessa classe, mas somente se você não estiver chamando BaseClass::ItemPostFrame();. Por exemplo, em arma_shotgun.cpp ele tem uma substituição de ItemPostFrame, o que significa que o código de redução da arma não será chamado para esta arma, a menos que você adicione uma chamada a ela! '''Lembre-se de colocar as declarações Basecombatweapon_Shared.h em públicas ou protegidas para que você possa fazer uso dessas variáveis ​​​​em classes que herdam basecombatweapon_shared, como o ItemPostFrame do Weapon_shotgun.cpp. Se você não fizer isso, receberá erros de identificador não declarados'''}}


== O Codigo ==
{{note|If your weapon_yourweaponname.cpp is overriding ItemPostFrame then you have to place BaseClass::ProcessAnimationEvents(); in the ItemPostFrame of that class but only if you aren't calling BaseClass::ItemPostFrame();. For example in the weapon_shotgun.cpp it has an override of ItemPostFrame which means that the lowering weapon code will not be called for this weapon unless you add a call to it! '''Remember to put the Basecombatweapon_Shared.h declarations under public or protected so that you can make use of these variables in classes which inherit basecombatweapon_shared, like the weapon_shotgun.cpp's ItemPostFrame. If you don't do this you will get undeclared identifier errors'''}}
 
== The Code ==
{{note|This has been tested with HL2MP, 2013 and Alien Swarm SDKS.}}
{{note|This has been tested with HL2MP, 2013 and Alien Swarm SDKS.}}


===BASECOMBATWEAPON_SHARED.CPP===
===BASECOMBATWEAPON_SHARED.CPP===


Aperta CRTL+F e procure para essa parte:
Hit CTRL+F and search for this code:
 
<source lang=cpp>
<source lang=cpp>


Line 18: Line 19:
</source>
</source>


Em seguida, copie e cole isto acima:
Then copy and paste this above it:


<source lang=cpp>
<source lang=cpp>
Line 56: Line 57:
</source>
</source>


Agora, para garantir que nosso código seja chamado, adicionamos ProcessAnimationEvents(); aqui:
Now to make sure our code gets called we add ProcessAnimationEvents(); here:


<source lang=cpp>
<source lang=cpp>
Line 62: Line 63:
void CBaseCombatWeapon::ItemPostFrame( void )
void CBaseCombatWeapon::ItemPostFrame( void )
{
{
    //Adicione isso abaixo da verificação do acessador pOwner.
      //Add this underneath the pOwner accessor check.
       ProcessAnimationEvents();
       ProcessAnimationEvents();
}
}
Line 70: Line 71:
===BASECOMBATWEAPON_SHARED.H===
===BASECOMBATWEAPON_SHARED.H===


Adicione essas declarações em public na linha 211 abaixo '''bool IsViewModelSequenceFinished( void ); // Retorna se a animação atual do viewmodel foi finalizada''':
Add these declarations under public at line 211 below '''bool IsViewModelSequenceFinished( void ); // Returns if the viewmodel's current animation is finished''':
{{note|Tornamos ProcessAnimationEvents virtuais para que possamos substituí-lo em classes que herdam esta classe.}}
{{note|We make ProcessAnimationEvents virtual so that we can override it in classes which inherit this class.}}


<source lang=cpp>
<source lang=cpp>
Line 80: Line 81:
</source>
</source>


==Fim==
==Finish==
 
Agora quando você correr sua arma deve abaixar!


[[File:Sprint.gif|none| Olhe como fica ]]
Now your weapon should be lowered when you hit the sprint button and you will not be able to shoot until you release the button!
[[File:Sprint.gif|none|Finished Product]]


[[Category:Weapons programming:pt-br]]
[[Category:Weapons programming]]
[[Category:Tutorials:pt-br]]
[[Category:Tutorials]]
[[Category:Programming:pt-br]]

Revision as of 10:16, 16 January 2024

This article provides a basic implementation of weapon lowering while sprinting, and preventing weapon fire while doing so.

Note.pngNote:This will not work if your viewmodel doesn't have ACT_VM_IDLE_LOWERED animation declared somewhere in the .qc file.


Note.pngNote:If your weapon_yourweaponname.cpp is overriding ItemPostFrame then you have to place BaseClass::ProcessAnimationEvents(); in the ItemPostFrame of that class but only if you aren't calling BaseClass::ItemPostFrame();. For example in the weapon_shotgun.cpp it has an override of ItemPostFrame which means that the lowering weapon code will not be called for this weapon unless you add a call to it! Remember to put the Basecombatweapon_Shared.h declarations under public or protected so that you can make use of these variables in classes which inherit basecombatweapon_shared, like the weapon_shotgun.cpp's ItemPostFrame. If you don't do this you will get undeclared identifier errors

The Code

Note.pngNote:This has been tested with HL2MP, 2013 and Alien Swarm SDKS.

BASECOMBATWEAPON_SHARED.CPP

Hit CTRL+F and search for this code:

void CBaseCombatWeapon::ItemPostFrame( void )

Then copy and paste this above it:

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;
		}
	}
}

Now to make sure our code gets called we add ProcessAnimationEvents(); here:

void CBaseCombatWeapon::ItemPostFrame( void )
{
      //Add this underneath the pOwner accessor check.
      ProcessAnimationEvents();
}

BASECOMBATWEAPON_SHARED.H

Add these declarations under public at line 211 below bool IsViewModelSequenceFinished( void ); // Returns if the viewmodel's current animation is finished:

Note.pngNote:We make ProcessAnimationEvents virtual so that we can override it in classes which inherit this class.
	virtual void            ProcessAnimationEvents(void);
	bool                    m_bWeaponIsLowered;

Finish

Now your weapon should be lowered when you hit the sprint button and you will not be able to shoot until you release the button!

Finished Product