//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef WEAPON_CSBASE_H #define WEAPON_CSBASE_H #ifdef _WIN32 #pragma once #endif #include "cs_playeranimstate.h" #include "cs_weapon_parse.h" #if defined( CLIENT_DLL ) #define CWeaponCSBase C_WeaponCSBase #endif extern CSWeaponID AliasToWeaponID( const char *alias ); extern const char *WeaponIDToAlias( int id ); extern const char *GetTranslatedWeaponAlias( const char *alias); extern const char * GetWeaponAliasFromTranslated(const char *translatedAlias); extern bool IsPrimaryWeapon( CSWeaponID id ); extern bool IsSecondaryWeapon( CSWeaponID id ); extern int GetShellForAmmoType( const char *ammoname ); #define SHIELD_VIEW_MODEL "models/weapons/v_shield.mdl" #define SHIELD_WORLD_MODEL "models/weapons/w_shield.mdl" class CCSPlayer; // These are the names of the ammo types that go in the CAmmoDefs and that the // weapon script files reference. #define BULLET_PLAYER_50AE "BULLET_PLAYER_50AE" #define BULLET_PLAYER_762MM "BULLET_PLAYER_762MM" #define BULLET_PLAYER_556MM "BULLET_PLAYER_556MM" #define BULLET_PLAYER_556MM_BOX "BULLET_PLAYER_556MM_BOX" #define BULLET_PLAYER_338MAG "BULLET_PLAYER_338MAG" #define BULLET_PLAYER_9MM "BULLET_PLAYER_9MM" #define BULLET_PLAYER_BUCKSHOT "BULLET_PLAYER_BUCKSHOT" #define BULLET_PLAYER_45ACP "BULLET_PLAYER_45ACP" #define BULLET_PLAYER_357SIG "BULLET_PLAYER_357SIG" #define BULLET_PLAYER_57MM "BULLET_PLAYER_57MM" #define AMMO_TYPE_HEGRENADE "AMMO_TYPE_HEGRENADE" #define AMMO_TYPE_FLASHBANG "AMMO_TYPE_FLASHBANG" #define AMMO_TYPE_SMOKEGRENADE "AMMO_TYPE_SMOKEGRENADE" #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 ); enum CSWeaponMode { Primary_Mode = 0, Secondary_Mode, WeaponMode_MAX }; #if defined( CLIENT_DLL ) //-------------------------------------------------------------------------------------------------------------- /** * Returns the client's ID_* value for the currently owned weapon, or ID_NONE if no weapon is owned */ CSWeaponID GetClientWeaponID( bool primary ); #endif //-------------------------------------------------------------------------------------------------------------- CCSWeaponInfo * GetWeaponInfo( CSWeaponID weaponID ); class CWeaponCSBase : public CBaseCombatWeapon { public: DECLARE_CLASS( CWeaponCSBase, CBaseCombatWeapon ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); CWeaponCSBase(); #ifdef GAME_DLL DECLARE_DATADESC(); virtual void CheckRespawn(); virtual CBaseEntity* Respawn(); virtual const Vector& GetBulletSpread(); virtual float GetDefaultAnimSpeed(); virtual void BulletWasFired( const Vector &vecStart, const Vector &vecEnd ); virtual bool ShouldRemoveOnRoundRestart(); //============================================================================= // HPE_BEGIN: // [dwenger] Handle round restart processing for the weapon. //============================================================================= virtual void OnRoundRestart(); //============================================================================= // HPE_END //============================================================================= virtual bool DefaultReload( int iClipSize1, int iClipSize2, int iActivity ); void SendReloadEvents(); void Materialize(); void AttemptToMaterialize(); virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); virtual bool IsRemoveable(); #endif virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ); 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; // Pistols reset m_iShotsFired to 0 when the attack button is released. bool IsPistol() const; virtual bool IsFullAuto() const; CCSPlayer* GetPlayerOwner() const; virtual float GetMaxSpeed() const; // What's the player's max speed while holding this weapon. // Get CS-specific weapon data. CCSWeaponInfo const &GetCSWpnData() const; // Get specific CS weapon ID (ie: WEAPON_AK47, etc) virtual CSWeaponID GetWeaponID( void ) const { return WEAPON_NONE; } // return true if this weapon is an instance of the given weapon type (ie: "IsA" WEAPON_GLOCK) bool IsA( CSWeaponID id ) const { return GetWeaponID() == id; } // return true if this weapon is a kinf of the given weapon type (ie: "IsKindOf" WEAPONTYPE_RIFLE ) bool IsKindOf( CSWeaponType type ) const { return GetCSWpnData().m_WeaponType == type; } // return true if this weapon has a silencer equipped virtual bool IsSilenced( void ) const { return false; } virtual void SetWeaponModelIndex( const char *pName ); virtual void OnPickedUp( CBaseCombatCharacter *pNewOwner ); virtual void OnJump( float fImpulse ); virtual void OnLand( float fVelocity ); public: #if defined( CLIENT_DLL ) virtual void ProcessMuzzleFlashEvent(); virtual bool OnFireEvent( C_BaseViewModel *pViewModel, const Vector& origin, const QAngle& angles, int event, const char *options ); virtual bool ShouldPredict(); virtual void DrawCrosshair(); virtual void OnDataChanged( DataUpdateType_t type ); virtual int GetMuzzleAttachment( void ); virtual bool HideViewModelWhenZoomed( void ) { return true; } float m_flCrosshairDistance; int m_iAmmoLastCheck; int m_iAlpha; int m_iScopeTextureID; int m_iCrosshairTextureID; // for white additive texture virtual int GetMuzzleFlashStyle( void ); #else virtual bool Reload(); virtual void Spawn(); virtual bool KeyValue( const char *szKeyName, const char *szValue ); virtual bool PhysicsSplash( const Vector ¢erPoint, const Vector &normal, float rawSpeed, float scaledSpeed ); #endif bool IsUseable(); virtual bool CanDeploy( void ); virtual void UpdateShieldState( void ); virtual bool SendWeaponAnim( int iActivity ); virtual void SecondaryAttack( void ); virtual void Precache( void ); virtual bool CanBeSelected( void ); virtual Activity GetDeployActivity( void ); virtual bool DefaultDeploy( char *szViewModel, char *szWeaponModel, int iActivity, char *szAnimExt ); virtual void DefaultTouch( CBaseEntity *pOther ); // default weapon touch virtual bool DefaultPistolReload(); virtual bool Deploy(); virtual void Drop( const Vector &vecVelocity ); bool PlayEmptySound(); virtual void ItemPostFrame(); virtual void ItemBusyFrame(); virtual const char *GetViewModel( int viewmodelindex = 0 ) const; bool m_bDelayFire; // This variable is used to delay the time between subsequent button pressing. float m_flAccuracy; //============================================================================= // HPE_BEGIN: // [pfreese] new accuracy model //============================================================================= CNetworkVar( CSWeaponMode, m_weaponMode); virtual float GetInaccuracy() const; virtual float GetSpread() const; virtual void UpdateAccuracyPenalty(); CNetworkVar( float, m_fAccuracyPenalty ); //============================================================================= // HPE_END //============================================================================= void SetExtraAmmoCount( int count ) { m_iExtraPrimaryAmmo = count; } int GetExtraAmmoCount( void ) { return m_iExtraPrimaryAmmo; } //============================================================================= // HPE_BEGIN: //============================================================================= // [tj] Accessors for the previous owner of the gun void SetPreviousOwner(CCSPlayer* player) { m_prevOwner = player; } CCSPlayer* GetPreviousOwner() { return m_prevOwner; } // [tj] Accessors for the donor system void SetDonor(CCSPlayer* player) { m_donor = player; } CCSPlayer* GetDonor() { return m_donor; } void SetDonated(bool donated) { m_donated = true;} bool GetDonated() { return m_donated; } //[dwenger] Accessors for the prior owner list void AddToPriorOwnerList(CCSPlayer* pPlayer); bool IsAPriorOwner(CCSPlayer* pPlayer); //============================================================================= // HPE_END //============================================================================= protected: float CalculateNextAttackTime( float flCycleTime ); private: float m_flDecreaseShotsFired; CWeaponCSBase( const CWeaponCSBase & ); int m_iExtraPrimaryAmmo; float m_nextPrevOwnerTouchTime; CCSPlayer *m_prevOwner; int m_iDefaultExtraAmmo; //============================================================================= // HPE_BEGIN: //============================================================================= // [dwenger] track all prior owners of this weapon CUtlVector< CCSPlayer* > m_PriorOwners; // [tj] To keep track of people who drop weapons for teammates during the buy round CHandle m_donor; bool m_donated; //============================================================================= // HPE_END //============================================================================= }; extern ConVar weapon_accuracy_model; #endif // WEAPON_CSBASE_H