Delayed Attacks: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Undo revision 142272 by MossyBucket (talk))
(Added back categories and replaced WeaponClassBlah with CWeaponDelayed)
Line 21: Line 21:
If your Weapon doesn't have a constructor, add this after the '''DECLARE_CLASS'''.
If your Weapon doesn't have a constructor, add this after the '''DECLARE_CLASS'''.
<pre>
<pre>
WeaponClassBlah();
CWeaponDelayed();
</pre>
</pre>


Line 34: Line 34:
Add the new variables with in your constructor.
Add the new variables with in your constructor.
<pre>
<pre>
WeaponClassBlah::WeaponClassBlah()
CWeaponDelayed::CWeaponDelayed()
{
{
         m_bDelayedAttack = false;
         m_bDelayedAttack = false;
Line 44: Line 44:
{{note|If you are planning to add a preparing animation, you may uncomment the animation comments and comment out the other '''m_flDelayedAttackTime'''}}
{{note|If you are planning to add a preparing animation, you may uncomment the animation comments and comment out the other '''m_flDelayedAttackTime'''}}
<pre>
<pre>
void WeaponClassBlah::ItemPostFrame( void )
void CWeaponDelayed::ItemPostFrame( void )
{
{
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
Line 66: Line 66:
{{Note|Though if you are doing a melee weapon, do not replace anything and leave as is.}}
{{Note|Though if you are doing a melee weapon, do not replace anything and leave as is.}}
<pre>
<pre>
void WeaponClassBlah::DelayedAttack( void )
void CWeaponDelayed::DelayedAttack( void )
{
{
         if (m_bDelayedAttack && gpGlobals->curtime > m_flDelayedAttackTime)
         if (m_bDelayedAttack && gpGlobals->curtime > m_flDelayedAttackTime)
Line 76: Line 76:
}
}
</pre>
</pre>
{{Note|Remember to replace '''WeaponClassBlah''' to your weapon class otherwise it won't compile.}}
{{Note|Remember to replace '''CWeaponDelayed''' to your weapon class otherwise it won't compile.}}
 
[[Category:Weapons programming]] [[Category:Programming]]

Revision as of 22:41, 9 June 2023

Overview

If you were wandering how to make one of your weapons have a delayed attack this may help you out. This tutorial will show you how to set up the Delayed Attack function to your weapon whether it's melee or fire arms. This should work with both Multiplayer and Singleplayer mods.

Header

So add these new voids with in your weapon class.

Note.pngNote:If you have an ItemPostFrame function already, do not add the ItemPostFrame void. Also if you have a PrimaryAttack void already, then replace with the one below.
void	DelayedAttack( void );
void	ItemPostFrame( void );
void	PrimaryAttack( void )	{ return;}

Now you may want to add these two in your weapon class.

private:
	bool  m_bDelayedAttack;
	float m_flDelayedAttackTime;

If your Weapon doesn't have a constructor, add this after the DECLARE_CLASS.

	CWeaponDelayed();

Weapon Script

Add two more headers within your weapon script if you haven't already.

#include "player.h"
#include "basecombatcharacter.h"
#include "in_buttons.h"

Add the new variables with in your constructor.

CWeaponDelayed::CWeaponDelayed()
{
        m_bDelayedAttack = false;
        m_flDelayedAttackTime = 0.0f;
}

Next add the ItemPostFrame function if you don't already have one, if you do, just copy the content and place it with in your existing ItemPostFrame function.

Note.pngNote:If you are planning to add a preparing animation, you may uncomment the animation comments and comment out the other m_flDelayedAttackTime
void CWeaponDelayed::ItemPostFrame( void )
{
	CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
	
	if ( pOwner == NULL )
		return;

	if ( (pOwner->m_afButtonPressed & IN_ATTACK) && !m_bDelayedAttack)
	{
		//Animation Comments
		//SendWeaponAnim( ACT_VM_HAULBACK );
		//m_flDelayedAttackTime = gpGlobals->curtime + SequenceDuration() + 1.0f;
		m_flDelayedAttackTime = gpGlobals->curtime + 1.0f;
		m_bDelayedAttack = true;
	}
	DelayedAttack();
	BaseClass::ItemPostFrame();
}

The rest should be easy to follow, all you have to do is place your primary fire code with in it.

Note.pngNote:Though if you are doing a melee weapon, do not replace anything and leave as is.
void CWeaponDelayed::DelayedAttack( void )
{
         if (m_bDelayedAttack && gpGlobals->curtime > m_flDelayedAttackTime)
         {
		//Replace this Comment with Weapon Attack Function
		BaseClass::PrimaryAttack();
		m_bDelayedAttack = false;
         }
}
Note.pngNote:Remember to replace CWeaponDelayed to your weapon class otherwise it won't compile.