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