mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user