Move Object Identification and Path Parsing to GameData, create initializable static Identifier in GameData.

This commit is contained in:
Ottermandias 2021-07-25 02:41:36 +02:00
parent b93c5376de
commit 702f8e3967
13 changed files with 88 additions and 35 deletions

View file

@ -4,10 +4,10 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Dalamud.Plugin; using Dalamud.Plugin;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;
using Penumbra.Util;
namespace Penumbra.Game namespace Penumbra.GameData
{ {
public static class GamePathParser public static class GamePathParser
{ {

View file

@ -6,13 +6,12 @@ using Lumina.Excel.GeneratedSheets;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;
using Penumbra.Util;
using Action = Lumina.Excel.GeneratedSheets.Action; using Action = Lumina.Excel.GeneratedSheets.Action;
using Race = Penumbra.GameData.Enums.Race; using Race = Penumbra.GameData.Enums.Race;
namespace Penumbra.Game namespace Penumbra.GameData
{ {
public class ObjectIdentification internal class ObjectIdentification
{ {
private readonly List< (ulong, HashSet< Item >) > _weapons; private readonly List< (ulong, HashSet< Item >) > _weapons;
private readonly List< (ulong, HashSet< Item >) > _equipment; private readonly List< (ulong, HashSet< Item >) > _equipment;

View file

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using Dalamud.Plugin;
using Lumina.Excel.GeneratedSheets;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.GameData.Util;
namespace Penumbra.GameData
{
public static class ObjectIdentifier
{
private static ObjectIdentification? _identification = null;
public static bool Initialize( DalamudPluginInterface pi )
{
if( _identification != null )
{
return true;
}
try
{
_identification = new ObjectIdentification( pi );
return true;
}
catch( Exception e )
{
_identification = null;
PluginLog.Error( $"Failure while initializing Object Identifier:\n{e}" );
return false;
}
}
private static void Verify()
{
if( _identification == null )
{
throw new Exception( "Object Identifier not initialized." );
}
}
public static void Identify( IDictionary< string, object? > set, GamePath path )
{
Verify();
_identification!.Identify( set, path );
}
public static Dictionary< string, object? > Identify( GamePath path )
{
Dictionary< string, object? > ret = new();
Identify( ret, path );
return ret;
}
public static Item? Identify( SetId setId, WeaponType weaponType, ushort variant, EquipSlot slot )
{
Verify();
return _identification!.Identify( setId, weaponType, variant, slot );
}
}
}

View file

@ -3,7 +3,7 @@ using System.Runtime.InteropServices;
using Dalamud; using Dalamud;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
namespace Penumbra.Game namespace Penumbra.GameData.Structs
{ {
[StructLayout( LayoutKind.Explicit )] [StructLayout( LayoutKind.Explicit )]
public struct GameObjectInfo : IComparable public struct GameObjectInfo : IComparable

View file

@ -4,7 +4,7 @@ using System.IO;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Dalamud.Plugin; using Dalamud.Plugin;
using Lumina.Data.Files; using Lumina.Data.Files;
using Penumbra.Game; using Penumbra.GameData;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;

View file

@ -2,7 +2,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Penumbra.Game;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;

View file

@ -2,7 +2,6 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Lumina.Data; using Lumina.Data;
using Penumbra.Game;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
namespace Penumbra.Meta.Files namespace Penumbra.Meta.Files

View file

@ -1,5 +1,4 @@
using Lumina.Data; using Lumina.Data;
using Penumbra.Game;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
namespace Penumbra.Meta.Files namespace Penumbra.Meta.Files

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using Dalamud.Plugin; using Dalamud.Plugin;
using Lumina.Data; using Lumina.Data;
using Lumina.Data.Files; using Lumina.Data.Files;
using Penumbra.Game;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;

View file

@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Dalamud.Plugin; using Dalamud.Plugin;
using Penumbra.Game; using Penumbra.GameData;
using Penumbra.Util; using Penumbra.Util;
namespace Penumbra.Mod namespace Penumbra.Mod
@ -31,20 +31,18 @@ namespace Penumbra.Mod
public void ComputeChangedItems() public void ComputeChangedItems()
{ {
var ident = Service< ObjectIdentification >.Get();
ChangedItems.Clear(); ChangedItems.Clear();
foreach( var file in Resources.ModFiles.Select( f => new RelPath( f, BasePath ) ) ) foreach( var file in Resources.ModFiles.Select( f => new RelPath( f, BasePath ) ) )
{ {
foreach( var path in ModFunctions.GetAllFiles( file, Meta ) ) foreach( var path in ModFunctions.GetAllFiles( file, Meta ) )
{ {
ident.Identify( ChangedItems, path ); ObjectIdentifier.Identify( ChangedItems, path );
} }
} }
foreach( var path in Meta.FileSwaps.Keys ) foreach( var path in Meta.FileSwaps.Keys )
{ {
ident.Identify( ChangedItems, path ); ObjectIdentifier.Identify( ChangedItems, path );
} }
} }

View file

@ -4,7 +4,7 @@ using Dalamud.Plugin;
using EmbedIO; using EmbedIO;
using EmbedIO.WebApi; using EmbedIO.WebApi;
using Penumbra.API; using Penumbra.API;
using Penumbra.Game; using Penumbra.GameData;
using Penumbra.Interop; using Penumbra.Interop;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Meta.Files; using Penumbra.Meta.Files;
@ -41,7 +41,7 @@ namespace Penumbra
{ {
PluginInterface = pluginInterface; PluginInterface = pluginInterface;
Service< DalamudPluginInterface >.Set( PluginInterface ); Service< DalamudPluginInterface >.Set( PluginInterface );
Service< ObjectIdentification >.Set( PluginInterface ); ObjectIdentifier.Initialize( PluginInterface );
Configuration = Configuration.Load( PluginInterface ); Configuration = Configuration.Load( PluginInterface );

View file

@ -7,7 +7,7 @@ using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Dalamud.Game.ClientState.Actors.Types; using Dalamud.Game.ClientState.Actors.Types;
using ImGuiNET; using ImGuiNET;
using Penumbra.Game; using Penumbra.GameData;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;
@ -39,7 +39,6 @@ namespace Penumbra.UI
if( ImGui.BeginTable( "##ActorTable", 13, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.ScrollX, if( ImGui.BeginTable( "##ActorTable", 13, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.ScrollX,
new Vector2( -1, ImGui.GetTextLineHeightWithSpacing() * 4 * actors.Count ) ) ) new Vector2( -1, ImGui.GetTextLineHeightWithSpacing() * 4 * actors.Count ) ) )
{ {
var identifier = Service< ObjectIdentification >.Get();
foreach( var actor in actors ) foreach( var actor in actors )
{ {
// @formatter:off // @formatter:off
@ -66,17 +65,17 @@ namespace Penumbra.UI
ImGui.Text( "(not set)" ); ImGui.Text( "(not set)" );
} }
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Mainhand.Set, actor.Value.Mainhand.Type, actor.Value.Mainhand.Variant, EquipSlot.MainHand )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Mainhand.Set, actor.Value.Mainhand.Type, actor.Value.Mainhand.Variant, EquipSlot.MainHand )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Head.Set, actor.Value.Head.Variant, 0, EquipSlot.Head )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Head.Set, actor.Value.Head.Variant, 0, EquipSlot.Head )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Body.Set, actor.Value.Body.Variant, 0, EquipSlot.Body )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Body.Set, actor.Value.Body.Variant, 0, EquipSlot.Body )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Hands.Set, actor.Value.Hands.Variant, 0, EquipSlot.Hands )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Hands.Set, actor.Value.Hands.Variant, 0, EquipSlot.Hands )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Legs.Set, actor.Value.Legs.Variant, 0, EquipSlot.Legs )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Legs.Set, actor.Value.Legs.Variant, 0, EquipSlot.Legs )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Feet.Set, actor.Value.Feet.Variant, 0, EquipSlot.Feet )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Feet.Set, actor.Value.Feet.Variant, 0, EquipSlot.Feet )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
@ -96,17 +95,17 @@ namespace Penumbra.UI
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Offhand.Set, actor.Value.Offhand.Type, actor.Value.Offhand.Variant, EquipSlot.Offhand )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Offhand.Set, actor.Value.Offhand.Type, actor.Value.Offhand.Variant, EquipSlot.Offhand )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Ear.Set, actor.Value.Ear.Variant, 0, EquipSlot.Ears )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Ear.Set, actor.Value.Ear.Variant, 0, EquipSlot.Ears )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Neck.Set, actor.Value.Neck.Variant, 0, EquipSlot.Neck )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Neck.Set, actor.Value.Neck.Variant, 0, EquipSlot.Neck )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Wrist.Set, actor.Value.Wrist.Variant, 0, EquipSlot.Wrists )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.Wrist.Set, actor.Value.Wrist.Variant, 0, EquipSlot.Wrists )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.LFinger.Set, actor.Value.LFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.LFinger.Set, actor.Value.LFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.RFinger.Set, actor.Value.RFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" ); ImGui.Text( ObjectIdentifier.Identify( actor.Value.RFinger.Set, actor.Value.RFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" );
// @formatter:on // @formatter:on
} }

View file

@ -6,7 +6,6 @@ using System.Numerics;
using Dalamud.Interface; using Dalamud.Interface;
using ImGuiNET; using ImGuiNET;
using Lumina.Data.Files; using Lumina.Data.Files;
using Penumbra.Game;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.Meta; using Penumbra.Meta;