Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

153 lines
5.4 KiB

5 years ago
//========= 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