300 lines
8.2 KiB
C++
300 lines
8.2 KiB
C++
//========= Copyright (c) 1996-2005, 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
|