205 lines
5.2 KiB
C++
205 lines
5.2 KiB
C++
#include "cbase.h"
|
|
#include "asw_weapon_flechette_shared.h"
|
|
#include "in_buttons.h"
|
|
|
|
#ifdef CLIENT_DLL
|
|
#define CASW_Weapon C_ASW_Weapon
|
|
#define CASW_Marine C_ASW_Marine
|
|
#define CBasePlayer C_BasePlayer
|
|
#include "c_asw_player.h"
|
|
#include "c_asw_weapon.h"
|
|
#include "c_asw_marine.h"
|
|
#include "c_asw_marine_resource.h"
|
|
#include "precache_register.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 "te_effect_dispatch.h"
|
|
#include "asw_marine_resource.h"
|
|
#include "asw_marine_speech.h"
|
|
#include "decals.h"
|
|
#include "ammodef.h"
|
|
#include "asw_weapon_ammo_bag_shared.h"
|
|
#include "asw_rocket.h"
|
|
#include "asw_gamerules.h"
|
|
#endif
|
|
#include "asw_marine_skills.h"
|
|
#include "asw_weapon_parse.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( ASW_Weapon_Flechette, DT_ASW_Weapon_Flechette )
|
|
|
|
BEGIN_NETWORK_TABLE( CASW_Weapon_Flechette, DT_ASW_Weapon_Flechette )
|
|
#ifdef CLIENT_DLL
|
|
// recvprops
|
|
#else
|
|
// sendprops
|
|
#endif
|
|
END_NETWORK_TABLE()
|
|
|
|
#ifdef CLIENT_DLL
|
|
BEGIN_PREDICTION_DATA( CASW_Weapon_Flechette )
|
|
END_PREDICTION_DATA()
|
|
#endif
|
|
|
|
LINK_ENTITY_TO_CLASS( asw_weapon_flechette, CASW_Weapon_Flechette );
|
|
PRECACHE_WEAPON_REGISTER( asw_weapon_flechette );
|
|
|
|
extern ConVar asw_weapon_max_shooting_distance;
|
|
|
|
#ifndef CLIENT_DLL
|
|
extern ConVar asw_debug_marine_damage;
|
|
|
|
#endif
|
|
|
|
CASW_Weapon_Flechette::CASW_Weapon_Flechette()
|
|
{
|
|
}
|
|
|
|
|
|
CASW_Weapon_Flechette::~CASW_Weapon_Flechette()
|
|
{
|
|
|
|
}
|
|
|
|
void CASW_Weapon_Flechette::Precache()
|
|
{
|
|
BaseClass::Precache();
|
|
PrecacheScriptSound( "ASWRocket.Explosion" );
|
|
PrecacheParticleSystem( "small_fire_burst" );
|
|
}
|
|
|
|
void CASW_Weapon_Flechette::PrimaryAttack()
|
|
{
|
|
// If my clip is empty (and I use clips) start reload
|
|
if ( UsesClipsForAmmo1() && !m_iClip1 )
|
|
{
|
|
Reload();
|
|
return;
|
|
}
|
|
|
|
CASW_Player *pPlayer = GetCommander();
|
|
CASW_Marine *pMarine = GetMarine();
|
|
|
|
if (pMarine) // firing from a marine
|
|
{
|
|
m_bIsFiring = true;
|
|
|
|
// MUST call sound before removing a round from the clip of a CMachineGun
|
|
WeaponSound(SINGLE);
|
|
|
|
if (m_iClip1 <= AmmoClickPoint())
|
|
{
|
|
LowAmmoSound();
|
|
}
|
|
|
|
// tell the marine to tell its weapon to draw the muzzle flash
|
|
pMarine->DoMuzzleFlash();
|
|
|
|
// sets the animation on the weapon model iteself
|
|
SendWeaponAnim( GetPrimaryAttackActivity() );
|
|
|
|
Vector vecDir;
|
|
Vector vecSrc = pMarine->Weapon_ShootPosition( );
|
|
if ( pPlayer && pMarine->IsInhabited() )
|
|
{
|
|
vecDir = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187
|
|
}
|
|
else
|
|
{
|
|
#ifdef CLIENT_DLL
|
|
Msg("Error, clientside firing of a weapon that's being controlled by an AI marine\n");
|
|
#else
|
|
vecDir = pMarine->GetActualShootTrajectory( vecSrc );
|
|
#endif
|
|
}
|
|
|
|
int iShots = 1;
|
|
|
|
// Make sure we don't fire more than the amount in the clip
|
|
if ( UsesClipsForAmmo1() )
|
|
{
|
|
iShots = MIN( iShots, m_iClip1 );
|
|
m_iClip1 -= iShots;
|
|
|
|
#ifdef GAME_DLL
|
|
CASW_Marine *pMarine = GetMarine();
|
|
if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 )
|
|
{
|
|
// check he doesn't have ammo in an ammo bay
|
|
CASW_Weapon_Ammo_Bag* pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(0));
|
|
if (!pAmmoBag)
|
|
pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(1));
|
|
if (!pAmmoBag || !pAmmoBag->CanGiveAmmoToWeapon(this))
|
|
pMarine->OnWeaponOutOfAmmo(true);
|
|
}
|
|
#endif
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
iShots = MIN( iShots, pMarine->GetAmmoCount( m_iPrimaryAmmoType ) );
|
|
pMarine->RemoveAmmo( iShots, m_iPrimaryAmmoType );
|
|
}
|
|
|
|
/*#ifndef CLIENT_DLL
|
|
if (asw_debug_marine_damage.GetBool())
|
|
Msg("Weapon dmg = %d\n", info.m_flDamage);
|
|
info.m_flDamage *= pMarine->GetMarineResource()->OnFired_GetDamageScale();
|
|
#endif*/
|
|
|
|
// increment shooting stats
|
|
#ifndef CLIENT_DLL
|
|
float fGrenadeDamage = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_FLECHETTE_DMG);
|
|
|
|
QAngle vecRocketAngle;
|
|
VectorAngles(vecDir, vecRocketAngle);
|
|
vecRocketAngle[YAW] += random->RandomFloat(-10, 10);
|
|
CASW_Rocket::Create(fGrenadeDamage, vecSrc, vecRocketAngle, GetMarine());
|
|
|
|
if (pMarine && pMarine->GetMarineResource())
|
|
{
|
|
pMarine->GetMarineResource()->UsedWeapon(this, iShots);
|
|
pMarine->OnWeaponFired( this, iShots );
|
|
}
|
|
|
|
if (ASWGameRules())
|
|
ASWGameRules()->m_fLastFireTime = gpGlobals->curtime;
|
|
#endif
|
|
m_flNextPrimaryAttack = m_flNextPrimaryAttack + GetFireRate();
|
|
}
|
|
}
|
|
|
|
void CASW_Weapon_Flechette::SecondaryAttack()
|
|
{
|
|
CASW_Player *pPlayer = GetCommander();
|
|
if (!pPlayer)
|
|
return;
|
|
|
|
CASW_Marine *pMarine = GetMarine();
|
|
if (!pMarine)
|
|
return;
|
|
|
|
|
|
// dry fire
|
|
SendWeaponAnim( ACT_VM_DRYFIRE );
|
|
BaseClass::WeaponSound( EMPTY );
|
|
m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f;
|
|
}
|
|
|
|
float CASW_Weapon_Flechette::GetFireRate()
|
|
{
|
|
//float flRate = 0.125f;
|
|
float flRate = GetWeaponInfo()->m_flFireRate;
|
|
|
|
//CALL_ATTRIB_HOOK_FLOAT( flRate, mod_fire_rate );
|
|
|
|
return flRate;
|
|
} |