//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "Color.h" #ifndef COMBINE_MINE_H #define COMBINE_MINE_H #ifdef _WIN32 #pragma once #endif class CSoundPatch; //--------------------------------------------------------- //--------------------------------------------------------- #define BOUNCEBOMB_HOOK_RANGE 64 #define BOUNCEBOMB_WARN_RADIUS 245.0 // Must be slightly less than physcannon! #define BOUNCEBOMB_DETONATE_RADIUS 100.0 #define BOUNCEBOMB_EXPLODE_RADIUS 125.0 #define BOUNCEBOMB_EXPLODE_DAMAGE 150.0 #include "player_pickup.h" class CBounceBomb : public CBaseAnimating, public CDefaultPlayerPickupVPhysics { DECLARE_CLASS( CBounceBomb, CBaseAnimating ); public: CBounceBomb() { m_pWarnSound = NULL; m_bPlacedByPlayer = false; } void Precache(); void Spawn(); void OnRestore(); int DrawDebugTextOverlays(void); void SetMineState( int iState ); int GetMineState() { return m_iMineState; } bool IsValidLocation(); void Flip( const Vector &vecForce, const AngularImpulse &torque ); void SearchThink(); void BounceThink(); void SettleThink(); void CaptiveThink(); void ExplodeThink(); void ExplodeTouch( CBaseEntity *pOther ); void CavernBounceThink(); ///< an alternative style of bouncing used for the citizen modded bouncers bool IsAwake() { return m_bAwake; } void Wake( bool bWake ); float FindNearestNPC(); void SetNearestNPC( CBaseEntity *pNearest ) { m_hNearestNPC.Set( pNearest ); } int OnTakeDamage( const CTakeDamageInfo &info ); bool IsFriend( CBaseEntity *pEntity ); void UpdateLight( bool bTurnOn, unsigned int r, unsigned int g, unsigned int b, unsigned int a ); bool IsLightOn() { return m_hSprite.Get() != NULL; } void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ); void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t reason ); bool ForcePhysgunOpen( CBasePlayer *pPlayer ) { return true; } bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer ) { return true; } virtual QAngle PreferredCarryAngles( void ) { return vec3_angle; } CBasePlayer *HasPhysicsAttacker( float dt ); bool IsPlayerPlaced() { return m_bPlacedByPlayer; } bool CreateVPhysics() { VPhysicsInitNormal( SOLID_VPHYSICS, 0, false ); return true; } void Pickup(); void OpenHooks( bool bSilent = false ); void CloseHooks(); DECLARE_DATADESC(); static string_t gm_iszFloorTurretClassname; static string_t gm_iszGroundTurretClassname; private: float m_flExplosionDelay; bool m_bAwake; bool m_bBounce; EHANDLE m_hNearestNPC; EHANDLE m_hSprite; Color m_LastSpriteColor; float m_flHookPositions; int m_iHookN; int m_iHookE; int m_iHookS; int m_iAllHooks; CSoundPatch *m_pWarnSound; bool m_bLockSilently; bool m_bFoeNearest; float m_flIgnoreWorldTime; bool m_bDisarmed; bool m_bPlacedByPlayer; bool m_bHeldByPhysgun; int m_iFlipAttempts; int m_iModification; CHandle m_hPhysicsAttacker; float m_flLastPhysicsInfluenceTime; float m_flTimeGrabbed; IPhysicsConstraint *m_pConstraint; int m_iMineState; COutputEvent m_OnPulledUp; void InputDisarm( inputdata_t &inputdata ); }; #endif // COMBINE_MINE_H