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
}