summaryrefslogtreecommitdiff
path: root/engine/baseclientstate.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/baseclientstate.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'engine/baseclientstate.h')
-rw-r--r--engine/baseclientstate.h256
1 files changed, 256 insertions, 0 deletions
diff --git a/engine/baseclientstate.h b/engine/baseclientstate.h
new file mode 100644
index 0000000..7b0151f
--- /dev/null
+++ b/engine/baseclientstate.h
@@ -0,0 +1,256 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef BASECLIENTSTATE_H
+#define BASECLIENTSTATE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include <inetmsghandler.h>
+#include <protocol.h>
+#include <client_class.h>
+#include <cdll_int.h>
+#include <netadr.h>
+#include "common.h"
+#include "clockdriftmgr.h"
+#include "convar.h"
+#include "cl_bounded_cvars.h"
+
+
+ // Only send this many requests before timing out.
+#define CL_CONNECTION_RETRIES 4
+
+// Mininum time gap (in seconds) before a subsequent connection request is sent.
+#define CL_MIN_RESEND_TIME 1.5f
+// Max time. The cvar cl_resend is bounded by these.
+#define CL_MAX_RESEND_TIME 20.0f
+
+// In release, send commands at least this many times per second
+#define MIN_CMD_RATE 10.0f
+#define MAX_CMD_RATE 100.0f
+
+extern ConVar cl_name;
+
+// This represents a server's
+class C_ServerClassInfo
+{
+public:
+ C_ServerClassInfo();
+ ~C_ServerClassInfo();
+
+public:
+
+ ClientClass *m_pClientClass;
+ char *m_ClassName;
+ char *m_DatatableName;
+
+ // This is an index into the network string table (cl.GetInstanceBaselineTable()).
+ int m_InstanceBaselineIndex; // INVALID_STRING_INDEX if not initialized yet.
+};
+
+#define EndGameAssertMsg( assertion, msg ) \
+ if ( !(assertion) )\
+ Host_EndGame msg
+
+
+class CNetworkStringTableContainer;
+class PackedEntity;
+class INetworkStringTable;
+class CEntityReadInfo;
+
+
+abstract_class CBaseClientState : public INetChannelHandler, public IConnectionlessPacketHandler, public IServerMessageHandler
+{
+
+public:
+ CBaseClientState();
+ virtual ~CBaseClientState();
+
+public: // IConnectionlessPacketHandler interface:
+
+ virtual bool ProcessConnectionlessPacket(struct netpacket_s *packet);
+
+public: // INetMsgHandler interface:
+
+ virtual void ConnectionStart(INetChannel *chan);
+ virtual void ConnectionClosing( const char *reason );
+ virtual void ConnectionCrashed(const char *reason);
+
+ virtual void PacketStart(int incoming_sequence, int outgoing_acknowledged) {};
+ virtual void PacketEnd( void ) {};
+
+ virtual void FileReceived( const char *fileName, unsigned int transferID );
+ virtual void FileRequested( const char *fileName, unsigned int transferID );
+ virtual void FileDenied( const char *fileName, unsigned int transferID );
+ virtual void FileSent( const char *fileName, unsigned int transferID );
+
+public: // IServerMessageHandlers
+
+ PROCESS_NET_MESSAGE( Tick );
+ PROCESS_NET_MESSAGE( StringCmd );
+ PROCESS_NET_MESSAGE( SetConVar );
+ PROCESS_NET_MESSAGE( SignonState );
+
+ PROCESS_SVC_MESSAGE( Print );
+ PROCESS_SVC_MESSAGE( ServerInfo );
+ PROCESS_SVC_MESSAGE( SendTable );
+ PROCESS_SVC_MESSAGE( ClassInfo );
+ PROCESS_SVC_MESSAGE( SetPause );
+ PROCESS_SVC_MESSAGE( CreateStringTable );
+ PROCESS_SVC_MESSAGE( UpdateStringTable );
+ PROCESS_SVC_MESSAGE( SetView );
+ PROCESS_SVC_MESSAGE( PacketEntities );
+ PROCESS_SVC_MESSAGE( Menu );
+ PROCESS_SVC_MESSAGE( GameEventList );
+ PROCESS_SVC_MESSAGE( GetCvarValue );
+ PROCESS_SVC_MESSAGE( CmdKeyValues );
+ PROCESS_SVC_MESSAGE( SetPauseTimed );
+
+ // Returns dem file protocol version, or, if not playing a demo, just returns PROTOCOL_VERSION
+ virtual int GetDemoProtocolVersion() const;
+
+public:
+ inline bool IsActive( void ) const { return m_nSignonState == SIGNONSTATE_FULL; };
+ inline bool IsConnected( void ) const { return m_nSignonState >= SIGNONSTATE_CONNECTED; };
+ virtual void Clear( void );
+ virtual void FullConnect( netadr_t &adr ); // a connection was established
+ virtual void Connect(const char* adr, const char *pszSourceTag); // start a connection challenge
+ virtual bool SetSignonState ( int state, int count );
+ virtual void Disconnect( const char *pszReason, bool bShowMainMenu );
+ virtual void SendConnectPacket (int challengeNr, int authProtocol, uint64 unGSSteamID, bool bGSSecure );
+ virtual const char *GetCDKeyHash() { return "123"; }
+ virtual void RunFrame ( void );
+ virtual void CheckForResend ( void );
+ virtual void InstallStringTableCallback( char const *tableName ) { }
+ virtual bool HookClientStringTable( char const *tableName ) { return false; }
+ virtual bool LinkClasses( void );
+ virtual int GetConnectionRetryNumber() const { return CL_CONNECTION_RETRIES; }
+ virtual const char *GetClientName() { return cl_name.GetString(); }
+
+ static ClientClass* FindClientClass(const char *pClassName);
+
+ CClockDriftMgr& GetClockDriftMgr();
+
+ int GetClientTickCount() const; // Get the client tick count.
+ void SetClientTickCount( int tick );
+
+ int GetServerTickCount() const;
+ void SetServerTickCount( int tick );
+
+ void SetClientAndServerTickCount( int tick );
+
+ INetworkStringTable *GetStringTable( const char * name ) const;
+
+ PackedEntity *GetEntityBaseline( int iBaseline, int nEntityIndex );
+ void SetEntityBaseline(int iBaseline, ClientClass *pClientClass, int index, char *packedData, int length);
+ void CopyEntityBaseline( int iFrom, int iTo );
+ void FreeEntityBaselines();
+ bool GetClassBaseline( int iClass, void const **pData, int *pDatalen );
+ ClientClass *GetClientClass( int i );
+
+ void ForceFullUpdate( void );
+ void SendStringCmd(const char * command);
+
+ void ReadPacketEntities( CEntityReadInfo &u );
+
+ virtual void ReadEnterPVS( CEntityReadInfo &u ) = 0;
+ virtual void ReadLeavePVS( CEntityReadInfo &u ) = 0;
+ virtual void ReadDeltaEnt( CEntityReadInfo &u ) = 0;
+ virtual void ReadPreserveEnt( CEntityReadInfo &u ) = 0;
+ virtual void ReadDeletions( CEntityReadInfo &u ) = 0;
+
+ bool IsClientConnectionViaMatchMaking( void );
+
+ static bool ConnectMethodAllowsRedirects( void );
+
+private:
+ bool PrepareSteamConnectResponse( uint64 unGSSteamID, bool bGSSecure, const netadr_t &adr, bf_write &msg );
+
+public:
+ // Connection to server.
+ int m_Socket; // network socket
+ INetChannel *m_NetChannel; // Our sequenced channel to the remote server.
+ unsigned int m_nChallengeNr; // connection challenge number
+ double m_flConnectTime; // If gap of connect_time to net_time > 3000, then resend connect packet
+ int m_nRetryNumber; // number of retry connection attemps
+ char m_szRetryAddress[ MAX_OSPATH ];
+ CUtlString m_sRetrySourceTag; // string that describes why we decided to connect to this server (empty for command line, "serverbrowser", "quickplay", etc)
+ int m_retryChallenge; // challenge we sent to the server
+ int m_nSignonState; // see SIGNONSTATE_* definitions
+ double m_flNextCmdTime; // When can we send the next command packet?
+ int m_nServerCount; // server identification for prespawns, must match the svs.spawncount which
+ // is incremented on server spawning. This supercedes svs.spawn_issued, in that
+ // we can now spend a fair amount of time sitting connected to the server
+ // but downloading models, sounds, etc. So much time that it is possible that the
+ // server might change levels again and, if so, we need to know that.
+ uint64 m_ulGameServerSteamID; // Steam ID of the game server we are trying to connect to, or are connected to. Zero if unknown
+ int m_nCurrentSequence; // this is the sequence number of the current incoming packet
+
+ CClockDriftMgr m_ClockDriftMgr;
+
+ int m_nDeltaTick; // last valid received snapshot (server) tick
+ bool m_bPaused; // send over by server
+ float m_flPausedExpireTime;
+ int m_nViewEntity; // cl_entitites[cl.viewentity] == player point of view
+
+ int m_nPlayerSlot; // own player entity index-1. skips world. Add 1 to get cl_entitites index;
+
+ char m_szLevelFileName[ 128 ]; // for display on solo scoreboard
+ char m_szLevelBaseName[ 128 ]; // removes maps/ and .bsp extension
+
+ int m_nMaxClients; // max clients on server
+
+ PackedEntity *m_pEntityBaselines[2][MAX_EDICTS]; // storing entity baselines
+
+ // This stuff manages the receiving of data tables and instantiating of client versions
+ // of server-side classes.
+ C_ServerClassInfo *m_pServerClasses;
+ int m_nServerClasses;
+ int m_nServerClassBits;
+ char m_szEncrytionKey[STEAM_KEYSIZE];
+ unsigned int m_iEncryptionKeySize;
+
+ CNetworkStringTableContainer *m_StringTableContainer;
+
+ bool m_bRestrictServerCommands; // If true, then the server is only allowed to execute commands marked with FCVAR_SERVER_CAN_EXECUTE on the client.
+ bool m_bRestrictClientCommands; // If true, then IVEngineClient::ClientCmd is only allowed to execute commands marked with FCVAR_CLIENTCMD_CAN_EXECUTE on the client.
+};
+
+
+inline CClockDriftMgr& CBaseClientState::GetClockDriftMgr()
+{
+ return m_ClockDriftMgr;
+}
+
+
+inline void CBaseClientState::SetClientTickCount( int tick )
+{
+ m_ClockDriftMgr.m_nClientTick = tick;
+}
+
+inline int CBaseClientState::GetClientTickCount() const
+{
+ return m_ClockDriftMgr.m_nClientTick;
+}
+
+inline int CBaseClientState::GetServerTickCount() const
+{
+ return m_ClockDriftMgr.m_nServerTick;
+}
+
+inline void CBaseClientState::SetServerTickCount( int tick )
+{
+ m_ClockDriftMgr.m_nServerTick = tick;
+}
+
+inline void CBaseClientState::SetClientAndServerTickCount( int tick )
+{
+ m_ClockDriftMgr.m_nServerTick = m_ClockDriftMgr.m_nClientTick = tick;
+}
+
+
+#endif // BASECLIENTSTATE_H