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 GAME_CLIENT_GAMECLIENT_H
|
|
|
|
#define GAME_CLIENT_GAMECLIENT_H
|
|
|
|
|
|
|
|
#include <base/vmath.h>
|
|
|
|
#include <engine/client.h>
|
|
|
|
#include <engine/console.h>
|
|
|
|
#include <game/layers.h>
|
|
|
|
#include <game/gamecore.h>
|
|
|
|
#include "render.h"
|
|
|
|
|
2011-04-09 06:41:31 +00:00
|
|
|
#include <game/teamscore.h>
|
|
|
|
|
2014-07-07 13:43:34 +00:00
|
|
|
#define MIN3(x,y,z) ((y) <= (z) ? \
|
|
|
|
((x) <= (y) ? (x) : (y)) \
|
|
|
|
: \
|
|
|
|
((x) <= (z) ? (x) : (z)))
|
|
|
|
|
|
|
|
#define MAX3(x,y,z) ((y) >= (z) ? \
|
|
|
|
((x) >= (y) ? (x) : (y)) \
|
|
|
|
: \
|
|
|
|
((x) >= (z) ? (x) : (z)))
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
class CGameClient : public IGameClient
|
|
|
|
{
|
|
|
|
class CStack
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
MAX_COMPONENTS = 64,
|
|
|
|
};
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CStack();
|
|
|
|
void Add(class CComponent *pComponent);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
class CComponent *m_paComponents[MAX_COMPONENTS];
|
|
|
|
int m_Num;
|
|
|
|
};
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CStack m_All;
|
|
|
|
CStack m_Input;
|
|
|
|
CNetObjHandler m_NetObjHandler;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2011-02-27 16:56:03 +00:00
|
|
|
class IEngine *m_pEngine;
|
2010-05-29 07:25:38 +00:00
|
|
|
class IInput *m_pInput;
|
|
|
|
class IGraphics *m_pGraphics;
|
|
|
|
class ITextRender *m_pTextRender;
|
|
|
|
class IClient *m_pClient;
|
|
|
|
class ISound *m_pSound;
|
|
|
|
class IConsole *m_pConsole;
|
|
|
|
class IStorage *m_pStorage;
|
|
|
|
class IDemoPlayer *m_pDemoPlayer;
|
2010-08-09 12:14:15 +00:00
|
|
|
class IDemoRecorder *m_pDemoRecorder;
|
2010-05-29 07:25:38 +00:00
|
|
|
class IServerBrowser *m_pServerBrowser;
|
2014-06-16 11:29:18 +00:00
|
|
|
#if !defined(CONF_PLATFORM_MACOSX) && !defined(__ANDROID__)
|
2014-04-27 22:45:45 +00:00
|
|
|
class IAutoUpdate *m_pAutoUpdate;
|
|
|
|
#endif
|
2011-03-21 23:31:42 +00:00
|
|
|
class IEditor *m_pEditor;
|
2011-03-23 12:06:35 +00:00
|
|
|
class IFriends *m_pFriends;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CLayers m_Layers;
|
|
|
|
class CCollision m_Collision;
|
|
|
|
CUI m_UI;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
void DispatchInput();
|
|
|
|
void ProcessEvents();
|
2011-03-10 09:08:14 +00:00
|
|
|
void UpdatePositions();
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
int m_PredictedTick;
|
2014-05-23 21:59:26 +00:00
|
|
|
int m_LastNewPredictedTick[2];
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
int64 m_LastSendInfo;
|
2011-01-06 03:46:10 +00:00
|
|
|
|
2011-08-13 00:11:06 +00:00
|
|
|
static void ConTeam(IConsole::IResult *pResult, void *pUserData);
|
|
|
|
static void ConKill(IConsole::IResult *pResult, void *pUserData);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
2014-04-28 13:19:57 +00:00
|
|
|
static void ConchainSpecialDummyInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
2014-04-28 13:34:56 +00:00
|
|
|
static void ConchainSpecialDummy(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
public:
|
|
|
|
IKernel *Kernel() { return IInterface::Kernel(); }
|
2011-02-27 16:56:03 +00:00
|
|
|
IEngine *Engine() const { return m_pEngine; }
|
2010-05-29 07:25:38 +00:00
|
|
|
class IGraphics *Graphics() const { return m_pGraphics; }
|
|
|
|
class IClient *Client() const { return m_pClient; }
|
|
|
|
class CUI *UI() { return &m_UI; }
|
|
|
|
class ISound *Sound() const { return m_pSound; }
|
|
|
|
class IInput *Input() const { return m_pInput; }
|
|
|
|
class IStorage *Storage() const { return m_pStorage; }
|
|
|
|
class IConsole *Console() { return m_pConsole; }
|
|
|
|
class ITextRender *TextRender() const { return m_pTextRender; }
|
|
|
|
class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; }
|
2010-08-09 12:14:15 +00:00
|
|
|
class IDemoRecorder *DemoRecorder() const { return m_pDemoRecorder; }
|
2010-05-29 07:25:38 +00:00
|
|
|
class IServerBrowser *ServerBrowser() const { return m_pServerBrowser; }
|
2014-06-16 11:29:18 +00:00
|
|
|
#if !defined(CONF_PLATFORM_MACOSX) && !defined(__ANDROID__)
|
2014-04-27 03:01:03 +00:00
|
|
|
class IAutoUpdate *AutoUpdate() const { return m_pAutoUpdate; }
|
2014-04-27 22:45:45 +00:00
|
|
|
#endif
|
2010-05-29 07:25:38 +00:00
|
|
|
class CRenderTools *RenderTools() { return &m_RenderTools; }
|
|
|
|
class CLayers *Layers() { return &m_Layers; };
|
|
|
|
class CCollision *Collision() { return &m_Collision; };
|
2011-03-21 23:31:42 +00:00
|
|
|
class IEditor *Editor() { return m_pEditor; }
|
2011-03-23 12:06:35 +00:00
|
|
|
class IFriends *Friends() { return m_pFriends; }
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-08-13 01:07:51 +00:00
|
|
|
int NetobjNumCorrections() { return m_NetObjHandler.NumObjCorrections(); }
|
|
|
|
const char *NetobjCorrectedOn() { return m_NetObjHandler.CorrectedObjOn(); }
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
bool m_SuppressEvents;
|
|
|
|
bool m_NewTick;
|
|
|
|
bool m_NewPredictedTick;
|
2011-07-05 21:15:24 +00:00
|
|
|
int m_FlagDropTick[2];
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
// TODO: move this
|
2014-04-29 01:34:23 +00:00
|
|
|
CTuningParams m_Tuning[2];
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
SERVERMODE_PURE=0,
|
|
|
|
SERVERMODE_MOD,
|
|
|
|
SERVERMODE_PUREMOD,
|
|
|
|
};
|
|
|
|
int m_ServerMode;
|
|
|
|
|
2011-03-12 17:07:57 +00:00
|
|
|
int m_DemoSpecID;
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
vec2 m_LocalCharacterPos;
|
|
|
|
|
|
|
|
// predicted players
|
|
|
|
CCharacterCore m_PredictedPrevChar;
|
|
|
|
CCharacterCore m_PredictedChar;
|
|
|
|
|
|
|
|
// snap pointers
|
|
|
|
struct CSnapState
|
|
|
|
{
|
|
|
|
const CNetObj_Character *m_pLocalCharacter;
|
|
|
|
const CNetObj_Character *m_pLocalPrevCharacter;
|
|
|
|
const CNetObj_PlayerInfo *m_pLocalInfo;
|
2011-03-10 09:08:14 +00:00
|
|
|
const CNetObj_SpectatorInfo *m_pSpectatorInfo;
|
|
|
|
const CNetObj_SpectatorInfo *m_pPrevSpectatorInfo;
|
2010-05-29 07:25:38 +00:00
|
|
|
const CNetObj_Flag *m_paFlags[2];
|
2011-03-04 16:08:10 +00:00
|
|
|
const CNetObj_GameInfo *m_pGameInfoObj;
|
|
|
|
const CNetObj_GameData *m_pGameDataObj;
|
|
|
|
int m_GameDataSnapID;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
const CNetObj_PlayerInfo *m_paPlayerInfos[MAX_CLIENTS];
|
|
|
|
const CNetObj_PlayerInfo *m_paInfoByScore[MAX_CLIENTS];
|
2014-02-08 21:24:57 +00:00
|
|
|
const CNetObj_PlayerInfo *m_paInfoByName[MAX_CLIENTS];
|
2011-08-04 21:43:39 +00:00
|
|
|
const CNetObj_PlayerInfo *m_paInfoByTeam[MAX_CLIENTS];
|
2014-01-22 00:39:18 +00:00
|
|
|
const CNetObj_PlayerInfo *m_paInfoByDDTeam[MAX_CLIENTS];
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2011-02-12 10:40:36 +00:00
|
|
|
int m_LocalClientID;
|
2010-05-29 07:25:38 +00:00
|
|
|
int m_NumPlayers;
|
|
|
|
int m_aTeamSize[2];
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2011-03-12 17:07:57 +00:00
|
|
|
// spectate data
|
|
|
|
struct CSpectateInfo
|
|
|
|
{
|
|
|
|
bool m_Active;
|
|
|
|
int m_SpectatorID;
|
|
|
|
bool m_UsePosition;
|
|
|
|
vec2 m_Position;
|
|
|
|
} m_SpecInfo;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
//
|
|
|
|
struct CCharacterInfo
|
|
|
|
{
|
|
|
|
bool m_Active;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
// snapshots
|
|
|
|
CNetObj_Character m_Prev;
|
|
|
|
CNetObj_Character m_Cur;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
// interpolated position
|
|
|
|
vec2 m_Position;
|
|
|
|
};
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CCharacterInfo m_aCharacters[MAX_CLIENTS];
|
|
|
|
};
|
|
|
|
|
|
|
|
CSnapState m_Snap;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
// client data
|
|
|
|
struct CClientData
|
|
|
|
{
|
|
|
|
int m_UseCustomColor;
|
|
|
|
int m_ColorBody;
|
|
|
|
int m_ColorFeet;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2011-03-15 10:23:49 +00:00
|
|
|
char m_aName[MAX_NAME_LENGTH];
|
|
|
|
char m_aClan[MAX_CLAN_LENGTH];
|
|
|
|
int m_Country;
|
2010-05-29 07:25:38 +00:00
|
|
|
char m_aSkinName[64];
|
2011-02-12 10:40:36 +00:00
|
|
|
int m_SkinID;
|
2010-05-29 07:25:38 +00:00
|
|
|
int m_SkinColor;
|
|
|
|
int m_Team;
|
|
|
|
int m_Emoticon;
|
|
|
|
int m_EmoticonStart;
|
|
|
|
CCharacterCore m_Predicted;
|
2013-10-09 14:02:23 +00:00
|
|
|
CCharacterCore m_PrevPredicted;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CTeeRenderInfo m_SkinInfo; // this is what the server reports
|
|
|
|
CTeeRenderInfo m_RenderInfo; // this is what we use
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
float m_Angle;
|
2011-03-22 21:41:27 +00:00
|
|
|
bool m_Active;
|
|
|
|
bool m_ChatIgnore;
|
2011-03-23 12:06:35 +00:00
|
|
|
bool m_Friend;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
void UpdateRenderInfo();
|
2011-03-22 21:41:27 +00:00
|
|
|
void Reset();
|
2011-04-09 06:41:31 +00:00
|
|
|
|
|
|
|
// DDRace
|
|
|
|
|
|
|
|
int m_Score;
|
2010-05-29 07:25:38 +00:00
|
|
|
};
|
2010-09-27 19:41:41 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CClientData m_aClients[MAX_CLIENTS];
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
CRenderTools m_RenderTools;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
void OnReset();
|
|
|
|
|
|
|
|
// hooks
|
|
|
|
virtual void OnConnected();
|
|
|
|
virtual void OnRender();
|
2014-04-28 14:47:44 +00:00
|
|
|
virtual void OnDummyDisconnect();
|
2010-09-12 10:43:03 +00:00
|
|
|
virtual void OnRelease();
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void OnInit();
|
|
|
|
virtual void OnConsoleInit();
|
|
|
|
virtual void OnStateChange(int NewState, int OldState);
|
2014-05-03 00:30:05 +00:00
|
|
|
virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, bool IsDummy = 0);
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void OnNewSnapshot();
|
|
|
|
virtual void OnPredict();
|
2011-01-17 11:28:37 +00:00
|
|
|
virtual void OnActivateEditor();
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual int OnSnapInput(int *pData);
|
|
|
|
virtual void OnShutdown();
|
|
|
|
virtual void OnEnterGame();
|
|
|
|
virtual void OnRconLine(const char *pLine);
|
2010-12-12 15:48:13 +00:00
|
|
|
virtual void OnGameOver();
|
2011-01-06 22:21:51 +00:00
|
|
|
virtual void OnStartGame();
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2014-07-07 23:41:45 +00:00
|
|
|
virtual void ResetDummyInput();
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual const char *GetItemName(int Type);
|
|
|
|
virtual const char *Version();
|
|
|
|
virtual const char *NetVersion();
|
2011-04-13 18:37:12 +00:00
|
|
|
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
// actions
|
|
|
|
// TODO: move these
|
|
|
|
void SendSwitchTeam(int Team);
|
|
|
|
void SendInfo(bool Start);
|
2014-04-28 13:19:57 +00:00
|
|
|
virtual void SendDummyInfo(bool Start);
|
2011-02-12 10:40:36 +00:00
|
|
|
void SendKill(int ClientID);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
// pointers to all systems
|
|
|
|
class CGameConsole *m_pGameConsole;
|
|
|
|
class CBinds *m_pBinds;
|
|
|
|
class CParticles *m_pParticles;
|
|
|
|
class CMenus *m_pMenus;
|
|
|
|
class CSkins *m_pSkins;
|
2011-03-16 11:09:22 +00:00
|
|
|
class CCountryFlags *m_pCountryFlags;
|
2010-05-29 07:25:38 +00:00
|
|
|
class CFlow *m_pFlow;
|
|
|
|
class CChat *m_pChat;
|
|
|
|
class CDamageInd *m_pDamageind;
|
|
|
|
class CCamera *m_pCamera;
|
|
|
|
class CControls *m_pControls;
|
|
|
|
class CEffects *m_pEffects;
|
|
|
|
class CSounds *m_pSounds;
|
|
|
|
class CMotd *m_pMotd;
|
|
|
|
class CMapImages *m_pMapimages;
|
|
|
|
class CVoting *m_pVoting;
|
2010-08-18 01:57:35 +00:00
|
|
|
class CScoreboard *m_pScoreboard;
|
2011-04-03 08:11:23 +00:00
|
|
|
class CItems *m_pItems;
|
2011-12-04 13:04:12 +00:00
|
|
|
class CMapLayers *m_pMapLayersBackGround;
|
|
|
|
class CMapLayers *m_pMapLayersForeGround;
|
2011-04-09 06:41:31 +00:00
|
|
|
|
|
|
|
// DDRace
|
2011-02-04 17:25:04 +00:00
|
|
|
|
|
|
|
class CRaceDemo *m_pRaceDemo;
|
|
|
|
class CGhost *m_pGhost;
|
2014-01-21 23:08:30 +00:00
|
|
|
class CTeamsCore m_Teams;
|
2011-04-09 06:41:31 +00:00
|
|
|
|
2014-01-30 03:10:52 +00:00
|
|
|
int IntersectCharacter(vec2 Pos0, vec2 Pos1, vec2& NewPos, int ownID);
|
2013-08-23 23:50:35 +00:00
|
|
|
|
2011-04-09 06:41:31 +00:00
|
|
|
private:
|
|
|
|
|
2014-04-27 11:44:04 +00:00
|
|
|
bool m_DDRaceMsgSent[2];
|
|
|
|
int m_ShowOthers[2];
|
2010-05-29 07:25:38 +00:00
|
|
|
};
|
|
|
|
|
2011-01-04 10:58:25 +00:00
|
|
|
|
|
|
|
inline float HueToRgb(float v1, float v2, float h)
|
|
|
|
{
|
2011-04-13 18:37:12 +00:00
|
|
|
if(h < 0.0f) h += 1;
|
|
|
|
if(h > 1.0f) h -= 1;
|
|
|
|
if((6.0f * h) < 1.0f) return v1 + (v2 - v1) * 6.0f * h;
|
|
|
|
if((2.0f * h) < 1.0f) return v2;
|
|
|
|
if((3.0f * h) < 2.0f) return v1 + (v2 - v1) * ((2.0f/3.0f) - h) * 6.0f;
|
|
|
|
return v1;
|
2011-01-04 10:58:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline vec3 HslToRgb(vec3 HSL)
|
|
|
|
{
|
|
|
|
if(HSL.s == 0.0f)
|
|
|
|
return vec3(HSL.l, HSL.l, HSL.l);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
float v2 = HSL.l < 0.5f ? HSL.l * (1.0f + HSL.s) : (HSL.l+HSL.s) - (HSL.s*HSL.l);
|
|
|
|
float v1 = 2.0f * HSL.l - v2;
|
|
|
|
|
|
|
|
return vec3(HueToRgb(v1, v2, HSL.h + (1.0f/3.0f)), HueToRgb(v1, v2, HSL.h), HueToRgb(v1, v2, HSL.h - (1.0f/3.0f)));
|
|
|
|
}
|
|
|
|
}
|
2011-08-13 00:11:06 +00:00
|
|
|
|
2014-07-07 13:43:34 +00:00
|
|
|
inline vec3 RgbToHsl(vec3 RGB)
|
|
|
|
{
|
|
|
|
vec3 HSL;
|
|
|
|
float maxColor = MAX3(RGB.r, RGB.g, RGB.b);
|
|
|
|
float minColor = MIN3(RGB.r, RGB.g, RGB.b);
|
|
|
|
if (minColor == maxColor)
|
|
|
|
return vec3(0.0f, 0.0f, RGB.g * 255.0f);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
HSL.l = (minColor + maxColor) / 2;
|
|
|
|
|
|
|
|
if (HSL.l < 0.5)
|
|
|
|
HSL.s = (maxColor - minColor) / (maxColor + minColor);
|
|
|
|
else
|
|
|
|
HSL.s = (maxColor - minColor) / (2.0 - maxColor - minColor);
|
|
|
|
|
|
|
|
if (RGB.r == maxColor)
|
|
|
|
HSL.h = (RGB.g - RGB.b) / (maxColor - minColor);
|
|
|
|
else if (RGB.g == maxColor)
|
|
|
|
HSL.h = 2.0 + (RGB.b - RGB.r) / (maxColor - minColor);
|
|
|
|
else
|
|
|
|
HSL.h = 4.0 + (RGB.r - RGB.g) / (maxColor - minColor);
|
|
|
|
|
|
|
|
HSL.h /= 6; //to bring it to a number between 0 and 1
|
|
|
|
if (HSL.h < 0) HSL.h++;
|
|
|
|
}
|
|
|
|
HSL.h = int(HSL.h * 255.0);
|
|
|
|
HSL.s = int(HSL.s * 255.0);
|
|
|
|
HSL.l = int(HSL.l * 255.0);
|
|
|
|
return HSL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-01-04 10:58:25 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
extern const char *Localize(const char *Str);
|
|
|
|
|
|
|
|
#endif
|