diff --git a/CMakeLists.txt b/CMakeLists.txt index d05f00ffd..ddd0b88db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1941,6 +1941,7 @@ set_src(ENGINE_SERVER GLOB_RECURSE src/engine/server upnp.h ) set_src(GAME_SERVER GLOB_RECURSE src/game/server + alloc.h ddracechat.cpp ddracechat.h ddracecommands.cpp diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 3717bb00b..d70c16702 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -272,6 +272,8 @@ CClient::CClient() : m_pSound = 0; m_pGameClient = 0; m_pMap = 0; + m_pConfigManager = 0; + m_pConfig = 0; m_pConsole = 0; m_RenderFrameTime = 0.0001f; @@ -2961,6 +2963,8 @@ void CClient::InitInterfaces() m_pInput = Kernel()->RequestInterface(); m_pMap = Kernel()->RequestInterface(); m_pMasterServer = Kernel()->RequestInterface(); + m_pConfigManager = Kernel()->RequestInterface(); + m_pConfig = m_pConfigManager->Values(); #if defined(CONF_AUTOUPDATE) m_pUpdater = Kernel()->RequestInterface(); #endif @@ -3338,8 +3342,7 @@ void CClient::Run() if(!s_SavedConfig) { // write down the config and quit - IConfig *pConfig = Kernel()->RequestInterface(); - if(!pConfig->Save()) + if(!m_pConfigManager->Save()) m_Warnings.emplace_back(SWarning(Localize("Saving ddnet-settings.cfg failed"))); s_SavedConfig = true; } @@ -4265,7 +4268,7 @@ int main(int argc, const char **argv) // ignore_convention IEngine *pEngine = CreateEngine("DDNet", Silent, 1); IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, argv); // ignore_convention - IConfig *pConfig = CreateConfig(); + IConfigManager *pConfigManager = CreateConfigManager(); IEngineSound *pEngineSound = CreateEngineSound(); IEngineInput *pEngineInput = CreateEngineInput(); IEngineTextRender *pEngineTextRender = CreateEngineTextRender(); @@ -4284,7 +4287,7 @@ int main(int argc, const char **argv) // ignore_convention RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngine); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); - RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); + RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfigManager); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineSound); // IEngineSound RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineSound), false); @@ -4316,7 +4319,8 @@ int main(int argc, const char **argv) // ignore_convention } pEngine->Init(); - pConfig->Init(); + pConfigManager->Init(); + pConsole->Init(); pEngineMasterServer->Init(); pEngineMasterServer->Load(); diff --git a/src/engine/client/client.h b/src/engine/client/client.h index 53ef17668..dae4c1131 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -90,6 +90,8 @@ class CClient : public IClient, public CDemoPlayer::IListener IEngineSound *m_pSound; IGameClient *m_pGameClient; IEngineMap *m_pMap; + IConfigManager *m_pConfigManager; + CConfig *m_pConfig; IConsole *m_pConsole; IStorage *m_pStorage; IUpdater *m_pUpdater; @@ -274,6 +276,8 @@ public: IEngineSound *Sound() { return m_pSound; } IGameClient *GameClient() { return m_pGameClient; } IEngineMasterServer *MasterServer() { return m_pMasterServer; } + IConfigManager *ConfigManager() { return m_pConfigManager; } + CConfig *Config() { return m_pConfig; } IStorage *Storage() { return m_pStorage; } IUpdater *Updater() { return m_pUpdater; } ISteam *Steam() { return m_pSteam; } diff --git a/src/engine/client/friends.cpp b/src/engine/client/friends.cpp index ca07aee11..aed61520a 100644 --- a/src/engine/client/friends.cpp +++ b/src/engine/client/friends.cpp @@ -38,9 +38,9 @@ void CFriends::Init(bool Foes) { m_Foes = Foes; - IConfig *pConfig = Kernel()->RequestInterface(); - if(pConfig) - pConfig->RegisterCallback(ConfigSaveCallback, this); + IConfigManager *pConfigManager = Kernel()->RequestInterface(); + if(pConfigManager) + pConfigManager->RegisterCallback(ConfigSaveCallback, this); IConsole *pConsole = Kernel()->RequestInterface(); if(pConsole) @@ -158,7 +158,7 @@ void CFriends::Friends() } } -void CFriends::ConfigSaveCallback(IConfig *pConfig, void *pUserData) +void CFriends::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) { CFriends *pSelf = (CFriends *)pUserData; char aBuf[128]; @@ -175,6 +175,6 @@ void CFriends::ConfigSaveCallback(IConfig *pConfig, void *pUserData) str_escape(&pDst, pSelf->m_aFriends[i].m_aClan, pEnd); str_append(aBuf, "\"", sizeof(aBuf)); - pConfig->WriteLine(aBuf); + pConfigManager->WriteLine(aBuf); } } diff --git a/src/engine/client/friends.h b/src/engine/client/friends.h index 8e98c9b49..983137862 100644 --- a/src/engine/client/friends.h +++ b/src/engine/client/friends.h @@ -17,7 +17,7 @@ class CFriends : public IFriends static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData); static void ConFriends(IConsole::IResult *pResult, void *pUserData); - static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); + static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); public: CFriends(); diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index b24b25c9d..a7e992118 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -89,9 +89,9 @@ void CServerBrowser::SetBaseInfo(class CNetClient *pClient, const char *pNetVers m_pMasterServer = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); m_pFriends = Kernel()->RequestInterface(); - IConfig *pConfig = Kernel()->RequestInterface(); - if(pConfig) - pConfig->RegisterCallback(ConfigSaveCallback, this); + IConfigManager *pConfigManager = Kernel()->RequestInterface(); + if(pConfigManager) + pConfigManager->RegisterCallback(ConfigSaveCallback, this); } const CServerInfo *CServerBrowser::SortedGet(int Index) const @@ -1264,7 +1264,7 @@ int CServerBrowser::LoadingProgression() const return 100.0f * Loaded / Servers; } -void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData) +void CServerBrowser::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) { CServerBrowser *pSelf = (CServerBrowser *)pUserData; @@ -1274,7 +1274,7 @@ void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData) { net_addr_str(&pSelf->m_aFavoriteServers[i], aAddrStr, sizeof(aAddrStr), true); str_format(aBuffer, sizeof(aBuffer), "add_favorite %s", aAddrStr); - pConfig->WriteLine(aBuffer); + pConfigManager->WriteLine(aBuffer); } } diff --git a/src/engine/client/serverbrowser.h b/src/engine/client/serverbrowser.h index 97e503300..9409dc22f 100644 --- a/src/engine/client/serverbrowser.h +++ b/src/engine/client/serverbrowser.h @@ -206,7 +206,7 @@ private: void SetInfo(CServerEntry *pEntry, const CServerInfo &Info); - static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); + static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); }; #endif diff --git a/src/engine/config.h b/src/engine/config.h index 087626c8f..ab6d1a176 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -5,21 +5,22 @@ #include "kernel.h" -class IConfig : public IInterface +class IConfigManager : public IInterface { MACRO_INTERFACE("config", 0) public: - typedef void (*SAVECALLBACKFUNC)(IConfig *pConfig, void *pUserData); + typedef void (*SAVECALLBACKFUNC)(IConfigManager *pConfig, void *pUserData); virtual void Init() = 0; virtual void Reset() = 0; virtual bool Save() = 0; + virtual class CConfig *Values() = 0; virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0; virtual void WriteLine(const char *pLine) = 0; }; -extern IConfig *CreateConfig(); +extern IConfigManager *CreateConfigManager(); #endif diff --git a/src/engine/console.h b/src/engine/console.h index 822bb399d..f19ad3737 100644 --- a/src/engine/console.h +++ b/src/engine/console.h @@ -81,6 +81,7 @@ public: typedef void (*FCommandCallback)(IResult *pResult, void *pUserData); typedef void (*FChainCommandCallback)(IResult *pResult, void *pUserData, FCommandCallback pfnCallback, void *pCallbackUserData); + virtual void Init() = 0; virtual const CCommandInfo *FirstCommandInfo(int AccessLevel, int Flagmask) const = 0; virtual const CCommandInfo *GetCommandInfo(const char *pName, int FlagMask, bool Temp) = 0; virtual void PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser) = 0; diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp index 90fdde17b..63b8b5d67 100644 --- a/src/engine/server/register.cpp +++ b/src/engine/server/register.cpp @@ -118,10 +118,11 @@ void CRegister::RegisterGotCount(CNetChunk *pChunk) } } -void CRegister::Init(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) +void CRegister::Init(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole) { m_pNetServer = pNetServer; m_pMasterServer = pMasterServer; + m_pConfig = pConfig; m_pConsole = pConsole; } diff --git a/src/engine/server/register.h b/src/engine/server/register.h index 6dfed8c33..36583f3c7 100644 --- a/src/engine/server/register.h +++ b/src/engine/server/register.h @@ -29,6 +29,7 @@ class CRegister class CNetServer *m_pNetServer; class IEngineMasterServer *m_pMasterServer; + class CConfig *m_pConfig; class IConsole *m_pConsole; bool m_Sixup; @@ -51,7 +52,7 @@ class CRegister public: CRegister(bool Sixup); - void Init(class CNetServer *pNetServer, class IEngineMasterServer *pMasterServer, class IConsole *pConsole); + void Init(class CNetServer *pNetServer, class IEngineMasterServer *pMasterServer, class CConfig *pConfig, class IConsole *pConsole); void RegisterUpdate(int Nettype); int RegisterProcessPacket(struct CNetChunk *pPacket, SECURITY_TOKEN ResponseToken = 0); void FeedToken(NETADDR Addr, SECURITY_TOKEN ResponseToken); diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 55becd2b5..8a0fef07c 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -2335,10 +2335,10 @@ int CServer::LoadMap(const char *pMapName) return 1; } -void CServer::InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) +void CServer::InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole) { - m_Register.Init(pNetServer, pMasterServer, pConsole); - m_RegSixup.Init(pNetServer, pMasterServer, pConsole); + m_Register.Init(pNetServer, pMasterServer, pConfig, pConsole); + m_RegSixup.Init(pNetServer, pMasterServer, pConfig, pConsole); } int CServer::Run() @@ -2407,7 +2407,7 @@ int CServer::Run() m_NetServer.SetCallbacks(NewClientCallback, NewClientNoAuthCallback, ClientRejoinCallback, DelClientCallback, this); - m_Econ.Init(Console(), &m_ServerBan); + m_Econ.Init(Config(), Console(), &m_ServerBan); #if defined(CONF_FAMILY_UNIX) m_Fifo.Init(Console(), g_Config.m_SvInputFifo, CFGFLAG_SERVER); @@ -3495,10 +3495,10 @@ int main(int argc, const char **argv) // ignore_convention IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention - IConfig *pConfig = CreateConfig(); + IConfigManager *pConfigManager = CreateConfigManager(); IEngineAntibot *pEngineAntibot = CreateEngineAntibot(); - pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole); + pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConfigManager->Values(), pConsole); { bool RegisterFail = false; @@ -3510,7 +3510,7 @@ int main(int argc, const char **argv) // ignore_convention RegisterFail = RegisterFail || !pKernel->RegisterInterface(pGameServer); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage); - RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); + RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfigManager); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineMasterServer); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMasterServer), false); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineAntibot); @@ -3524,7 +3524,8 @@ int main(int argc, const char **argv) // ignore_convention } pEngine->Init(); - pConfig->Init(); + pConfigManager->Init(); + pConsole->Init(); pEngineMasterServer->Init(); pEngineMasterServer->Load(); diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 02ed93a4e..61052e302 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -89,6 +89,7 @@ public: class CServer : public IServer { class IGameServer *m_pGameServer; + class CConfig *m_pConfig; class IConsole *m_pConsole; class IStorage *m_pStorage; class IEngineAntibot *m_pAntibot; @@ -107,6 +108,7 @@ class CServer : public IServer public: class IGameServer *GameServer() { return m_pGameServer; } + class CConfig *Config() { return m_pConfig; } class IConsole *Console() { return m_pConsole; } class IStorage *Storage() { return m_pStorage; } class IEngineAntibot *Antibot() { return m_pAntibot; } @@ -366,7 +368,7 @@ public: void StopRecord(int ClientID); bool IsRecording(int ClientID); - void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole); + void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole); int Run(); static void ConTestingCommands(IConsole::IResult *pResult, void *pUser); diff --git a/src/engine/shared/config.cpp b/src/engine/shared/config.cpp index 7de9cbe8f..bc56c1f2e 100644 --- a/src/engine/shared/config.cpp +++ b/src/engine/shared/config.cpp @@ -5,49 +5,35 @@ #include #include -CConfiguration g_Config; +CConfig g_Config; -class CConfig : public IConfig +void EscapeParam(char *pDst, const char *pSrc, int size) { - IStorage *m_pStorage; - IOHANDLE m_ConfigFile; - bool m_Failed; - - struct CCallback + for(int i = 0; *pSrc && i < size - 1; ++i) { - SAVECALLBACKFUNC m_pfnFunc; - void *m_pUserData; - }; - - enum - { - MAX_CALLBACKS = 16 - }; - - CCallback m_aCallbacks[MAX_CALLBACKS]; - int m_NumCallbacks; - - void EscapeParam(char *pDst, const char *pSrc, int Size) - { - str_escape(&pDst, pSrc, pDst + Size); + if(*pSrc == '"' || *pSrc == '\\') // escape \ and " + *pDst++ = '\\'; + *pDst++ = *pSrc++; } + *pDst = 0; +} -public: - CConfig() - { - m_ConfigFile = 0; - m_NumCallbacks = 0; - m_Failed = false; - } +CConfigManager::CConfigManager() +{ + m_pStorage = 0; + m_ConfigFile = 0; + m_NumCallbacks = 0; + m_Failed = false; +} - virtual void Init() - { - m_pStorage = Kernel()->RequestInterface(); - Reset(); - } +void CConfigManager::Init() +{ + m_pStorage = Kernel()->RequestInterface(); + Reset(); +} - virtual void Reset() - { +void CConfigManager::Reset() +{ #define MACRO_CONFIG_INT(Name, ScriptName, def, min, max, flags, desc) g_Config.m_##Name = def; #define MACRO_CONFIG_COL(Name, ScriptName, def, flags, desc) MACRO_CONFIG_INT(Name, ScriptName, def, 0, 0, flags, desc) #define MACRO_CONFIG_STR(Name, ScriptName, len, def, flags, desc) str_copy(g_Config.m_##Name, def, len); @@ -57,28 +43,28 @@ public: #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_COL #undef MACRO_CONFIG_STR +} + +bool CConfigManager::Save() +{ + if(!m_pStorage || !g_Config.m_ClSaveSettings) + return true; + + char aConfigFileTmp[64]; + str_format(aConfigFileTmp, sizeof(aConfigFileTmp), CONFIG_FILE ".%d.tmp", pid()); + + m_ConfigFile = m_pStorage->OpenFile(aConfigFileTmp, IOFLAG_WRITE, IStorage::TYPE_SAVE); + + if(!m_ConfigFile) + { + dbg_msg("config", "ERROR: opening %s failed", aConfigFileTmp); + return false; } - virtual bool Save() - { - if(!m_pStorage || !g_Config.m_ClSaveSettings) - return true; + m_Failed = false; - char aConfigFileTmp[64]; - str_format(aConfigFileTmp, sizeof(aConfigFileTmp), CONFIG_FILE ".%d.tmp", pid()); - - m_ConfigFile = m_pStorage->OpenFile(aConfigFileTmp, IOFLAG_WRITE, IStorage::TYPE_SAVE); - - if(!m_ConfigFile) - { - dbg_msg("config", "ERROR: opening %s failed", aConfigFileTmp); - return false; - } - - m_Failed = false; - - char aLineBuf[1024 * 2]; - char aEscapeBuf[1024 * 2]; + char aLineBuf[1024 * 2]; + char aEscapeBuf[1024 * 2]; #define MACRO_CONFIG_INT(Name, ScriptName, def, min, max, flags, desc) \ if((flags)&CFGFLAG_SAVE && g_Config.m_##Name != def) \ @@ -106,48 +92,47 @@ public: #undef MACRO_CONFIG_COL #undef MACRO_CONFIG_STR - for(int i = 0; i < m_NumCallbacks; i++) - m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData); + for(int i = 0; i < m_NumCallbacks; i++) + m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData); - if(io_close(m_ConfigFile) != 0) - m_Failed = true; + if(io_close(m_ConfigFile) != 0) + m_Failed = true; - m_ConfigFile = 0; + m_ConfigFile = 0; - if(m_Failed) - { - dbg_msg("config", "ERROR: writing to %s failed", aConfigFileTmp); - return false; - } - - if(!m_pStorage->RenameFile(aConfigFileTmp, CONFIG_FILE, IStorage::TYPE_SAVE)) - { - dbg_msg("config", "ERROR: renaming %s to " CONFIG_FILE " failed", aConfigFileTmp); - return false; - } - - return true; + if(m_Failed) + { + dbg_msg("config", "ERROR: writing to %s failed", aConfigFileTmp); + return false; } - virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) + if(!m_pStorage->RenameFile(aConfigFileTmp, CONFIG_FILE, IStorage::TYPE_SAVE)) { - dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks"); - m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc; - m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData; - m_NumCallbacks++; + dbg_msg("config", "ERROR: renaming %s to " CONFIG_FILE " failed", aConfigFileTmp); + return false; } - virtual void WriteLine(const char *pLine) - { - if(!m_ConfigFile || - io_write(m_ConfigFile, pLine, str_length(pLine)) != static_cast(str_length(pLine)) || + return true; +} + +void CConfigManager::RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) +{ + dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks"); + m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc; + m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData; + m_NumCallbacks++; +} + +void CConfigManager::WriteLine(const char *pLine) +{ + if(!m_ConfigFile || + io_write(m_ConfigFile, pLine, str_length(pLine)) != static_cast(str_length(pLine)) || #if defined(CONF_FAMILY_WINDOWS) - io_write_newline(m_ConfigFile) != 2) + io_write_newline(m_ConfigFile) != 2) #else - io_write_newline(m_ConfigFile) != 1) + io_write_newline(m_ConfigFile) != 1) #endif - m_Failed = true; - } -}; + m_Failed = true; +} -IConfig *CreateConfig() { return new CConfig; } +IConfigManager *CreateConfigManager() { return new CConfigManager; } diff --git a/src/engine/shared/config.h b/src/engine/shared/config.h index f5c3c5b4f..ef5555926 100644 --- a/src/engine/shared/config.h +++ b/src/engine/shared/config.h @@ -4,14 +4,16 @@ #define ENGINE_SHARED_CONFIG_H #include +#include #define CONFIG_FILE "settings_ddnet.cfg" #define AUTOEXEC_FILE "autoexec.cfg" #define AUTOEXEC_CLIENT_FILE "autoexec_client.cfg" #define AUTOEXEC_SERVER_FILE "autoexec_server.cfg" -struct CConfiguration +class CConfig { +public: #define MACRO_CONFIG_INT(Name, ScriptName, Def, Min, Max, Save, Desc) int m_##Name; #define MACRO_CONFIG_COL(Name, ScriptName, Def, Save, Desc) unsigned m_##Name; #define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Save, Desc) char m_##Name[Len]; // Flawfinder: ignore @@ -21,7 +23,7 @@ struct CConfiguration #undef MACRO_CONFIG_STR }; -extern CConfiguration g_Config; +extern CConfig g_Config; enum { @@ -41,4 +43,36 @@ enum CFGFLAG_COLALPHA = 1 << 11, }; +class CConfigManager : public IConfigManager +{ + enum + { + MAX_CALLBACKS = 16 + }; + + struct CCallback + { + SAVECALLBACKFUNC m_pfnFunc; + void *m_pUserData; + }; + + class IStorage *m_pStorage; + IOHANDLE m_ConfigFile; + bool m_Failed; + CCallback m_aCallbacks[MAX_CALLBACKS]; + int m_NumCallbacks; + +public: + CConfigManager(); + + virtual void Init(); + virtual void Reset(); + virtual bool Save(); + virtual CConfig *Values() { return &g_Config; } + + virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData); + + virtual void WriteLine(const char *pLine); +}; + #endif diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 57abb3072..949c7923d 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -571,8 +571,6 @@ void CConsole::ExecuteFile(const char *pFilename, int ClientID, bool LogFailure, if(str_comp(pFilename, pCur->m_pFilename) == 0) return; - if(!m_pStorage) - m_pStorage = Kernel()->RequestInterface(); if(!m_pStorage) return; @@ -951,6 +949,31 @@ CConsole::CConsole(int FlagMask) Register("access_status", "i[accesslevel]", CFGFLAG_SERVER, ConCommandStatus, this, "List all commands which are accessible for admin = 0, moderator = 1, helper = 2, all = 3"); Register("cmdlist", "", CFGFLAG_SERVER | CFGFLAG_CHAT, ConUserCommandStatus, this, "List all commands which are accessible for users"); + // DDRace + + m_Cheated = false; +} + +CConsole::~CConsole() +{ + CCommand *pCommand = m_pFirstCommand; + while(pCommand) + { + CCommand *pNext = pCommand->m_pNext; + if(pCommand->m_pfnCallback == Con_Chain) + delete static_cast(pCommand->m_pUserData); + // Temp commands are on m_TempCommands heap, so don't delete them + if(!pCommand->m_Temp) + delete pCommand; + pCommand = pNext; + } +} + +void CConsole::Init() +{ + m_pConfig = Kernel()->RequestInterface()->Values(); + m_pStorage = Kernel()->RequestInterface(); + // TODO: this should disappear #define MACRO_CONFIG_INT(Name, ScriptName, Def, Min, Max, Flags, Desc) \ { \ @@ -977,25 +1000,6 @@ CConsole::CConsole(int FlagMask) #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_COL #undef MACRO_CONFIG_STR - - // DDRace - - m_Cheated = false; -} - -CConsole::~CConsole() -{ - CCommand *pCommand = m_pFirstCommand; - while(pCommand) - { - CCommand *pNext = pCommand->m_pNext; - if(pCommand->m_pfnCallback == Con_Chain) - delete static_cast(pCommand->m_pUserData); - // Temp commands are on m_TempCommands heap, so don't delete them - if(!pCommand->m_Temp) - delete pCommand; - pCommand = pNext; - } } void CConsole::ParseArguments(int NumArgs, const char **ppArguments) diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 2e714a117..7cf26724c 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -46,6 +46,7 @@ class CConsole : public IConsole }; CExecFile *m_pFirstExec; + class CConfig *m_pConfig; class IStorage *m_pStorage; int m_AccessLevel; @@ -196,6 +197,7 @@ public: CConsole(int FlagMask); ~CConsole(); + virtual void Init(); virtual const CCommandInfo *FirstCommandInfo(int AccessLevel, int FlagMask) const; virtual const CCommandInfo *GetCommandInfo(const char *pName, int FlagMask, bool Temp); virtual void PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser); diff --git a/src/engine/shared/econ.cpp b/src/engine/shared/econ.cpp index f48f4499b..2a7412d40 100644 --- a/src/engine/shared/econ.cpp +++ b/src/engine/shared/econ.cpp @@ -59,8 +59,9 @@ void CEcon::ConLogout(IConsole::IResult *pResult, void *pUserData) pThis->m_NetConsole.Drop(pThis->m_UserClientID, "Logout"); } -void CEcon::Init(IConsole *pConsole, CNetBan *pNetBan) +void CEcon::Init(CConfig *pConfig, IConsole *pConsole, CNetBan *pNetBan) { + m_pConfig = pConfig; m_pConsole = pConsole; for(auto &Client : m_aClients) diff --git a/src/engine/shared/econ.h b/src/engine/shared/econ.h index a7f82a984..f45aba38a 100644 --- a/src/engine/shared/econ.h +++ b/src/engine/shared/econ.h @@ -5,6 +5,8 @@ #include +class CConfig; + class CEcon { enum @@ -28,6 +30,7 @@ class CEcon }; CClient m_aClients[NET_MAX_CONSOLE_CLIENTS]; + CConfig *m_pConfig; IConsole *m_pConsole; CNetConsole m_NetConsole; @@ -45,7 +48,7 @@ class CEcon public: IConsole *Console() { return m_pConsole; } - void Init(IConsole *pConsole, class CNetBan *pNetBan); + void Init(CConfig *pConfig, IConsole *pConsole, class CNetBan *pNetBan); void Update(); void Send(int ClientID, const char *pLine); void Shutdown(); diff --git a/src/game/client/component.h b/src/game/client/component.h index 89ad7dd42..f9f60ebe5 100644 --- a/src/game/client/component.h +++ b/src/game/client/component.h @@ -26,6 +26,7 @@ protected: class CUI *UI() const { return m_pClient->UI(); } class ISound *Sound() const { return m_pClient->Sound(); } class CRenderTools *RenderTools() const { return m_pClient->RenderTools(); } + class CConfig *Config() const { return m_pClient->Config(); } class IConsole *Console() const { return m_pClient->Console(); } class IDemoPlayer *DemoPlayer() const { return m_pClient->DemoPlayer(); } class IDemoRecorder *DemoRecorder(int Recorder) const { return m_pClient->DemoRecorder(Recorder); } diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp index 724482997..e1ded9e76 100644 --- a/src/game/client/components/binds.cpp +++ b/src/game/client/components/binds.cpp @@ -250,9 +250,9 @@ void CBinds::SetDefaults() void CBinds::OnConsoleInit() { // bindings - IConfig *pConfig = Kernel()->RequestInterface(); - if(pConfig) - pConfig->RegisterCallback(ConfigSaveCallback, this); + IConfigManager *pConfigManager = Kernel()->RequestInterface(); + if(pConfigManager) + pConfigManager->RegisterCallback(ConfigSaveCallback, this); Console()->Register("bind", "s[key] r[command]", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute the command"); Console()->Register("dump_binds", "?s[key]", CFGFLAG_CLIENT, ConDumpBinds, this, "Print command executed by this keybindind or all binds"); @@ -423,13 +423,13 @@ const char *CBinds::GetKeyBindModifiersName(int Modifier) return aModifier; } -void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData) +void CBinds::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) { CBinds *pSelf = (CBinds *)pUserData; char aBuffer[256]; char *pEnd = aBuffer + sizeof(aBuffer); - pConfig->WriteLine("unbindall"); + pConfigManager->WriteLine("unbindall"); for(int i = 0; i < MODIFIER_COMBINATION_COUNT; i++) { for(int j = 0; j < KEY_LAST; j++) @@ -443,7 +443,7 @@ void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData) str_escape(&pDst, pSelf->m_aapKeyBindings[i][j], pEnd); str_append(aBuffer, "\"", sizeof(aBuffer)); - pConfig->WriteLine(aBuffer); + pConfigManager->WriteLine(aBuffer); } } } diff --git a/src/game/client/components/binds.h b/src/game/client/components/binds.h index 4eaff794e..f09475dcf 100644 --- a/src/game/client/components/binds.h +++ b/src/game/client/components/binds.h @@ -15,7 +15,7 @@ class CBinds : public CComponent static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData); class IConsole *GetConsole() const { return Console(); } - static void ConfigSaveCallback(class IConfig *pConfig, void *pUserData); + static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); public: CBinds(); diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index d1feeaa58..149fbae49 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -744,8 +744,6 @@ void CMenus::RenderSettingsTee(CUIRect MainView) TextRender()->SetCurFont(NULL); } -typedef void (*pfnAssignFuncCallback)(CConfiguration *pConfig, int Value); - typedef struct { CLocConstString m_Name; diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index bcf02fc4e..cce0d3639 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -84,6 +84,7 @@ class CGameClient : public IGameClient class ITextRender *m_pTextRender; class IClient *m_pClient; class ISound *m_pSound; + class CConfig *m_pConfig; class IConsole *m_pConsole; class IStorage *m_pStorage; class IDemoPlayer *m_pDemoPlayer; @@ -135,6 +136,7 @@ public: class ISound *Sound() const { return m_pSound; } class IInput *Input() const { return m_pInput; } class IStorage *Storage() const { return m_pStorage; } + class CConfig *Config() const { return m_pConfig; } class IConsole *Console() { return m_pConsole; } class ITextRender *TextRender() const { return m_pTextRender; } class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; } diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index a9412c846..fb91eaebe 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -6346,6 +6346,7 @@ void CEditor::Init() { m_pInput = Kernel()->RequestInterface(); m_pClient = Kernel()->RequestInterface(); + m_pConfig = Kernel()->RequestInterface()->Values(); m_pConsole = Kernel()->RequestInterface(); m_pGraphics = Kernel()->RequestInterface(); m_pTextRender = Kernel()->RequestInterface(); diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index abce25cd6..fd793ea98 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -631,6 +631,7 @@ class CEditor : public IEditor { class IInput *m_pInput; class IClient *m_pClient; + class CConfig *m_pConfig; class IConsole *m_pConsole; class IGraphics *m_pGraphics; class ITextRender *m_pTextRender; @@ -642,6 +643,7 @@ class CEditor : public IEditor public: class IInput *Input() { return m_pInput; }; class IClient *Client() { return m_pClient; }; + class CConfig *Config() { return m_pConfig; } class IConsole *Console() { return m_pConsole; }; class IGraphics *Graphics() { return m_pGraphics; }; class ISound *Sound() { return m_pSound; } diff --git a/src/game/server/alloc.h b/src/game/server/alloc.h new file mode 100644 index 000000000..3fcb7799d --- /dev/null +++ b/src/game/server/alloc.h @@ -0,0 +1,62 @@ +/* (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. */ +#ifndef GAME_SERVER_ALLOC_H +#define GAME_SERVER_ALLOC_H + +#include + +#include + +#define MACRO_ALLOC_HEAP() \ +public: \ + void *operator new(size_t Size) \ + { \ + void *p = malloc(Size); \ + mem_zero(p, Size); \ + return p; \ + } \ + void operator delete(void *pPtr) \ + { \ + free(pPtr); \ + } \ +\ +private: + +#define MACRO_ALLOC_POOL_ID() \ +public: \ + void *operator new(size_t Size, int id); \ + void operator delete(void *p, int id); \ + void operator delete(void *p); /* NOLINT(misc-new-delete-overloads) */ \ +\ +private: + +#define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, PoolSize) \ + static char ms_PoolData##POOLTYPE[PoolSize][sizeof(POOLTYPE)] = {{0}}; \ + static int ms_PoolUsed##POOLTYPE[PoolSize] = {0}; \ + void *POOLTYPE::operator new(size_t Size, int id) \ + { \ + dbg_assert(sizeof(POOLTYPE) == Size, "size error"); \ + dbg_assert(!ms_PoolUsed##POOLTYPE[id], "already used"); \ + /*dbg_msg("pool", "++ %s %d", #POOLTYPE, id);*/ \ + ms_PoolUsed##POOLTYPE[id] = 1; \ + mem_zero(ms_PoolData##POOLTYPE[id], Size); \ + return ms_PoolData##POOLTYPE[id]; \ + } \ + void POOLTYPE::operator delete(void *p, int id) \ + { \ + dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ + dbg_assert(id == (POOLTYPE *)p - (POOLTYPE *)ms_PoolData##POOLTYPE, "invalid id"); \ + /*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \ + ms_PoolUsed##POOLTYPE[id] = 0; \ + mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ + } \ + void POOLTYPE::operator delete(void *p) /* NOLINT(misc-new-delete-overloads) */ \ + { \ + int id = (POOLTYPE *)p - (POOLTYPE *)ms_PoolData##POOLTYPE; \ + dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ + /*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \ + ms_PoolUsed##POOLTYPE[id] = 0; \ + mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ + } + +#endif diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 969fa7255..5c3c54a54 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -7,6 +7,9 @@ #include #include +#include "entities/character.h" +#include "player.h" + bool CheckClientID(int ClientID); void CGameContext::ConCredits(IConsole::IResult *pResult, void *pUserData) diff --git a/src/game/server/ddracecommands.cpp b/src/game/server/ddracecommands.cpp index fe24381fc..9f0986df5 100644 --- a/src/game/server/ddracecommands.cpp +++ b/src/game/server/ddracecommands.cpp @@ -1,7 +1,9 @@ /* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */ #include "gamecontext.h" #include +#include #include +#include #include #include #include diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 4fffa4337..8ec28a7fd 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -2,8 +2,10 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include +#include #include #include +#include #include #include "character.h" @@ -18,9 +20,8 @@ MACRO_ALLOC_POOL_ID_IMPL(CCharacter, MAX_CLIENTS) // Character, "physical" player's part CCharacter::CCharacter(CGameWorld *pWorld) : - CEntity(pWorld, CGameWorld::ENTTYPE_CHARACTER) + CEntity(pWorld, CGameWorld::ENTTYPE_CHARACTER, vec2(0, 0), ms_PhysSize) { - m_ProximityRadius = ms_PhysSize; m_Health = 0; m_Armor = 0; m_StrongWeakID = 0; @@ -128,12 +129,12 @@ void CCharacter::SetSolo(bool Solo) bool CCharacter::IsGrounded() { - if(GameServer()->Collision()->CheckPoint(m_Pos.x + m_ProximityRadius / 2, m_Pos.y + m_ProximityRadius / 2 + 5)) + if(GameServer()->Collision()->CheckPoint(m_Pos.x + GetProximityRadius() / 2, m_Pos.y + GetProximityRadius() / 2 + 5)) return true; - if(GameServer()->Collision()->CheckPoint(m_Pos.x - m_ProximityRadius / 2, m_Pos.y + m_ProximityRadius / 2 + 5)) + if(GameServer()->Collision()->CheckPoint(m_Pos.x - GetProximityRadius() / 2, m_Pos.y + GetProximityRadius() / 2 + 5)) return true; - int MoveRestrictionsBelow = GameServer()->Collision()->GetMoveRestrictions(m_Pos + vec2(0, m_ProximityRadius / 2 + 4), 0.0f); + int MoveRestrictionsBelow = GameServer()->Collision()->GetMoveRestrictions(m_Pos + vec2(0, GetProximityRadius() / 2 + 4), 0.0f); if(MoveRestrictionsBelow & CANTMOVE_DOWN) { return true; @@ -223,7 +224,7 @@ void CCharacter::HandleNinja() // Set velocity m_Core.m_Vel = m_Ninja.m_ActivationDir * g_pData->m_Weapons.m_Ninja.m_Velocity; vec2 OldPos = m_Pos; - GameServer()->Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(m_ProximityRadius, m_ProximityRadius), 0.f); + GameServer()->Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(GetProximityRadius(), GetProximityRadius()), 0.f); // reset velocity so the client doesn't predict stuff m_Core.m_Vel = vec2(0.f, 0.f); @@ -232,7 +233,7 @@ void CCharacter::HandleNinja() { CCharacter *aEnts[MAX_CLIENTS]; vec2 Dir = m_Pos - OldPos; - float Radius = m_ProximityRadius * 2.0f; + float Radius = GetProximityRadius() * 2.0f; vec2 Center = OldPos + Dir * 0.5f; int Num = GameServer()->m_World.FindEntities(Center, Radius, (CEntity **)aEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); @@ -264,7 +265,7 @@ void CCharacter::HandleNinja() continue; // check so we are sufficiently close - if(distance(aEnts[i]->m_Pos, m_Pos) > (m_ProximityRadius * 2.0f)) + if(distance(aEnts[i]->m_Pos, m_Pos) > (GetProximityRadius() * 2.0f)) continue; // Hit a player, give him damage and stuffs... @@ -399,7 +400,7 @@ void CCharacter::FireWeapon() return; } - vec2 ProjStartPos = m_Pos + Direction * m_ProximityRadius * 0.75f; + vec2 ProjStartPos = m_Pos + Direction * GetProximityRadius() * 0.75f; switch(m_Core.m_ActiveWeapon) { @@ -416,7 +417,7 @@ void CCharacter::FireWeapon() CCharacter *apEnts[MAX_CLIENTS]; int Hits = 0; - int Num = GameServer()->m_World.FindEntities(ProjStartPos, m_ProximityRadius * 0.5f, (CEntity **)apEnts, + int Num = GameServer()->m_World.FindEntities(ProjStartPos, GetProximityRadius() * 0.5f, (CEntity **)apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for(int i = 0; i < Num; ++i) @@ -429,7 +430,7 @@ void CCharacter::FireWeapon() // set his velocity to fast upward (for now) if(length(pTarget->m_Pos - ProjStartPos) > 0.0f) - GameServer()->CreateHammerHit(pTarget->m_Pos - normalize(pTarget->m_Pos - ProjStartPos) * m_ProximityRadius * 0.5f, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); + GameServer()->CreateHammerHit(pTarget->m_Pos - normalize(pTarget->m_Pos - ProjStartPos) * GetProximityRadius() * 0.5f, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); else GameServer()->CreateHammerHit(ProjStartPos, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); @@ -1379,13 +1380,13 @@ void CCharacter::HandleBroadcast() void CCharacter::HandleSkippableTiles(int Index) { // handle death-tiles and leaving gamelayer - if((GameServer()->Collision()->GetCollisionAt(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y + m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x - m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y + m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x - m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f) == TILE_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x - m_ProximityRadius / 3.f, m_Pos.y + m_ProximityRadius / 3.f) == TILE_DEATH) && + if((GameServer()->Collision()->GetCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetFCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetFCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetFCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH) && !m_Super && !(Team() && Teams()->TeeFinished(m_pPlayer->GetCID()))) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); @@ -1477,10 +1478,10 @@ void CCharacter::HandleTiles(int Index) m_TileFIndex = GameServer()->Collision()->GetFTileIndex(MapIndex); m_MoveRestrictions = GameServer()->Collision()->GetMoveRestrictions(IsSwitchActiveCb, this, m_Pos, 18.0f, MapIndex); //Sensitivity - int S1 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f)); - int S2 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x + m_ProximityRadius / 3.f, m_Pos.y + m_ProximityRadius / 3.f)); - int S3 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x - m_ProximityRadius / 3.f, m_Pos.y - m_ProximityRadius / 3.f)); - int S4 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x - m_ProximityRadius / 3.f, m_Pos.y + m_ProximityRadius / 3.f)); + int S1 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f)); + int S2 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f)); + int S3 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f)); + int S4 = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f)); int Tile1 = GameServer()->Collision()->GetTileIndex(S1); int Tile2 = GameServer()->Collision()->GetTileIndex(S2); int Tile3 = GameServer()->Collision()->GetTileIndex(S3); diff --git a/src/game/server/entities/character.h b/src/game/server/entities/character.h index c7cdf8116..c61747c8b 100644 --- a/src/game/server/entities/character.h +++ b/src/game/server/entities/character.h @@ -4,24 +4,13 @@ #define GAME_SERVER_ENTITIES_CHARACTER_H #include -#include -#include #include #include -#include - class CAntibot; class CGameTeams; struct CAntibotCharacterData; -enum -{ - WEAPON_GAME = -3, // team switching etc - WEAPON_SELF = -2, // console kill command - WEAPON_WORLD = -1, // death tiles etc -}; - enum { FAKETUNE_FREEZE = 1, diff --git a/src/game/server/entities/door.cpp b/src/game/server/entities/door.cpp index 10eaea737..3161b61fd 100644 --- a/src/game/server/entities/door.cpp +++ b/src/game/server/entities/door.cpp @@ -3,7 +3,9 @@ #include #include #include +#include +#include "character.h" #include "door.h" CDoor::CDoor(CGameWorld *pGameWorld, vec2 Pos, float Rotation, int Length, @@ -64,7 +66,7 @@ void CDoor::Snap(int SnappingClient) return; CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem( - NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); if(!pObj) return; diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index 484293600..6f154ed5f 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -6,8 +6,11 @@ #include #include #include +#include #include +#include "character.h" + CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CaughtTeam, int Layer, int Number) : CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) @@ -222,7 +225,7 @@ void CDragger::Snap(int SnappingClient) if(i == -1) { obj = static_cast(Server()->SnapNewItem( - NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); } else { diff --git a/src/game/server/entities/gun.cpp b/src/game/server/entities/gun.cpp index 9def15802..e14114856 100644 --- a/src/game/server/entities/gun.cpp +++ b/src/game/server/entities/gun.cpp @@ -3,8 +3,10 @@ #include #include #include +#include #include +#include "character.h" #include "gun.h" #include "plasma.h" @@ -121,7 +123,7 @@ void CGun::Snap(int SnappingClient) int Tick = (Server()->Tick() % Server()->TickSpeed()) % 11; if(Char && Char->IsAlive() && (m_Layer == LAYER_SWITCH && !GameServer()->Collision()->m_pSwitchers[m_Number].m_Status[Char->Team()]) && (!Tick)) return; - CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); if(!pObj) return; diff --git a/src/game/server/entities/laser.cpp b/src/game/server/entities/laser.cpp index c3a70b6e7..5db085482 100644 --- a/src/game/server/entities/laser.cpp +++ b/src/game/server/entities/laser.cpp @@ -8,6 +8,8 @@ #include #include +#include "character.h" + CLaser::CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEnergy, int Owner, int Type) : CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) { @@ -273,7 +275,7 @@ void CLaser::Snap(int SnappingClient) if(!CmaskIsSet(TeamMask, SnappingClient)) return; - CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); if(!pObj) return; diff --git a/src/game/server/entities/light.cpp b/src/game/server/entities/light.cpp index d2989fc6f..ea7dd78aa 100644 --- a/src/game/server/entities/light.cpp +++ b/src/game/server/entities/light.cpp @@ -5,6 +5,9 @@ #include #include #include +#include + +#include "character.h" CLight::CLight(CGameWorld *pGameWorld, vec2 Pos, float Rotation, int Length, int Layer, int Number) : @@ -112,7 +115,7 @@ void CLight::Snap(int SnappingClient) return; CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem( - NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); if(!pObj) return; diff --git a/src/game/server/entities/pickup.cpp b/src/game/server/entities/pickup.cpp index c75232169..bda0e1db8 100644 --- a/src/game/server/entities/pickup.cpp +++ b/src/game/server/entities/pickup.cpp @@ -3,15 +3,17 @@ #include "pickup.h" #include #include +#include #include +#include "character.h" + CPickup::CPickup(CGameWorld *pGameWorld, int Type, int SubType, int Layer, int Number) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_PICKUP) + CEntity(pGameWorld, CGameWorld::ENTTYPE_PICKUP, vec2(0, 0), PickupPhysSize) { m_Type = Type; m_Subtype = SubType; - m_ProximityRadius = PickupPhysSize; m_Layer = Layer; m_Number = Number; @@ -164,7 +166,7 @@ void CPickup::Snap(int SnappingClient) return; int Size = Server()->IsSixup(SnappingClient) ? 3 * 4 : sizeof(CNetObj_Pickup); - CNetObj_Pickup *pP = static_cast(Server()->SnapNewItem(NETOBJTYPE_PICKUP, m_ID, Size)); + CNetObj_Pickup *pP = static_cast(Server()->SnapNewItem(NETOBJTYPE_PICKUP, GetID(), Size)); if(!pP) return; diff --git a/src/game/server/entities/plasma.cpp b/src/game/server/entities/plasma.cpp index 6509565c2..dce8f72ba 100644 --- a/src/game/server/entities/plasma.cpp +++ b/src/game/server/entities/plasma.cpp @@ -5,8 +5,11 @@ #include #include #include +#include #include +#include "character.h" + const float PLASMA_ACCEL = 1.1f; CPlasma::CPlasma(CGameWorld *pGameWorld, vec2 Pos, vec2 Dir, bool Freeze, @@ -101,7 +104,7 @@ void CPlasma::Snap(int SnappingClient) return; CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem( - NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); + NETOBJTYPE_LASER, GetID(), sizeof(CNetObj_Laser))); if(!pObj) return; diff --git a/src/game/server/entities/projectile.cpp b/src/game/server/entities/projectile.cpp index 10a5e728b..13517b646 100644 --- a/src/game/server/entities/projectile.cpp +++ b/src/game/server/entities/projectile.cpp @@ -4,10 +4,13 @@ #include #include #include +#include #include #include +#include "character.h" + CProjectile::CProjectile( CGameWorld *pGameWorld, int Type, @@ -316,7 +319,7 @@ void CProjectile::Snap(int SnappingClient) if(m_Owner != -1 && !CmaskIsSet(TeamMask, SnappingClient)) return; - CNetObj_Projectile *pProj = static_cast(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_ID, sizeof(CNetObj_Projectile))); + CNetObj_Projectile *pProj = static_cast(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, GetID(), sizeof(CNetObj_Projectile))); if(pProj) { if(SnappingClient > -1 && GameServer()->m_apPlayers[SnappingClient] && GameServer()->m_apPlayers[SnappingClient]->GetClientVersion() >= VERSION_DDNET_ANTIPING_PROJECTILE) diff --git a/src/game/server/entity.cpp b/src/game/server/entity.cpp index ff6ad34df..6a7944034 100644 --- a/src/game/server/entity.cpp +++ b/src/game/server/entity.cpp @@ -3,17 +3,18 @@ #include "entity.h" #include "gamecontext.h" +#include "player.h" ////////////////////////////////////////////////// // Entity ////////////////////////////////////////////////// -CEntity::CEntity(CGameWorld *pGameWorld, int ObjType) +CEntity::CEntity(CGameWorld *pGameWorld, int ObjType, vec2 Pos, int ProximityRadius) { m_pGameWorld = pGameWorld; m_ObjType = ObjType; - m_Pos = vec2(0, 0); - m_ProximityRadius = 0; + m_Pos = Pos; + m_ProximityRadius = ProximityRadius; m_MarkedForDestroy = false; m_ID = Server()->SnapNewID(); diff --git a/src/game/server/entity.h b/src/game/server/entity.h index a3521ea53..1c314a225 100644 --- a/src/game/server/entity.h +++ b/src/game/server/entity.h @@ -4,60 +4,9 @@ #define GAME_SERVER_ENTITY_H #include -#include -#include -#define MACRO_ALLOC_HEAP() \ -public: \ - void *operator new(size_t Size) \ - { \ - void *p = malloc(Size); \ - mem_zero(p, Size); \ - return p; \ - } \ - void operator delete(void *pPtr) \ - { \ - free(pPtr); \ - } \ -\ -private: - -#define MACRO_ALLOC_POOL_ID() \ -public: \ - void *operator new(size_t Size, int id); \ - void operator delete(void *p, int id); \ - void operator delete(void *p); /* NOLINT(misc-new-delete-overloads) */ \ -\ -private: - -#define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, PoolSize) \ - static char ms_PoolData##POOLTYPE[PoolSize][sizeof(POOLTYPE)] = {{0}}; \ - static int ms_PoolUsed##POOLTYPE[PoolSize] = {0}; \ - void *POOLTYPE::operator new(size_t Size, int id) \ - { \ - dbg_assert(sizeof(POOLTYPE) == Size, "size error"); \ - dbg_assert(!ms_PoolUsed##POOLTYPE[id], "already used"); \ - /*dbg_msg("pool", "++ %s %d", #POOLTYPE, id);*/ \ - ms_PoolUsed##POOLTYPE[id] = 1; \ - mem_zero(ms_PoolData##POOLTYPE[id], Size); \ - return ms_PoolData##POOLTYPE[id]; \ - } \ - void POOLTYPE::operator delete(void *p, int id) \ - { \ - dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ - dbg_assert(id == (POOLTYPE *)p - (POOLTYPE *)ms_PoolData##POOLTYPE, "invalid id"); \ - /*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \ - ms_PoolUsed##POOLTYPE[id] = 0; \ - mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ - } \ - void POOLTYPE::operator delete(void *p) /* NOLINT(misc-new-delete-overloads) */ \ - { \ - int id = (POOLTYPE *)p - (POOLTYPE *)ms_PoolData##POOLTYPE; \ - dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ - /*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \ - ms_PoolUsed##POOLTYPE[id] = 0; \ - mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ - } +#include "alloc.h" +#include "gameworld.h" /* Class: Entity @@ -67,50 +16,86 @@ class CEntity { MACRO_ALLOC_HEAP() +private: friend class CGameWorld; // entity list handling CEntity *m_pPrevTypeEntity; CEntity *m_pNextTypeEntity; -protected: + /* Identity */ class CGameWorld *m_pGameWorld; - bool m_MarkedForDestroy; + int m_ID; int m_ObjType; -public: - CEntity(CGameWorld *pGameWorld, int Objtype); - virtual ~CEntity(); + /* + Variable: m_ProximityRadius + Contains the physical size of the entity. + */ + float m_ProximityRadius; - class CGameWorld *GameWorld() { return m_pGameWorld; } - class CGameContext *GameServer() { return GameWorld()->GameServer(); } - class IServer *Server() { return GameWorld()->Server(); } + /* State */ + bool m_MarkedForDestroy; - CEntity *TypeNext() { return m_pNextTypeEntity; } - CEntity *TypePrev() { return m_pPrevTypeEntity; } +public: // TODO: Maybe make protected + /* State */ /* - Function: destroy + Variable: m_Pos + Contains the current posititon of the entity. + */ + vec2 m_Pos; + + /* Getters */ + int GetID() const { return m_ID; } + +public: + /* Constructor */ + CEntity(CGameWorld *pGameWorld, int Objtype, vec2 Pos = vec2(0, 0), int ProximityRadius = 0); + + /* Destructor */ + virtual ~CEntity(); + + /* Objects */ + class CGameWorld *GameWorld() { return m_pGameWorld; } + class CConfig *Config() { return m_pGameWorld->Config(); } + class CGameContext *GameServer() { return m_pGameWorld->GameServer(); } + class IServer *Server() { return m_pGameWorld->Server(); } + + /* Getters */ + CEntity *TypeNext() { return m_pNextTypeEntity; } + CEntity *TypePrev() { return m_pPrevTypeEntity; } + const vec2 &GetPos() const { return m_Pos; } + float GetProximityRadius() const { return m_ProximityRadius; } + bool IsMarkedForDestroy() const { return m_MarkedForDestroy; } + + /* Setters */ + void MarkForDestroy() { m_MarkedForDestroy = true; } + + /* Other functions */ + + /* + Function: Destroy Destroys the entity. */ virtual void Destroy() { delete this; } /* - Function: reset + Function: Reset Called when the game resets the map. Puts the entity - back to it's starting state or perhaps destroys it. + back to its starting state or perhaps destroys it. */ virtual void Reset() {} /* - Function: tick - Called progress the entity to the next tick. Updates - and moves the entity to it's new state and position. + Function: Tick + Called to progress the entity to the next tick. Updates + and moves the entity to its new state and position. */ virtual void Tick() {} /* - Function: tick_defered - Called after all entities tick() function has been called. + Function: TickDefered + Called after all entities Tick() function has been called. */ virtual void TickDefered() {} @@ -121,12 +106,12 @@ public: virtual void TickPaused() {} /* - Function: snap + Function: Snap Called when a new snapshot is being generated for a specific client. Arguments: - snapping_client - ID of the client which snapshot is + SnappingClient - ID of the client which snapshot is being generated. Could be -1 to create a complete snapshot of everything in the game for demo recording. @@ -139,7 +124,7 @@ public: entity. Arguments: - snapping_client - ID of the client which snapshot is + SnappingClient - ID of the client which snapshot is being generated. Could be -1 to create a complete snapshot of everything in the game for demo recording. @@ -152,18 +137,6 @@ public: bool GameLayerClipped(vec2 CheckPos); - /* - Variable: proximity_radius - Contains the physical size of the entity. - */ - float m_ProximityRadius; - - /* - Variable: pos - Contains the current posititon of the entity. - */ - vec2 m_Pos; - // DDRace bool GetNearestAirPos(vec2 Pos, vec2 ColPos, vec2 *pOutPos); diff --git a/src/game/server/eventhandler.cpp b/src/game/server/eventhandler.cpp index 5e68b2591..30e0e40e4 100644 --- a/src/game/server/eventhandler.cpp +++ b/src/game/server/eventhandler.cpp @@ -2,6 +2,7 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "eventhandler.h" #include "gamecontext.h" +#include "player.h" ////////////////////////////////////////////////// // Event handler diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 98c66a873..2f988d8f7 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -13,17 +13,19 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include +#include "entities/character.h" #include "gamemodes/DDRace.h" +#include "player.h" #include "score.h" enum @@ -469,6 +471,28 @@ void CGameContext::SendWeaponPickup(int ClientID, int Weapon) Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } +void CGameContext::SendMotd(int ClientID) +{ + CNetMsg_Sv_Motd Msg; + Msg.m_pMessage = g_Config.m_SvMotd; + Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); +} + +void CGameContext::SendSettings(int ClientID) +{ + if(Server()->IsSixup(ClientID)) + { + protocol7::CNetMsg_Sv_ServerSettings Msg; + Msg.m_KickVote = g_Config.m_SvVoteKick; + Msg.m_KickMin = g_Config.m_SvVoteKickMin; + Msg.m_SpecVote = g_Config.m_SvVoteSpectate; + Msg.m_TeamLock = 0; + Msg.m_TeamBalance = 0; + Msg.m_PlayerSlots = g_Config.m_SvMaxClients - g_Config.m_SvSpectatorSlots; + Server()->SendPackMsg(&Msg, MSGFLAG_VITAL | MSGFLAG_NORECORD, ClientID); + } +} + void CGameContext::SendBroadcast(const char *pText, int ClientID, bool IsImportant) { CNetMsg_Sv_Broadcast Msg; @@ -1361,23 +1385,8 @@ void CGameContext::OnClientConnected(int ClientID) } #endif - // send motd - CNetMsg_Sv_Motd Msg; - Msg.m_pMessage = g_Config.m_SvMotd; - Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); - - //send sixup settings - if(Server()->IsSixup(ClientID)) - { - protocol7::CNetMsg_Sv_ServerSettings Msg; - Msg.m_KickVote = g_Config.m_SvVoteKick; - Msg.m_KickMin = g_Config.m_SvVoteKickMin; - Msg.m_SpecVote = g_Config.m_SvVoteSpectate; - Msg.m_TeamLock = 0; - Msg.m_TeamBalance = 0; - Msg.m_PlayerSlots = g_Config.m_SvMaxClients - g_Config.m_SvSpectatorSlots; - Server()->SendPackMsg(&Msg, MSGFLAG_VITAL | MSGFLAG_NORECORD, ClientID); - } + SendMotd(ClientID); + SendSettings(ClientID); Server()->ExpireServerInfo(); } @@ -2989,18 +2998,15 @@ void CGameContext::ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *p pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) { - CNetMsg_Sv_Motd Msg; - Msg.m_pMessage = g_Config.m_SvMotd; CGameContext *pSelf = (CGameContext *)pUserData; - for(int i = 0; i < MAX_CLIENTS; ++i) - if(pSelf->m_apPlayers[i]) - pSelf->Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, i); + pSelf->SendMotd(-1); } } void CGameContext::OnConsoleInit() { m_pServer = Kernel()->RequestInterface(); + m_pConfig = Kernel()->RequestInterface()->Values(); m_pConsole = Kernel()->RequestInterface(); m_pEngine = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); @@ -3047,6 +3053,7 @@ void CGameContext::OnConsoleInit() void CGameContext::OnInit(/*class IKernel *pKernel*/) { m_pServer = Kernel()->RequestInterface(); + m_pConfig = Kernel()->RequestInterface()->Values(); m_pConsole = Kernel()->RequestInterface(); m_pEngine = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h index e0637dcde..977bbbe75 100644 --- a/src/game/server/gamecontext.h +++ b/src/game/server/gamecontext.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -16,9 +15,8 @@ #include #include "eventhandler.h" -#include "gamecontroller.h" +//#include "gamecontroller.h" #include "gameworld.h" -#include "player.h" #include "teehistorian.h" #include @@ -58,8 +56,12 @@ enum NUM_TUNEZONES = 256 }; +class CConfig; +class CHeap; +class CPlayer; class CScore; class IConsole; +class IGameController; class IEngine; class IStorage; struct CAntibotData; @@ -68,6 +70,7 @@ struct CScoreRandomMapResult; class CGameContext : public IGameServer { IServer *m_pServer; + CConfig *m_pConfig; IConsole *m_pConsole; IEngine *m_pEngine; IStorage *m_pStorage; @@ -130,6 +133,7 @@ class CGameContext : public IGameServer public: IServer *Server() const { return m_pServer; } + CConfig *Config() { return m_pConfig; } IConsole *Console() { return m_pConsole; } IEngine *Engine() { return m_pEngine; } IStorage *Storage() { return m_pStorage; } @@ -219,6 +223,8 @@ public: void SendChat(int ClientID, int Team, const char *pText, int SpamProtectionClientID = -1, int Flags = CHAT_SIX | CHAT_SIXUP); void SendEmoticon(int ClientID, int Emoticon); void SendWeaponPickup(int ClientID, int Weapon); + void SendMotd(int ClientID); + void SendSettings(int ClientID); void SendBroadcast(const char *pText, int ClientID, bool IsImportant = true); void List(int ClientID, const char *filter); diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 620c3068d..4f91e7a52 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -5,9 +5,11 @@ #include +#include "entities/character.h" #include "entities/pickup.h" #include "gamecontext.h" #include "gamecontroller.h" +#include "player.h" #include "entities/door.h" #include "entities/dragger.h" @@ -20,6 +22,7 @@ IGameController::IGameController(class CGameContext *pGameServer) { m_pGameServer = pGameServer; + m_pConfig = m_pGameServer->Config(); m_pServer = m_pGameServer->Server(); m_pGameType = "unknown"; @@ -81,7 +84,7 @@ void IGameController::EvaluateSpawnType(CSpawnEval *pEval, int Type) break; for(int c = 0; c < Num; ++c) if(GameServer()->Collision()->CheckPoint(m_aaSpawnPoints[Type][i] + Positions[Index]) || - distance(aEnts[c]->m_Pos, m_aaSpawnPoints[Type][i] + Positions[Index]) <= aEnts[c]->m_ProximityRadius) + distance(aEnts[c]->m_Pos, m_aaSpawnPoints[Type][i] + Positions[Index]) <= aEnts[c]->GetProximityRadius()) { Result = -1; break; diff --git a/src/game/server/gamecontroller.h b/src/game/server/gamecontroller.h index 600fdfde1..d1fecfcd7 100644 --- a/src/game/server/gamecontroller.h +++ b/src/game/server/gamecontroller.h @@ -29,10 +29,12 @@ class IGameController int m_aNumSpawnPoints[3]; class CGameContext *m_pGameServer; + class CConfig *m_pConfig; class IServer *m_pServer; protected: CGameContext *GameServer() const { return m_pGameServer; } + CConfig *Config() { return m_pConfig; } IServer *Server() const { return m_pServer; } struct CSpawnEval diff --git a/src/game/server/gameworld.cpp b/src/game/server/gameworld.cpp index 5cb93f3c6..b8e023bc6 100644 --- a/src/game/server/gameworld.cpp +++ b/src/game/server/gameworld.cpp @@ -2,8 +2,10 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "gameworld.h" +#include "entities/character.h" #include "entity.h" #include "gamecontext.h" +#include "player.h" #include #include #include @@ -14,6 +16,7 @@ CGameWorld::CGameWorld() { m_pGameServer = 0x0; + m_pConfig = 0x0; m_pServer = 0x0; m_Paused = false; @@ -33,6 +36,7 @@ CGameWorld::~CGameWorld() void CGameWorld::SetGameServer(CGameContext *pGameServer) { m_pGameServer = pGameServer; + m_pConfig = m_pGameServer->Config(); m_pServer = m_pGameServer->Server(); } diff --git a/src/game/server/gameworld.h b/src/game/server/gameworld.h index dcb16ee29..23b41abf6 100644 --- a/src/game/server/gameworld.h +++ b/src/game/server/gameworld.h @@ -36,12 +36,14 @@ private: CEntity *m_apFirstEntityTypes[NUM_ENTTYPES]; class CGameContext *m_pGameServer; + class CConfig *m_pConfig; class IServer *m_pServer; void UpdatePlayerMaps(); public: class CGameContext *GameServer() { return m_pGameServer; } + class CConfig *Config() { return m_pConfig; } class IServer *Server() { return m_pServer; } bool m_ResetRequested; diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 7e283f896..fdefe56f4 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -2,15 +2,14 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "player.h" #include -#include +#include "entities/character.h" #include "gamecontext.h" #include "gamemodes/DDRace.h" #include #include #include #include -#include MACRO_ALLOC_POOL_ID_IMPL(CPlayer, MAX_CLIENTS) diff --git a/src/game/server/player.h b/src/game/server/player.h index 4fcd01065..afc26d68f 100644 --- a/src/game/server/player.h +++ b/src/game/server/player.h @@ -3,12 +3,18 @@ #ifndef GAME_SERVER_PLAYER_H #define GAME_SERVER_PLAYER_H +#include "alloc.h" + // this include should perhaps be removed -#include "entities/character.h" -#include "gamecontext.h" #include "score.h" #include "teeinfo.h" -#include + +enum +{ + WEAPON_GAME = -3, // team switching etc + WEAPON_SELF = -2, // console kill command + WEAPON_WORLD = -1, // death tiles etc +}; // player object class CPlayer diff --git a/src/game/server/save.cpp b/src/game/server/save.cpp index 6428ea2ce..252d410d3 100644 --- a/src/game/server/save.cpp +++ b/src/game/server/save.cpp @@ -3,7 +3,9 @@ #include #include +#include "entities/character.h" #include "gamemodes/DDRace.h" +#include "player.h" #include "teams.h" #include diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index 128e99250..4640d78b1 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -1,6 +1,7 @@ #include "score.h" #include "entities/character.h" #include "gamemodes/DDRace.h" +#include "player.h" #include "save.h" #include diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index 8ed0b31b7..79763eae0 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -4,6 +4,9 @@ #include "teehistorian.h" #include +#include "entities/character.h" +#include "player.h" + CGameTeams::CGameTeams(CGameContext *pGameContext) : m_pGameContext(pGameContext) { diff --git a/src/game/server/teams.h b/src/game/server/teams.h index 43c48ee5b..0ee347c96 100644 --- a/src/game/server/teams.h +++ b/src/game/server/teams.h @@ -4,6 +4,7 @@ #include #include +#include #include #include diff --git a/src/game/server/teehistorian.h b/src/game/server/teehistorian.h index 0e3be5141..32518b131 100644 --- a/src/game/server/teehistorian.h +++ b/src/game/server/teehistorian.h @@ -9,7 +9,7 @@ #include -struct CConfiguration; +class CConfig; class CTuningParams; class CUuidManager; @@ -34,7 +34,7 @@ public: SHA256_DIGEST m_MapSha256; int m_MapCrc; - CConfiguration *m_pConfig; + CConfig *m_pConfig; CTuningParams *m_pTuning; CUuidManager *m_pUuids; }; diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp index 58186944f..3843a7f44 100644 --- a/src/mastersrv/mastersrv.cpp +++ b/src/mastersrv/mastersrv.cpp @@ -332,17 +332,18 @@ int main(int argc, const char **argv) // ignore_convention IKernel *pKernel = IKernel::Create(); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); - IConfig *pConfig = CreateConfig(); + IConfigManager *pConfigManager = CreateConfigManager(); m_pConsole = CreateConsole(CFGFLAG_MASTER); bool RegisterFail = !pKernel->RegisterInterface(pStorage); RegisterFail |= !pKernel->RegisterInterface(m_pConsole); - RegisterFail |= !pKernel->RegisterInterface(pConfig); + RegisterFail |= !pKernel->RegisterInterface(pConfigManager); if(RegisterFail) return -1; - pConfig->Init(); + pConfigManager->Init(); + m_pConsole->Init(); m_NetBan.Init(m_pConsole, pStorage); if(argc > 1) // ignore_convention m_pConsole->ParseArguments(argc - 1, &argv[1]); // ignore_convention diff --git a/src/test/teehistorian.cpp b/src/test/teehistorian.cpp index 2618d12c0..071aa7005 100644 --- a/src/test/teehistorian.cpp +++ b/src/test/teehistorian.cpp @@ -12,7 +12,7 @@ class TeeHistorian : public ::testing::Test { protected: CTeeHistorian m_TH; - CConfiguration m_Config; + CConfig m_Config; CTuningParams m_Tuning; CUuidManager m_UuidManager; CTeeHistorian::CGameInfo m_GameInfo;