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.
470 lines
17 KiB
470 lines
17 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef TF_WEAPON_THROWABLE_H
|
|
#define TF_WEAPON_THROWABLE_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tf_weapon_jar.h"
|
|
#include "tf_shareddefs.h"
|
|
#include "tf_weaponbase_gun.h"
|
|
|
|
#ifdef CLIENT_DLL
|
|
#define CTFThrowable C_TFThrowable
|
|
#define CTFThrowablePrimary C_TFThrowablePrimary
|
|
#define CTFThrowableSecondary C_TFThrowableSecondary
|
|
#define CTFThrowableMelee C_TFThrowableMelee
|
|
#define CTFThrowableUtility C_TFThrowableUtility
|
|
#define CTFProjectile_Throwable C_TFProjectile_Throwable
|
|
#define CTFProjectile_ThrowableRepel C_TFProjectile_ThrowableRepel
|
|
#define CTFProjectile_ThrowableBrick C_TFProjectile_ThrowableBrick
|
|
#define CTFProjectile_ThrowableBreadMonster C_TFProjectile_ThrowableBreadMonster
|
|
#define CTFProjectile_BreadMonster_Jarate C_TFProjectile_BreadMonster_Jarate
|
|
|
|
#ifdef STAGING_ONLY
|
|
#define CTFProjectile_ThrowableTargetDummy C_TFProjectile_ThrowableTargetDummy
|
|
#define CTFProjectile_ConcGrenade C_TFProjectile_ConcGrenade
|
|
#define CTFProjectile_TeleportGrenade C_TFProjectile_TeleportGrenade
|
|
#define CTFProjectile_GravityGrenade C_TFProjectile_GravityGrenade
|
|
#define CTFProjectile_ThrowingKnife C_TFProjectile_ThrowingKnife
|
|
#define CTFProjectile_SmokeGrenade C_TFProjectile_SmokeGrenade
|
|
#endif // STAGING_ONLY
|
|
#endif
|
|
|
|
class CTFProjectile_Throwable;
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFThrowable : public CTFJar, public ITFChargeUpWeapon
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFThrowable, CTFJar );
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
|
|
CTFThrowable();
|
|
|
|
virtual void Precache();
|
|
virtual void PrimaryAttack( void );
|
|
virtual void ItemPostFrame( void );
|
|
virtual CBaseEntity *FireJar( CTFPlayer *pPlayer ) OVERRIDE;
|
|
|
|
virtual int GetWeaponID( void ) const { return TF_WEAPON_THROWABLE; }
|
|
virtual const char* GetEffectLabelText( void ) { return "#TF_Throwable"; }
|
|
virtual bool ShowHudElement( void ) { return true; }
|
|
virtual const char* ModifyEventParticles( const char* token ) { return NULL; }
|
|
|
|
virtual float InternalGetEffectBarRechargeTime( void );
|
|
virtual float GetDetonationTime( void );
|
|
|
|
|
|
// ITFChargeUpWeapon
|
|
virtual bool CanCharge( void );
|
|
virtual float GetChargeBeginTime( void );
|
|
virtual float GetChargeMaxTime( void ); // Same as Det time
|
|
|
|
#ifdef GAME_DLL
|
|
//virtual bool ShouldSpeakWhenFiring( void ) { return false; }
|
|
|
|
//virtual const AngularImpulse GetAngularImpulse( void ){ return AngularImpulse( 300, 0, 0 ); }
|
|
//virtual Vector GetVelocityVector( const Vector &vecForward, const Vector &vecRight, const Vector &vecUp );
|
|
|
|
virtual void TossJarThink( void );
|
|
virtual CTFProjectile_Throwable *FireProjectileInternal( void );
|
|
|
|
#endif
|
|
|
|
CNetworkVar( float, m_flChargeBeginTime );
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFThrowablePrimary : public CTFThrowable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFThrowablePrimary, CTFThrowable );
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
};
|
|
|
|
class CTFThrowableSecondary : public CTFThrowable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFThrowableSecondary, CTFThrowable );
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
};
|
|
|
|
class CTFThrowableMelee : public CTFThrowable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFThrowableMelee, CTFThrowable );
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
};
|
|
|
|
class CTFThrowableUtility : public CTFThrowable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFThrowableUtility, CTFThrowable );
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_Throwable : public CTFProjectile_Jar
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_Throwable, CTFProjectile_Jar );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual int GetWeaponID( void ) const { return TF_WEAPON_GRENADE_THROWABLE; }
|
|
virtual float GetModelScale() const { return 1.0f; }
|
|
virtual int GetCustomDamageType() const OVERRIDE{ return TF_DMG_CUSTOM_THROWABLE; }
|
|
virtual bool IsDeflectable() OVERRIDE { return true; }
|
|
virtual bool ExplodesOnHit() { return true; }
|
|
virtual void SetCustomPipebombModel() { return; }
|
|
virtual float GetShakeAmplitude() { return 0.0; }
|
|
virtual float GetProjectileSpeed() { return 1000.0f; }
|
|
virtual float GetProjectileMaxSpeed() { return 2500.0f; }
|
|
virtual const char *GetThrowSoundEffect() const { return NULL; }
|
|
|
|
#ifdef GAME_DLL
|
|
CTFProjectile_Throwable();
|
|
|
|
virtual void Spawn( void )
|
|
{
|
|
SetModelScale( GetModelScale() );
|
|
BaseClass::Spawn();
|
|
}
|
|
virtual void InitThrowable( float flChargePercent ) { m_flChargePercent = flChargePercent; }
|
|
|
|
virtual int GetProjectileType( void ) const OVERRIDE { return TF_PROJECTILE_THROWABLE; }
|
|
|
|
virtual void OnHit( CBaseEntity *pOther );
|
|
//virtual void Detonate(); // Timer based Explode
|
|
virtual void Misfire() { }
|
|
virtual void Explode(); // Explode Helper
|
|
virtual void Explode( trace_t *pTrace, int bitsDamageType ) OVERRIDE;
|
|
|
|
virtual void ApplyBlastDamage( CTFPlayer *pThrower, Vector vecOrigin ) { }
|
|
virtual bool InitialExplodeEffects( CTFPlayer *pThrower, const trace_t *pTrace ) { return false; }
|
|
virtual void ExplodeEffectOnTarget( CTFPlayer *pThrower, CTFPlayer *pTarget, CBaseCombatCharacter *pBaseTarget ) { }
|
|
|
|
virtual float GetDamage() { return 0.0f; }
|
|
virtual float GetDamageRadius() const { return 250.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return GetTeamNumber() == TF_TEAM_RED ? "" : ""; }
|
|
virtual const char *GetExplodeEffectSound() const { return ""; }
|
|
|
|
virtual const AngularImpulse GetAngularImpulse( void ) { return AngularImpulse( 300, 0, 0 ); }
|
|
virtual Vector GetVelocityVector( const Vector &vecForward, const Vector &vecRight, const Vector &vecUp, float flCharge );
|
|
|
|
#endif // GAME_DLL
|
|
|
|
#ifdef CLIENT_DLL
|
|
virtual const char* GetTrailParticleName( void ) { return GetTeamNumber() == TF_TEAM_RED ? "trail_basic_red" : "trail_basic_blue"; }
|
|
#endif
|
|
|
|
protected:
|
|
|
|
#ifdef GAME_DLL
|
|
float m_flChargePercent;
|
|
bool m_bHit;
|
|
#endif // GAME_DLL
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ThrowableRepel : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ThrowableRepel, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/weapons/c_models/c_balloon_default.mdl" ); }
|
|
virtual bool ExplodesOnHit() { return true; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void OnHit( CBaseEntity *pOther );
|
|
|
|
virtual float GetDamage() { return RemapVal( m_flChargePercent, 0, 1, 20.0f, 50.0f ); }
|
|
virtual float GetDamageRadius() const { return 0.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return "Explosion_bubbles"; }
|
|
virtual const char *GetExplodeEffectSound() const { return ""; }
|
|
|
|
#endif // GAME_DLL
|
|
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ThrowableBrick : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ThrowableBrick, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/weapons/c_models/c_bread/c_bread_plainloaf.mdl" ); }
|
|
virtual bool ExplodesOnHit() { return false; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void OnHit( CBaseEntity *pOther );
|
|
|
|
virtual float GetDamage() { return RemapVal( m_flChargePercent, 0, 1, 40.0f, 70.0f ); }
|
|
virtual float GetDamageRadius() const { return 0.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return ""; }
|
|
virtual const char *GetExplodeEffectSound() const { return ""; }
|
|
|
|
#endif // GAME_DLL
|
|
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ThrowableBreadMonster : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ThrowableBreadMonster, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/weapons/c_models/c_breadmonster/c_breadmonster.mdl" ); }
|
|
virtual bool ExplodesOnHit() { return true; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual int GetProjectileType( void ) const OVERRIDE { return TF_PROJECTILE_BREAD_MONSTER; }
|
|
|
|
virtual void OnHit( CBaseEntity *pOther );
|
|
virtual void Detonate(); // Timer based 'Explode' Just Remove
|
|
virtual void Explode( trace_t *pTrace, int bitsDamageType );
|
|
|
|
virtual float GetDamage() { return RemapVal( m_flChargePercent, 0, 1, 40.0f, 85.0f ); }
|
|
virtual float GetDamageRadius() const { return 0.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return "breadjar_impact"; }
|
|
virtual const char *GetThrowSoundEffect() const { return "Weapon_bm_throwable.throw"; }
|
|
virtual const char *GetExplodeEffectSound() const { return "Weapon_bm_throwable.smash"; }
|
|
#endif // GAME_DLL
|
|
|
|
};
|
|
|
|
|
|
// *************************************************************************************************************************
|
|
//class CTFProjectile_BreadMonster_Jarate : public CTFProjectile_Throwable
|
|
//{
|
|
//public:
|
|
// DECLARE_CLASS( CTFProjectile_BreadMonster_Jarate, CTFProjectile_Throwable );
|
|
// DECLARE_NETWORKCLASS();
|
|
//
|
|
// virtual int GetProjectileType( void ) { return TF_PROJECTILE_BREAD_MONSTER; }
|
|
// virtual void SetCustomPipebombModel() { SetModel( "models/weapons/c_models/c_breadmonster/c_breadmonster.mdl" ); }
|
|
// virtual bool ExplodesOnHit() { return true; }
|
|
////
|
|
////#ifdef GAME_DLL
|
|
// virtual void OnHit( CBaseEntity *pOther );
|
|
// virtual void Detonate(); // Timer based 'Explode' Just Remove
|
|
// virtual void Explode( trace_t *pTrace, int bitsDamageType );
|
|
////
|
|
// virtual float GetDamage() { return 0.0f; }
|
|
// virtual float GetDamageRadius() const { return 0.0f; }
|
|
//
|
|
// virtual const char *GetExplodeEffectParticle() const { return "breadjar_impact"; }
|
|
// virtual const char *GetThrowSoundEffect() const { return "Weapon_bm_throwable.throw"; }
|
|
// virtual const char *GetExplodeEffectSound() const { return "Weapon_bm_throwable.smash"; }
|
|
//#endif // GAME_DLL
|
|
|
|
//};
|
|
|
|
|
|
#ifdef STAGING_ONLY
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ThrowableTargetDummy : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ThrowableTargetDummy, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/props_gameplay/small_loaf.mdl" ); }
|
|
virtual bool ExplodesOnHit() { return false; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual int GetProjectileType( void ) const OVERRIDE{ return TF_PROJECTILE_BREAD_MONSTER; }
|
|
|
|
//virtual void OnHit( CBaseEntity *pOther );
|
|
virtual void Detonate() { Explode(); } // Timer based 'Explode' Just Remove
|
|
virtual void Explode();
|
|
|
|
virtual float GetDamage() { return 0.0f; }
|
|
virtual float GetDamageRadius() const { return 0.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return "breadjar_impact"; }
|
|
virtual const char *GetThrowSoundEffect() const { return "Weapon_bm_throwable.throw"; }
|
|
virtual const char *GetExplodeEffectSound() const { return "Weapon_bm_throwable.smash"; }
|
|
#endif // GAME_DLL
|
|
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ConcGrenade : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ConcGrenade, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
virtual void SetCustomPipebombModel( void ) OVERRIDE { return; }
|
|
virtual float GetShakeAmplitude( void ) OVERRIDE { return 10.f; }
|
|
|
|
virtual bool ExplodesOnHit() { return false; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Misfire();
|
|
virtual void Detonate(); // Timer based Explode
|
|
virtual void Explode(); // Explode Helper
|
|
virtual float GetDamageRadius( void ) const OVERRIDE { return 200.f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle( void ) const OVERRIDE { return "mvm_soldier_shockwave"; }
|
|
virtual const char *GetExplodeEffectSound(void ) const OVERRIDE { return "Weapon_Grenade_Concussion.Explode"; }
|
|
#endif // GAME_DLL
|
|
};
|
|
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_TeleportGrenade : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_TeleportGrenade, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Spawn( void ) OVERRIDE;
|
|
#endif // GAME_DLL
|
|
|
|
virtual void SetCustomPipebombModel( void ) OVERRIDE { return; }
|
|
virtual float GetShakeAmplitude( void ) OVERRIDE { return 10.f; }
|
|
|
|
virtual bool ExplodesOnHit() OVERRIDE { return true; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Explode( trace_t *pTrace, int bitsDamageType ) OVERRIDE;
|
|
virtual float GetDamageRadius( void ) const OVERRIDE { return 5.f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle( void ) const OVERRIDE { return "mvm_soldier_shockwave"; }
|
|
virtual const char *GetExplodeEffectSound(void ) const OVERRIDE { return "Weapon_Grenade_Teleport.Explode"; }
|
|
|
|
void RecordPosThink( void );
|
|
#endif // GAME_DLL
|
|
|
|
private:
|
|
#ifdef GAME_DLL
|
|
CUtlVector< Vector > m_vecTrailingPos;
|
|
#endif
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_GravityGrenade : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_GravityGrenade, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Spawn( void ) OVERRIDE;
|
|
#endif // GAME_DLL
|
|
|
|
virtual void SetCustomPipebombModel( void ) OVERRIDE { return; }
|
|
virtual float GetShakeAmplitude( void ) OVERRIDE { return 10.f; }
|
|
|
|
virtual bool ExplodesOnHit() OVERRIDE { return false; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void OnHitWorld( void ) OVERRIDE;
|
|
virtual float GetDamageRadius( void ) const OVERRIDE { return 200.f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle( void ) const OVERRIDE { return "mvm_soldier_shockwave"; }
|
|
virtual const char *GetExplodeEffectSound(void ) const OVERRIDE { return "Weapon_Grenade_Concussion.Explode"; }
|
|
|
|
private:
|
|
void TrapThink( void );
|
|
void PulseTrap( void );
|
|
void PulseEffects( void );
|
|
|
|
float m_flStartTime;
|
|
float m_flNextPulseEffectTime;
|
|
bool m_bHitWorld;
|
|
|
|
#endif // GAME_DLL
|
|
};
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_ThrowingKnife : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_ThrowingKnife, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
#ifdef STAGING_ONLY
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/workshop_partner/weapons/c_models/c_sd_cleaver/c_sd_cleaver.mdl" ); }
|
|
#else
|
|
virtual void SetCustomPipebombModel() { SetModel( "models/weapons/c_models/c_sd_cleaver/c_sd_cleaver.mdl" ); }
|
|
#endif
|
|
virtual bool ExplodesOnHit() { return false; }
|
|
virtual float GetProjectileSpeed() { return 800.0f; }
|
|
virtual float GetProjectileMaxSpeed() { return 2700.0f; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual int GetProjectileType( void ) const OVERRIDE { return TF_PROJECTILE_THROWING_KNIFE; }
|
|
|
|
virtual void OnHit( CBaseEntity *pOther );
|
|
virtual void Detonate(); // Timer based 'Explode' Just Remove
|
|
|
|
virtual const AngularImpulse GetAngularImpulse( void ) { return AngularImpulse( 0, 500, 0 ); }
|
|
virtual Vector GetVelocityVector( const Vector &vecForward, const Vector &vecRight, const Vector &vecUp, float flCharge );
|
|
|
|
virtual float GetDamage() { return 10.0f; }
|
|
virtual float GetBackHitDamage() { return RemapVal( m_flChargePercent, 0, 1, 35.0f, 60.0f ); } // x3 for crit
|
|
virtual float GetDamageRadius() const { return 0.0f; }
|
|
|
|
virtual const char *GetExplodeEffectParticle() const { return ""; }
|
|
virtual const char *GetExplodeEffectSound() const { return ""; }
|
|
|
|
#endif // GAME_DLL
|
|
};
|
|
|
|
|
|
// *************************************************************************************************************************
|
|
class CTFProjectile_SmokeGrenade : public CTFProjectile_Throwable
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_GravityGrenade, CTFProjectile_Throwable );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Spawn( void ) OVERRIDE;
|
|
#endif // GAME_DLL
|
|
|
|
virtual void SetCustomPipebombModel( void ) OVERRIDE { return; }
|
|
virtual bool ExplodesOnHit() OVERRIDE { return false; }
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void OnHitWorld( void ) OVERRIDE;
|
|
virtual float GetDamageRadius( void ) const OVERRIDE { return 220.f; }
|
|
|
|
virtual const char *GetExplodeEffectSound(void ) const OVERRIDE { return "Weapon_Grenade_Concussion.Explode"; }
|
|
|
|
private:
|
|
void SmokeThink( void );
|
|
|
|
float m_flStartTime;
|
|
bool m_bHitWorld;
|
|
#endif // GAME_DLL
|
|
};
|
|
|
|
#endif // STAGING_ONLY
|
|
|
|
#endif // TF_WEAPON_THROWABLE_H
|