mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 18:27:24 +01:00
Move MetaIndex to its first class enum.
This commit is contained in:
parent
e4fc86ca38
commit
4f9e224494
10 changed files with 147 additions and 148 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
using Dalamud.Interface.Internal.Notifications;
|
using Dalamud.Interface.Internal.Notifications;
|
||||||
using Glamourer.GameData;
|
using Glamourer.GameData;
|
||||||
using Glamourer.Services;
|
using Glamourer.Services;
|
||||||
|
using Glamourer.State;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using OtterGui.Classes;
|
using OtterGui.Classes;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
|
|
@ -34,7 +35,7 @@ public class DesignBase
|
||||||
_designData = designData;
|
_designData = designData;
|
||||||
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
|
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
|
||||||
ApplyEquip = equipFlags & EquipFlagExtensions.All;
|
ApplyEquip = equipFlags & EquipFlagExtensions.All;
|
||||||
_designFlags = 0;
|
ApplyMeta = 0;
|
||||||
CustomizeSet = SetCustomizationSet(customize);
|
CustomizeSet = SetCustomizationSet(customize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,7 +46,7 @@ public class DesignBase
|
||||||
ApplyCustomize = clone.ApplyCustomizeRaw;
|
ApplyCustomize = clone.ApplyCustomizeRaw;
|
||||||
ApplyEquip = clone.ApplyEquip & EquipFlagExtensions.All;
|
ApplyEquip = clone.ApplyEquip & EquipFlagExtensions.All;
|
||||||
ApplyParameters = clone.ApplyParameters & CustomizeParameterExtensions.All;
|
ApplyParameters = clone.ApplyParameters & CustomizeParameterExtensions.All;
|
||||||
_designFlags = clone._designFlags & (DesignFlags)0x0F;
|
ApplyMeta = clone.ApplyMeta & MetaExtensions.All;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Ensure that the customization set is updated when the design data changes. </summary>
|
/// <summary> Ensure that the customization set is updated when the design data changes. </summary>
|
||||||
|
|
@ -57,16 +58,6 @@ public class DesignBase
|
||||||
|
|
||||||
#region Application Data
|
#region Application Data
|
||||||
|
|
||||||
[Flags]
|
|
||||||
private enum DesignFlags : byte
|
|
||||||
{
|
|
||||||
ApplyHatVisible = 0x01,
|
|
||||||
ApplyVisorState = 0x02,
|
|
||||||
ApplyWeaponVisible = 0x04,
|
|
||||||
ApplyWetness = 0x08,
|
|
||||||
WriteProtected = 0x10,
|
|
||||||
}
|
|
||||||
|
|
||||||
private CustomizeFlag _applyCustomize = CustomizeFlagExtensions.AllRelevant;
|
private CustomizeFlag _applyCustomize = CustomizeFlagExtensions.AllRelevant;
|
||||||
public CustomizeSet CustomizeSet { get; private set; }
|
public CustomizeSet CustomizeSet { get; private set; }
|
||||||
|
|
||||||
|
|
@ -84,9 +75,10 @@ public class DesignBase
|
||||||
internal CustomizeFlag ApplyCustomizeRaw
|
internal CustomizeFlag ApplyCustomizeRaw
|
||||||
=> _applyCustomize;
|
=> _applyCustomize;
|
||||||
|
|
||||||
internal EquipFlag ApplyEquip = EquipFlagExtensions.All;
|
internal EquipFlag ApplyEquip = EquipFlagExtensions.All;
|
||||||
internal CrestFlag ApplyCrest = CrestExtensions.AllRelevant;
|
internal CrestFlag ApplyCrest = CrestExtensions.AllRelevant;
|
||||||
private DesignFlags _designFlags = DesignFlags.ApplyHatVisible | DesignFlags.ApplyVisorState | DesignFlags.ApplyWeaponVisible;
|
internal MetaFlag ApplyMeta = MetaFlag.HatState | MetaFlag.VisorState | MetaFlag.WeaponState;
|
||||||
|
private bool _writeProtected;
|
||||||
|
|
||||||
public bool SetCustomize(CustomizeService customizeService, CustomizeArray customize)
|
public bool SetCustomize(CustomizeService customizeService, CustomizeArray customize)
|
||||||
{
|
{
|
||||||
|
|
@ -98,69 +90,30 @@ public class DesignBase
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool DoApplyHatVisible()
|
public bool DoApplyMeta(MetaIndex index)
|
||||||
=> _designFlags.HasFlag(DesignFlags.ApplyHatVisible);
|
=> ApplyMeta.HasFlag(index.ToFlag());
|
||||||
|
|
||||||
public bool DoApplyVisorToggle()
|
|
||||||
=> _designFlags.HasFlag(DesignFlags.ApplyVisorState);
|
|
||||||
|
|
||||||
public bool DoApplyWeaponVisible()
|
|
||||||
=> _designFlags.HasFlag(DesignFlags.ApplyWeaponVisible);
|
|
||||||
|
|
||||||
public bool DoApplyWetness()
|
|
||||||
=> _designFlags.HasFlag(DesignFlags.ApplyWetness);
|
|
||||||
|
|
||||||
public bool WriteProtected()
|
public bool WriteProtected()
|
||||||
=> _designFlags.HasFlag(DesignFlags.WriteProtected);
|
=> _writeProtected;
|
||||||
|
|
||||||
public bool SetApplyHatVisible(bool value)
|
public bool SetApplyMeta(MetaIndex index, bool value)
|
||||||
{
|
{
|
||||||
var newFlag = value ? _designFlags | DesignFlags.ApplyHatVisible : _designFlags & ~DesignFlags.ApplyHatVisible;
|
var newFlag = value ? ApplyMeta | index.ToFlag() : ApplyMeta & ~index.ToFlag();
|
||||||
if (newFlag == _designFlags)
|
if (newFlag == ApplyMeta)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_designFlags = newFlag;
|
ApplyMeta = newFlag;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SetApplyVisorToggle(bool value)
|
|
||||||
{
|
|
||||||
var newFlag = value ? _designFlags | DesignFlags.ApplyVisorState : _designFlags & ~DesignFlags.ApplyVisorState;
|
|
||||||
if (newFlag == _designFlags)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
_designFlags = newFlag;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SetApplyWeaponVisible(bool value)
|
|
||||||
{
|
|
||||||
var newFlag = value ? _designFlags | DesignFlags.ApplyWeaponVisible : _designFlags & ~DesignFlags.ApplyWeaponVisible;
|
|
||||||
if (newFlag == _designFlags)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
_designFlags = newFlag;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SetApplyWetness(bool value)
|
|
||||||
{
|
|
||||||
var newFlag = value ? _designFlags | DesignFlags.ApplyWetness : _designFlags & ~DesignFlags.ApplyWetness;
|
|
||||||
if (newFlag == _designFlags)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
_designFlags = newFlag;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetWriteProtected(bool value)
|
public bool SetWriteProtected(bool value)
|
||||||
{
|
{
|
||||||
var newFlag = value ? _designFlags | DesignFlags.WriteProtected : _designFlags & ~DesignFlags.WriteProtected;
|
if (value == _writeProtected)
|
||||||
if (newFlag == _designFlags)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_designFlags = newFlag;
|
_writeProtected = value;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool DoApplyEquip(EquipSlot slot)
|
public bool DoApplyEquip(EquipSlot slot)
|
||||||
|
|
@ -298,9 +251,9 @@ public class DesignBase
|
||||||
ret[slot.ToString()] = Serialize(item.Id, stain, crest, DoApplyEquip(slot), DoApplyStain(slot), DoApplyCrest(crestSlot));
|
ret[slot.ToString()] = Serialize(item.Id, stain, crest, DoApplyEquip(slot), DoApplyStain(slot), DoApplyCrest(crestSlot));
|
||||||
}
|
}
|
||||||
|
|
||||||
ret["Hat"] = new QuadBool(_designData.IsHatVisible(), DoApplyHatVisible()).ToJObject("Show", "Apply");
|
ret["Hat"] = new QuadBool(_designData.IsHatVisible(), DoApplyMeta(MetaIndex.HatState)).ToJObject("Show", "Apply");
|
||||||
ret["Visor"] = new QuadBool(_designData.IsVisorToggled(), DoApplyVisorToggle()).ToJObject("IsToggled", "Apply");
|
ret["Visor"] = new QuadBool(_designData.IsVisorToggled(), DoApplyMeta(MetaIndex.VisorState)).ToJObject("IsToggled", "Apply");
|
||||||
ret["Weapon"] = new QuadBool(_designData.IsWeaponVisible(), DoApplyWeaponVisible()).ToJObject("Show", "Apply");
|
ret["Weapon"] = new QuadBool(_designData.IsWeaponVisible(), DoApplyMeta(MetaIndex.WeaponState)).ToJObject("Show", "Apply");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -344,7 +297,7 @@ public class DesignBase
|
||||||
ret["Wetness"] = new JObject()
|
ret["Wetness"] = new JObject()
|
||||||
{
|
{
|
||||||
["Value"] = _designData.IsWet(),
|
["Value"] = _designData.IsWet(),
|
||||||
["Apply"] = DoApplyWetness(),
|
["Apply"] = DoApplyMeta(MetaIndex.Wetness),
|
||||||
};
|
};
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -478,7 +431,7 @@ public class DesignBase
|
||||||
// Load the token and set application.
|
// Load the token and set application.
|
||||||
bool TryGetToken(CustomizeParameterFlag flag, [NotNullWhen(true)] out JToken? token)
|
bool TryGetToken(CustomizeParameterFlag flag, [NotNullWhen(true)] out JToken? token)
|
||||||
{
|
{
|
||||||
token = parameters![flag.ToString()];
|
token = parameters[flag.ToString()];
|
||||||
if (token != null)
|
if (token != null)
|
||||||
{
|
{
|
||||||
var apply = token["Apply"]?.ToObject<bool>() ?? false;
|
var apply = token["Apply"]?.ToObject<bool>() ?? false;
|
||||||
|
|
@ -493,8 +446,8 @@ public class DesignBase
|
||||||
|
|
||||||
void MigrateLipOpacity()
|
void MigrateLipOpacity()
|
||||||
{
|
{
|
||||||
var token = parameters!["LipOpacity"]?["Percentage"]?.ToObject<float>();
|
var token = parameters["LipOpacity"]?["Percentage"]?.ToObject<float>();
|
||||||
var actualToken = parameters![CustomizeParameterFlag.LipDiffuse.ToString()]?["Alpha"];
|
var actualToken = parameters[CustomizeParameterFlag.LipDiffuse.ToString()]?["Alpha"];
|
||||||
if (token != null && actualToken == null)
|
if (token != null && actualToken == null)
|
||||||
design.GetDesignDataRef().Parameters.LipDiffuse.W = token.Value;
|
design.GetDesignDataRef().Parameters.LipDiffuse.W = token.Value;
|
||||||
}
|
}
|
||||||
|
|
@ -575,15 +528,15 @@ public class DesignBase
|
||||||
design.SetApplyCrest(CrestFlag.OffHand, applyCrestOff);
|
design.SetApplyCrest(CrestFlag.OffHand, applyCrestOff);
|
||||||
}
|
}
|
||||||
var metaValue = QuadBool.FromJObject(equip["Hat"], "Show", "Apply", QuadBool.NullFalse);
|
var metaValue = QuadBool.FromJObject(equip["Hat"], "Show", "Apply", QuadBool.NullFalse);
|
||||||
design.SetApplyHatVisible(metaValue.Enabled);
|
design.SetApplyMeta(MetaIndex.HatState, metaValue.Enabled);
|
||||||
design._designData.SetHatVisible(metaValue.ForcedValue);
|
design._designData.SetHatVisible(metaValue.ForcedValue);
|
||||||
|
|
||||||
metaValue = QuadBool.FromJObject(equip["Weapon"], "Show", "Apply", QuadBool.NullFalse);
|
metaValue = QuadBool.FromJObject(equip["Weapon"], "Show", "Apply", QuadBool.NullFalse);
|
||||||
design.SetApplyWeaponVisible(metaValue.Enabled);
|
design.SetApplyMeta(MetaIndex.WeaponState, metaValue.Enabled);
|
||||||
design._designData.SetWeaponVisible(metaValue.ForcedValue);
|
design._designData.SetWeaponVisible(metaValue.ForcedValue);
|
||||||
|
|
||||||
metaValue = QuadBool.FromJObject(equip["Visor"], "IsToggled", "Apply", QuadBool.NullFalse);
|
metaValue = QuadBool.FromJObject(equip["Visor"], "IsToggled", "Apply", QuadBool.NullFalse);
|
||||||
design.SetApplyVisorToggle(metaValue.Enabled);
|
design.SetApplyMeta(MetaIndex.VisorState, metaValue.Enabled);
|
||||||
design._designData.SetVisor(metaValue.ForcedValue);
|
design._designData.SetVisor(metaValue.ForcedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -610,7 +563,7 @@ public class DesignBase
|
||||||
|
|
||||||
var wetness = QuadBool.FromJObject(json["Wetness"], "Value", "Apply", QuadBool.NullFalse);
|
var wetness = QuadBool.FromJObject(json["Wetness"], "Value", "Apply", QuadBool.NullFalse);
|
||||||
design._designData.SetIsWet(wetness.ForcedValue);
|
design._designData.SetIsWet(wetness.ForcedValue);
|
||||||
design.SetApplyWetness(wetness.Enabled);
|
design.SetApplyMeta(MetaIndex.Wetness, wetness.Enabled);
|
||||||
|
|
||||||
design._designData.ModelId = json["ModelId"]?.ToObject<uint>() ?? 0;
|
design._designData.ModelId = json["ModelId"]?.ToObject<uint>() ?? 0;
|
||||||
PrintWarning(customizations.ValidateModelId(design._designData.ModelId, out design._designData.ModelId,
|
PrintWarning(customizations.ValidateModelId(design._designData.ModelId, out design._designData.ModelId,
|
||||||
|
|
@ -664,17 +617,13 @@ public class DesignBase
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_designData = DesignBase64Migration.MigrateBase64(items, humans, base64, out var equipFlags, out var customizeFlags,
|
_designData = DesignBase64Migration.MigrateBase64(items, humans, base64, out var equipFlags, out var customizeFlags,
|
||||||
out var writeProtected,
|
out var writeProtected, out var applyMeta);
|
||||||
out var applyHat, out var applyVisor, out var applyWeapon);
|
|
||||||
ApplyEquip = equipFlags;
|
ApplyEquip = equipFlags;
|
||||||
ApplyCustomize = customizeFlags;
|
ApplyCustomize = customizeFlags;
|
||||||
ApplyParameters = 0;
|
ApplyParameters = 0;
|
||||||
ApplyCrest = 0;
|
ApplyCrest = 0;
|
||||||
|
ApplyMeta = applyMeta;
|
||||||
SetWriteProtected(writeProtected);
|
SetWriteProtected(writeProtected);
|
||||||
SetApplyHatVisible(applyHat);
|
|
||||||
SetApplyVisorToggle(applyVisor);
|
|
||||||
SetApplyWeaponVisible(applyWeapon);
|
|
||||||
SetApplyWetness(true);
|
|
||||||
CustomizeSet = SetCustomizationSet(customize);
|
CustomizeSet = SetCustomizationSet(customize);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using Glamourer.Services;
|
using Glamourer.Services;
|
||||||
|
using Glamourer.State;
|
||||||
using OtterGui;
|
using OtterGui;
|
||||||
using Penumbra.GameData.DataContainers;
|
using Penumbra.GameData.DataContainers;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
|
|
@ -13,7 +14,7 @@ public class DesignBase64Migration
|
||||||
public const int Base64SizeV4 = 95;
|
public const int Base64SizeV4 = 95;
|
||||||
|
|
||||||
public static unsafe DesignData MigrateBase64(ItemManager items, HumanModelList humans, string base64, out EquipFlag equipFlags,
|
public static unsafe DesignData MigrateBase64(ItemManager items, HumanModelList humans, string base64, out EquipFlag equipFlags,
|
||||||
out CustomizeFlag customizeFlags, out bool writeProtected, out bool applyHat, out bool applyVisor, out bool applyWeapon)
|
out CustomizeFlag customizeFlags, out bool writeProtected, out MetaFlag metaFlags)
|
||||||
{
|
{
|
||||||
static void CheckSize(int length, int requiredLength)
|
static void CheckSize(int length, int requiredLength)
|
||||||
{
|
{
|
||||||
|
|
@ -25,9 +26,7 @@ public class DesignBase64Migration
|
||||||
byte applicationFlags;
|
byte applicationFlags;
|
||||||
ushort equipFlagsS;
|
ushort equipFlagsS;
|
||||||
var bytes = Convert.FromBase64String(base64);
|
var bytes = Convert.FromBase64String(base64);
|
||||||
applyHat = false;
|
metaFlags = MetaFlag.Wetness;
|
||||||
applyVisor = false;
|
|
||||||
applyWeapon = false;
|
|
||||||
var data = new DesignData();
|
var data = new DesignData();
|
||||||
switch (bytes[0])
|
switch (bytes[0])
|
||||||
{
|
{
|
||||||
|
|
@ -77,9 +76,12 @@ public class DesignBase64Migration
|
||||||
|
|
||||||
customizeFlags = (applicationFlags & 0x01) != 0 ? CustomizeFlagExtensions.All : 0;
|
customizeFlags = (applicationFlags & 0x01) != 0 ? CustomizeFlagExtensions.All : 0;
|
||||||
data.SetIsWet((applicationFlags & 0x02) != 0);
|
data.SetIsWet((applicationFlags & 0x02) != 0);
|
||||||
applyHat = (applicationFlags & 0x04) != 0;
|
if ((applicationFlags & 0x04) != 0)
|
||||||
applyWeapon = (applicationFlags & 0x08) != 0;
|
metaFlags |= MetaFlag.HatState;
|
||||||
applyVisor = (applicationFlags & 0x10) != 0;
|
if ((applicationFlags & 0x08) != 0)
|
||||||
|
metaFlags |= MetaFlag.WeaponState;
|
||||||
|
if ((applicationFlags & 0x10) != 0)
|
||||||
|
metaFlags |= MetaFlag.VisorState;
|
||||||
writeProtected = (applicationFlags & 0x20) != 0;
|
writeProtected = (applicationFlags & 0x20) != 0;
|
||||||
|
|
||||||
equipFlags = 0;
|
equipFlags = 0;
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,26 @@ public unsafe struct DesignData
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readonly bool GetMeta(MetaIndex index)
|
||||||
|
=> index switch
|
||||||
|
{
|
||||||
|
MetaIndex.Wetness => IsWet(),
|
||||||
|
MetaIndex.HatState => IsHatVisible(),
|
||||||
|
MetaIndex.VisorState => IsVisorToggled(),
|
||||||
|
MetaIndex.WeaponState => IsWeaponVisible(),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
public bool SetMeta(MetaIndex index, bool value)
|
||||||
|
=> index switch
|
||||||
|
{
|
||||||
|
MetaIndex.Wetness => SetIsWet(value),
|
||||||
|
MetaIndex.HatState => SetHatVisible(value),
|
||||||
|
MetaIndex.VisorState => SetVisor(value),
|
||||||
|
MetaIndex.WeaponState => SetWeaponVisible(value),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
public readonly bool IsWet()
|
public readonly bool IsWet()
|
||||||
=> (_states & 0x01) == 0x01;
|
=> (_states & 0x01) == 0x01;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,50 +6,9 @@ using Glamourer.State;
|
||||||
using Glamourer.Unlocks;
|
using Glamourer.Unlocks;
|
||||||
using OtterGui.Services;
|
using OtterGui.Services;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
using Penumbra.GameData.Structs;
|
|
||||||
|
|
||||||
namespace Glamourer.Designs.Links;
|
namespace Glamourer.Designs.Links;
|
||||||
|
|
||||||
using WeaponDict = Dictionary<FullEquipType, (EquipItem, StateChanged.Source)>;
|
|
||||||
|
|
||||||
public sealed class MergedDesign
|
|
||||||
{
|
|
||||||
public MergedDesign(DesignManager designManager)
|
|
||||||
{
|
|
||||||
Design = designManager.CreateTemporary();
|
|
||||||
Design.ApplyEquip = 0;
|
|
||||||
Design.ApplyCustomize = 0;
|
|
||||||
Design.ApplyCrest = 0;
|
|
||||||
Design.ApplyParameters = 0;
|
|
||||||
Design.SetApplyWetness(false);
|
|
||||||
Design.SetApplyVisorToggle(false);
|
|
||||||
Design.SetApplyWeaponVisible(false);
|
|
||||||
Design.SetApplyHatVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly DesignBase Design;
|
|
||||||
public readonly WeaponDict Weapons = new(4);
|
|
||||||
public readonly StateSource Source = new();
|
|
||||||
|
|
||||||
public StateChanged.Source GetSource(EquipSlot slot, bool stain, StateChanged.Source actualSource)
|
|
||||||
=> GetSource(Source[slot, stain], actualSource);
|
|
||||||
|
|
||||||
public StateChanged.Source GetSource(CrestFlag slot, StateChanged.Source actualSource)
|
|
||||||
=> GetSource(Source[slot], actualSource);
|
|
||||||
|
|
||||||
public StateChanged.Source GetSource(CustomizeIndex type, StateChanged.Source actualSource)
|
|
||||||
=> GetSource(Source[type], actualSource);
|
|
||||||
|
|
||||||
public StateChanged.Source GetSource(MetaIndex index, StateChanged.Source actualSource)
|
|
||||||
=> GetSource(Source[index], actualSource);
|
|
||||||
|
|
||||||
public StateChanged.Source GetSource(CustomizeParameterFlag flag, StateChanged.Source actualSource)
|
|
||||||
=> GetSource(Source[flag], actualSource);
|
|
||||||
|
|
||||||
public static StateChanged.Source GetSource(StateChanged.Source given, StateChanged.Source actualSource)
|
|
||||||
=> given is StateChanged.Source.Game ? StateChanged.Source.Game : actualSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DesignMerger(
|
public class DesignMerger(
|
||||||
DesignManager designManager,
|
DesignManager designManager,
|
||||||
CustomizeService _customize,
|
CustomizeService _customize,
|
||||||
|
|
@ -57,7 +16,8 @@ public class DesignMerger(
|
||||||
ItemUnlockManager _itemUnlocks,
|
ItemUnlockManager _itemUnlocks,
|
||||||
CustomizeUnlockManager _customizeUnlocks) : IService
|
CustomizeUnlockManager _customizeUnlocks) : IService
|
||||||
{
|
{
|
||||||
public MergedDesign Merge(IEnumerable<(DesignBase?, ApplicationType)> designs, in DesignData baseRef, bool respectOwnership)
|
public MergedDesign Merge(IEnumerable<(DesignBase?, ApplicationType)> designs, in DesignData baseRef, bool respectOwnership,
|
||||||
|
bool modAssociations)
|
||||||
{
|
{
|
||||||
var ret = new MergedDesign(designManager);
|
var ret = new MergedDesign(designManager);
|
||||||
CustomizeFlag fixFlags = 0;
|
CustomizeFlag fixFlags = 0;
|
||||||
|
|
@ -81,6 +41,7 @@ public class DesignMerger(
|
||||||
ReduceOffhands(data, equipFlags, ret, source, respectOwnership);
|
ReduceOffhands(data, equipFlags, ret, source, respectOwnership);
|
||||||
ReduceCrests(data, crestFlags, ret, source);
|
ReduceCrests(data, crestFlags, ret, source);
|
||||||
ReduceParameters(data, parameterFlags, ret, source);
|
ReduceParameters(data, parameterFlags, ret, source);
|
||||||
|
ReduceMods(design as Design, ret, modAssociations);
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplyFixFlags(ret, fixFlags);
|
ApplyFixFlags(ret, fixFlags);
|
||||||
|
|
@ -88,6 +49,15 @@ public class DesignMerger(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void ReduceMods(Design? design, MergedDesign ret, bool modAssociations)
|
||||||
|
{
|
||||||
|
if (design == null || !modAssociations)
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var (mod, settings) in design.AssociatedMods)
|
||||||
|
ret.AssociatedMods.TryAdd(mod, settings);
|
||||||
|
}
|
||||||
|
|
||||||
private static void ReduceMeta(in DesignData design, bool applyHat, bool applyVisor, bool applyWeapon, bool applyWet, MergedDesign ret,
|
private static void ReduceMeta(in DesignData design, bool applyHat, bool applyVisor, bool applyWeapon, bool applyWet, MergedDesign ret,
|
||||||
StateChanged.Source source)
|
StateChanged.Source source)
|
||||||
{
|
{
|
||||||
|
|
@ -196,7 +166,8 @@ public class DesignMerger(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReduceMainhands(in DesignData design, EquipFlag equipFlags, MergedDesign ret, StateChanged.Source source, bool respectOwnership)
|
private void ReduceMainhands(in DesignData design, EquipFlag equipFlags, MergedDesign ret, StateChanged.Source source,
|
||||||
|
bool respectOwnership)
|
||||||
{
|
{
|
||||||
if (!equipFlags.HasFlag(EquipFlag.Mainhand))
|
if (!equipFlags.HasFlag(EquipFlag.Mainhand))
|
||||||
return;
|
return;
|
||||||
|
|
@ -271,7 +242,7 @@ public class DesignMerger(
|
||||||
ret.Source[CustomizeIndex.Face] = source;
|
ret.Source[CustomizeIndex.Face] = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
var set = _customize.Manager.GetSet(customize.Clan, customize.Gender);
|
var set = ret.Design.CustomizeSet;
|
||||||
var face = customize.Face;
|
var face = customize.Face;
|
||||||
foreach (var index in Enum.GetValues<CustomizeIndex>())
|
foreach (var index in Enum.GetValues<CustomizeIndex>())
|
||||||
{
|
{
|
||||||
|
|
@ -291,6 +262,8 @@ public class DesignMerger(
|
||||||
ret.Source[index] = source;
|
ret.Source[index] = source;
|
||||||
fixFlags &= ~flag;
|
fixFlags &= ~flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret.Design.SetCustomize(_customize, customize);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ApplyFixFlags(MergedDesign ret, CustomizeFlag fixFlags)
|
private static void ApplyFixFlags(MergedDesign ret, CustomizeFlag fixFlags)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using Glamourer.Events;
|
using Glamourer.Events;
|
||||||
using Glamourer.GameData;
|
using Glamourer.GameData;
|
||||||
|
using Glamourer.Interop.Penumbra;
|
||||||
using Glamourer.State;
|
using Glamourer.State;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
using Penumbra.GameData.Structs;
|
using Penumbra.GameData.Structs;
|
||||||
|
|
@ -15,15 +16,38 @@ public sealed class MergedDesign
|
||||||
Design.ApplyCustomize = 0;
|
Design.ApplyCustomize = 0;
|
||||||
Design.ApplyCrest = 0;
|
Design.ApplyCrest = 0;
|
||||||
Design.ApplyParameters = 0;
|
Design.ApplyParameters = 0;
|
||||||
Design.SetApplyWetness(false);
|
Design.ApplyMeta = 0;
|
||||||
Design.SetApplyVisorToggle(false);
|
}
|
||||||
Design.SetApplyWeaponVisible(false);
|
|
||||||
Design.SetApplyHatVisible(false);
|
public MergedDesign(DesignBase design)
|
||||||
|
{
|
||||||
|
Design = design;
|
||||||
|
if (design.DoApplyEquip(EquipSlot.MainHand))
|
||||||
|
{
|
||||||
|
var weapon = design.DesignData.Item(EquipSlot.MainHand);
|
||||||
|
if (weapon.Valid)
|
||||||
|
Weapons.TryAdd(weapon.Type, (weapon, StateChanged.Source.Manual));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (design.DoApplyEquip(EquipSlot.OffHand))
|
||||||
|
{
|
||||||
|
var weapon = design.DesignData.Item(EquipSlot.OffHand);
|
||||||
|
if (weapon.Valid)
|
||||||
|
Weapons.TryAdd(weapon.Type, (weapon, StateChanged.Source.Manual));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MergedDesign(Design design)
|
||||||
|
: this((DesignBase)design)
|
||||||
|
{
|
||||||
|
foreach (var (mod, settings) in design.AssociatedMods)
|
||||||
|
AssociatedMods[mod] = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly DesignBase Design;
|
public readonly DesignBase Design;
|
||||||
public readonly Dictionary<FullEquipType, (EquipItem, StateChanged.Source)> Weapons = new(4);
|
public readonly Dictionary<FullEquipType, (EquipItem, StateChanged.Source)> Weapons = new(4);
|
||||||
public readonly StateSource Source = new();
|
public readonly StateSource Source = new();
|
||||||
|
public readonly SortedList<Mod, ModSettings> AssociatedMods = [];
|
||||||
|
|
||||||
public StateChanged.Source GetSource(EquipSlot slot, bool stain, StateChanged.Source actualSource)
|
public StateChanged.Source GetSource(EquipSlot slot, bool stain, StateChanged.Source actualSource)
|
||||||
=> GetSource(Source[slot, stain], actualSource);
|
=> GetSource(Source[slot, stain], actualSource);
|
||||||
|
|
|
||||||
39
Glamourer/Designs/MetaIndex.cs
Normal file
39
Glamourer/Designs/MetaIndex.cs
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
using Penumbra.GameData.Enums;
|
||||||
|
|
||||||
|
namespace Glamourer.State;
|
||||||
|
|
||||||
|
public enum MetaIndex
|
||||||
|
{
|
||||||
|
Wetness = EquipFlagExtensions.NumEquipFlags + CustomizationExtensions.NumIndices,
|
||||||
|
HatState,
|
||||||
|
VisorState,
|
||||||
|
WeaponState,
|
||||||
|
ModelId,
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum MetaFlag : byte
|
||||||
|
{
|
||||||
|
Wetness = 0x01,
|
||||||
|
HatState = 0x02,
|
||||||
|
VisorState = 0x04,
|
||||||
|
WeaponState = 0x08,
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MetaExtensions
|
||||||
|
{
|
||||||
|
public static readonly IReadOnlyList<MetaIndex> AllRelevant =
|
||||||
|
[MetaIndex.Wetness, MetaIndex.HatState, MetaIndex.VisorState, MetaIndex.WeaponState];
|
||||||
|
|
||||||
|
public const MetaFlag All = MetaFlag.Wetness | MetaFlag.HatState | MetaFlag.VisorState | MetaFlag.WeaponState;
|
||||||
|
|
||||||
|
public static MetaFlag ToFlag(this MetaIndex index)
|
||||||
|
=> index switch
|
||||||
|
{
|
||||||
|
MetaIndex.Wetness => MetaFlag.Wetness,
|
||||||
|
MetaIndex.HatState => MetaFlag.HatState,
|
||||||
|
MetaIndex.VisorState => MetaFlag.VisorState,
|
||||||
|
MetaIndex.WeaponState => MetaFlag.WeaponState,
|
||||||
|
_ => (MetaFlag) byte.MaxValue,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
using Glamourer.Designs;
|
using Glamourer.Designs;
|
||||||
using Glamourer.GameData;
|
using Glamourer.GameData;
|
||||||
using Glamourer.State;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using OtterGui.Services;
|
using OtterGui.Services;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
|
using Glamourer.Designs;
|
||||||
using Glamourer.Events;
|
using Glamourer.Events;
|
||||||
using Glamourer.GameData;
|
using Glamourer.GameData;
|
||||||
using Glamourer.Services;
|
using Glamourer.Services;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ using Dalamud.Game.ClientState.Conditions;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using Glamourer.GameData;
|
using Glamourer.GameData;
|
||||||
using Penumbra.GameData.DataContainers;
|
using Penumbra.GameData.DataContainers;
|
||||||
|
using Glamourer.Designs;
|
||||||
|
|
||||||
namespace Glamourer.State;
|
namespace Glamourer.State;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,6 @@ using static Glamourer.Events.StateChanged;
|
||||||
|
|
||||||
namespace Glamourer.State;
|
namespace Glamourer.State;
|
||||||
|
|
||||||
public enum MetaIndex
|
|
||||||
{
|
|
||||||
Wetness = EquipFlagExtensions.NumEquipFlags + CustomizationExtensions.NumIndices,
|
|
||||||
HatState,
|
|
||||||
VisorState,
|
|
||||||
WeaponState,
|
|
||||||
ModelId,
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly struct StateSource
|
public readonly struct StateSource
|
||||||
{
|
{
|
||||||
public static readonly int Size = EquipFlagExtensions.NumEquipFlags
|
public static readonly int Size = EquipFlagExtensions.NumEquipFlags
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue