From 5c1bb0acc9a8a695afc9e6d7f8ebba57c1697fa5 Mon Sep 17 00:00:00 2001 From: dongresource Date: Fri, 7 May 2021 21:29:18 +0200 Subject: [PATCH] Add enabledpatches config option The server administrator must now specify which patches they want the server to load (if deviating from the defaults). There are multiple reasons for this: * It's useful to be able to pick and choose which patches you want to boot the server with; without having to move the directories in and out of the patch directory * This way, we can have different default patches for different builds of the game (104 vs 1013) * ...ergo, it's easier to rapidly switch builds without having to rearrange your workspace to properly run them * This also allows us to remove the std::filesystem stuff, which has spotty compatibility with slightly older (but still current) versions of the compilers --- config.ini | 5 +++++ src/TableData.cpp | 22 +++++++++++++++------- src/TableData.hpp | 2 +- src/settings.cpp | 3 +++ src/settings.hpp | 1 + 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/config.ini b/config.ini index 7802b24..8c52a4a 100644 --- a/config.ini +++ b/config.ini @@ -40,6 +40,11 @@ motd=Welcome to OpenFusion! # location of the patch folder #patchdir=tdata/patch/ +# Space-separated list of patch folders in patchdir to load from. +# If you uncomment this, note that Academy builds *must* contain 1013, +# and pre-Academy builds must *not* contain it. +#enabledpatches=1013 + # xdt json filename #xdtdata=xdt.json # NPC json filename diff --git a/src/TableData.cpp b/src/TableData.cpp index 7ccf865..2b35824 100644 --- a/src/TableData.cpp +++ b/src/TableData.cpp @@ -14,6 +14,7 @@ #include "JSON.hpp" #include +#include #include using namespace TableData; @@ -1079,19 +1080,26 @@ void TableData::init() { } fstream.close(); - // patching: loop through every directory within the patch directory, looking for a matching file - if (!std::filesystem::exists(settings::PATCHDIR)) continue; // patch dir doesn't exist + // patching: load each patch directory specified in the config file + + // split config field into individual patch entries + std::stringstream ss(settings::ENABLEDPATCHES); + std::istream_iterator begin(ss); + std::istream_iterator end; + json patch; - for (const auto& patchModule : std::filesystem::directory_iterator(settings::PATCHDIR)) { + for (auto it = begin; it != end; it++) { // this is the theoretical path of a corresponding patch for this file - std::string patchFile = patchModule.path().generic_u8string() + "/" + table.second; - if (std::filesystem::exists(patchFile)) { - // file exists - std::cout << "[INFO] Patching " << patchFile << std::endl; + std::string patchModuleName = *it; + std::string patchFile = settings::PATCHDIR + patchModuleName + "/" + table.second; + try { fstream.open(patchFile); fstream >> patch; // load into temporary json object + std::cout << "[INFO] Patching " << patchFile << std::endl; patchJSON(table.first, &patch); // patch fstream.close(); + } catch (const std::exception& err) { + // no-op } } } diff --git a/src/TableData.hpp b/src/TableData.hpp index d3d0e72..d8be3fc 100644 --- a/src/TableData.hpp +++ b/src/TableData.hpp @@ -1,6 +1,6 @@ #pragma once + #include -#include #include "NPCManager.hpp" diff --git a/src/settings.cpp b/src/settings.cpp index 811ca46..8054e65 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -45,8 +45,10 @@ std::string settings::DROPSJSON = "drops.json"; std::string settings::PATHJSON = "paths.json"; #ifdef ACADEMY std::string settings::XDTJSON = "xdt1013.json"; +std::string settings::ENABLEDPATCHES = "1013"; #else std::string settings::XDTJSON = "xdt.json"; +std::string settings::ENABLEDPATCHES = ""; #endif // ACADEMY int settings::ACCLEVEL = 1; @@ -96,6 +98,7 @@ void settings::init() { DBPATH = reader.Get("shard", "dbpath", DBPATH); TDATADIR = reader.Get("shard", "tdatadir", TDATADIR); PATCHDIR = reader.Get("shard", "patchdir", PATCHDIR); + ENABLEDPATCHES = reader.Get("shard", "enabledpatches", ENABLEDPATCHES); ACCLEVEL = reader.GetInteger("shard", "accountlevel", ACCLEVEL); EVENTMODE = reader.GetInteger("shard", "eventmode", EVENTMODE); DISABLEFIRSTUSEFLAG = reader.GetBoolean("shard", "disablefirstuseflag", DISABLEFIRSTUSEFLAG); diff --git a/src/settings.hpp b/src/settings.hpp index ee07ec5..d925fd4 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -25,6 +25,7 @@ namespace settings { extern std::string GRUNTWORKJSON; extern std::string DBPATH; extern std::string PATCHDIR; + extern std::string ENABLEDPATCHES; extern std::string TDATADIR; extern int EVENTMODE; extern bool MONITORENABLED;