//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef TF_WEAPON_PASSTIME_GUN_H #define TF_WEAPON_PASSTIME_GUN_H #ifdef _WIN32 #pragma once #endif #include "tf_weaponbase.h" class CPasstimeBall; #ifdef CLIENT_DLL #define CPasstimeBall C_PasstimeBall #define CPasstimeGun C_PasstimeGun class C_PasstimeBounceReticle; #else #include "passtime_ballcontroller_homing.h" #endif //----------------------------------------------------------------------------- class CPasstimeGun : public CTFWeaponBase, public ITFChargeUpWeapon { DECLARE_CLASS( CPasstimeGun, CTFWeaponBase ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); // this has to be here because the client's precache code uses it to get the classname of this entity... public: CPasstimeGun(); ~CPasstimeGun(); virtual float GetChargeBeginTime() OVERRIDE; virtual float GetCurrentCharge() OVERRIDE; static bool BValidPassTarget( CTFPlayer *pSource, CTFPlayer *pTarget, HudNotification_t *pReason = 0 ); struct LaunchParams { Vector eyePos; Vector viewFwd; Vector viewRight; Vector viewUp; Vector traceHullSize; float traceHullDistance; Vector startPos; Vector startDir; Vector startVel; static LaunchParams Default( CTFPlayer *pPlayer ); }; static LaunchParams CalcLaunch( CTFPlayer *pPlayer, bool bHoming ); protected: virtual int GetWeaponID() const OVERRIDE { return TF_WEAPON_PASSTIME_GUN; } virtual void Spawn() OVERRIDE; virtual void Equip( CBaseCombatCharacter *pOwner ) OVERRIDE; virtual void Precache() OVERRIDE; virtual bool CanHolster() const OVERRIDE; virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ) OVERRIDE; virtual void WeaponReset() OVERRIDE; virtual bool CanCharge() OVERRIDE; virtual float GetChargeMaxTime() OVERRIDE; virtual void UpdateOnRemove() OVERRIDE; virtual bool VisibleInWeaponSelection() OVERRIDE; virtual acttable_t* ActivityList(int &iActivityCount) OVERRIDE; virtual void ItemPostFrame() OVERRIDE; virtual void ItemHolsterFrame() OVERRIDE; virtual bool Deploy() OVERRIDE; virtual bool CanDeploy() OVERRIDE; virtual const char *GetWorldModel() const OVERRIDE; virtual bool SendWeaponAnim( int actBase ) OVERRIDE; virtual Activity GetDrawActivity() OVERRIDE { return ACT_BALL_VM_CATCH; } // HasPrimaryAmmo, CanBeSelected, IsEnergyWeapon: // these exist to make other code have correct side-effects // search for where these are called to see the specifics. virtual bool HasPrimaryAmmo() OVERRIDE { return true; } virtual bool CanBeSelected() OVERRIDE { return true; } virtual bool IsEnergyWeapon() const OVERRIDE { return true; } #ifdef CLIENT_DLL virtual void UpdateAttachmentModels() OVERRIDE; virtual void ClientThink() OVERRIDE; void UpdateThrowArch(); void DestroyThrowArch(); C_PasstimeBounceReticle *m_pBounceReticle; #endif void Throw( CTFPlayer *pOwner ); enum EThrowState { THROWSTATE_IDLE, THROWSTATE_CHARGING, THROWSTATE_CHARGED, THROWSTATE_THROWN, THROWSTATE_CANCELLED, THROWSTATE_DISABLED, }; enum EButtonState { BUTTONSTATE_UP, // not pressed BUTTONSTATE_PRESSED, // was just pressed and is down BUTTONSTATE_DOWN, // continues to be down BUTTONSTATE_RELEASED, // was just released and is not down BUTTONSTATE_DISABLED, // ignore input }; struct AttackInputState { AttackInputState( int button ) : iButton( button ), eButtonState( BUTTONSTATE_UP ) , bLatchedUp( false ) {} const int iButton; EButtonState eButtonState; bool bLatchedUp; bool Is( EButtonState state ) const { return eButtonState == state; } void Disable() { eButtonState = BUTTONSTATE_DISABLED; } void Enable() { if ( eButtonState == BUTTONSTATE_DISABLED ) eButtonState = BUTTONSTATE_UP; } void Update( int held, int pressed, int released ); void LatchUp(); void UnlatchUp(); }; int m_iHalloweenAttachmentIndex; int m_iAttachmentIndex; float m_flTargetResetTime; float m_flThrowLoopStartTime; AttackInputState m_attack, m_attack2; CNetworkVar( EThrowState, m_eThrowState ); CNetworkVar( float, m_fChargeBeginTime ); CHandle m_hStoredLastWpn; #ifdef GAME_DLL CPasstimeBallControllerHoming m_ballController; #endif }; #endif // TF_WEAPON_PASSTIME_GUN_H