summaryrefslogtreecommitdiff
path: root/game/shared/tf2/weapon_laserrifle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/tf2/weapon_laserrifle.cpp')
-rw-r--r--game/shared/tf2/weapon_laserrifle.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/game/shared/tf2/weapon_laserrifle.cpp b/game/shared/tf2/weapon_laserrifle.cpp
new file mode 100644
index 0000000..04a4d5f
--- /dev/null
+++ b/game/shared/tf2/weapon_laserrifle.cpp
@@ -0,0 +1,160 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Medic's Laser rifle
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "NPCEvent.h"
+#include "tf_basecombatweapon.h"
+#include "basecombatcharacter.h"
+#include "smoke_trail.h"
+#include "tf_player.h"
+#include "in_buttons.h"
+#include "tf_gamerules.h"
+#include "ammodef.h"
+#include "IEffects.h"
+#include "vstdlib/random.h"
+
+// Damage CVars
+ConVar weapon_laserrifle_damage( "weapon_laserrifle_damage","0", FCVAR_NONE, "Laser Rifle maximum damage" );
+ConVar weapon_laserrifle_range( "weapon_laserrifle_range","0", FCVAR_NONE, "Laser Rifle maximum range" );
+
+// ------------------------------------------------------------------------ //
+// CWeaponLaserRifle
+// ------------------------------------------------------------------------ //
+class CWeaponLaserRifle : public CBaseTFCombatWeapon
+{
+ DECLARE_CLASS( CWeaponLaserRifle, CBaseTFCombatWeapon );
+public:
+ virtual void Precache( void );
+ virtual float GetFireRate( void );
+ virtual void PrimaryAttack( void );
+ virtual bool ComputeEMPFireState( void );
+
+ // Beam
+ int m_iSpriteTexture;
+};
+
+LINK_ENTITY_TO_CLASS( weapon_laserrifle, CWeaponLaserRifle );
+PRECACHE_WEAPON_REGISTER(weapon_laserrifle);
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CWeaponLaserRifle::Precache( void )
+{
+ BaseClass::Precache();
+
+ m_iSpriteTexture = PrecacheModel( "sprites/physbeam.vmt" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+float CWeaponLaserRifle::GetFireRate()
+{
+ return 0.2;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CWeaponLaserRifle::ComputeEMPFireState( void )
+{
+ if (IsOwnerEMPed())
+ {
+ // FIXME: Need a sound
+ //UTIL_EmitSound( pPlayer->pev, CHAN_WEAPON, g_pszEMPGatlingFizzle, 1.0, ATTN_NORM );
+ return false;
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CWeaponLaserRifle::PrimaryAttack( void )
+{
+ CBaseTFPlayer *pPlayer = ToBaseTFPlayer( m_hOwner );
+ if ( !pPlayer )
+ return;
+
+ if ( !ComputeEMPFireState() )
+ return;
+
+ WeaponSound(SINGLE);
+
+ PlayAttackAnimation( GetPrimaryAttackActivity() );
+
+ pPlayer->AddEffects( EF_MUZZLEFLASH );
+
+ // Fire the beam: BLOW OFF AUTOAIM
+ Vector vecSrc = pPlayer->Weapon_ShootPosition( pPlayer->GetOrigin() );
+ Vector vecAiming, right, up;
+ pPlayer->EyeVectors( &vecAiming, &right, &up);
+
+ Vector vecSpread = VECTOR_CONE_4DEGREES;
+
+ // Get endpoint
+ float x, y, z;
+ do {
+ x = random->RandomFloat(-0.5,0.5) + random->RandomFloat(-0.5,0.5);
+ y = random->RandomFloat(-0.5,0.5) + random->RandomFloat(-0.5,0.5);
+ z = x*x+y*y;
+ } while (z > 1);
+ Vector vecDir = vecAiming + x * vecSpread.x * right + y * vecSpread.y * up;
+ Vector vecEnd = vecSrc + vecDir * weapon_laserrifle_range.GetFloat();
+
+ trace_t tr;
+ float damagefactor = TFGameRules()->WeaponTraceLine(vecSrc, vecEnd, MASK_SHOT, pPlayer, DMG_ENERGYBEAM, &tr);
+
+ // Hit target?
+ if (tr.fraction != 1.0)
+ {
+ CBaseEntity *pEntity = CBaseEntity::Instance(tr.u.ent);
+ if ( pEntity )
+ {
+ ClearMultiDamage();
+ float flDamage = GetDamage( (tr.endpos - vecSrc).Length(), tr.hitgroup );
+ flDamage *= damagefactor;
+ pEntity->TraceAttack( CTakeDamageInfo( pPlayer, pPlayer, flDamage, DMG_ENERGYBEAM ), vecDir, &tr );
+ ApplyMultiDamage( pPlayer, pPlayer );
+ }
+
+ g_pEffects->EnergySplash( tr.endpos, tr.plane.normal );
+ }
+
+ // Get hacked gun position
+ AngleVectors( pPlayer->EyeAngles() + pPlayer->m_Local.m_vecPunchAngle, NULL, &right, NULL );
+ Vector vecTracerSrc = vecSrc + Vector (0,0,-8) + right * 12 + vecDir * 16;
+
+ // Laser beam
+ CBroadcastRecipientFilter filter;
+ te->BeamPoints( filter, 0.0,
+ &vecTracerSrc,
+ &tr.endpos,
+ m_iSpriteTexture,
+ 0, // Halo index
+ 0, // Start frame
+ 0, // Frame rate
+ 0.2, // Life
+ 15, // Width
+ 15, // EndWidth
+ 0, // FadeLength
+ 0, // Amplitude
+ 200, // r
+ 200, // g
+ 255, // b
+ 255, // a
+ 255 ); // speed
+
+ pPlayer->m_iAmmo[m_iPrimaryAmmoType]--;
+ m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate();
+
+ CheckRemoveDisguise();
+}