From 790c1cc0aa8025ebb01ccc8d9b566d2cb1749340 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 21 Dec 2021 17:19:42 +0100 Subject: [PATCH] Switch new players to DDNet config dir, support Teeworlds as fallback This way new players will get DDNet directory, old ones can switch directory if they want, or keep using the old one. If we ever enforce a switch in a future version, this will make it easier since older DDNet versions will also support the DDNet directory already. --- CMakeLists.txt | 2 ++ other/config_directory.bat | 6 +++++- other/config_directory.sh | 21 +++++++++++++++++++++ src/base/system.h | 2 +- src/engine/client/client.cpp | 2 +- src/engine/server/server.cpp | 2 +- src/engine/shared/storage.cpp | 19 +++++++++++++------ src/engine/storage.h | 2 +- src/mastersrv/main_mastersrv.cpp | 2 +- src/tools/dummy_map.cpp | 2 +- src/tools/map_convert_07.cpp | 2 +- src/tools/map_optimize.cpp | 2 +- src/tools/map_replace_image.cpp | 2 +- src/tools/map_resave.cpp | 2 +- storage.cfg | 5 +++-- 15 files changed, 54 insertions(+), 19 deletions(-) create mode 100755 other/config_directory.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 003555ded..ff81fe2c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2670,6 +2670,8 @@ set(CPACK_GEN_FILES if(TARGET_OS STREQUAL "windows") list(APPEND CPACK_FILES other/config_directory.bat) +else() + list(APPEND CPACK_FILES other/config_directory.sh) endif() if(NOT DEV) diff --git a/other/config_directory.bat b/other/config_directory.bat index 96a9ec812..9d9d02e0a 100644 --- a/other/config_directory.bat +++ b/other/config_directory.bat @@ -1 +1,5 @@ -@start explorer %APPDATA%\Teeworlds +if exist %APPDATA%\DDNet\ ( + @start explorer %APPDATA%\DDNet\ +) else ( + @start explorer %APPDATA%\Teeworlds\ +) diff --git a/other/config_directory.sh b/other/config_directory.sh new file mode 100755 index 000000000..abd53aa84 --- /dev/null +++ b/other/config_directory.sh @@ -0,0 +1,21 @@ +#!/bin/sh +case "$(uname -s)" in + CYGWIN*|MINGW*|MSYS*) + if [ -d "$APPDATA/DDNet/" ]; then + explorer "$APPDATA/DDNet/" + else + explorer "$APPDATA/Teeworlds/" + fi;; + Darwin*) + if [ -d "$HOME/Library/Application Support/DDNet/" ]; then + open "$HOME/Library/Application Support/DDNet/" + else + open "$HOME/Library/Application Support/Teeworlds/" + fi;; + *) + if [ -d "$HOME/.ddnet/" ]; then + xdg-open "$HOME/.ddnet/" + else + xdg-open "$HOME/.teeworlds/" + fi;; +esac diff --git a/src/base/system.h b/src/base/system.h index b299858d2..a1c2d8b48 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -1799,7 +1799,7 @@ int fs_rename(const char *oldname, const char *newname); modified - Pointer to time_t Returns: - 0 on success non-zero on failure + 0 on success, non-zero on failure Remarks: - Returned time is in seconds since UNIX Epoch diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 2b25f93b1..ace00beea 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -4325,7 +4325,7 @@ int main(int argc, const char **argv) // create the components IEngine *pEngine = CreateEngine(GAME_NAME, Silent, 2); IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, (const char **)argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, (const char **)argv); IConfigManager *pConfigManager = CreateConfigManager(); IEngineSound *pEngineSound = CreateEngineSound(); IEngineInput *pEngineInput = CreateEngineInput(); diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 9203229c8..17d473124 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -3646,7 +3646,7 @@ int main(int argc, const char **argv) IGameServer *pGameServer = CreateGameServer(); IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_SERVER, argc, argv); IConfigManager *pConfigManager = CreateConfigManager(); IEngineAntibot *pEngineAntibot = CreateEngineAntibot(); diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index a261d50f4..6f274d6b1 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -28,10 +28,17 @@ public: m_aUserdir[0] = 0; } - int Init(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) + int Init(int StorageType, int NumArgs, const char **ppArguments) { // get userdir - fs_storage_path(pApplicationName, m_aUserdir, sizeof(m_aUserdir)); + char aFallbackUserdir[IO_MAX_PATH_LENGTH]; + fs_storage_path("DDNet", m_aUserdir, sizeof(m_aUserdir)); + fs_storage_path("Teeworlds", aFallbackUserdir, sizeof(aFallbackUserdir)); + + if(!fs_is_dir(m_aUserdir) && fs_is_dir(aFallbackUserdir)) + { + str_copy(m_aUserdir, aFallbackUserdir, sizeof(m_aUserdir)); + } // get datadir FindDatadir(ppArguments[0]); @@ -559,10 +566,10 @@ public: return pBuffer; } - static IStorage *Create(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) + static IStorage *Create(int StorageType, int NumArgs, const char **ppArguments) { CStorage *p = new CStorage(); - if(p && p->Init(pApplicationName, StorageType, NumArgs, ppArguments)) + if(p && p->Init(StorageType, NumArgs, ppArguments)) { dbg_msg("storage", "initialisation failed"); delete p; @@ -600,9 +607,9 @@ const char *IStorage::FormatTmpPath(char *aBuf, unsigned BufSize, const char *pP return aBuf; } -IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) +IStorage *CreateStorage(int StorageType, int NumArgs, const char **ppArguments) { - return CStorage::Create(pApplicationName, StorageType, NumArgs, ppArguments); + return CStorage::Create(StorageType, NumArgs, ppArguments); } IStorage *CreateLocalStorage() diff --git a/src/engine/storage.h b/src/engine/storage.h index 23bc7c308..58cc0f7e7 100644 --- a/src/engine/storage.h +++ b/src/engine/storage.h @@ -42,7 +42,7 @@ public: static const char *FormatTmpPath(char *aBuf, unsigned BufSize, const char *pPath); }; -extern IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments); +extern IStorage *CreateStorage(int StorageType, int NumArgs, const char **ppArguments); extern IStorage *CreateLocalStorage(); extern IStorage *CreateTempStorage(const char *pDirectory); diff --git a/src/mastersrv/main_mastersrv.cpp b/src/mastersrv/main_mastersrv.cpp index a57aa8a8f..87db7f5a4 100644 --- a/src/mastersrv/main_mastersrv.cpp +++ b/src/mastersrv/main_mastersrv.cpp @@ -333,7 +333,7 @@ int main(int argc, const char **argv) mem_copy(m_CountDataLegacy.m_Header, SERVERBROWSE_COUNT_LEGACY, sizeof(SERVERBROWSE_COUNT_LEGACY)); IKernel *pKernel = IKernel::Create(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_BASIC, argc, argv); IConfigManager *pConfigManager = CreateConfigManager(); m_pConsole = CreateConsole(CFGFLAG_MASTER); diff --git a/src/tools/dummy_map.cpp b/src/tools/dummy_map.cpp index 2715ce390..50d53a424 100644 --- a/src/tools/dummy_map.cpp +++ b/src/tools/dummy_map.cpp @@ -75,7 +75,7 @@ int main(int argc, const char **argv) { cmdline_fix(&argc, &argv); dbg_logger_stdout(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_SERVER, argc, argv); CreateEmptyMap(pStorage); cmdline_free(argc, argv); return 0; diff --git a/src/tools/map_convert_07.cpp b/src/tools/map_convert_07.cpp index 29c3a2b66..e45e4fc0b 100644 --- a/src/tools/map_convert_07.cpp +++ b/src/tools/map_convert_07.cpp @@ -138,7 +138,7 @@ int main(int argc, const char **argv) cmdline_fix(&argc, &argv); dbg_logger_stdout(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_BASIC, argc, argv); if(argc < 2 || argc > 3) { diff --git a/src/tools/map_optimize.cpp b/src/tools/map_optimize.cpp index 3e5ea54ab..d862bafc0 100644 --- a/src/tools/map_optimize.cpp +++ b/src/tools/map_optimize.cpp @@ -81,7 +81,7 @@ int main(int argc, const char **argv) cmdline_fix(&argc, &argv); dbg_logger_stdout(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_BASIC, argc, argv); int ID = 0, Type = 0, Size; void *pPtr; char aFileName[IO_MAX_PATH_LENGTH]; diff --git a/src/tools/map_replace_image.cpp b/src/tools/map_replace_image.cpp index a9c2fe763..f4082d234 100644 --- a/src/tools/map_replace_image.cpp +++ b/src/tools/map_replace_image.cpp @@ -113,7 +113,7 @@ int main(int argc, const char **argv) cmdline_fix(&argc, &argv); dbg_logger_stdout(); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_BASIC, argc, argv); if(argc != 5) { diff --git a/src/tools/map_resave.cpp b/src/tools/map_resave.cpp index 9f15c5d6d..7e2ead1cd 100644 --- a/src/tools/map_resave.cpp +++ b/src/tools/map_resave.cpp @@ -7,7 +7,7 @@ int main(int argc, const char **argv) { cmdline_fix(&argc, &argv); - IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_BASIC, argc, argv); int Index, ID = 0, Type = 0, Size; void *pPtr; char aFileName[IO_MAX_PATH_LENGTH]; diff --git a/storage.cfg b/storage.cfg index 1a28d87e2..344b51c4c 100644 --- a/storage.cfg +++ b/storage.cfg @@ -1,5 +1,5 @@ #### -# This specifies where and in which order Teeworlds looks +# This specifies where and in which order DDNet looks # for its data (sounds, skins, ...). The search goes top # down which means the first path has the highest priority. # Furthermore the top entry also defines the save path where @@ -7,8 +7,9 @@ # There are 3 special paths available: # $USERDIR # - ~/.appname on UNIX based systems -# - ~/Library/Applications Support/appname on macOS +# - ~/Library/Applications Support/Appname on macOS # - %APPDATA%/Appname on Windows based systems +# Appname is DDNet, if that doesn't exist Teeworlds is used as a fallback # $DATADIR # - the 'data' directory which is part of an official # release