diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/hl2/prop_combine_ball.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/hl2/prop_combine_ball.h')
| -rw-r--r-- | game/server/hl2/prop_combine_ball.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/game/server/hl2/prop_combine_ball.h b/game/server/hl2/prop_combine_ball.h new file mode 100644 index 0000000..1de4390 --- /dev/null +++ b/game/server/hl2/prop_combine_ball.h @@ -0,0 +1,299 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef PROP_COMBINE_BALL_H +#define PROP_COMBINE_BALL_H +#ifdef _WIN32 +#pragma once +#endif + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- +#include "player_pickup.h" // for combine ball inheritance + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class CFuncCombineBallSpawner; +class CSpriteTrail; + +//----------------------------------------------------------------------------- +// Looks for enemies, bounces a max # of times before it breaks +//----------------------------------------------------------------------------- +class CPropCombineBall : public CBaseAnimating, public CDefaultPlayerPickupVPhysics +{ +public: + DECLARE_CLASS( CPropCombineBall, CBaseAnimating ); + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + virtual void Precache(); + virtual void Spawn(); + virtual void UpdateOnRemove(); + void StopLoopingSounds(); + + virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ); + virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason ); + virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); + + virtual bool OverridePropdata(); + virtual bool CreateVPhysics(); + + CFuncCombineBallSpawner *GetSpawner(); + + virtual void ExplodeThink( void ); + + // Override of IPlayerPickupVPhysics; + virtual bool ShouldPuntUseLaunchForces( PhysGunForce_t reason ) { return ( reason == PHYSGUN_FORCE_PUNTED ); } + + void SetRadius( float flRadius ); + void SetSpeed( float flSpeed ) { m_flSpeed = flSpeed; } + float GetSpeed( void ) const { return m_flSpeed; } + + void CaptureBySpawner( ); + bool IsBeingCaptured() const { return m_bCaptureInProgress; } + + void ReplaceInSpawner( float flSpeed ); + + // Input + void InputExplode( inputdata_t &inputdata ); + void InputFadeAndRespawn( inputdata_t &inputdata ); + void InputKill( inputdata_t &inputdata ); + void InputSocketed( inputdata_t &inputdata ); + + enum + { + STATE_NOT_THROWN = 0, + STATE_HOLDING, + STATE_THROWN, + STATE_LAUNCHED, //by a combine_ball launcher + }; + + void SetState( int state ); + bool IsInField() const; + + void StartWhizSoundThink( void ); + + void StartLifetime( float flDuration ); + void ClearLifetime( ); + void SetMass( float mass ); + + void SetWeaponLaunched( bool state = true ) { m_bWeaponLaunched = state; m_bLaunched = state; } + bool WasWeaponLaunched( void ) const { return m_bWeaponLaunched; } + + bool WasFiredByNPC() const { return (GetOwnerEntity() && GetOwnerEntity()->IsNPC()); } + + bool ShouldHitPlayer() const; + + virtual CBasePlayer *HasPhysicsAttacker( float dt ); + + void SetSpawner( CFuncCombineBallSpawner *pSpawner ) { m_hSpawner = pSpawner; } + void NotifySpawnerOfRemoval( void ); + + + float LastCaptureTime() const; + + unsigned char GetState() const { return m_nState; } + + int NumBounces( void ) const { return m_nBounceCount; } + + void SetMaxBounces( int iBounces ) + { + m_nMaxBounces = iBounces; + } + + void SetEmitState( bool bEmit ) + { + m_bEmit = bEmit; + } + + void SetOriginalOwner( CBaseEntity *pEntity ) { m_hOriginalOwner = pEntity; } + CBaseEntity *GetOriginalOwner() { return m_hOriginalOwner; } + +private: + + void SetPlayerLaunched( CBasePlayer *pOwner ); + + float GetBallHoldDissolveTime(); + float GetBallHoldSoundRampTime(); + + // Pow! + void DoExplosion( ); + + void StartAnimating( void ); + void StopAnimating( void ); + + void SetBallAsLaunched( void ); + + void CollisionEventToTrace( int index, gamevcollisionevent_t *pEvent, trace_t &tr ); + bool DissolveEntity( CBaseEntity *pEntity ); + void OnHitEntity( CBaseEntity *pHitEntity, float flSpeed, int index, gamevcollisionevent_t *pEvent ); + void DoImpactEffect( const Vector &preVelocity, int index, gamevcollisionevent_t *pEvent ); + + // Bounce inside the spawner: + void BounceInSpawner( float flSpeed, int index, gamevcollisionevent_t *pEvent ); + + bool IsAttractiveTarget( CBaseEntity *pEntity ); + + // Deflects the ball toward enemies in case of a collision + void DeflectTowardEnemy( float flSpeed, int index, gamevcollisionevent_t *pEvent ); + + // Is this something we can potentially dissolve? + bool IsHittableEntity( CBaseEntity *pHitEntity ); + + // Sucky. + void WhizSoundThink(); + void DieThink(); + void DissolveThink(); + void DissolveRampSoundThink(); + void AnimThink( void ); + + void FadeOut( float flDuration ); + + + bool OutOfBounces( void ) const + { + return ( m_nState == STATE_LAUNCHED && m_nMaxBounces != 0 && m_nBounceCount >= m_nMaxBounces ); + } + +private: + + int m_nBounceCount; + int m_nMaxBounces; + bool m_bBounceDie; + + float m_flLastBounceTime; + + bool m_bFiredGrabbedOutput; + bool m_bStruckEntity; // Has hit an entity already (control accuracy) + bool m_bWeaponLaunched; // Means this was fired from the AR2 + bool m_bForward; // Movement direction in ball spawner + + unsigned char m_nState; + bool m_bCaptureInProgress; + + float m_flSpeed; + + CSpriteTrail *m_pGlowTrail; + CSoundPatch *m_pHoldingSound; + + float m_flNextDamageTime; + float m_flLastCaptureTime; + + CHandle < CFuncCombineBallSpawner > m_hSpawner; + + EHANDLE m_hOriginalOwner; + + CNetworkVar( bool, m_bEmit ); + CNetworkVar( bool, m_bHeld ); + CNetworkVar( bool, m_bLaunched ); + CNetworkVar( float, m_flRadius ); +}; + +class CFuncCombineBallSpawner : public CBaseEntity +{ + DECLARE_CLASS( CFuncCombineBallSpawner, CBaseEntity ); + DECLARE_DATADESC(); + +public: + CFuncCombineBallSpawner(); + + virtual void Spawn(); + virtual void Precache(); + + // Balls call this to figure out where to bounce to + void GetTargetEndpoint( bool bForward, Vector *pVecEndpoint ); + + // Balls call this when they've been removed from the spawner + void RespawnBall( float flRespawnTime ); + void RespawnBallPostExplosion( void ); + + // Fire ball grabbed output + void BallGrabbed( CBaseEntity *pEntity ); + + // Get speed of ball to place into the field + float GetBallSpeed( ) const; + + // Register that a reflection occurred + void RegisterReflection( CPropCombineBall *pBall, bool bForward ); + + // Spawn a ball + virtual void SpawnBall(); + +private: + + // Choose a random point inside the cylinder + void ChoosePointInCylinder( Vector *pVecPoint ); + + // Choose a random point inside the box + void ChoosePointInBox( Vector *pVecPoint ); + + // Used to determine when to respawn balls + void BallThink(); + + // Input + void InputEnable( inputdata_t &inputdata ); + void InputDisable( inputdata_t &inputdata ); + + // Fire ball grabbed output + void GrabBallTouch( CBaseEntity *pOther ); + +public: + bool m_bShooter; + float m_flBallRadius; + float m_flBallRespawnTime; + float m_flMinSpeed; + float m_flMaxSpeed; + +private: + CUtlVector< float > m_BallRespawnTime; + int m_nBallCount; + int m_nBallsRemainingInField; + float m_flRadius; + float m_flDisableTime; + bool m_bEnabled; + + COutputEvent m_OnBallGrabbed; + COutputEvent m_OnBallReinserted; + COutputEvent m_OnBallHitTopSide; + COutputEvent m_OnBallHitBottomSide; + COutputEvent m_OnLastBallGrabbed; + COutputEvent m_OnFirstBallReinserted; +}; + + +class CPointCombineBallLauncher : public CFuncCombineBallSpawner +{ + DECLARE_CLASS( CPointCombineBallLauncher, CFuncCombineBallSpawner ); + + DECLARE_DATADESC(); + +public: + + virtual void Spawn( void ); + virtual void SpawnBall( void ); + void InputLaunchBall ( inputdata_t &inputdata ); + + CPointCombineBallLauncher(); + +private: + + int m_iBounces; + float m_flConeDegrees; + string_t m_iszBullseyeName; +}; + +// Creates a combine ball +CBaseEntity *CreateCombineBall( const Vector &origin, const Vector &velocity, float radius, float mass, float lifetime, CBaseEntity *pOwner ); + +// Query function to find out if a physics object is a combine ball (used for collision checks) +bool UTIL_IsCombineBall( CBaseEntity *pEntity ); +bool UTIL_IsCombineBallDefinite( CBaseEntity *pEntity ); +bool UTIL_IsAR2CombineBall( CBaseEntity *pEntity ); + +#endif // PROP_COMBINE_BALL_H |