Update for changed GameData.

This commit is contained in:
Ottermandias 2023-12-17 11:51:24 +01:00
parent 3305250482
commit 7d612df951
42 changed files with 374 additions and 455 deletions

View file

@ -1,5 +1,4 @@
using Penumbra.Api.Enums;
using Penumbra.GameData;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Files;
@ -41,7 +40,7 @@ public static class EquipmentSwap
: Array.Empty<EquipSlot>();
}
public static EquipItem[] CreateTypeSwap(MetaFileManager manager, IObjectIdentifier identifier, List<Swap> swaps,
public static EquipItem[] CreateTypeSwap(MetaFileManager manager, ObjectIdentification identifier, List<Swap> swaps,
Func<Utf8GamePath, FullPath> redirections, Func<MetaManipulation, MetaManipulation> manips,
EquipSlot slotFrom, EquipItem itemFrom, EquipSlot slotTo, EquipItem itemTo)
{
@ -99,7 +98,7 @@ public static class EquipmentSwap
return affectedItems;
}
public static EquipItem[] CreateItemSwap(MetaFileManager manager, IObjectIdentifier identifier, List<Swap> swaps,
public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentification identifier, List<Swap> swaps,
Func<Utf8GamePath, FullPath> redirections, Func<MetaManipulation, MetaManipulation> manips, EquipItem itemFrom,
EquipItem itemTo, bool rFinger = true, bool lFinger = true)
{
@ -247,7 +246,7 @@ public static class EquipmentSwap
variant = i.Variant;
}
private static (ImcFile, Variant[], EquipItem[]) GetVariants(MetaFileManager manager, IObjectIdentifier identifier, EquipSlot slotFrom,
private static (ImcFile, Variant[], EquipItem[]) GetVariants(MetaFileManager manager, ObjectIdentification identifier, EquipSlot slotFrom,
SetId idFrom, SetId idTo, Variant variantFrom)
{
var entry = new ImcManipulation(slotFrom, variantFrom.Id, idFrom, default);
@ -256,11 +255,8 @@ public static class EquipmentSwap
Variant[] variants;
if (idFrom == idTo)
{
items = identifier.Identify(idFrom, variantFrom, slotFrom).ToArray();
variants = new[]
{
variantFrom,
};
items = identifier.Identify(idFrom, 0, variantFrom, slotFrom).ToArray();
variants = [variantFrom];
}
else
{

View file

@ -1,5 +1,5 @@
using Lumina.Excel.GeneratedSheets;
using Penumbra.Collections;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.Meta.Manipulations;
@ -7,17 +7,16 @@ using Penumbra.String.Classes;
using Penumbra.Meta;
using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses;
using Penumbra.Services;
namespace Penumbra.Mods.ItemSwap;
public class ItemSwapContainer
{
private readonly MetaFileManager _manager;
private readonly IdentifierService _identifier;
private readonly MetaFileManager _manager;
private readonly ObjectIdentification _identifier;
private Dictionary<Utf8GamePath, FullPath> _modRedirections = new();
private HashSet<MetaManipulation> _modManipulations = new();
private Dictionary<Utf8GamePath, FullPath> _modRedirections = [];
private HashSet<MetaManipulation> _modManipulations = [];
public IReadOnlyDictionary<Utf8GamePath, FullPath> ModRedirections
=> _modRedirections;
@ -25,7 +24,7 @@ public class ItemSwapContainer
public IReadOnlySet<MetaManipulation> ModManipulations
=> _modManipulations;
public readonly List<Swap> Swaps = new();
public readonly List<Swap> Swaps = [];
public bool Loaded { get; private set; }
@ -107,7 +106,7 @@ public class ItemSwapContainer
}
}
public ItemSwapContainer(MetaFileManager manager, IdentifierService identifier)
public ItemSwapContainer(MetaFileManager manager, ObjectIdentification identifier)
{
_manager = manager;
_identifier = identifier;
@ -130,7 +129,7 @@ public class ItemSwapContainer
{
Swaps.Clear();
Loaded = false;
var ret = EquipmentSwap.CreateItemSwap(_manager, _identifier.AwaitedService, Swaps, PathResolver(collection), MetaResolver(collection),
var ret = EquipmentSwap.CreateItemSwap(_manager, _identifier, Swaps, PathResolver(collection), MetaResolver(collection),
from, to, useRightRing, useLeftRing);
Loaded = true;
return ret;
@ -140,7 +139,7 @@ public class ItemSwapContainer
{
Swaps.Clear();
Loaded = false;
var ret = EquipmentSwap.CreateTypeSwap(_manager, _identifier.AwaitedService, Swaps, PathResolver(collection), MetaResolver(collection),
var ret = EquipmentSwap.CreateTypeSwap(_manager, _identifier, Swaps, PathResolver(collection), MetaResolver(collection),
slotFrom, from, slotTo, to);
Loaded = true;
return ret;

View file

@ -1,5 +1,4 @@
using Penumbra.Communication;
using Penumbra.GameData;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
using Penumbra.Meta.Manipulations;
@ -9,11 +8,12 @@ namespace Penumbra.Mods.Manager;
public class ModCacheManager : IDisposable
{
private readonly CommunicatorService _communicator;
private readonly IdentifierService _identifier;
private readonly ModStorage _modManager;
private readonly CommunicatorService _communicator;
private readonly ObjectIdentification _identifier;
private readonly ModStorage _modManager;
private bool _updatingItems = false;
public ModCacheManager(CommunicatorService communicator, IdentifierService identifier, ModStorage modStorage)
public ModCacheManager(CommunicatorService communicator, ObjectIdentification identifier, ModStorage modStorage)
{
_communicator = communicator;
_identifier = identifier;
@ -23,8 +23,7 @@ public class ModCacheManager : IDisposable
_communicator.ModPathChanged.Subscribe(OnModPathChange, ModPathChanged.Priority.ModCacheManager);
_communicator.ModDataChanged.Subscribe(OnModDataChange, ModDataChanged.Priority.ModCacheManager);
_communicator.ModDiscoveryFinished.Subscribe(OnModDiscoveryFinished, ModDiscoveryFinished.Priority.ModCacheManager);
if (!identifier.Valid)
identifier.FinishedCreation += OnIdentifierCreation;
identifier.Awaiter.ContinueWith(_ => OnIdentifierCreation());
OnModDiscoveryFinished();
}
@ -37,7 +36,7 @@ public class ModCacheManager : IDisposable
}
/// <summary> Compute the items changed by a given meta manipulation and put them into the changedItems dictionary. </summary>
public static void ComputeChangedItems(IObjectIdentifier identifier, IDictionary<string, object?> changedItems, MetaManipulation manip)
public static void ComputeChangedItems(ObjectIdentification identifier, IDictionary<string, object?> changedItems, MetaManipulation manip)
{
switch (manip.ManipulationType)
{
@ -155,10 +154,7 @@ public class ModCacheManager : IDisposable
=> Parallel.ForEach(_modManager, Refresh);
private void OnIdentifierCreation()
{
Parallel.ForEach(_modManager, UpdateChangedItems);
_identifier.FinishedCreation -= OnIdentifierCreation;
}
=> Parallel.ForEach(_modManager, UpdateChangedItems);
private static void UpdateFileCount(Mod mod)
=> mod.TotalFileCount = mod.AllSubMods.Sum(s => s.Files.Count);
@ -177,18 +173,23 @@ public class ModCacheManager : IDisposable
private void UpdateChangedItems(Mod mod)
{
if (_updatingItems)
return;
_updatingItems = true;
var changedItems = (SortedList<string, object?>)mod.ChangedItems;
changedItems.Clear();
if (!_identifier.Valid)
if (!_identifier.Awaiter.IsCompletedSuccessfully)
return;
foreach (var gamePath in mod.AllSubMods.SelectMany(m => m.Files.Keys.Concat(m.FileSwaps.Keys)))
_identifier.AwaitedService.Identify(changedItems, gamePath.ToString());
_identifier.Identify(changedItems, gamePath.ToString());
foreach (var manip in mod.AllSubMods.SelectMany(m => m.Manipulations))
ComputeChangedItems(_identifier.AwaitedService, changedItems, manip);
ComputeChangedItems(_identifier, changedItems, manip);
mod.LowerChangedItemsString = string.Join("\0", mod.ChangedItems.Keys.Select(k => k.ToLowerInvariant()));
_updatingItems = false;
}
private static void UpdateCounts(Mod mod)

View file

@ -5,7 +5,7 @@ using OtterGui;
using OtterGui.Classes;
using OtterGui.Filesystem;
using Penumbra.Api.Enums;
using Penumbra.GameData;
using Penumbra.GameData.Data;
using Penumbra.Import;
using Penumbra.Import.Structs;
using Penumbra.Meta;
@ -17,7 +17,7 @@ using Penumbra.String.Classes;
namespace Penumbra.Mods;
public partial class ModCreator(SaveService _saveService, Configuration config, ModDataEditor _dataEditor, MetaFileManager _metaFileManager,
IGamePathParser _gamePathParser)
GamePathParser _gamePathParser)
{
public readonly Configuration Config = config;