|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef WEAPON_DODBASE_H
#define WEAPON_DODBASE_H
#ifdef _WIN32
#pragma once
#endif
#include "dod_playeranimstate.h"
#include "dod_weapon_parse.h"
#if defined( CLIENT_DLL )
#define CWeaponDODBase C_WeaponDODBase
#endif
extern int AliasToWeaponID( const char *alias ); extern const char *WeaponIDToAlias( int id ); extern bool IsPrimaryWeapon( int id ); extern bool IsSecondaryWeapon( int id );
class CDODPlayer;
// These are the names of the ammo types that go in the CAmmoDefs and that the
// weapon script files reference.
#define DOD_AMMO_SUBMG "DOD_AMMO_SUBMG"
#define DOD_AMMO_ROCKET "DOD_AMMO_ROCKET"
#define DOD_AMMO_COLT "DOD_AMMO_COLT"
#define DOD_AMMO_P38 "DOD_AMMO_P38"
#define DOD_AMMO_C96 "DOD_AMMO_C96"
#define DOD_AMMO_WEBLEY "DOD_AMMO_WEBLEY"
#define DOD_AMMO_GARAND "DOD_AMMO_GARAND"
#define DOD_AMMO_K98 "DOD_AMMO_K98"
#define DOD_AMMO_M1CARBINE "DOD_AMMO_M1CARBINE"
#define DOD_AMMO_ENFIELD "DOD_AMMO_ENFIELD"
#define DOD_AMMO_SPRING "DOD_AMMO_SPRING"
#define DOD_AMMO_FG42 "DOD_AMMO_FG42"
#define DOD_AMMO_BREN "DOD_AMMO_BREN"
#define DOD_AMMO_BAR "DOD_AMMO_BAR"
#define DOD_AMMO_30CAL "DOD_AMMO_30CAL"
#define DOD_AMMO_MG34 "DOD_AMMO_MG34"
#define DOD_AMMO_MG42 "DOD_AMMO_MG42"
#define DOD_AMMO_HANDGRENADE "DOD_AMMO_HANDGRENADE"
#define DOD_AMMO_HANDGRENADE_EX "DOD_AMMO_HANDGRENADE_EX" // the EX is for EXploding! :)
#define DOD_AMMO_STICKGRENADE "DOD_AMMO_STICKGRENADE"
#define DOD_AMMO_STICKGRENADE_EX "DOD_AMMO_STICKGRENADE_EX"
#define DOD_AMMO_SMOKEGRENADE_US "DOD_AMMO_SMOKEGRENADE_US"
#define DOD_AMMO_SMOKEGRENADE_GER "DOD_AMMO_SMOKEGRENADE_GER"
#define DOD_AMMO_SMOKEGRENADE_US_LIVE "DOD_AMMO_SMOKEGRENADE_US_LIVE"
#define DOD_AMMO_SMOKEGRENADE_GER_LIVE "DOD_AMMO_SMOKEGRENADE_GER_LIVE"
#define DOD_AMMO_RIFLEGRENADE_US "DOD_AMMO_RIFLEGRENADE_US"
#define DOD_AMMO_RIFLEGRENADE_GER "DOD_AMMO_RIFLEGRENADE_GER"
#define DOD_AMMO_RIFLEGRENADE_US_LIVE "DOD_AMMO_RIFLEGRENADE_US_LIVE"
#define DOD_AMMO_RIFLEGRENADE_GER_LIVE "DOD_AMMO_RIFLEGRENADE_GER_LIVE"
#define CROSSHAIR_CONTRACT_PIXELS_PER_SECOND 7.0f
// Given an ammo type (like from a weapon's GetPrimaryAmmoType()), this compares it
// against the ammo name you specify.
// MIKETODO: this should use indexing instead of searching and strcmp()'ing all the time.
bool IsAmmoType( int iAmmoType, const char *pAmmoName );
typedef enum { WEAPON_NONE = 0,
//Melee
WEAPON_AMERKNIFE, WEAPON_SPADE,
//Pistols
WEAPON_COLT, WEAPON_P38, WEAPON_C96,
//Rifles
WEAPON_GARAND, WEAPON_M1CARBINE, WEAPON_K98, //Sniper Rifles
WEAPON_SPRING, WEAPON_K98_SCOPED,
//SMG
WEAPON_THOMPSON, WEAPON_MP40, WEAPON_MP44, WEAPON_BAR,
//Machine guns
WEAPON_30CAL, WEAPON_MG42,
//Rocket weapons
WEAPON_BAZOOKA, WEAPON_PSCHRECK,
//Grenades
WEAPON_FRAG_US, WEAPON_FRAG_GER,
WEAPON_FRAG_US_LIVE, WEAPON_FRAG_GER_LIVE,
WEAPON_SMOKE_US, WEAPON_SMOKE_GER,
WEAPON_RIFLEGREN_US, WEAPON_RIFLEGREN_GER,
WEAPON_RIFLEGREN_US_LIVE, WEAPON_RIFLEGREN_GER_LIVE,
// not actually separate weapons, but defines used in stats recording
// find a better way to do this without polluting the list of actual weapons.
WEAPON_THOMPSON_PUNCH, WEAPON_MP40_PUNCH,
WEAPON_GARAND_ZOOMED, WEAPON_K98_ZOOMED, WEAPON_SPRING_ZOOMED, WEAPON_K98_SCOPED_ZOOMED,
WEAPON_30CAL_UNDEPLOYED, WEAPON_MG42_UNDEPLOYED,
WEAPON_BAR_SEMIAUTO, WEAPON_MP44_SEMIAUTO, WEAPON_MAX, // number of weapons weapon index
} DODWeaponID;
//Class Heirarchy for dod weapons
/*
CWeaponDODBase | | |--> CWeaponDODBaseMelee | | | |--> CWeaponSpade | |--> CWeaponUSKnife | |--> CWeaponDODBaseGrenade | | | |--> CWeaponHandgrenade | |--> CWeaponStickGrenade | |--> CWeaponSmokeGrenadeUS | |--> CWeaponSmokeGrenadeGER | |--> CWeaponBaseRifleGrenade | | | |--> CWeaponRifleGrenadeUS | |--> CWeaponRifleGrenadeGER | |--> CDODBaseRocketWeapon | | | |--> CWeaponBazooka | |--> CWeaponPschreck | |--> CWeaponDODBaseGun | |--> CDODFullAutoWeapon | | | |--> CWeaponC96 | | | |--> CDODFullAutoPunchWeapon | | | | | |--> CWeaponThompson | | |--> CWeaponMP40 | | | |--> CDODBipodWeapon | | | |-> CWeapon30Cal | |-> CWeaponMG42 | |--> CDODFireSelectWeapon | | | |--> CWeaponMP44 | |--> CWeaponBAR | | |--> CDODSemiAutoWeapon | |--> CWeaponColt |--> CWeaponP38 |--> CWeaponM1Carbine |--> CDODSniperWeapon | |--> CWeaponSpring |--> CWeaponScopedK98 |--> CWeaponGarand |--> CWeaponK98
*/
void FindHullIntersection( const Vector &vecSrc, trace_t &tr, const Vector &mins, const Vector &maxs, CBaseEntity *pEntity );
typedef enum { Primary_Mode = 0, Secondary_Mode, } DODWeaponMode;
class CWeaponDODBase : public CBaseCombatWeapon { public: DECLARE_CLASS( CWeaponDODBase, CBaseCombatWeapon ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE();
CWeaponDODBase();
#ifdef GAME_DLL
DECLARE_DATADESC();
virtual void CheckRespawn(); virtual CBaseEntity* Respawn(); virtual const Vector& GetBulletSpread(); virtual float GetDefaultAnimSpeed();
virtual void ItemBusyFrame(); virtual bool ShouldRemoveOnRoundRestart();
void Materialize(); void AttemptToMaterialize(); #else
void PlayWorldReloadSound( CDODPlayer *pPlayer );
#endif
virtual bool DefaultReload( int iClipSize1, int iClipSize2, int iActivity );
virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ); virtual void Drop( const Vector &vecVelocity ); virtual void AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles ); virtual float CalcViewmodelBob( void ); // All predicted weapons need to implement and return true
virtual bool IsPredicted() const;
virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() | FCAP_USE_IN_RADIUS; }
CBasePlayer* GetPlayerOwner() const; CDODPlayer* GetDODPlayerOwner() const;
virtual void WeaponIdle( void ); virtual Activity GetIdleActivity( void );
// Get DOD-specific weapon data.
CDODWeaponInfo const &GetDODWpnData() const;
// Get specific DOD weapon ID (ie: WEAPON_GARAND, etc)
virtual DODWeaponID GetWeaponID( void ) const { return WEAPON_NONE; } virtual DODWeaponID GetStatsWeaponID( void ) { return GetWeaponID(); } virtual DODWeaponID GetAltWeaponID( void ) const { return WEAPON_NONE; }
// return true if this weapon is an instance of the given weapon type (ie: "IsA" WEAPON_GLOCK)
bool IsA( DODWeaponID id ) const { return GetWeaponID() == id; }
// return true if this weapon has a silencer equipped
virtual bool IsSilenced( void ) const { return false; }
void KickBack( float up_base, float lateral_base, float up_modifier, float lateral_modifier, float up_max, float lateral_max, int direction_change );
virtual void SetWeaponModelIndex( const char *pName );
virtual bool CanDrop( void ) { return false; }
virtual bool ShouldDrawCrosshair( void ) { return true; } virtual bool ShouldDrawViewModel( void ) { return true; } virtual bool ShouldDrawMuzzleFlash( void ) { return true; }
virtual float GetWeaponAccuracy( float flPlayerSpeed ) { return 0; }
virtual bool HideViewModelWhenZoomed( void ) { return false; }
virtual bool CanAttack( void ); virtual bool ShouldAutoReload( void );
CNetworkVar( int, m_iReloadModelIndex ); CNetworkVector( m_vInitialDropVelocity );
virtual void FinishReload( void ) {}
public: #if defined( CLIENT_DLL )
virtual void ProcessMuzzleFlashEvent(); virtual bool ShouldPredict();
virtual void PostDataUpdate( DataUpdateType_t type ); virtual void OnDataChanged( DataUpdateType_t type );
virtual bool OnFireEvent( C_BaseViewModel *pViewModel, const Vector& origin, const QAngle& angles, int event, const char *options );
virtual bool ShouldAutoEjectBrass( void ); virtual bool GetEjectBrassShellType( void );
void SetUseAltModel( bool bUseAlt ); virtual int GetWorldModelIndex( void ); virtual void CheckForAltWeapon( int iCurrentState );
virtual Vector GetDesiredViewModelOffset( C_DODPlayer *pOwner ); virtual float GetViewModelSwayScale( void ) { return 1.0; }
virtual void OnWeaponDropped( void ) {}
virtual bool ShouldDraw( void );
float m_flCrosshairDistance; int m_iAmmoLastCheck; int m_iAlpha; int m_iScopeTextureID;
bool m_bUseAltWeaponModel; //use alternate left handed world model? reset on new sequence
#else
virtual bool Reload(); virtual void Spawn();
void SetDieThink( bool bDie ); void Die( void );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
#endif
virtual void OnPickedUp( CBaseCombatCharacter *pNewOwner );
bool IsUseable(); virtual bool CanDeploy( void ); virtual bool CanHolster( void ); virtual bool SendWeaponAnim( int iActivity ); virtual void Precache( void ); virtual bool CanBeSelected( void ); virtual bool DefaultDeploy( char *szViewModel, char *szWeaponModel, int iActivity, char *szAnimExt ); virtual bool Deploy(); bool PlayEmptySound(); virtual void ItemPostFrame();
virtual const char *GetViewModel( int viewmodelindex = 0 ) const;
bool m_bInAttack; //True after a semi-auto weapon fires - will not fire a second time on the same button press
void SetExtraAmmoCount( int count ) { m_iExtraPrimaryAmmo = count; } int GetExtraAmmoCount( void ) { return m_iExtraPrimaryAmmo; }
virtual const char *GetSecondaryDeathNoticeName( void ) { return "world"; }
virtual CBaseEntity *MeleeAttack( int iDamageAmount, int iDamageType, float flDmgDelay, float flAttackDelay ); void EXPORT Smack( void ); //Secondary Attacks
void RifleButt( void ); void Bayonet( void ); void Punch( void );
virtual Activity GetMeleeActivity( void ) { return ACT_VM_SECONDARYATTACK; } virtual Activity GetStrongMeleeActivity( void ) { return ACT_VM_SECONDARYATTACK; }
virtual float GetRecoil( void ) { return 0.0f; }
protected: CNetworkVar( float, m_flSmackTime ); int m_iSmackDamage; int m_iSmackDamageType; EHANDLE m_pTraceHitEnt; trace_t m_trHit;
int m_iAltFireHint;
private:
void EjectBrassLate();
float m_flDecreaseShotsFired;
CWeaponDODBase( const CWeaponDODBase & );
int m_iExtraPrimaryAmmo;
#ifdef CLIENT_DLL
int m_iCrosshairTexture; #endif
};
#endif // WEAPON_DODBASE_H
|