@@ -167,15 +167,17 @@ VersionInfo Mod::Impl::getVersion() const {
167167matjson::Value& Mod::Impl::getSaveContainer () {
168168 // saved value taken, so we need to save it every time
169169 // since we dont know what the caller will do with the container
170- m_savedTaken = true ;
170+ m_saveRequestState = SaveRequestState::SaveUntilExit ;
171171
172172 return m_saved;
173173}
174174
175175matjson::Value& Mod::Impl::getSaveContainerTemp () {
176176 // saved value dirty - caller promises to get rid
177177 // of its ref before next save
178- m_savedDirty = true ;
178+ if (m_saveRequestState == SaveRequestState::Clean) {
179+ m_saveRequestState = SaveRequestState::SaveOnce;
180+ }
179181
180182 return m_saved;
181183}
@@ -232,11 +234,11 @@ Result<> Mod::Impl::loadData() {
232234 }
233235 } else {
234236 // this used to early return but skipping saved values is not great behavior here imo
235- m_settings->markDirty ();
237+ m_settings->queueSave ();
236238 log::warn (" Unable to load settings: {}" , json.unwrapErr ());
237239 }
238240 } else {
239- m_settings->markDirty ();
241+ m_settings->queueSave ();
240242 }
241243
242244 // Saved values
@@ -266,7 +268,7 @@ Result<> Mod::Impl::saveData() {
266268 }
267269
268270 // ModSettingsManager keeps track of the whole savedata
269- if (m_settings->dirty ()) {
271+ if (m_settings->shouldSave ()) {
270272 log::debug (" Saving settings for mod {}" , m_metadata.getID ());
271273
272274 matjson::Value json = m_settings->save ();
@@ -278,22 +280,24 @@ Result<> Mod::Impl::saveData() {
278280 if (!res) {
279281 log::error (" Unable to save settings: {}" , res.unwrapErr ());
280282 } else {
281- m_settings->unmarkDirty ();
283+ m_settings->saveFinished ();
282284 }
283285 } else {
284286 // duplicated line to retain old expectations of saveData being called after json dump but before file write
285287 ModStateEvent (ModEventType::DataSaved, std::move (m_self)).send ();
286288 }
287289
288- if (m_savedTaken || m_savedDirty ) {
290+ if (m_saveRequestState != SaveRequestState::Clean ) {
289291 log::debug (" Saving values for mod {}" , m_metadata.getID ());
290292
291293 auto res2 = utils::file::writeStringSafe (m_saveDirPath / " saved.json" , m_saved.dump ());
292294 if (!res2) {
293295 log::error (" Unable to save values: {}" , res2.unwrapErr ());
294296 }
295297
296- m_savedDirty = false ;
298+ if (m_saveRequestState == SaveRequestState::SaveOnce) {
299+ m_saveRequestState = SaveRequestState::Clean;
300+ }
297301 }
298302
299303 return Ok ();
0 commit comments