All pastes #956003 Raw Edit

Unnamed

public text v1 · immutable
#956003 ·published 2008-03-24 23:38 UTC
rendered paste body

#include "cbase.h"
#include "npcevent.h"
#include "in_buttons.h"
#include "beam_shared.h"
#include "ammodef.h"
#include "effect_dispatch_data.h"

#ifdef CLIENT_DLL
	#include "c_hl2mp_player.h"
#else
	#include "hl2mp_player.h"
#endif

#include "weapon_hl2mpbasehlmpcombatweapon.h"

#ifdef CLIENT_DLL
#define CWeaponGauss C_WeaponGauss
#endif
#define GAUSS_BEAM_SPRITE "sprites/laserbeam.vmt"

#define	GAUSS_CHARGE_TIME			0.2f
#define	MAX_GAUSS_CHARGE			16
#define	MAX_GAUSS_CHARGE_TIME		3
#define	DANGER_GAUSS_CHARGE_TIME	10
#define GAUSS_NUM_BEAMS				4


class CWeaponGauss : public CBaseHL2MPCombatWeapon
{
	DECLARE_CLASS( CWeaponGauss, CBaseHL2MPCombatWeapon );
public:

	CWeaponGauss( void );

	void	PrimaryAttack( void );
	void DrawBeam( const Vector &startPos, const Vector &endPos, float width );

	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

#ifndef CLIENT_DLL
	DECLARE_ACTTABLE();
#endif

private:

};

IMPLEMENT_NETWORKCLASS_ALIASED( WeaponGauss, DT_WeaponGauss )

BEGIN_NETWORK_TABLE( CWeaponGauss, DT_WeaponGauss )
END_NETWORK_TABLE()

BEGIN_PREDICTION_DATA( CWeaponGauss )
END_PREDICTION_DATA()

LINK_ENTITY_TO_CLASS( weapon_Gauss, CWeaponGauss );
PRECACHE_WEAPON_REGISTER( weapon_Gauss );


#ifndef CLIENT_DLL
acttable_t CWeaponGauss::m_acttable[] = 
{
	{ ACT_HL2MP_IDLE,					ACT_HL2MP_IDLE_PISTOL,					false },
	{ ACT_HL2MP_RUN,					ACT_HL2MP_RUN_PISTOL,					false },
	{ ACT_HL2MP_IDLE_CROUCH,			ACT_HL2MP_IDLE_CROUCH_PISTOL,			false },
	{ ACT_HL2MP_WALK_CROUCH,			ACT_HL2MP_WALK_CROUCH_PISTOL,			false },
	{ ACT_HL2MP_GESTURE_RANGE_ATTACK,	ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL,	false },
	{ ACT_HL2MP_GESTURE_RELOAD,			ACT_HL2MP_GESTURE_RELOAD_PISTOL,		false },
	{ ACT_HL2MP_JUMP,					ACT_HL2MP_JUMP_PISTOL,					false },
	{ ACT_RANGE_ATTACK1,				ACT_RANGE_ATTACK_PISTOL,				false },
};



IMPLEMENT_ACTTABLE( CWeaponGauss );

#endif

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CWeaponGauss::CWeaponGauss( void )
{
	m_bReloadsSingly	= false;
	m_bFiresUnderwater	= true;
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CWeaponGauss::PrimaryAttack( void )
{
	
	CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

	if ( !pPlayer )
		return;


	WeaponSound( SINGLE );
	pPlayer->DoMuzzleFlash();

	SendWeaponAnim( ACT_VM_PRIMARYATTACK );
	pPlayer->SetAnimation( PLAYER_ATTACK1 );

	m_flNextPrimaryAttack = gpGlobals->curtime + 0.75;
	m_flNextSecondaryAttack = gpGlobals->curtime + 0.75;

	Vector vecForward, vecEnd, vecStart;
	AngleVectors( pPlayer->EyeAngles( ), &vecForward );
	vecStart = pPlayer->EyePosition();
	vecEnd = vecStart + vecForward * 8000;

	trace_t tr;
	UTIL_TraceLine(vecStart, vecEnd, MASK_ALL, pPlayer, COLLISION_GROUP_NPC, &tr );
	//FX_GaussTracer(  vecStart, tr.endpos,3000, true);
	//FX_CreateGaussExplosion(tr.endpos,vecForward,1);
#ifndef CLIENT_DLL	
	CPVSFilter filter( tr.endpos );
	te->GaussExplosion( filter, 0.0f, tr.endpos, tr.plane.normal, 0 );
	UTIL_ImpactTrace( &tr, GetAmmoDef()->Index("GaussEnergy") );
	DrawBeam(tr.startpos, tr.endpos, 32 );

	RadiusDamage ( CTakeDamageInfo( this, pPlayer, 20, DMG_BLAST ), tr.endpos, 30, CLASS_NONE, NULL );
#endif

}


void CWeaponGauss::DrawBeam( const Vector &startPos, const Vector &endPos, float width )
{
	#ifndef CLIENT_DLL	
	//Tracer down the middle
	UTIL_Tracer( startPos, endPos, 0, TRACER_DONT_USE_ATTACHMENT, 6500, false, "GaussTracer" );

	//Draw the main beam shaft
	CBeam *pBeam = CBeam::BeamCreate( GAUSS_BEAM_SPRITE, 0.5 );
	
	pBeam->SetStartPos( startPos );
	pBeam->PointEntInit( endPos, this );
	pBeam->SetEndAttachment( LookupAttachment("Muzzle") );
	pBeam->SetWidth( width );
	pBeam->SetEndWidth( 0.05f );
	pBeam->SetBrightness( 255 );
	pBeam->SetColor( 255, 185+random->RandomInt( -16, 16 ), 40 );
	pBeam->RelinkBeam();
	pBeam->LiveForTime( 0.1f );

	//Draw electric bolts along shaft
	pBeam = CBeam::BeamCreate( GAUSS_BEAM_SPRITE, 3.0f );
	
	pBeam->SetStartPos( startPos );
	pBeam->PointEntInit( endPos, this );
	pBeam->SetEndAttachment( LookupAttachment("Muzzle") );

	pBeam->SetBrightness( random->RandomInt( 64, 255 ) );
	pBeam->SetColor( 255, 255, 150+random->RandomInt( 0, 64 ) );
	pBeam->RelinkBeam();
	pBeam->LiveForTime( 0.1f );
	pBeam->SetNoise( 1.6f );
	pBeam->SetEndWidth( 0.1f );
	#endif
}