From adf00ff48abb7aacee28ab3b8c2d8bb67a409b27 Mon Sep 17 00:00:00 2001 From: fed <58637860+fedddddd@users.noreply.github.com> Date: Thu, 16 Feb 2023 17:01:53 +0100 Subject: [PATCH] Add h2 mod config --- src/client/component/config.cpp | 58 +++++++++++++++++++++++++++++++ src/client/component/config.hpp | 27 ++++++++++++++ src/client/component/console.cpp | 10 +++++- src/client/component/language.cpp | 12 +++---- 4 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 src/client/component/config.cpp create mode 100644 src/client/component/config.hpp diff --git a/src/client/component/config.cpp b/src/client/component/config.cpp new file mode 100644 index 00000000..afd3686e --- /dev/null +++ b/src/client/component/config.cpp @@ -0,0 +1,58 @@ +#include +#include "loader/component_loader.hpp" + +#include "config.hpp" +#include "console.hpp" + +#include +#include + +#define CONFIG_FILE "players2/default/h2_mod.json" + +namespace config +{ + void write_config(const nlohmann::json& json) + { + try + { + const auto str = json.dump(4); + utils::io::write_file(CONFIG_FILE, str, false); + } + catch (const std::exception& e) + { + console::error("Failed to write config file: %s\n", e.what()); + } + } + + nlohmann::json read_config() + { + if (!utils::io::file_exists(CONFIG_FILE)) + { + return {}; + } + + try + { + const auto data = utils::io::read_file(CONFIG_FILE); + return nlohmann::json::parse(data); + } + catch (const std::exception& e) + { + console::error("Failed to parse config file: %s\n", e.what()); + utils::io::write_file(CONFIG_FILE, "{}", false); + } + + return {}; + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + + } + }; +} + +REGISTER_COMPONENT(config::component) diff --git a/src/client/component/config.hpp b/src/client/component/config.hpp new file mode 100644 index 00000000..91395404 --- /dev/null +++ b/src/client/component/config.hpp @@ -0,0 +1,27 @@ +#pragma once + +namespace config +{ + nlohmann::json read_config(); + void write_config(const nlohmann::json& json); + + template + std::optional get(const std::string& key) + { + const auto cfg = read_config(); + if (!cfg.is_object() || !cfg.contains(key)) + { + return {}; + } + + return {cfg[key].get()}; + } + + template + void set(const std::string& key, const T& value) + { + auto cfg = read_config(); + cfg[key] = value; + write_config(cfg); + } +} diff --git a/src/client/component/console.cpp b/src/client/component/console.cpp index 0840553d..422927f5 100644 --- a/src/client/component/console.cpp +++ b/src/client/component/console.cpp @@ -54,6 +54,11 @@ namespace console template int invoke_printf(const char* fmt, Args&&... args) { + if (printf_hook.get_original() == nullptr) + { + return printf(fmt, std::forward(args)...); + } + return printf_hook.invoke(fmt, std::forward(args)...); } @@ -336,10 +341,13 @@ namespace console ShowWindow(GetConsoleWindow(), SW_HIDE); } - void post_unpack() override + void post_start() override { printf_hook.create(printf, printf_stub); + } + void post_unpack() override + { ShowWindow(GetConsoleWindow(), SW_SHOW); SetConsoleTitle("H2-Mod"); diff --git a/src/client/component/language.cpp b/src/client/component/language.cpp index 39d5ee0c..76b9b22c 100644 --- a/src/client/component/language.cpp +++ b/src/client/component/language.cpp @@ -2,14 +2,13 @@ #include "loader/component_loader.hpp" #include "language.hpp" +#include "config.hpp" #include "localized_strings.hpp" #include #include -#define LANGUAGE_FILE "players2/default/language" - namespace language { namespace @@ -47,14 +46,15 @@ namespace language const char* get_loc_language_string() { - if (!utils::io::file_exists(LANGUAGE_FILE)) + const auto data = config::get("language"); + if (!data.has_value()) { return nullptr; } static char language[0x200] = {0}; - const auto data = utils::io::read_file(LANGUAGE_FILE); - strcpy_s(language, data.data()); + const auto& value = data.value(); + strcpy_s(language, value.data()); return language; } } @@ -87,7 +87,7 @@ namespace language void set(const std::string& lang) { - utils::io::write_file(LANGUAGE_FILE, lang, false); + config::set("language", lang); } void set_from_index(const int index)