summaryrefslogtreecommitdiff
path: root/engine/hltvserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine/hltvserver.h')
-rw-r--r--engine/hltvserver.h262
1 files changed, 262 insertions, 0 deletions
diff --git a/engine/hltvserver.h b/engine/hltvserver.h
new file mode 100644
index 0000000..fa5a657
--- /dev/null
+++ b/engine/hltvserver.h
@@ -0,0 +1,262 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef HLTVSERVER_H
+#define HLTVSERVER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "baseserver.h"
+#include "hltvclient.h"
+#include "hltvdemo.h"
+#include "hltvclientstate.h"
+#include "clientframe.h"
+#include "networkstringtable.h"
+#include <ihltv.h>
+#include <convar.h>
+
+#define HLTV_BUFFER_DIRECTOR 0 // director commands
+#define HLTV_BUFFER_RELIABLE 1 // reliable messages
+#define HLTV_BUFFER_UNRELIABLE 2 // unreliable messages
+#define HLTV_BUFFER_VOICE 3 // player voice data
+#define HLTV_BUFFER_SOUNDS 4 // unreliable sounds
+#define HLTV_BUFFER_TEMPENTS 5 // temporary/event entities
+#define HLTV_BUFFER_MAX 6 // end marker
+
+// proxy dispatch modes
+#define DISPATCH_MODE_OFF 0
+#define DISPATCH_MODE_AUTO 1
+#define DISPATCH_MODE_ALWAYS 2
+
+extern ConVar tv_debug;
+
+class CHLTVFrame : public CClientFrame
+{
+public:
+ CHLTVFrame();
+ virtual ~CHLTVFrame();
+
+ void Reset(); // resets all data & buffers
+ void FreeBuffers();
+ void AllocBuffers();
+ bool HasData();
+ void CopyHLTVData( CHLTVFrame &frame );
+ virtual bool IsMemPoolAllocated() { return false; }
+
+public:
+
+ // message buffers:
+ bf_write m_Messages[HLTV_BUFFER_MAX];
+};
+
+struct CFrameCacheEntry_s
+{
+ CClientFrame* pFrame;
+ int nTick;
+};
+
+class CDeltaEntityCache
+{
+ struct DeltaEntityEntry_s
+ {
+ DeltaEntityEntry_s *pNext;
+ int nDeltaTick;
+ int nBits;
+ };
+
+public:
+ CDeltaEntityCache();
+ ~CDeltaEntityCache();
+
+ void SetTick( int nTick, int nMaxEntities );
+ unsigned char* FindDeltaBits( int nEntityIndex, int nDeltaTick, int &nBits );
+ void AddDeltaBits( int nEntityIndex, int nDeltaTick, int nBits, bf_write *pBuffer );
+ void Flush();
+
+protected:
+ int m_nTick; // current tick
+ int m_nMaxEntities; // max entities = length of cache
+ int m_nCacheSize;
+ DeltaEntityEntry_s* m_Cache[MAX_EDICTS]; // array of pointers to delta entries
+};
+
+
+class CGameClient;
+class CGameServer;
+class IHLTVDirector;
+
+class CHLTVServer : public IGameEventListener2, public CBaseServer, public CClientFrameManager, public IHLTVServer, public IDemoPlayer
+{
+friend class CHLTVClientState;
+
+public:
+ CHLTVServer();
+ virtual ~CHLTVServer();
+
+public: // CBaseServer interface:
+ bool ProcessConnectionlessPacket( netpacket_t * packet );
+
+ void Init (bool bIsDedicated);
+ void Shutdown( void );
+ void Clear( void );
+ bool IsHLTV( void ) const { return true; };
+ bool IsMultiplayer( void ) const { return true; };
+ void FillServerInfo(SVC_ServerInfo &serverinfo);
+ void GetNetStats( float &avgIn, float &avgOut );
+ int GetChallengeType ( netadr_t &adr );
+ const char *GetName( void ) const;
+ const char *GetPassword() const;
+ IClient *ConnectClient ( netadr_t &adr, int protocol, int challenge, int clientChallenge, int authProtocol,
+ const char *name, const char *password, const char *hashedCDkey, int cdKeyLen );
+
+public:
+ void FireGameEvent(IGameEvent *event);
+
+public: // IHLTVServer interface:
+ IServer *GetBaseServer( void );
+ IHLTVDirector *GetDirector( void );
+ int GetHLTVSlot( void ); // return entity index-1 of HLTV in game
+ float GetOnlineTime( void ); // seconds since broadcast started
+ void GetLocalStats( int &proxies, int &slots, int &clients );
+ void GetGlobalStats( int &proxies, int &slots, int &clients );
+ void GetRelayStats( int &proxies, int &slots, int &clients );
+
+ bool IsMasterProxy( void ); // true, if this is the HLTV master proxy
+ bool IsTVRelay(); // true if we're running a relay (i.e. this is the opposite of IsMasterProxy()).
+ bool IsDemoPlayback( void ); // true if this is a HLTV demo
+
+ const netadr_t *GetRelayAddress( void ); // returns relay address
+
+ void BroadcastEvent(IGameEvent *event);
+
+public: // IDemoPlayer interface
+ CDemoFile *GetDemoFile();
+ int GetPlaybackStartTick( void );
+ int GetPlaybackTick( void );
+ int GetTotalTicks( void );
+
+ bool StartPlayback( const char *filename, bool bAsTimeDemo );
+
+ bool IsPlayingBack( void ); // true if demo loaded and playing back
+ bool IsPlaybackPaused( void ); // true if playback paused
+ bool IsPlayingTimeDemo( void ) { return false; } // true if playing back in timedemo mode
+ bool IsSkipping( void ) { return false; }; // true, if demo player skiiping trough packets
+ bool CanSkipBackwards( void ) { return true; } // true if demoplayer can skip backwards
+
+ void SetPlaybackTimeScale( float timescale ); // sets playback timescale
+ float GetPlaybackTimeScale( void ); // get playback timescale
+
+ void PausePlayback( float seconds ) {}
+ void SkipToTick( int tick, bool bRelative, bool bPause ) {}
+ void SetEndTick( int tick) {}
+ void ResumePlayback( void ) {}
+ void StopPlayback( void ) {}
+ void InterpolateViewpoint() {}
+ netpacket_t *ReadPacket( void ) { return NULL; }
+
+ void ResetDemoInterpolation( void ) {}
+ int GetProtocolVersion();
+
+ bool ShouldLoopDemos() { return true; }
+ void OnLastDemoInLoopPlayed() {}
+
+ bool IsLoading( void ) { return false; } // true if demo is currently loading
+
+public:
+ void StartMaster(CGameClient *client); // start HLTV server as master proxy
+ void ConnectRelay(const char *address); // connect to other HLTV proxy
+ void StartDemo(const char *filename); // starts playing back a demo file
+ void StartRelay( void ); // start HLTV server as relay proxy
+ bool SendNetMsg( INetMessage &msg, bool bForceReliable = false );
+ void RunFrame();
+ void SetMaxClients( int number );
+ void Changelevel( void );
+
+ void UserInfoChanged( int nClientIndex );
+ void SendClientMessages ( bool bSendSnapshots );
+ CClientFrame *AddNewFrame( CClientFrame * pFrame ); // add new frame, returns HLTV's copy
+ void SignonComplete( void );
+ void LinkInstanceBaselines( void );
+ void BroadcastEventLocal( IGameEvent *event, bool bReliable ); // broadcast event but not to relay proxies
+ void BroadcastLocalChat( const char *pszChat, const char *pszGroup ); // broadcast event but not to relay proxies
+ void BroadcastLocalTitle( CHLTVClient *client = NULL ); // NULL = broadcast to all
+ bool DispatchToRelay( CHLTVClient *pClient);
+ bf_write *GetBuffer( int nBuffer);
+ CClientFrame *GetDeltaFrame( int nTick );
+
+ inline CHLTVClient* Client( int i ) { return static_cast<CHLTVClient*>(m_Clients[i]); }
+
+
+protected:
+ virtual bool ShouldUpdateMasterServer();
+
+private:
+ CBaseClient *CreateNewClient( int slot );
+ void UpdateTick( void );
+ void UpdateStats( void );
+ void InstallStringTables( void );
+ void RestoreTick( int tick );
+ void EntityPVSCheck( CClientFrame *pFrame );
+ void InitClientRecvTables();
+ void FreeClientRecvTables();
+ void ReadCompleteDemoFile();
+ void ResyncDemoClock();
+
+#ifndef NO_STEAM
+ void ReplyInfo( const netadr_t &adr );
+#endif
+
+
+ // Vector GetOriginFromPackedEntity(PackedEntity* pe);
+
+public:
+
+ CGameClient *m_MasterClient; // if != NULL, this is the master HLTV
+ CHLTVClientState m_ClientState;
+ CHLTVDemoRecorder m_DemoRecorder; // HLTV demo object for recording and playback
+ CGameServer *m_Server; // pointer to source server (sv.)
+ IHLTVDirector *m_Director; // HTLV director exported by game.dll
+ int m_nFirstTick; // first known server tick;
+ int m_nLastTick; // last tick from AddFrame()
+ CHLTVFrame *m_CurrentFrame; // current delayed HLTV frame
+ int m_nViewEntity; // the current entity HLTV is tracking
+ int m_nPlayerSlot; // slot of HLTV client on game server
+ CHLTVFrame m_HLTVFrame; // all incoming messages go here until Snapshot is made
+
+ bool m_bSignonState; // true if connecting to server
+ float m_flStartTime;
+ float m_flFPS; // FPS the proxy is running;
+ int m_nGameServerMaxClients; // max clients on game server
+ float m_fNextSendUpdateTime; // time to send next HLTV status messages
+ RecvTable *m_pRecvTables[MAX_DATATABLES];
+ int m_nRecvTables;
+ Vector m_vPVSOrigin;
+ bool m_bMasterOnlyMode;
+
+ netadr_t m_RootServer; // HLTV root server
+ int m_nGlobalSlots;
+ int m_nGlobalClients;
+ int m_nGlobalProxies;
+
+ CNetworkStringTableContainer m_NetworkStringTables;
+
+ CDeltaEntityCache m_DeltaCache;
+ CUtlVector<CFrameCacheEntry_s> m_FrameCache;
+
+ // demoplayer stuff:
+ CDemoFile m_DemoFile; // for demo playback
+ int m_nStartTick;
+ democmdinfo_t m_LastCmdInfo;
+ bool m_bPlayingBack;
+ bool m_bPlaybackPaused; // true if demo is paused right now
+ float m_flPlaybackRateModifier;
+ int m_nSkipToTick; // skip to tick ASAP, -1 = off
+};
+
+extern CHLTVServer *hltv; // The global HLTV server/object. NULL on xbox.
+
+#endif // HLTVSERVER_H