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.
319 lines
10 KiB
319 lines
10 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Entities for use in the Robot Destruction TF2 game mode.
|
|
//
|
|
//=========================================================================//
|
|
#ifndef LOGIC_ROBOT_DESTRUCTION_H
|
|
#define LOGIC_ROBOT_DESTRUCTION_H
|
|
#pragma once
|
|
|
|
#include "cbase.h"
|
|
|
|
#ifdef GAME_DLL
|
|
#include "triggers.h"
|
|
#include "tf_shareddefs.h"
|
|
#include "GameEventListener.h"
|
|
#include "entity_capture_flag.h"
|
|
#else
|
|
#include "c_tf_player.h"
|
|
#endif
|
|
|
|
|
|
#include "tf_robot_destruction_robot.h"
|
|
|
|
#ifdef CLIENT_DLL
|
|
#define CTFRobotDestructionLogic C_TFRobotDestructionLogic
|
|
#define CTFRobotDestruction_RobotSpawn C_TFRobotDestruction_RobotSpawn
|
|
#define CTFRobotDestruction_RobotGroup C_TFRobotDestruction_RobotGroup
|
|
#endif
|
|
|
|
#include "props_shared.h"
|
|
|
|
#define RD_POINTS_STOLEN_PER_TICK 2
|
|
|
|
//-----------------------------------------------------------------------------
|
|
class CTFRobotDestruction_RobotSpawn : public CBaseEntity
|
|
{
|
|
public:
|
|
DECLARE_DATADESC();
|
|
DECLARE_CLASS( CTFRobotDestruction_RobotSpawn, CBaseEntity )
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
CTFRobotDestruction_RobotSpawn();
|
|
|
|
virtual void Spawn() OVERRIDE;
|
|
virtual void Activate() OVERRIDE;
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void Precache() OVERRIDE;
|
|
virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const OVERRIDE;
|
|
|
|
CTFRobotDestruction_Robot* GetRobot() const { return m_hRobot.Get(); }
|
|
void OnRobotKilled();
|
|
void ClearRobot();
|
|
void SpawnRobot();
|
|
void SetGroup( class CTFRobotDestruction_RobotGroup* pGroup ) { m_hGroup.Set( pGroup ); }
|
|
// Inputs
|
|
void InputSpawnRobot( inputdata_t &inputdata );
|
|
|
|
#endif
|
|
private:
|
|
CHandle< CTFRobotDestruction_Robot > m_hRobot;
|
|
#ifdef GAME_DLL
|
|
CHandle< class CTFRobotDestruction_RobotGroup > m_hGroup;
|
|
RobotSpawnData_t m_spawnData;
|
|
COutputEvent m_OnRobotKilled;
|
|
#endif
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
DECLARE_AUTO_LIST( IRobotDestructionGroupAutoList );
|
|
class CTFRobotDestruction_RobotGroup : public CBaseEntity, public IRobotDestructionGroupAutoList
|
|
{
|
|
DECLARE_DATADESC();
|
|
DECLARE_CLASS( CTFRobotDestruction_RobotGroup, CBaseEntity )
|
|
DECLARE_NETWORKCLASS();
|
|
public:
|
|
virtual ~CTFRobotDestruction_RobotGroup();
|
|
#ifdef GAME_DLL
|
|
|
|
CTFRobotDestruction_RobotGroup();
|
|
|
|
virtual int UpdateTransmitState() OVERRIDE { return SetTransmitState( FL_EDICT_ALWAYS ); }
|
|
virtual void Spawn() OVERRIDE;
|
|
virtual void Activate() OVERRIDE;
|
|
void AddToGroup( CTFRobotDestruction_RobotSpawn * pSpawn );
|
|
void RemoveFromGroup( CTFRobotDestruction_RobotSpawn * pSpawn );
|
|
void UpdateState();
|
|
void RespawnRobots();
|
|
int GetNumAliveBots() const;
|
|
float GetTeamRespawnScale() const { return m_flTeamRespawnReductionScale; }
|
|
|
|
// Respawn functions
|
|
void StopRespawnTimer();
|
|
void StartRespawnTimerIfNeeded( CTFRobotDestruction_RobotGroup *pMasterGroup );
|
|
void RespawnCountdownFinish();
|
|
|
|
void EnableUberForGroup();
|
|
void DisableUberForGroup();
|
|
|
|
void OnRobotAttacked();
|
|
void OnRobotKilled();
|
|
void OnRobotSpawned();
|
|
#else
|
|
virtual void PostDataUpdate( DataUpdateType_t updateType ) OVERRIDE;
|
|
virtual int GetTeamNumber( void ) const OVERRIDE { return m_iTeamNum; }
|
|
virtual void SetDormant( bool bDormant ) OVERRIDE;
|
|
#endif
|
|
const char *GetHUDIcon() const { return m_pszHudIcon; }
|
|
int GetGroupNumber() const { return m_nGroupNumber; }
|
|
int GetState() const { return m_nState; }
|
|
float GetRespawnStartTime() const { return m_flRespawnStartTime; }
|
|
float GetRespawnEndTime() const { return m_flRespawnEndTime; }
|
|
float GetLastAttackedTime() const { return m_flLastAttackedTime; }
|
|
|
|
private:
|
|
|
|
#ifdef GAME_DLL
|
|
CUtlVector< CTFRobotDestruction_RobotSpawn* > m_vecSpawns;
|
|
int m_nTeamNumber;
|
|
IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iTeamNum );
|
|
float m_flRespawnTime;
|
|
static float m_sflNextAllowedAttackAlertTime[ TF_TEAM_COUNT ];
|
|
string_t m_iszHudIcon;
|
|
float m_flTeamRespawnReductionScale;
|
|
|
|
COutputEvent m_OnRobotsRespawn;
|
|
COutputEvent m_OnAllRobotsDead;
|
|
#else
|
|
int m_iTeamNum;
|
|
#endif
|
|
CNetworkString( m_pszHudIcon, MAX_PATH );
|
|
CNetworkVar( int, m_nGroupNumber );
|
|
CNetworkVar( int, m_nState );
|
|
CNetworkVar( float, m_flRespawnStartTime );
|
|
CNetworkVar( float, m_flRespawnEndTime );
|
|
CNetworkVar( float, m_flLastAttackedTime );
|
|
};
|
|
|
|
struct RateLimitedSound_t
|
|
{
|
|
RateLimitedSound_t( float flPause )
|
|
{
|
|
m_mapNextAllowedTime.SetLessFunc( DefLessFunc( const CBaseEntity* ) );
|
|
m_flPause = flPause;
|
|
}
|
|
|
|
float m_flPause;
|
|
CUtlMap< const CBaseEntity*, float > m_mapNextAllowedTime;
|
|
};
|
|
|
|
struct TeamSound_t
|
|
{
|
|
const char *m_pszYourTeam;
|
|
const char *m_pszTheirTeam;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
class CTFRobotDestructionLogic : public CBaseEntity
|
|
#ifdef GAME_DLL
|
|
, public CGameEventListener
|
|
#endif
|
|
{
|
|
DECLARE_CLASS( CTFRobotDestructionLogic, CBaseEntity )
|
|
DECLARE_NETWORKCLASS();
|
|
public:
|
|
|
|
enum EType
|
|
{
|
|
TYPE_ROBOT_DESTRUCTION,
|
|
TYPE_PLAYER_DESTRUCTION,
|
|
};
|
|
|
|
virtual EType GetType() const { return TYPE_ROBOT_DESTRUCTION; }
|
|
|
|
CTFRobotDestructionLogic();
|
|
virtual ~CTFRobotDestructionLogic();
|
|
static CTFRobotDestructionLogic* GetRobotDestructionLogic();
|
|
|
|
virtual void Spawn() OVERRIDE;
|
|
virtual void Precache() OVERRIDE;
|
|
|
|
float GetRespawnScaleForTeam( int nTeam ) const;
|
|
int GetScore( int nTeam ) const;
|
|
int GetTargetScore( int nTeam ) const;
|
|
int GetMaxPoints() const { return m_nMaxPoints.Get(); }
|
|
float GetFinaleWinTime( int nTeam ) const;
|
|
float GetFinaleLength() const { return m_flFinaleLength; }
|
|
void PlaySoundInfoForScoreEvent( CTFPlayer* pPlayer, bool bPositive, int nNewScore, int nTeam, RDScoreMethod_t eMethod = SCORE_UNDEFINED );
|
|
RDScoreMethod_t GetLastScoreMethod( int nTeam ) const { return (RDScoreMethod_t)m_eWinningMethod[ nTeam ]; }
|
|
|
|
#ifdef CLIENT_DLL
|
|
|
|
virtual void OnDataChanged( DataUpdateType_t type ) OVERRIDE;
|
|
virtual void ClientThink() OVERRIDE;
|
|
const char* GetResFile() const { return STRING( m_szResFile ); }
|
|
|
|
#else
|
|
DECLARE_DATADESC();
|
|
|
|
virtual void Activate() OVERRIDE;
|
|
virtual void FireGameEvent( IGameEvent * event ) OVERRIDE;
|
|
|
|
virtual int UpdateTransmitState() OVERRIDE { return SetTransmitState( FL_EDICT_ALWAYS ); }
|
|
|
|
CTFRobotDestruction_Robot * IterateRobots( CTFRobotDestruction_Robot * ) const;
|
|
void RobotCreated( CTFRobotDestruction_Robot *pRobot );
|
|
void RobotRemoved( CTFRobotDestruction_Robot *pRobot );
|
|
void RobotAttacked( CTFRobotDestruction_Robot *pRobot );
|
|
float GetScoringInterval() const { return m_flRobotScoreInterval; }
|
|
void ScorePoints( int nTeam, int nPoints, RDScoreMethod_t eMethod, CTFPlayer *pPlayer );
|
|
void AddRobotGroup( CTFRobotDestruction_RobotGroup* pGroup );
|
|
void ManageGameState();
|
|
void FlagCreated( int nTeam );
|
|
void FlagDestroyed( int nTeam );
|
|
|
|
void DBG_SetMaxPoints( int nNewMax ) { m_nMaxPoints.Set( nNewMax ); }
|
|
void InputRoundActivate( inputdata_t &inputdata );
|
|
virtual int GetHealDistance( void ) { return 64; }
|
|
#endif
|
|
|
|
virtual void SetCountdownEndTime( float flTime ){ m_flCountdownEndTime = flTime; }
|
|
virtual float GetCountdownEndTime(){ return m_flCountdownEndTime; }
|
|
virtual CTFPlayer *GetTeamLeader( int iTeam ) const { return NULL; }
|
|
virtual string_t GetCountdownImage( void ) { return NULL_STRING; }
|
|
virtual bool IsUsingCustomCountdownImage( void ) { return false; }
|
|
|
|
protected:
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
virtual void OnRedScoreChanged() {}
|
|
virtual void OnBlueScoreChanged() {}
|
|
void ApproachTargetScoresThink();
|
|
int ApproachTeamTargetScore( int nTeam, int nApproachScore, int nCurrentScore );
|
|
void PlaySoundInPlayersEars( CTFPlayer* pPlayer, const EmitSound_t& params ) const;
|
|
void RedTeamWin();
|
|
void BlueTeamWin();
|
|
virtual void TeamWin( int nTeam );
|
|
|
|
typedef CUtlMap< int, CTFRobotDestruction_RobotGroup* > RobotSpawnMap_t;
|
|
CUtlVector< CTFRobotDestruction_Robot* > m_vecRobots;
|
|
CUtlVector< CTFRobotDestruction_RobotGroup * > m_vecSpawnGroups;
|
|
float m_flLoserRespawnBonusPerBot;
|
|
float m_flRobotScoreInterval;
|
|
float m_flNextRedRobotAttackedAlertTime;
|
|
float m_flNextBlueRobotAttackedAlertTime;
|
|
int m_nNumFlagsOut[ TF_TEAM_COUNT ];
|
|
bool m_bEducateNewConnectors;
|
|
string_t m_iszResFile;
|
|
|
|
TeamSound_t m_AnnouncerProgressSound;
|
|
CUtlMap< const char *, RateLimitedSound_t * > m_mapRateLimitedSounds;
|
|
|
|
CUtlVector< CTFPlayer* > m_vecEducatedPlayers;
|
|
|
|
// Outputs
|
|
COutputEvent m_OnRedFinalePeriodEnd;
|
|
COutputEvent m_OnBlueFinalePeriodEnd;
|
|
COutputEvent m_OnBlueHitZeroPoints;
|
|
COutputEvent m_OnRedHitZeroPoints;
|
|
COutputEvent m_OnBlueHasPoints;
|
|
COutputEvent m_OnRedHasPoints;
|
|
COutputEvent m_OnBlueHitMaxPoints;
|
|
COutputEvent m_OnRedHitMaxPoints;
|
|
COutputEvent m_OnBlueLeaveMaxPoints;
|
|
COutputEvent m_OnRedLeaveMaxPoints;
|
|
|
|
COutputEvent m_OnRedFirstFlagStolen;
|
|
COutputEvent m_OnRedFlagStolen;
|
|
COutputEvent m_OnRedLastFlagReturned;
|
|
COutputEvent m_OnBlueFirstFlagStolen;
|
|
COutputEvent m_OnBlueFlagStolen;
|
|
COutputEvent m_OnBlueLastFlagReturned;
|
|
#else
|
|
float m_flLastTickSoundTime;
|
|
#endif
|
|
static CTFRobotDestructionLogic* m_sCTFRobotDestructionLogic;
|
|
CNetworkVar( int, m_nMaxPoints );
|
|
CNetworkVar( float, m_flFinaleLength );
|
|
CNetworkVar( float, m_flBlueFinaleEndTime );
|
|
CNetworkVar( float, m_flRedFinaleEndTime );
|
|
CNetworkVar( int, m_nBlueScore );
|
|
CNetworkVar( int, m_nRedScore );
|
|
CNetworkVar( int, m_nBlueTargetPoints );
|
|
CNetworkVar( int, m_nRedTargetPoints );
|
|
CNetworkVar( float, m_flBlueTeamRespawnScale );
|
|
CNetworkVar( float, m_flRedTeamRespawnScale );
|
|
CNetworkString( m_szResFile, MAX_PATH );
|
|
CNetworkArray( int, m_eWinningMethod, TF_TEAM_COUNT );
|
|
CNetworkVar( float, m_flCountdownEndTime ); // used for player destruction countdown timers
|
|
};
|
|
|
|
#ifdef GAME_DLL
|
|
class CRobotDestructionVaultTrigger : public CBaseTrigger
|
|
{
|
|
DECLARE_CLASS( CRobotDestructionVaultTrigger, CBaseTrigger );
|
|
DECLARE_DATADESC();
|
|
|
|
public:
|
|
CRobotDestructionVaultTrigger();
|
|
virtual void Spawn() OVERRIDE;
|
|
virtual void Precache() OVERRIDE;
|
|
|
|
virtual bool PassesTriggerFilters( CBaseEntity *pOther ) OVERRIDE;
|
|
virtual void StartTouch(CBaseEntity *pOther) OVERRIDE;
|
|
virtual void EndTouch(CBaseEntity *pOther) OVERRIDE;
|
|
|
|
private:
|
|
void StealPointsThink();
|
|
int StealPoints( CTFPlayer *pPlayer );
|
|
|
|
bool m_bIsStealing;
|
|
COutputEvent m_OnPointsStolen;
|
|
COutputEvent m_OnPointsStartStealing;
|
|
COutputEvent m_OnPointsEndStealing;
|
|
};
|
|
|
|
#endif// GAME_DLL
|
|
#endif// LOGIC_ROBOT_DESTRUCTION_H
|