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