Fix issue with unavailable customizations applying.

This commit is contained in:
Ottermandias 2023-07-15 15:23:25 +02:00
parent 4743914153
commit 3b55f72ce5
6 changed files with 50 additions and 15 deletions

View file

@ -51,6 +51,9 @@ public static class CustomizationExtensions
public static readonly CustomizeIndex[] All = Enum.GetValues<CustomizeIndex>()
.Where(v => v is not CustomizeIndex.Race and not CustomizeIndex.BodyType).ToArray();
public static readonly CustomizeIndex[] AllBasic = All
.Where(v => v is not CustomizeIndex.Gender and not CustomizeIndex.Clan).ToArray();
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public static (int ByteIdx, byte Mask) ToByteAndMask(this CustomizeIndex index)
=> index switch

View file

@ -378,22 +378,32 @@ public class DesignBase
var set = customizations.AwaitedService.GetList(clan, gender);
foreach (var idx in Enum.GetValues<CustomizeIndex>().Where(set.IsAvailable))
foreach (var idx in CustomizationExtensions.AllBasic)
{
var tok = json[idx.ToString()];
var data = (CustomizeValue)(tok?["Value"]?.ToObject<byte>() ?? 0);
PrintWarning(CustomizationService.ValidateCustomizeValue(set, design.DesignData.Customize.Face, idx, data, out data, allowUnknown));
var apply = tok?["Apply"]?.ToObject<bool>() ?? false;
design.DesignData.Customize[idx] = data;
design.SetApplyCustomize(idx, apply);
if (set.IsAvailable(idx))
{
var tok = json[idx.ToString()];
var data = (CustomizeValue)(tok?["Value"]?.ToObject<byte>() ?? 0);
PrintWarning(CustomizationService.ValidateCustomizeValue(set, design.DesignData.Customize.Face, idx, data, out data,
allowUnknown));
var apply = tok?["Apply"]?.ToObject<bool>() ?? false;
design.DesignData.Customize[idx] = data;
design.SetApplyCustomize(idx, apply);
}
else
{
design.DesignData.Customize[idx] = CustomizeValue.Zero;
design.SetApplyCustomize(idx, false);
}
}
}
public void MigrateBase64(ItemManager items, string base64)
public void MigrateBase64(CustomizationService customizations, ItemManager items, string base64)
{
DesignData = DesignBase64Migration.MigrateBase64(items, base64, out var equipFlags, out var customizeFlags, out var writeProtected,
out var applyHat, out var applyVisor, out var applyWeapon);
ApplyEquip = equipFlags;
ApplyEquip = equipFlags;
var set = customizations.AwaitedService.GetList(DesignData.Customize.Clan, DesignData.Customize.Gender);
ApplyCustomize = customizeFlags;
SetWriteProtected(writeProtected);
SetApplyHatVisible(applyHat);
@ -402,5 +412,15 @@ public class DesignBase
SetApplyWetness(DesignData.IsWet());
}
public void RemoveInvalidCustomize(CustomizationService customizations)
{
var set = customizations.AwaitedService.GetList(DesignData.Customize.Clan, DesignData.Customize.Gender);
foreach (var idx in CustomizationExtensions.AllBasic.Where(i => !set.IsAvailable(i)))
{
DesignData.Customize[idx] = CustomizeValue.Zero;
SetApplyCustomize(idx, false);
}
}
#endregion
}

View file

@ -79,7 +79,7 @@ public class DesignConverter
case 1:
case 2:
ret = _designs.CreateTemporary();
ret.MigrateBase64(_items, base64);
ret.MigrateBase64(_customize, _items, base64);
break;
case Version:
var version = bytes.DecompressToString(out var decompressed);

View file

@ -273,11 +273,13 @@ public class DesignManager
if (_customizations.ChangeClan(ref design.DesignData.Customize, (SubRace)value.Value) == 0)
return;
design.RemoveInvalidCustomize(_customizations);
break;
case CustomizeIndex.Gender:
if (_customizations.ChangeGender(ref design.DesignData.Customize, (Gender)(value.Value + 1)) == 0)
return;
design.RemoveInvalidCustomize(_customizations);
break;
default:
if (!_customizations.IsCustomizationValid(design.DesignData.Customize.Clan, design.DesignData.Customize.Gender,
@ -517,7 +519,7 @@ public class DesignManager
Identifier = CreateNewGuid(),
Name = actualName,
};
design.MigrateBase64(_items, base64);
design.MigrateBase64(_customizations, _items, base64);
if (!_designs.Any(d => d.Name == design.Name && d.CreationDate == design.CreationDate))
{
Add(design, $"Migrated old design to {design.Identifier}.");

View file

@ -199,7 +199,9 @@ public class DesignPanel
if (ImGui.CheckboxFlags("Apply All Customizations", ref flags, 3))
{
var newFlags = flags == 3;
foreach (var index in CustomizationExtensions.All)
_manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, newFlags);
_manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, newFlags);
foreach (var index in CustomizationExtensions.AllBasic.Where(set.IsAvailable))
_manager.ChangeApplyCustomize(_selector.Selected!, index, newFlags);
}

View file

@ -277,11 +277,19 @@ public sealed class CustomizationService : AsyncServiceWrapper<ICustomizationMan
private static CustomizeFlag FixValues(CustomizationSet set, ref Customize customize)
{
CustomizeFlag flags = 0;
foreach (var idx in Enum.GetValues<CustomizeIndex>().Where(set.IsAvailable))
foreach (var idx in Enum.GetValues<CustomizeIndex>())
{
if (ValidateCustomizeValue(set, customize.Face, idx, customize[idx], out var fixedValue, false).Length > 0)
if (set.IsAvailable(idx))
{
customize[idx] = fixedValue;
if (ValidateCustomizeValue(set, customize.Face, idx, customize[idx], out var fixedValue, false).Length > 0)
{
customize[idx] = fixedValue;
flags |= idx.ToFlag();
}
}
else
{
customize[idx] = CustomizeValue.Zero;
flags |= idx.ToFlag();
}
}