diff --git a/OtterGui b/OtterGui index f94bb054..b18fdb0d 160000 --- a/OtterGui +++ b/OtterGui @@ -1 +1 @@ -Subproject commit f94bb0541e422a3e61a7117e8ad5bbba2f8ed6c0 +Subproject commit b18fdb0d39016e783923d5956ae6c07a89e53f30 diff --git a/Penumbra.GameData/Actors/ActorManager.Data.cs b/Penumbra.GameData/Actors/ActorManager.Data.cs index b23fabf9..c2a4a8cd 100644 --- a/Penumbra.GameData/Actors/ActorManager.Data.cs +++ b/Penumbra.GameData/Actors/ActorManager.Data.cs @@ -48,7 +48,7 @@ public sealed partial class ActorManager : IDisposable public IReadOnlyDictionary ENpcs { get; } public ActorManagerData(DalamudPluginInterface pluginInterface, DataManager gameData, ClientLanguage language) - : base(pluginInterface, language, 1) + : base(pluginInterface, language, 2) { var worldTask = TryCatchDataAsync("Worlds", CreateWorldData(gameData)); var mountsTask = TryCatchDataAsync("Mounts", CreateMountData(gameData)); diff --git a/Penumbra.GameData/Data/HumanModelList.cs b/Penumbra.GameData/Data/HumanModelList.cs index 5ade3616..719c7bbb 100644 --- a/Penumbra.GameData/Data/HumanModelList.cs +++ b/Penumbra.GameData/Data/HumanModelList.cs @@ -11,7 +11,7 @@ namespace Penumbra.GameData.Data; public sealed class HumanModelList : DataSharer { public const string Tag = "HumanModels"; - public const int CurrentVersion = 1; + public const int CurrentVersion = 2; private readonly BitArray _humanModels; diff --git a/Penumbra.GameData/Data/ItemData.cs b/Penumbra.GameData/Data/ItemData.cs index 47f7b327..cece8732 100644 --- a/Penumbra.GameData/Data/ItemData.cs +++ b/Penumbra.GameData/Data/ItemData.cs @@ -26,12 +26,12 @@ public sealed class ItemData : DataSharer, IReadOnlyDictionary i.Name.RawData.Length > 1)) { var type = item.ToEquipType(); - if (type.IsWeapon()) + if (type.IsWeapon() || type.IsTool()) { if (item.ModelMain != 0) tmp[(int)type].Add(EquipItem.FromMainhand(item)); if (item.ModelSub != 0) - tmp[(int)type.Offhand()].Add(EquipItem.FromOffhand(item)); + tmp[(int)type.ValidOffhand()].Add(EquipItem.FromOffhand(item)); } else if (type != FullEquipType.Unknown) { @@ -76,7 +76,7 @@ public sealed class ItemData : DataSharer, IReadOnlyDictionary CreateItems(dataManager, language)); _mainItems = TryCatchData("ItemDictMain", () => CreateMainItems(_byType)); diff --git a/Penumbra.GameData/Data/ObjectIdentification.cs b/Penumbra.GameData/Data/ObjectIdentification.cs index 81968012..25b01f81 100644 --- a/Penumbra.GameData/Data/ObjectIdentification.cs +++ b/Penumbra.GameData/Data/ObjectIdentification.cs @@ -20,7 +20,7 @@ namespace Penumbra.GameData.Data; internal sealed class ObjectIdentification : DataSharer, IObjectIdentifier { - public const int IdentificationVersion = 1; + public const int IdentificationVersion = 2; public IGamePathParser GamePathParser { get; } = new GamePathParser(); public readonly IReadOnlyList> BnpcNames; diff --git a/Penumbra.GameData/Data/RestrictedGear.cs b/Penumbra.GameData/Data/RestrictedGear.cs index 7bfb2360..5e1fa5a0 100644 --- a/Penumbra.GameData/Data/RestrictedGear.cs +++ b/Penumbra.GameData/Data/RestrictedGear.cs @@ -30,7 +30,7 @@ public sealed class RestrictedGear : DataSharer public readonly IReadOnlyDictionary FemaleToMale; public RestrictedGear(DalamudPluginInterface pi, ClientLanguage language, DataManager gameData) - : base(pi, language, 1) + : base(pi, language, 2) { _items = gameData.GetExcelSheet()!; _categories = gameData.GetExcelSheet()!; diff --git a/Penumbra.GameData/Data/StainData.cs b/Penumbra.GameData/Data/StainData.cs index 8ba69d89..0e602307 100644 --- a/Penumbra.GameData/Data/StainData.cs +++ b/Penumbra.GameData/Data/StainData.cs @@ -14,7 +14,7 @@ public sealed class StainData : DataSharer, IReadOnlyDictionary public readonly IReadOnlyDictionary Data; public StainData(DalamudPluginInterface pluginInterface, DataManager dataManager, ClientLanguage language) - : base(pluginInterface, language, 1) + : base(pluginInterface, language, 2) { Data = TryCatchData("Stains", () => CreateStainData(dataManager)); } diff --git a/Penumbra.GameData/Enums/FullEquipType.cs b/Penumbra.GameData/Enums/FullEquipType.cs index 6d5b015e..7d7ae512 100644 --- a/Penumbra.GameData/Enums/FullEquipType.cs +++ b/Penumbra.GameData/Enums/FullEquipType.cs @@ -123,6 +123,17 @@ public static class FullEquipTypeExtensions FullEquipType.Pickaxe => true, FullEquipType.Hatchet => true, FullEquipType.FishingRod => true, + FullEquipType.ClawHammer => true, + FullEquipType.File => true, + FullEquipType.Pliers => true, + FullEquipType.GrindingWheel => true, + FullEquipType.Awl => true, + FullEquipType.SpinningWheel => true, + FullEquipType.Mortar => true, + FullEquipType.CulinaryKnife => true, + FullEquipType.Sledgehammer => true, + FullEquipType.GardenScythe => true, + FullEquipType.Gig => true, _ => false, }; @@ -362,6 +373,22 @@ public static class FullEquipTypeExtensions _ => FullEquipType.Unknown, }; + public static FullEquipType ValidOffhand(this FullEquipType type) + => type switch + { + FullEquipType.Fists => FullEquipType.FistsOff, + FullEquipType.Sword => FullEquipType.Shield, + FullEquipType.Wand => FullEquipType.Shield, + FullEquipType.Daggers => FullEquipType.DaggersOff, + FullEquipType.Gun => FullEquipType.GunOff, + FullEquipType.Orrery => FullEquipType.OrreryOff, + FullEquipType.Rapier => FullEquipType.RapierOff, + FullEquipType.Glaives => FullEquipType.GlaivesOff, + FullEquipType.Bow => FullEquipType.BowOff, + FullEquipType.Katana => FullEquipType.KatanaOff, + _ => FullEquipType.Unknown, + }; + public static FullEquipType Offhand(this FullEquipType type) => type switch { diff --git a/Penumbra.GameData/Structs/EquipItem.cs b/Penumbra.GameData/Structs/EquipItem.cs index 8a7a7fae..59ea94b4 100644 --- a/Penumbra.GameData/Structs/EquipItem.cs +++ b/Penumbra.GameData/Structs/EquipItem.cs @@ -84,7 +84,7 @@ public readonly struct EquipItem public static EquipItem FromOffhand(Item item) { - var type = item.ToEquipType().Offhand(); + var type = item.ToEquipType().ValidOffhand(); var name = item.Name.ToDalamudString().TextValue + type.OffhandTypeSuffix(); var id = item.RowId; var icon = item.Icon; diff --git a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs index 9331fb32..a705393d 100644 --- a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs +++ b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs @@ -203,7 +203,8 @@ public class ItemSwapTab : IDisposable, ITab case SwapType.Bracelet: case SwapType.Ring: var values = _selectors[_lastTab]; - if (values.Source.CurrentSelection.Type != FullEquipType.Unknown && values.Target.CurrentSelection.Type != FullEquipType.Unknown) + if (values.Source.CurrentSelection.Type != FullEquipType.Unknown + && values.Target.CurrentSelection.Type != FullEquipType.Unknown) _affectedItems = _swapData.LoadEquipment(values.Target.CurrentSelection, values.Source.CurrentSelection, _useCurrentCollection ? _collectionManager.Active.Current : null, _useRightRing, _useLeftRing);