You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.6 KiB
162 lines
4.6 KiB
#include "cbase.h" |
|
#include "asw_weapon_grenade_launcher.h" |
|
#include "in_buttons.h" |
|
|
|
#ifdef CLIENT_DLL |
|
#include "c_asw_player.h" |
|
#include "c_asw_weapon.h" |
|
#include "c_asw_marine.h" |
|
#include "prediction.h" |
|
#include "c_te_effect_dispatch.h" |
|
#else |
|
#include "asw_marine.h" |
|
#include "asw_player.h" |
|
#include "asw_weapon.h" |
|
#include "npcevent.h" |
|
#include "shot_manipulator.h" |
|
#include "asw_grenade_cluster.h" |
|
#include "asw_marine_speech.h" |
|
#include "asw_gamerules.h" |
|
#endif |
|
#include "asw_marine_skills.h" |
|
#include "particle_parse.h" |
|
#include "asw_util_shared.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
#define ASW_FLARES_FASTEST_REFIRE_TIME 0.1f |
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( ASW_Weapon_Grenade_Launcher, DT_ASW_Weapon_Grenade_Launcher ) |
|
|
|
BEGIN_NETWORK_TABLE( CASW_Weapon_Grenade_Launcher, DT_ASW_Weapon_Grenade_Launcher ) |
|
#ifdef CLIENT_DLL |
|
// recvprops |
|
#else |
|
// sendprops |
|
#endif |
|
END_NETWORK_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( CASW_Weapon_Grenade_Launcher ) |
|
|
|
END_PREDICTION_DATA() |
|
|
|
LINK_ENTITY_TO_CLASS( asw_weapon_grenade_launcher, CASW_Weapon_Grenade_Launcher ); |
|
PRECACHE_WEAPON_REGISTER( asw_weapon_grenade_launcher ); |
|
|
|
#ifndef CLIENT_DLL |
|
extern ConVar asw_debug_marine_damage; |
|
//--------------------------------------------------------- |
|
// Save/Restore |
|
//--------------------------------------------------------- |
|
BEGIN_DATADESC( CASW_Weapon_Grenade_Launcher ) |
|
DEFINE_FIELD( m_flSoonestPrimaryAttack, FIELD_TIME ), |
|
END_DATADESC() |
|
|
|
#endif /* not client */ |
|
|
|
CASW_Weapon_Grenade_Launcher::CASW_Weapon_Grenade_Launcher() |
|
{ |
|
m_flSoonestPrimaryAttack = gpGlobals->curtime; |
|
} |
|
|
|
|
|
CASW_Weapon_Grenade_Launcher::~CASW_Weapon_Grenade_Launcher() |
|
{ |
|
|
|
} |
|
|
|
#ifdef GAME_DLL |
|
ConVar asw_grenade_launcher_speed( "asw_grenade_launcher_speed", "2.4f", FCVAR_CHEAT, "Scale speed of grenade launcher grenades" ); |
|
ConVar asw_grenade_launcher_gravity( "asw_grenade_launcher_gravity", "2.4f", FCVAR_CHEAT, "Gravity of grenade launcher grenades" ); |
|
#endif |
|
|
|
void CASW_Weapon_Grenade_Launcher::PrimaryAttack( void ) |
|
{ |
|
CASW_Player *pPlayer = GetCommander(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
// NOTE: this class is now a grenade launcher, do we want to rename it at some point? |
|
CASW_Marine *pMarine = GetMarine(); |
|
if ( !pMarine || pMarine->GetWaterLevel() == 3 ) |
|
return; |
|
|
|
#ifndef CLIENT_DLL |
|
pMarine->GetMarineSpeech()->Chatter(CHATTER_GRENADE); |
|
|
|
Vector vecSrc = pMarine->Weapon_ShootPosition( ); |
|
// check it fits where we want to spawn it |
|
Ray_t ray; |
|
trace_t pm; |
|
ray.Init( pMarine->WorldSpaceCenter(), vecSrc, -Vector(4,4,4), Vector(4,4,4) ); |
|
UTIL_TraceRay( ray, MASK_SOLID, pMarine, COLLISION_GROUP_PROJECTILE, &pm ); |
|
if (pm.fraction < 1.0f) |
|
vecSrc = pm.endpos; |
|
|
|
Vector vecDest = pPlayer->GetCrosshairTracePos(); |
|
Vector newVel = UTIL_LaunchVector( vecSrc, vecDest, asw_grenade_launcher_gravity.GetFloat() ) * 28.0f; |
|
|
|
const float &fGrenadeDamage = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_CLUSTER_DMG); |
|
const float &fGrenadeRadius = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_RADIUS); |
|
int iClusters = 0; //MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_CLUSTERS); |
|
if (asw_debug_marine_damage.GetBool()) |
|
{ |
|
Msg("Grenade launcher damage = %f radius = %f clusters = %d\n", fGrenadeDamage, fGrenadeRadius, iClusters); |
|
} |
|
|
|
if (ASWGameRules()) |
|
ASWGameRules()->m_fLastFireTime = gpGlobals->curtime; |
|
|
|
CASW_Grenade_Cluster *pGrenade = |
|
CASW_Grenade_Cluster::Cluster_Grenade_Create( |
|
fGrenadeDamage, |
|
fGrenadeRadius, |
|
iClusters, |
|
vecSrc, pMarine->EyeAngles(), newVel, AngularImpulse(0,0,0), pMarine, this ); |
|
if ( pGrenade ) |
|
{ |
|
pGrenade->SetGravity( asw_grenade_launcher_gravity.GetFloat() ); |
|
pGrenade->SetExplodeOnWorldContact( true ); |
|
|
|
pMarine->OnWeaponFired( this, 1 ); |
|
} |
|
|
|
#else |
|
DispatchParticleEffect( "muzzleflash_grenadelauncher_main", PATTACH_POINT_FOLLOW, this, "muzzle" ); |
|
#endif |
|
|
|
WeaponSound(SINGLE); |
|
|
|
//pMarine->DoMuzzleFlash(); |
|
// sets the animation on the weapon model iteself |
|
SendWeaponAnim( GetPrimaryAttackActivity() ); |
|
|
|
pMarine->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN_PRIMARY ); |
|
|
|
// decrement ammo |
|
m_iClip1 -= 1; |
|
|
|
m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + GetFireRate(); |
|
} |
|
|
|
|
|
void CASW_Weapon_Grenade_Launcher::Precache() |
|
{ |
|
BaseClass::Precache(); |
|
|
|
#ifndef CLIENT_DLL |
|
//UTIL_PrecacheOther( "asw_flare_projectile" ); |
|
#endif |
|
} |
|
|
|
// flares don't reload |
|
bool CASW_Weapon_Grenade_Launcher::Reload() |
|
{ |
|
return BaseClass::Reload(); |
|
} |
|
|
|
void CASW_Weapon_Grenade_Launcher::ItemPostFrame( void ) |
|
{ |
|
BaseClass::ItemPostFrame(); |
|
} |