From 2dfe043e1e44d817a5d2f252e2cc8bfb74a75b22 Mon Sep 17 00:00:00 2001 From: biwa <6475593+biwa@users.noreply.github.com> Date: Sat, 26 Feb 2022 16:21:59 +0100 Subject: [PATCH] UDMF: fixed an issue where user variables with default values were not saved when their value was equal to the type's default value. Fixes #709 --- Source/Core/Controls/FieldsEditorControl.cs | 9 ++++++--- Source/Core/Windows/ThingEditFormUDMF.cs | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/Core/Controls/FieldsEditorControl.cs b/Source/Core/Controls/FieldsEditorControl.cs index 13cfba2d..da49561b 100755 --- a/Source/Core/Controls/FieldsEditorControl.cs +++ b/Source/Core/Controls/FieldsEditorControl.cs @@ -417,7 +417,7 @@ namespace CodeImp.DoomBuilder.Controls } //mxd - public void ApplyUserVars(Dictionary vars, UniFields tofields) + public void ApplyUserVars(Dictionary vars, Dictionary vardefaults, UniFields tofields) { // Apply user variables when target map element contains user var definition and the value is not default foreach(DataGridViewRow row in fieldslist.Rows) @@ -434,8 +434,11 @@ namespace CodeImp.DoomBuilder.Controls // Skip field when mixed values if(newvalue == null) continue; - // Remove field - if(newvalue.Equals(frow.TypeHandler.GetDefaultValue())) + object typedefault = frow.TypeHandler.GetDefaultValue(); + object userdefault = vardefaults.ContainsKey(frow.Name) ? vardefaults[frow.Name] : typedefault; + + // Remove field, but only if the type's default value is the same as the user var's default value + if (newvalue.Equals(typedefault) && typedefault.Equals(userdefault)) { if(tofields.ContainsKey(frow.Name)) tofields.Remove(frow.Name); } diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs index a131d505..0d71eac9 100755 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -584,9 +584,10 @@ namespace CodeImp.DoomBuilder.Windows if (ti != null && ti.Actor != null) { Dictionary uservars = ti.Actor.GetAllUserVars(); + Dictionary uservardefaults = ti.Actor.GetAllUserVarDefaults(); if(uservars.Count > 0) - fieldslist.ApplyUserVars(uservars, t.Fields); + fieldslist.ApplyUserVars(uservars, uservardefaults, t.Fields); } color.ApplyTo(t.Fields, t.Fields.GetValue("fillcolor", 0));