Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

129 lines
3.7 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef TF_PASSTIME_BALL_H
#define TF_PASSTIME_BALL_H
#ifdef _WIN32
#pragma once
#endif
#include "passtime_ballcontroller_playerseek.h"
#include "predictable_entity.h"
#include "util_shared.h"
#include "baseanimating.h"
#include "utllinkedlist.h"
class CSpriteTrail;
class CBallPlayerToucher;
//-----------------------------------------------------------------------------
class CPasstimeBall : public CBaseAnimating
{
public:
DECLARE_CLASS( CPasstimeBall, CBaseAnimating );
DECLARE_NETWORKCLASS();
CPasstimeBall();
~CPasstimeBall();
virtual void Spawn() OVERRIDE;
virtual void Precache() OVERRIDE;
virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ) OVERRIDE;
virtual int OnTakeDamage( const CTakeDamageInfo &info ) OVERRIDE;
virtual unsigned int PhysicsSolidMaskForEntity() const OVERRIDE;
virtual void ChangeTeam( int iTeamNum ) OVERRIDE;
virtual bool IsDeflectable() OVERRIDE;
virtual void Deflected( CBaseEntity *pDeflectedBy, Vector& vecDir ) OVERRIDE;
virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const OVERRIDE;
virtual int UpdateTransmitState() OVERRIDE;
CTFPlayer *GetCarrier() const;
CTFPlayer *GetPrevCarrier() const;
CTFPlayer *GetThrower() const;
int GetCollisionCount() const;
int GetCarryDuration() const;
void ResetTrail();
void HideTrail();
void MoveTo( const Vector &pos, const Vector &vel );
void MoveToSpawner( const Vector &pos );
void SetStateOutOfPlay();
void SetStateFree();
void SetStateCarried( CTFPlayer *pCarrier );
bool BOutOfPlay() const;
static CPasstimeBall *Create( Vector position, QAngle angles );
void SetHomingTarget( CTFPlayer *pPlayer );
CTFPlayer *GetHomingTarget() const;
float GetAirtimeSec() const;
float GetAirtimeDistance() const;
void StartLagCompensation( CBasePlayer *player, CUserCmd *cmd );
void FinishLagCompensation( CBasePlayer *player );
private:
friend class CBallPlayerToucher;
void OnTouch( CBaseEntity *pOther );
void DefaultThink();
void TouchPlayer( CTFPlayer *pPlayer );
void BlockReflect( CTFPlayer *pPlayer, const Vector& origin, const Vector& ballvel );
void BlockDamage( CTFPlayer *pPlayer, const Vector& ballvel );
bool BIgnorePlayer( CTFPlayer *pPlayer );
void OnCollision();
void UpdateLagCompensationHistory();
void SetThrower( CTFPlayer *pPlayer );
void OnBecomeNotCarried();
void SetIdleRespawnTime();
void DisableIdleRespawnTime();
bool BShouldPanicRespawn() const;
bool CreateModelCollider();
void CreateSphereCollider();
enum EState
{
STATE_OUT_OF_PLAY,
STATE_FREE,
STATE_CARRIED
};
EState m_eState;
CHandle<CTFPlayer> m_hThrower;
EHANDLE m_hBlocker;
CSpriteTrail *m_pTrail;
bool m_bTrailActive;
bool m_bLeftOwner;
CSoundPatch *m_pHumLoop;
CSoundPatch *m_pBeepLoop;
CBaseEntity *m_pPlayerToucher;
CPasstimeBallControllerPlayerSeek m_playerSeek;
bool m_bTouchedSinceSpawn;
float m_flLastCollisionTime;
float m_flAirtimeDistance;
Vector m_vecPrevOrigin; // note: C_BaseEntity has m_vecOldOrigin in client code only
float m_flLastTeamChangeTime; // for stats
float m_flBeginCarryTime;
float m_flIdleRespawnTime;
struct LagRecord
{
float flSimulationTime;
Vector vecOrigin;
};
CUtlFixedLinkedList<LagRecord> m_lagCompensationHistory;
LagRecord m_lagCompensationRestore;
bool m_bLagCompensationNeedsRestore;
float m_flLagCompensationTeleportDistanceSqr;
CNetworkVar( int, m_iCollisionCount );
CNetworkHandle( CTFPlayer, m_hHomingTarget );
CNetworkHandle( CTFPlayer, m_hCarrier );
CNetworkHandle( CTFPlayer, m_hPrevCarrier );
};
#endif // TF_PASSTIME_BALL_H