From 92fe72b7936163268fa2e9bc6fa833717afeee23 Mon Sep 17 00:00:00 2001 From: Cvolton Date: Mon, 23 Mar 2026 13:27:13 +0100 Subject: [PATCH 1/6] dont save empty jsons --- loader/src/loader/ModImpl.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 6179c0a81..593a10660 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -240,13 +240,28 @@ Result<> Mod::Impl::saveData() { // saveData is expected to be synchronous, and always called from GD thread ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send(); - auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", json.dump()); - if (!res) { - log::error("Unable to save settings: {}", res.unwrapErr()); + // TODO: better check if its empty? + auto dump = json.dump(); + if(!dump.starts_with("{}")) { + auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", dump); + if (!res) { + log::error("Unable to save settings: {}", res.unwrapErr()); + } } - auto res2 = utils::file::writeStringSafe(m_saveDirPath / "saved.json", m_saved.dump()); - if (!res2) { - log::error("Unable to save values: {}", res2.unwrapErr()); + /*else { + std::error_code ec; + std::filesystem::remove(m_saveDirPath / "settings.json", ec); + if (ec) { + log::error("Unable to remove settings.json: {}", ec.message()); + } + }*/ + + dump = m_saved.dump(); + if (!dump.starts_with("{}")) { + auto res2 = utils::file::writeStringSafe(m_saveDirPath / "saved.json", m_saved.dump()); + if (!res2) { + log::error("Unable to save values: {}", res2.unwrapErr()); + } } return Ok(); From 6df1d9c312bf184da48025ebbe7c2c39858087bb Mon Sep 17 00:00:00 2001 From: Cvolton Date: Mon, 23 Mar 2026 14:00:08 +0100 Subject: [PATCH 2/6] delete files if empty --- loader/src/loader/ModImpl.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 593a10660..726bc9cfb 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -23,6 +23,7 @@ #include #include #include +#include using namespace geode::prelude; @@ -248,13 +249,12 @@ Result<> Mod::Impl::saveData() { log::error("Unable to save settings: {}", res.unwrapErr()); } } - /*else { - std::error_code ec; - std::filesystem::remove(m_saveDirPath / "settings.json", ec); - if (ec) { - log::error("Unable to remove settings.json: {}", ec.message()); + else { + auto res = asp::fs::remove(m_saveDirPath / "settings.json"); + if (!res) { + log::error("Unable to remove settings.json: {}", res.unwrapErr().message()); } - }*/ + } dump = m_saved.dump(); if (!dump.starts_with("{}")) { @@ -263,6 +263,12 @@ Result<> Mod::Impl::saveData() { log::error("Unable to save values: {}", res2.unwrapErr()); } } + else { + auto res2 = asp::fs::remove(m_saveDirPath / "saved.json"); + if (!res2) { + log::error("Unable to remove saved.json: {}", res2.unwrapErr().message()); + } + } return Ok(); } From 4f7910da33d1f10bd522c86696feb50533cd666b Mon Sep 17 00:00:00 2001 From: Cvolton Date: Mon, 23 Mar 2026 14:19:54 +0100 Subject: [PATCH 3/6] dont save settings if theyre all default --- loader/src/loader/ModImpl.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 726bc9cfb..7a757c680 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -238,13 +238,19 @@ Result<> Mod::Impl::saveData() { // ModSettingsManager keeps track of the whole savedata matjson::Value json = m_settings->save(); + bool isDefault = true; + for (const auto& [key, value] : m_saved) { + if (m_settings->get(key) && m_settings->get(key)->isDefaultValue()) { + isDefault = false; + break; + } + } + // saveData is expected to be synchronous, and always called from GD thread ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send(); - // TODO: better check if its empty? - auto dump = json.dump(); - if(!dump.starts_with("{}")) { - auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", dump); + if(!isDefault) { + auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", json.dump()); if (!res) { log::error("Unable to save settings: {}", res.unwrapErr()); } @@ -256,7 +262,8 @@ Result<> Mod::Impl::saveData() { } } - dump = m_saved.dump(); + // TODO: better check if its empty? + auto dump = m_saved.dump(); if (!dump.starts_with("{}")) { auto res2 = utils::file::writeStringSafe(m_saveDirPath / "saved.json", m_saved.dump()); if (!res2) { From 107d307938a4a01405242161e0e0f11894c92d4a Mon Sep 17 00:00:00 2001 From: Cvolton Date: Mon, 23 Mar 2026 15:00:55 +0100 Subject: [PATCH 4/6] actually make the default value nonsaving work --- loader/include/Geode/loader/ModSettingsManager.hpp | 2 ++ loader/src/loader/ModImpl.cpp | 10 +--------- loader/src/loader/ModSettingsManager.cpp | 9 +++++++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/loader/include/Geode/loader/ModSettingsManager.hpp b/loader/include/Geode/loader/ModSettingsManager.hpp index f7eeb2adf..39851c188 100644 --- a/loader/include/Geode/loader/ModSettingsManager.hpp +++ b/loader/include/Geode/loader/ModSettingsManager.hpp @@ -67,5 +67,7 @@ namespace geode { * for this mod, they are also reloaded for the dependant mods */ void addDependant(Mod* mod); + + bool isDefaultValues() const; }; } diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 7a757c680..0c2ed819f 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -238,18 +238,10 @@ Result<> Mod::Impl::saveData() { // ModSettingsManager keeps track of the whole savedata matjson::Value json = m_settings->save(); - bool isDefault = true; - for (const auto& [key, value] : m_saved) { - if (m_settings->get(key) && m_settings->get(key)->isDefaultValue()) { - isDefault = false; - break; - } - } - // saveData is expected to be synchronous, and always called from GD thread ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send(); - if(!isDefault) { + if(!m_settings->isDefaultValues()) { auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", json.dump()); if (!res) { log::error("Unable to save settings: {}", res.unwrapErr()); diff --git a/loader/src/loader/ModSettingsManager.cpp b/loader/src/loader/ModSettingsManager.cpp index d76d48fce..19d29a9d1 100644 --- a/loader/src/loader/ModSettingsManager.cpp +++ b/loader/src/loader/ModSettingsManager.cpp @@ -338,3 +338,12 @@ bool ModSettingsManager::restartRequired() const { void ModSettingsManager::addDependant(Mod* mod) { m_impl->dependants.push_back(mod); } + +bool ModSettingsManager::isDefaultValues() const { + for (const auto& [key, setting] : this->m_impl->settings) { + if (setting.v3 && !setting.v3->isDefaultValue()) { + return false; + } + } + return true; +} \ No newline at end of file From af3348c3e2a651b05cd5bf09e036994d523f2ba4 Mon Sep 17 00:00:00 2001 From: Cvolton Date: Sat, 28 Mar 2026 17:19:26 +0100 Subject: [PATCH 5/6] Revert "actually make the default value nonsaving work" This reverts commit 107d307938a4a01405242161e0e0f11894c92d4a. --- loader/include/Geode/loader/ModSettingsManager.hpp | 2 -- loader/src/loader/ModImpl.cpp | 10 +++++++++- loader/src/loader/ModSettingsManager.cpp | 9 --------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/loader/include/Geode/loader/ModSettingsManager.hpp b/loader/include/Geode/loader/ModSettingsManager.hpp index 39851c188..f7eeb2adf 100644 --- a/loader/include/Geode/loader/ModSettingsManager.hpp +++ b/loader/include/Geode/loader/ModSettingsManager.hpp @@ -67,7 +67,5 @@ namespace geode { * for this mod, they are also reloaded for the dependant mods */ void addDependant(Mod* mod); - - bool isDefaultValues() const; }; } diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 0c2ed819f..7a757c680 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -238,10 +238,18 @@ Result<> Mod::Impl::saveData() { // ModSettingsManager keeps track of the whole savedata matjson::Value json = m_settings->save(); + bool isDefault = true; + for (const auto& [key, value] : m_saved) { + if (m_settings->get(key) && m_settings->get(key)->isDefaultValue()) { + isDefault = false; + break; + } + } + // saveData is expected to be synchronous, and always called from GD thread ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send(); - if(!m_settings->isDefaultValues()) { + if(!isDefault) { auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", json.dump()); if (!res) { log::error("Unable to save settings: {}", res.unwrapErr()); diff --git a/loader/src/loader/ModSettingsManager.cpp b/loader/src/loader/ModSettingsManager.cpp index 19d29a9d1..d76d48fce 100644 --- a/loader/src/loader/ModSettingsManager.cpp +++ b/loader/src/loader/ModSettingsManager.cpp @@ -338,12 +338,3 @@ bool ModSettingsManager::restartRequired() const { void ModSettingsManager::addDependant(Mod* mod) { m_impl->dependants.push_back(mod); } - -bool ModSettingsManager::isDefaultValues() const { - for (const auto& [key, setting] : this->m_impl->settings) { - if (setting.v3 && !setting.v3->isDefaultValue()) { - return false; - } - } - return true; -} \ No newline at end of file From f2fc3407006266185656b01d1f653220970bc44e Mon Sep 17 00:00:00 2001 From: Cvolton Date: Sat, 28 Mar 2026 17:19:33 +0100 Subject: [PATCH 6/6] Revert "dont save settings if theyre all default" This reverts commit 4f7910da33d1f10bd522c86696feb50533cd666b. --- loader/src/loader/ModImpl.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 7a757c680..726bc9cfb 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -238,19 +238,13 @@ Result<> Mod::Impl::saveData() { // ModSettingsManager keeps track of the whole savedata matjson::Value json = m_settings->save(); - bool isDefault = true; - for (const auto& [key, value] : m_saved) { - if (m_settings->get(key) && m_settings->get(key)->isDefaultValue()) { - isDefault = false; - break; - } - } - // saveData is expected to be synchronous, and always called from GD thread ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send(); - if(!isDefault) { - auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", json.dump()); + // TODO: better check if its empty? + auto dump = json.dump(); + if(!dump.starts_with("{}")) { + auto res = utils::file::writeStringSafe(m_saveDirPath / "settings.json", dump); if (!res) { log::error("Unable to save settings: {}", res.unwrapErr()); } @@ -262,8 +256,7 @@ Result<> Mod::Impl::saveData() { } } - // TODO: better check if its empty? - auto dump = m_saved.dump(); + dump = m_saved.dump(); if (!dump.starts_with("{}")) { auto res2 = utils::file::writeStringSafe(m_saveDirPath / "saved.json", m_saved.dump()); if (!res2) {