ddnet/src/engine/client/client.h

367 lines
10 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#ifndef ENGINE_CLIENT_CLIENT_H
#define ENGINE_CLIENT_CLIENT_H
2009-10-29 12:14:31 +00:00
2010-05-29 07:25:38 +00:00
class CGraph
2009-10-29 12:14:31 +00:00
{
public:
2010-05-29 07:25:38 +00:00
enum
{
// restrictions: Must be power of two
MAX_VALUES=128,
};
float m_Min, m_Max;
float m_aValues[MAX_VALUES];
float m_aColors[MAX_VALUES][3];
int m_Index;
void Init(float Min, float Max);
void ScaleMax();
void ScaleMin();
void Add(float v, float r, float g, float b);
void Render(IGraphics *pGraphics, int Font, float x, float y, float w, float h, const char *pDescription);
2009-10-29 12:14:31 +00:00
};
2010-05-29 07:25:38 +00:00
class CSmoothTime
2009-10-29 12:14:31 +00:00
{
2010-05-29 07:25:38 +00:00
int64 m_Snap;
int64 m_Current;
int64 m_Target;
int64 m_RLast;
int64 m_TLast;
CGraph m_Graph;
int m_SpikeCounter;
float m_aAdjustSpeed[2]; // 0 = down, 1 = up
2009-10-29 12:14:31 +00:00
public:
2010-05-29 07:25:38 +00:00
void Init(int64 Target);
void SetAdjustSpeed(int Direction, float Value);
int64 Get(int64 Now);
void UpdateInt(int64 Target);
void Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustDirection);
2009-10-29 12:14:31 +00:00
};
2010-05-29 07:25:38 +00:00
class CClient : public IClient, public CDemoPlayer::IListner
{
// needed interfaces
2011-02-27 14:03:57 +00:00
IEngine *m_pEngine;
2010-05-29 07:25:38 +00:00
IEditor *m_pEditor;
IEngineInput *m_pInput;
IEngineGraphics *m_pGraphics;
IEngineSound *m_pSound;
IGameClient *m_pGameClient;
IEngineMap *m_pMap;
IConsole *m_pConsole;
IStorage *m_pStorage;
IFetcher *m_pFetcher;
2014-12-31 14:29:34 +00:00
IAutoUpdate *m_pAutoUpdate;
2010-05-29 07:25:38 +00:00
IEngineMasterServer *m_pMasterServer;
enum
{
NUM_SNAPSHOT_TYPES=2,
PREDICTION_MARGIN=1000/50/2, // magic network prediction value
};
class CNetClient m_NetClient[3];
2011-02-27 14:03:57 +00:00
class CDemoPlayer m_DemoPlayer;
class CDemoRecorder m_DemoRecorder[RECORDER_MAX];
2014-08-12 14:21:06 +00:00
class CDemoEditor m_DemoEditor;
2011-02-27 14:03:57 +00:00
class CServerBrowser m_ServerBrowser;
class CFetcher m_Fetcher;
2014-12-31 14:29:34 +00:00
class CAutoUpdate m_AutoUpdate;
2011-03-23 12:06:35 +00:00
class CFriends m_Friends;
class CMapChecker m_MapChecker;
2010-05-29 07:25:38 +00:00
char m_aServerAddressStr[256];
unsigned m_SnapshotParts;
int64 m_LocalStartTime;
int m_DebugFont;
int64 m_LastRenderTime;
float m_RenderFrameTimeLow;
float m_RenderFrameTimeHigh;
int m_RenderFrames;
2010-05-29 07:25:38 +00:00
NETADDR m_ServerAddress;
int m_WindowMustRefocus;
int m_SnapCrcErrors;
bool m_AutoScreenshotRecycle;
bool m_EditorActive;
bool m_SoundInitFailed;
bool m_ResortServerBrowser;
2010-05-29 07:25:38 +00:00
2014-04-28 15:26:31 +00:00
int m_AckGameTick[2];
int m_CurrentRecvTick[2];
2014-04-27 11:44:04 +00:00
int m_RconAuthed[2];
char m_RconPassword[32];
int m_UseTempRconCommands;
2010-05-29 07:25:38 +00:00
// version-checking
char m_aVersionStr[10];
// pinging
int64 m_PingStartTime;
//
char m_aCurrentMap[256];
unsigned m_CurrentMapCrc;
2010-05-29 07:25:38 +00:00
2014-08-17 17:19:40 +00:00
bool m_TimeoutCodeSent[2];
2010-05-29 07:25:38 +00:00
//
char m_aCmdConnect[256];
// map download
CFetchTask *m_pMapdownloadTask;
2010-05-29 07:25:38 +00:00
char m_aMapdownloadFilename[256];
char m_aMapdownloadName[256];
IOHANDLE m_MapdownloadFile;
int m_MapdownloadChunk;
int m_MapdownloadCrc;
int m_MapdownloadAmount;
int m_MapdownloadTotalsize;
// time
2014-04-28 15:26:31 +00:00
CSmoothTime m_GameTime[2];
CSmoothTime m_PredictedTime;
2010-05-29 07:25:38 +00:00
// input
struct // TODO: handle input better
{
int m_aData[MAX_INPUT_SIZE]; // the input data
int m_Tick; // the tick that the input is for
int64 m_PredictedTime; // prediction latency when we sent this input
int64 m_Time;
} m_aInputs[2][200];
2010-05-29 07:25:38 +00:00
int m_CurrentInput[2];
2014-04-28 18:43:08 +00:00
bool m_LastDummy;
bool m_LastDummy2;
CNetObj_PlayerInput HammerInput;
2010-05-29 07:25:38 +00:00
// graphs
CGraph m_InputtimeMarginGraph;
CGraph m_GametimeMarginGraph;
CGraph m_FpsGraph;
// the game snapshots are modifiable by the game
class CSnapshotStorage m_SnapshotStorage[2];
CSnapshotStorage::CHolder *m_aSnapshots[2][NUM_SNAPSHOT_TYPES];
2010-05-29 07:25:38 +00:00
int m_RecivedSnapshots[2];
2010-05-29 07:25:38 +00:00
char m_aSnapshotIncommingData[CSnapshot::MAX_SIZE];
2011-02-27 14:03:57 +00:00
class CSnapshotStorage::CHolder m_aDemorecSnapshotHolders[NUM_SNAPSHOT_TYPES];
2010-05-29 07:25:38 +00:00
char *m_aDemorecSnapshotData[NUM_SNAPSHOT_TYPES][2][CSnapshot::MAX_SIZE];
2011-02-27 14:03:57 +00:00
class CSnapshotDelta m_SnapshotDelta;
2010-05-29 07:25:38 +00:00
//
2011-02-27 14:03:57 +00:00
class CServerInfo m_CurrentServerInfo;
2010-05-29 07:25:38 +00:00
int64 m_CurrentServerInfoRequestTime; // >= 0 should request, == -1 got info
// version info
struct CVersionInfo
2010-05-29 07:25:38 +00:00
{
enum
{
STATE_INIT=0,
STATE_START,
STATE_READY,
};
2010-05-29 07:25:38 +00:00
int m_State;
2011-02-27 14:03:57 +00:00
class CHostLookup m_VersionServeraddr;
2010-05-29 07:25:38 +00:00
} m_VersionInfo;
2011-02-27 14:03:57 +00:00
volatile int m_GfxState;
static void GraphicsThreadProxy(void *pThis) { ((CClient*)pThis)->GraphicsThread(); }
void GraphicsThread();
vec3 GetColorV3(int v);
2014-09-19 22:36:22 +00:00
char m_aDDNetSrvListToken[4];
bool m_DDNetSrvListTokenSet;
2014-09-19 22:36:22 +00:00
2010-05-29 07:25:38 +00:00
public:
2011-02-27 14:03:57 +00:00
IEngine *Engine() { return m_pEngine; }
2010-05-29 07:25:38 +00:00
IEngineGraphics *Graphics() { return m_pGraphics; }
IEngineInput *Input() { return m_pInput; }
IEngineSound *Sound() { return m_pSound; }
IGameClient *GameClient() { return m_pGameClient; }
IEngineMasterServer *MasterServer() { return m_pMasterServer; }
IStorage *Storage() { return m_pStorage; }
IFetcher *Fetcher() { return m_pFetcher; }
2014-12-31 14:29:34 +00:00
IAutoUpdate *AutoUpdate() { return m_pAutoUpdate; }
2010-05-29 07:25:38 +00:00
CClient();
// ----- send functions -----
virtual int SendMsg(CMsgPacker *pMsg, int Flags);
2014-04-28 13:19:57 +00:00
virtual int SendMsgExY(CMsgPacker *pMsg, int Flags, bool System=true, int NetClient=1);
2010-05-29 07:25:38 +00:00
int SendMsgEx(CMsgPacker *pMsg, int Flags, bool System=true);
void SendInfo();
void SendEnterGame();
void SendReady();
void SendMapRequest();
2010-05-29 07:25:38 +00:00
2014-04-27 11:44:04 +00:00
virtual bool RconAuthed() { return m_RconAuthed[g_Config.m_ClDummy] != 0; }
virtual bool UseTempRconCommands() { return m_UseTempRconCommands != 0; }
2010-05-29 07:25:38 +00:00
void RconAuth(const char *pName, const char *pPassword);
virtual void Rcon(const char *pCmd);
virtual bool ConnectionProblems();
virtual bool SoundInitFailed() { return m_SoundInitFailed; }
virtual int GetDebugFont() { return m_DebugFont; }
2010-05-29 07:25:38 +00:00
void DirectInput(int *pInput, int Size);
void SendInput();
// TODO: OPT: do this alot smarter!
virtual int *GetInput(int Tick);
virtual bool InputExists(int Tick);
2010-05-29 07:25:38 +00:00
const char *LatestVersion();
void VersionUpdate();
void CheckVersionUpdate();
2010-05-29 07:25:38 +00:00
// ------ state handling -----
void SetState(int s);
// called when the map is loaded and we should init for a new round
void OnEnterGame();
virtual void EnterGame();
virtual void Connect(const char *pAddress);
void DisconnectWithReason(const char *pReason);
virtual void Disconnect();
virtual void DummyDisconnect(const char *pReason);
2014-04-28 13:19:57 +00:00
virtual void DummyConnect();
virtual bool DummyConnected();
void DummyInfo();
int m_DummyConnected;
int m_LastDummyConnectTime;
2014-04-28 20:12:50 +00:00
int m_Fire;
2010-05-29 07:25:38 +00:00
virtual void GetServerInfo(CServerInfo *pServerInfo);
void ServerInfoRequest();
int LoadData();
// ---
void *SnapGetItem(int SnapID, int Index, CSnapItem *pItem);
void SnapInvalidateItem(int SnapID, int Index);
void *SnapFindItem(int SnapID, int Type, int ID);
int SnapNumItems(int SnapID);
2010-05-29 07:25:38 +00:00
void SnapSetStaticsize(int ItemType, int Size);
void Render();
void DebugRender();
2014-12-31 14:35:49 +00:00
virtual void Restart();
2010-05-29 07:25:38 +00:00
virtual void Quit();
virtual const char *ErrorString();
const char *LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc);
const char *LoadMapSearch(const char *pMapName, int WantedCrc);
static int PlayerScoreComp(const void *a, const void *b);
void ProcessConnlessPacket(CNetChunk *pPacket);
void ProcessServerPacket(CNetChunk *pPacket);
2014-05-03 00:30:05 +00:00
void ProcessServerPacketDummy(CNetChunk *pPacket);
2010-05-29 07:25:38 +00:00
void ResetMapDownload();
void FinishMapDownload();
virtual CFetchTask *MapDownloadTask() { return m_pMapdownloadTask; }
2014-08-15 23:06:17 +00:00
virtual const char *MapDownloadName() { return m_aMapdownloadName; }
virtual int MapDownloadAmount() { return !m_pMapdownloadTask ? m_MapdownloadAmount : (int)m_pMapdownloadTask->Current(); }
virtual int MapDownloadTotalsize() { return !m_pMapdownloadTask ? m_MapdownloadTotalsize : (int)m_pMapdownloadTask->Size(); }
2010-05-29 07:25:38 +00:00
void PumpNetwork();
virtual void OnDemoPlayerSnapshot(void *pData, int Size);
virtual void OnDemoPlayerMessage(void *pData, int Size);
void Update();
void RegisterInterfaces();
void InitInterfaces();
void Run();
bool CtrlShiftKey(int Key, bool &Last);
2010-05-29 07:25:38 +00:00
static void Con_Connect(IConsole::IResult *pResult, void *pUserData);
static void Con_Disconnect(IConsole::IResult *pResult, void *pUserData);
static void Con_DummyConnect(IConsole::IResult *pResult, void *pUserData);
static void Con_DummyDisconnect(IConsole::IResult *pResult, void *pUserData);
static void Con_Quit(IConsole::IResult *pResult, void *pUserData);
static void Con_Minimize(IConsole::IResult *pResult, void *pUserData);
static void Con_Ping(IConsole::IResult *pResult, void *pUserData);
static void Con_Screenshot(IConsole::IResult *pResult, void *pUserData);
static void Con_Rcon(IConsole::IResult *pResult, void *pUserData);
static void Con_RconAuth(IConsole::IResult *pResult, void *pUserData);
static void Con_AddFavorite(IConsole::IResult *pResult, void *pUserData);
static void Con_RemoveFavorite(IConsole::IResult *pResult, void *pUserData);
static void Con_Play(IConsole::IResult *pResult, void *pUserData);
static void Con_Record(IConsole::IResult *pResult, void *pUserData);
static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData);
static void Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData);
static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
2010-05-29 07:25:38 +00:00
2014-08-12 14:21:06 +00:00
static void Con_DemoSlice(IConsole::IResult *pResult, void *pUserData);
static void Con_DemoSliceBegin(IConsole::IResult *pResult, void *pUserData);
2014-08-12 14:21:06 +00:00
static void Con_DemoSliceEnd(IConsole::IResult *pResult, void *pUserData);
2010-05-29 07:25:38 +00:00
void RegisterCommands();
2010-10-06 21:07:35 +00:00
const char *DemoPlayer_Play(const char *pFilename, int StorageType);
void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder);
void DemoRecorder_HandleAutoStart();
void DemoRecorder_Stop(int Recorder);
void DemoRecorder_AddDemoMarker(int Recorder);
class IDemoRecorder *DemoRecorder(int Recorder);
2010-05-29 07:25:38 +00:00
void AutoScreenshot_Start();
void AutoScreenshot_Cleanup();
void ServerBrowserUpdate();
// DDRace
virtual const char* GetCurrentMap();
virtual int GetCurrentMapCrc();
virtual const char* RaceRecordStart(const char *pFilename);
virtual void RaceRecordStop();
virtual bool RaceRecordIsRecording();
virtual void DemoSliceBegin();
virtual void DemoSliceEnd();
2014-08-23 15:48:04 +00:00
virtual void DemoSlice(const char *pDstPath);
2014-09-19 22:36:22 +00:00
void RequestDDNetSrvList();
2010-05-29 07:25:38 +00:00
};
#endif