source-engine/game/server/hl2/prop_combine_ball.h

300 lines
7.9 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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