mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-20 14:57:50 +01:00
Add option to apply only attributes from IMC group.
This commit is contained in:
parent
ac1ea124d9
commit
00fbb2686b
8 changed files with 63 additions and 40 deletions
|
|
@ -10,8 +10,7 @@ namespace Penumbra.Mods.Editor;
|
|||
|
||||
public class ModMetaEditor(
|
||||
ModGroupEditor groupEditor,
|
||||
MetaFileManager metaFileManager,
|
||||
ImcChecker imcChecker) : MetaDictionary, IService
|
||||
MetaFileManager metaFileManager) : MetaDictionary, IService
|
||||
{
|
||||
public sealed class OtherOptionData : HashSet<string>
|
||||
{
|
||||
|
|
@ -67,14 +66,14 @@ public class ModMetaEditor(
|
|||
Changes = false;
|
||||
}
|
||||
|
||||
public static bool DeleteDefaultValues(MetaFileManager metaFileManager, ImcChecker imcChecker, MetaDictionary dict)
|
||||
public static bool DeleteDefaultValues(MetaFileManager metaFileManager, MetaDictionary dict)
|
||||
{
|
||||
var clone = dict.Clone();
|
||||
dict.Clear();
|
||||
var count = 0;
|
||||
foreach (var (key, value) in clone.Imc)
|
||||
{
|
||||
var defaultEntry = imcChecker.GetDefaultEntry(key, false);
|
||||
var defaultEntry = ImcChecker.GetDefaultEntry(key, false);
|
||||
if (!defaultEntry.Entry.Equals(value))
|
||||
{
|
||||
dict.TryAdd(key, value);
|
||||
|
|
@ -164,7 +163,7 @@ public class ModMetaEditor(
|
|||
}
|
||||
|
||||
public void DeleteDefaultValues()
|
||||
=> Changes = DeleteDefaultValues(metaFileManager, imcChecker, this);
|
||||
=> Changes = DeleteDefaultValues(metaFileManager, this);
|
||||
|
||||
public void Apply(IModDataContainer container)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ public class ImcModGroup(Mod mod) : IModGroup
|
|||
public ImcIdentifier Identifier;
|
||||
public ImcEntry DefaultEntry;
|
||||
public bool AllVariants;
|
||||
public bool OnlyAttributes;
|
||||
|
||||
|
||||
public FullPath? FindBestMatch(Utf8GamePath gamePath)
|
||||
|
|
@ -97,28 +98,36 @@ public class ImcModGroup(Mod mod) : IModGroup
|
|||
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer)
|
||||
=> new ImcModGroupEditDrawer(editDrawer, this);
|
||||
|
||||
public ImcEntry GetEntry(ushort mask)
|
||||
=> DefaultEntry with { AttributeMask = mask };
|
||||
private ImcEntry GetEntry(Variant variant, ushort mask)
|
||||
{
|
||||
if (!OnlyAttributes)
|
||||
return DefaultEntry with { AttributeMask = mask };
|
||||
|
||||
var defaultEntry = ImcChecker.GetDefaultEntry(Identifier with { Variant = variant }, true);
|
||||
if (defaultEntry.VariantExists)
|
||||
return defaultEntry.Entry with { AttributeMask = mask };
|
||||
|
||||
return DefaultEntry with { AttributeMask = mask };
|
||||
}
|
||||
|
||||
public void AddData(Setting setting, Dictionary<Utf8GamePath, FullPath> redirections, MetaDictionary manipulations)
|
||||
{
|
||||
if (IsDisabled(setting))
|
||||
return;
|
||||
|
||||
var mask = GetCurrentMask(setting);
|
||||
var entry = GetEntry(mask);
|
||||
var mask = GetCurrentMask(setting);
|
||||
if (AllVariants)
|
||||
{
|
||||
var count = ImcChecker.GetVariantCount(Identifier);
|
||||
if (count == 0)
|
||||
manipulations.TryAdd(Identifier, entry);
|
||||
manipulations.TryAdd(Identifier, GetEntry(Identifier.Variant, mask));
|
||||
else
|
||||
for (var i = 0; i <= count; ++i)
|
||||
manipulations.TryAdd(Identifier with { Variant = (Variant)i }, entry);
|
||||
manipulations.TryAdd(Identifier with { Variant = (Variant)i }, GetEntry((Variant)i, mask));
|
||||
}
|
||||
else
|
||||
{
|
||||
manipulations.TryAdd(Identifier, entry);
|
||||
manipulations.TryAdd(Identifier, GetEntry(Identifier.Variant, mask));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -138,6 +147,8 @@ public class ImcModGroup(Mod mod) : IModGroup
|
|||
serializer.Serialize(jWriter, DefaultEntry);
|
||||
jWriter.WritePropertyName(nameof(AllVariants));
|
||||
jWriter.WriteValue(AllVariants);
|
||||
jWriter.WritePropertyName(nameof(OnlyAttributes));
|
||||
jWriter.WriteValue(OnlyAttributes);
|
||||
jWriter.WritePropertyName("Options");
|
||||
jWriter.WriteStartArray();
|
||||
foreach (var option in OptionData)
|
||||
|
|
@ -170,8 +181,9 @@ public class ImcModGroup(Mod mod) : IModGroup
|
|||
var identifier = ImcIdentifier.FromJson(json[nameof(Identifier)] as JObject);
|
||||
var ret = new ImcModGroup(mod)
|
||||
{
|
||||
DefaultEntry = json[nameof(DefaultEntry)]?.ToObject<ImcEntry>() ?? new ImcEntry(),
|
||||
AllVariants = json[nameof(AllVariants)]?.ToObject<bool>() ?? false,
|
||||
DefaultEntry = json[nameof(DefaultEntry)]?.ToObject<ImcEntry>() ?? new ImcEntry(),
|
||||
AllVariants = json[nameof(AllVariants)]?.ToObject<bool>() ?? false,
|
||||
OnlyAttributes = json[nameof(OnlyAttributes)]?.ToObject<bool>() ?? false,
|
||||
};
|
||||
if (!ModSaveGroup.ReadJsonBase(json, ret))
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -89,6 +89,16 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ
|
|||
Communicator.ModOptionChanged.Invoke(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, -1);
|
||||
}
|
||||
|
||||
public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveType saveType = SaveType.Queue)
|
||||
{
|
||||
if (group.OnlyAttributes == onlyAttributes)
|
||||
return;
|
||||
|
||||
group.OnlyAttributes = onlyAttributes;
|
||||
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
|
||||
Communicator.ModOptionChanged.Invoke(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, -1);
|
||||
}
|
||||
|
||||
public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType saveType = SaveType.Queue)
|
||||
{
|
||||
if (group.CanBeDisabled == canBeDisabled)
|
||||
|
|
|
|||
|
|
@ -25,8 +25,7 @@ public partial class ModCreator(
|
|||
Configuration config,
|
||||
ModDataEditor dataEditor,
|
||||
MetaFileManager metaFileManager,
|
||||
GamePathParser gamePathParser,
|
||||
ImcChecker imcChecker) : IService
|
||||
GamePathParser gamePathParser) : IService
|
||||
{
|
||||
public readonly Configuration Config = config;
|
||||
|
||||
|
|
@ -86,7 +85,7 @@ public partial class ModCreator(
|
|||
{
|
||||
foreach (var container in mod.AllDataContainers)
|
||||
{
|
||||
if (ModMetaEditor.DeleteDefaultValues(metaFileManager, imcChecker, container.Manipulations))
|
||||
if (ModMetaEditor.DeleteDefaultValues(metaFileManager, container.Manipulations))
|
||||
saveService.ImmediateSaveSync(new ModSaveGroup(container, Config.ReplaceNonAsciiOnImport));
|
||||
}
|
||||
}
|
||||
|
|
@ -235,7 +234,7 @@ public partial class ModCreator(
|
|||
DeleteDeleteList(deleteList, delete);
|
||||
var changes = oldSize < option.Manipulations.Count;
|
||||
if (deleteDefault && !Config.KeepDefaultMetaChanges)
|
||||
changes |= ModMetaEditor.DeleteDefaultValues(metaFileManager, imcChecker, option.Manipulations);
|
||||
changes |= ModMetaEditor.DeleteDefaultValues(metaFileManager, option.Manipulations);
|
||||
|
||||
return (changes, deleteList);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue