|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef TF_PASSTIME_LOGIC_H
#define TF_PASSTIME_LOGIC_H
#ifdef _WIN32
#pragma once
#endif
#include "baseentity.h"
#include "tf_passtime_ball.h"
#include "GameEventListener.h"
//-----------------------------------------------------------------------------
class CTFPlayer; class CTFPasstimeBall; class CPasstimeBallSpawn; class CFuncPasstimeGoal; class CCountdownAnnouncer; class CTrackPath; struct SetSectionParams; enum HudNotification_t;
//-----------------------------------------------------------------------------
class CTFPasstimeLogic : public CPointEntity, public CGameEventListener { public: DECLARE_CLASS( CTFPasstimeLogic, CBaseEntity ); DECLARE_SERVERCLASS(); DECLARE_DATADESC();
CTFPasstimeLogic(); virtual ~CTFPasstimeLogic(); virtual void Spawn() OVERRIDE; virtual void Precache() OVERRIDE; virtual int UpdateTransmitState() OVERRIDE; virtual void FireGameEvent( IGameEvent *pEvent ) OVERRIDE;
void LaunchBall( CTFPlayer *pPlayer, const Vector &pos, const Vector &vel ); void EjectBall( CTFPlayer *pPlayer, CTFPlayer *pAttacker );
bool BCanPlayerPickUpBall( CTFPlayer *pPlayer, HudNotification_t *pReason = 0 ) const; CPasstimeBall *GetBall() const;
void OnBallCarrierDamaged( CTFPlayer *pPlayer, CTFPlayer *pAttacker, const CTakeDamageInfo& info ); void OnBallCarrierMeleeHit( CTFPlayer *pPlayer, CTFPlayer *pAttacker ); void OnPlayerTouchBall( CTFPlayer *pPlayer, CPasstimeBall *pBall ); void OnEnterGoal( CPasstimeBall *pBall, CFuncPasstimeGoal *pGoal ); void OnEnterGoal( CTFPlayer *pPlayer, CFuncPasstimeGoal *pGoal ); void OnExitGoal( CPasstimeBall *pBall, CFuncPasstimeGoal *pGoal ); void OnStayInGoal( CTFPlayer *pPlayer, CFuncPasstimeGoal *pGoal ); bool OnBallCollision( CPasstimeBall *pBall, int index, gamevcollisionevent_t *pEvent ); float GetLastHeldTime( CTFPlayer* pPlayer ); float GetLastPassTime( CTFPlayer* pPlayer ); void SetLastPassTime( CTFPlayer* pPlayer ); void RespawnBall(); float GetMaxPassRange() const { return m_flMaxPassRange; } CTFPlayer *GetBallCarrier() const; float GetPackSpeed( CTFPlayer *pPlayer ) const;
static void AddCondToTeam( ETFCond eCond, int iTeam, float flTime );
private: void PostSpawn(); void InputSetSection( inputdata_t &input ); bool ParseSetSection( const char *pStr, SetSectionParams &s ) const; void InputSpawnBall( inputdata_t &input ); void InputTimeUp( inputdata_t &input ); void InputSpeedBoostUsed( inputdata_t &input ); void InputJumpPadUsed( inputdata_t &input );
void StopAskForBallEffects(); void OnBallGet(); void Score( CTFPlayer *pPlayer, CFuncPasstimeGoal *pGoal ); void Score( CPasstimeBall *pBall, CFuncPasstimeGoal *pGoal ); void Score( CTFPlayer *pPlayer, int iTeam, int iPoints, bool iForceWin ); void SpawnBallAtRandomSpawnerThink(); void SpawnBallAtRandomSpawner(); void SpawnBallAtSpawner( CPasstimeBallSpawn *pSpawner ); void MoveBallToSpawner(); void StealBall( CTFPlayer *pFrom, CTFPlayer *pTo ); void ThinkExpiredTimer(); void EndRoundExpiredTimer(); void CrowdReactionSound( int iTeam );
void OneSecStatsUpdateThink(); void BallHistSampleThink(); void BallPower_PowerThink(); void BallPower_PackThink(); void BallPower_PackHealThink(); float CalcProgressFrac() const; bool AddBallPower( int iPower ); void ClearBallPower(); bool ShouldEndOvertime() const; void ReplicatePackMemberBits();
CUtlVector< std::pair<CTFPlayer*, float> > m_ballLastPassTimes; CUtlVector< std::pair<CTFPlayer*, float> > m_ballLastHeldTimes; CCountdownAnnouncer *m_pRespawnCountdown; int m_iBallSpawnCountdownSec; float m_flNextCrowdReactionTime; uint64 m_nPackMemberBits; uint64 m_nPrevPackMemberBits;
// outputs
COutputEvent m_onBallFree; COutputEvent m_onBallGetRed; COutputEvent m_onBallGetBlu; COutputEvent m_onBallGetAny; COutputEvent m_onBallRemoved; COutputEvent m_onScoreRed; COutputEvent m_onScoreBlu; COutputEvent m_onScoreAny; COutputEvent m_onBallPowerUp; COutputEvent m_onBallPowerDown;
// secret room stuff
void SecretRoom_Spawn(); void statica( inputdata_t &input ); // SecretRoom_InputStartTouchPlayerSlot
void staticb( inputdata_t &input ); // SecretRoom_InputEndTouchPlayerSlot
void staticc( inputdata_t &input ); // SecretRoom_InputPlugDamaged
void InputRoomTriggerOnTouch( inputdata_t &input ); void SecretRoom_UpdateTv( int iNumSlotsFilled ); void SecretRoom_Solve(); int SecretRoom_CountSlottedPlayers() const; CTFPlayer **SecretRoom_GetPlayerSlotInfoForTrigger( const char *pTriggerName, int *piExpectedClass, int *piExpectedTeam );
CBaseEntity *m_SecretRoom_pTv; CSoundPatch* m_SecretRoom_pTvSound; enum class SecretRoomState { None, Open, Solved } m_SecretRoom_state; CTFPlayer *m_SecretRoom_slottedPlayers[9]; CUtlVector<CSteamID> m_SecretRoom_playersThatTouchedRoom; // netvars
CNetworkHandle( CPasstimeBall, m_hBall ); CNetworkArray( Vector, m_trackPoints, 16 ); CNetworkVar( int, m_iNumSections ); CNetworkVar( int, m_iCurrentSection ); CNetworkVar( float, m_flMaxPassRange ); CNetworkVar( int, m_iBallPower ); CNetworkVar( float, m_flPackSpeed ); CNetworkArray( int, m_bPlayerIsPackMember, MAX_PLAYERS + 1 ); // +1 for easy entity index
};
//-----------------------------------------------------------------------------
extern CTFPasstimeLogic *g_pPasstimeLogic;
#endif // TF_PASSTIME_LOGIC_H
|