From da4af1de0cf552239dc71e35fc0f1606d9b741aa Mon Sep 17 00:00:00 2001 From: ilitirit Date: Sun, 1 Sep 2024 15:36:42 +0200 Subject: [PATCH] Update project structure --- Expedience.Api/Expedience.Api.csproj | 2 +- Expedience.Models/ClientInfo.cs | 15 -- Expedience.Models/CompletionTimeInfo.cs | 30 --- Expedience.Models/CurrentDutyInfo.cs | 40 --- Expedience.Models/DutyCompletionResult.cs | 74 ------ Expedience.Models/DutyInfo.cs | 19 -- Expedience.Models/Expedience.Models.csproj | 9 - Expedience.Models/GroupMemberInfo.cs | 17 -- Expedience.Models/PlayerInfo.cs | 14 -- Expedience.Models/UserInfo.cs | 16 -- Expedience.sln | 40 +-- utils/GUINodeUtils.cs | 280 --------------------- 12 files changed, 21 insertions(+), 535 deletions(-) delete mode 100644 Expedience.Models/ClientInfo.cs delete mode 100644 Expedience.Models/CompletionTimeInfo.cs delete mode 100644 Expedience.Models/CurrentDutyInfo.cs delete mode 100644 Expedience.Models/DutyCompletionResult.cs delete mode 100644 Expedience.Models/DutyInfo.cs delete mode 100644 Expedience.Models/Expedience.Models.csproj delete mode 100644 Expedience.Models/GroupMemberInfo.cs delete mode 100644 Expedience.Models/PlayerInfo.cs delete mode 100644 Expedience.Models/UserInfo.cs delete mode 100644 utils/GUINodeUtils.cs diff --git a/Expedience.Api/Expedience.Api.csproj b/Expedience.Api/Expedience.Api.csproj index b48e096..e2d223c 100644 --- a/Expedience.Api/Expedience.Api.csproj +++ b/Expedience.Api/Expedience.Api.csproj @@ -25,8 +25,8 @@ + - diff --git a/Expedience.Models/ClientInfo.cs b/Expedience.Models/ClientInfo.cs deleted file mode 100644 index 2376263..0000000 --- a/Expedience.Models/ClientInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class ClientInfo - { - public string GameVersion { get; set; } - public string GameLanguage { get; set; } - public string PluginVersion { get; set; } - } -} diff --git a/Expedience.Models/CompletionTimeInfo.cs b/Expedience.Models/CompletionTimeInfo.cs deleted file mode 100644 index 198d9c2..0000000 --- a/Expedience.Models/CompletionTimeInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class CompletionTimeInfo - { - public CompletionTimeInfo() - { - - } - public CompletionTimeInfo(TimeSpan completionTime) - { - Hours = completionTime.Hours; - Minutes = completionTime.Minutes; - Seconds = completionTime.Seconds; - Milliseconds = completionTime.Milliseconds; - CompletionTimeText = completionTime.ToString(@"hh\:mm\:ss\.fff"); - } - - public int Hours { get; set; } - public int Minutes { get; set; } - public int Seconds { get; set; } - public int Milliseconds { get; set; } - public string CompletionTimeText { get; set; } - } -} diff --git a/Expedience.Models/CurrentDutyInfo.cs b/Expedience.Models/CurrentDutyInfo.cs deleted file mode 100644 index b9848a2..0000000 --- a/Expedience.Models/CurrentDutyInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Diagnostics; - -namespace Expedience.Models -{ - public class CurrentDutyInfo - { - public CurrentDutyInfo(Stopwatch stopwatch) - { - _stopwatch = stopwatch; - StartTime = DateTime.UtcNow; - } - - private Stopwatch _stopwatch; - public PlayerInfo Player { get; set; } - public int TerritoryId { get; set; } - public string PlaceName { get; set; } - public string ContentName { get; set; } - public List PartyMembers { get; set; } = new(); - public DateTime StartTime { get; } - public DateTime EndTime { get; private set; } - public bool IsUnrestricted { get; set; } - public bool HasNpcMembers { get; set; } - public bool HasEcho { get; set; } - - public string DataCenter { get; set; } - public bool IsMinILevel { get; set; } - - public void EndDuty() - { - _stopwatch.Stop(); - EndTime = DateTime.UtcNow; - } - - public TimeSpan GetDuration() - { - return _stopwatch.Elapsed; - } - } -} diff --git a/Expedience.Models/DutyCompletionResult.cs b/Expedience.Models/DutyCompletionResult.cs deleted file mode 100644 index 45b5b2e..0000000 --- a/Expedience.Models/DutyCompletionResult.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Expedience.Models -{ - public class DutyCompletionResult - { - public DutyCompletionResult() - { - - } - - public DutyCompletionResult(CurrentDutyInfo currentDuty, ClientInfo clientInfo, UserInfo userInfo) - { - DutyInfo = new DutyInfo - { - TerritoryId = currentDuty.TerritoryId, - PlaceName = currentDuty.PlaceName, - ContentName = currentDuty.ContentName, - IsUnrestricted = currentDuty.IsUnrestricted, - IsMinILevel = currentDuty.IsMinILevel, - IsNpcSupported = currentDuty.PartyMembers.Any(p => p.IsNpc), - HasEcho = currentDuty.HasEcho, - }; - - PlayerInfo = new PlayerInfo - { - ClassJob = currentDuty.Player.ClassJob, - Level = currentDuty.Player.Level, - }; - - GroupMembers = currentDuty.PartyMembers.Select(p => new GroupMemberInfo - { - ClassJob = p.ClassJob, - Level = p.Level, - GroupNumber = p.GroupNumber, - IsNpc = p.IsNpc, - IsPlayer = p.IsPlayer, - }).ToList(); - - ClientInfo = new ClientInfo - { - GameVersion = clientInfo.GameVersion, - GameLanguage = clientInfo.GameLanguage, - PluginVersion = clientInfo.PluginVersion, - }; - - UserInfo = new UserInfo - { - UserId = userInfo.UserId, - WorldId = userInfo.WorldId, - WorldName = userInfo.WorldName, - }; - - CompletionTimeInfo = new CompletionTimeInfo(currentDuty.GetDuration()); - DutyStartDateUtc = currentDuty.StartTime; - DutyCompletionDateUtc = currentDuty.EndTime; - DataCenter = currentDuty.DataCenter; - } - - public Guid UploadId { get; set; } - public DutyInfo DutyInfo { get; set; } - public CompletionTimeInfo CompletionTimeInfo { get; set; } - public PlayerInfo PlayerInfo { get; set; } - public List GroupMembers { get; set; } - public DateTime DutyStartDateUtc { get; set; } - public DateTime DutyCompletionDateUtc { get; set; } - public ClientInfo ClientInfo { get; set; } - public UserInfo UserInfo{ get; set; } - public DateTime UploadDateUtc { get; set; } - public string DataCenter { get; set; } - } -} diff --git a/Expedience.Models/DutyInfo.cs b/Expedience.Models/DutyInfo.cs deleted file mode 100644 index baaba53..0000000 --- a/Expedience.Models/DutyInfo.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class DutyInfo - { - public int TerritoryId { get; set; } - public string ContentName { get; set; } - public bool IsUnrestricted { get; set; } - public bool HasEcho { get; set; } - public bool IsNpcSupported { get; set; } - public bool IsMinILevel { get; set; } - public string PlaceName { get; set; } - } -} diff --git a/Expedience.Models/Expedience.Models.csproj b/Expedience.Models/Expedience.Models.csproj deleted file mode 100644 index 30402ac..0000000 --- a/Expedience.Models/Expedience.Models.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net8.0 - enable - enable - - - diff --git a/Expedience.Models/GroupMemberInfo.cs b/Expedience.Models/GroupMemberInfo.cs deleted file mode 100644 index 0d5140c..0000000 --- a/Expedience.Models/GroupMemberInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class GroupMemberInfo - { - public string ClassJob { get; set; } - public bool IsNpc { get; set; } - public int Level { get; set; } - public int GroupNumber { get; set; } - public bool IsPlayer { get; set; } - } -} diff --git a/Expedience.Models/PlayerInfo.cs b/Expedience.Models/PlayerInfo.cs deleted file mode 100644 index 9bef41f..0000000 --- a/Expedience.Models/PlayerInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class PlayerInfo - { - public string ClassJob { get; set; } - public uint Level { get; set; } - } -} \ No newline at end of file diff --git a/Expedience.Models/UserInfo.cs b/Expedience.Models/UserInfo.cs deleted file mode 100644 index b5446b3..0000000 --- a/Expedience.Models/UserInfo.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Expedience.Models -{ - public class UserInfo - { - public string UserId { get; set; } - public int WorldId { get; set; } - public string WorldName { get; set; } - public string UserName { get; set; } - } -} diff --git a/Expedience.sln b/Expedience.sln index be432d5..03b5a19 100644 --- a/Expedience.sln +++ b/Expedience.sln @@ -3,16 +3,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.33424.131 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Plugin", "Expedience.Plugin\Expedience.Plugin.csproj", "{8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Api", "Expedience.Api\Expedience.Api.csproj", "{B385491B-A14F-4971-8486-66146592794A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Models", "Expedience.Models\Expedience.Models.csproj", "{1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Web", "Expedience.Web\Expedience.Web.csproj", "{F0C4E623-C9D0-470A-A7CE-423D84261C82}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Infrastructure", "Expedience.Infrastructure\Expedience.Infrastructure.csproj", "{22193E16-7B41-44A7-8A40-523963CF2963}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Plugin", "..\ExpediencePlugin\Expedience.Plugin\Expedience.Plugin.csproj", "{B0BAD212-3F8F-4A7A-B767-4219F1278813}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expedience.Models", "..\ExpediencePlugin\Expedience.Models\Expedience.Models.csproj", "{00B139BD-77E6-43FC-A532-7C59D0B84408}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,14 +21,6 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Debug|Any CPU.Build.0 = Debug|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Debug|x64.ActiveCfg = Debug|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Debug|x64.Build.0 = Debug|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Release|Any CPU.ActiveCfg = Release|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Release|Any CPU.Build.0 = Release|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Release|x64.ActiveCfg = Release|x64 - {8F1BDDC2-28F2-4CE2-8FB0-8FC58B4F6D9F}.Release|x64.Build.0 = Release|x64 {B385491B-A14F-4971-8486-66146592794A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B385491B-A14F-4971-8486-66146592794A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B385491B-A14F-4971-8486-66146592794A}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -37,14 +29,6 @@ Global {B385491B-A14F-4971-8486-66146592794A}.Release|Any CPU.Build.0 = Release|Any CPU {B385491B-A14F-4971-8486-66146592794A}.Release|x64.ActiveCfg = Release|Any CPU {B385491B-A14F-4971-8486-66146592794A}.Release|x64.Build.0 = Release|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Debug|x64.ActiveCfg = Debug|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Debug|x64.Build.0 = Debug|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Release|Any CPU.Build.0 = Release|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Release|x64.ActiveCfg = Release|Any CPU - {1775D9CD-9FD3-4433-8D0A-C405EA8D7E46}.Release|x64.Build.0 = Release|Any CPU {F0C4E623-C9D0-470A-A7CE-423D84261C82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0C4E623-C9D0-470A-A7CE-423D84261C82}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0C4E623-C9D0-470A-A7CE-423D84261C82}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -61,6 +45,22 @@ Global {22193E16-7B41-44A7-8A40-523963CF2963}.Release|Any CPU.Build.0 = Release|Any CPU {22193E16-7B41-44A7-8A40-523963CF2963}.Release|x64.ActiveCfg = Release|Any CPU {22193E16-7B41-44A7-8A40-523963CF2963}.Release|x64.Build.0 = Release|Any CPU + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Debug|Any CPU.Build.0 = Debug|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Debug|x64.ActiveCfg = Debug|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Debug|x64.Build.0 = Debug|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Release|Any CPU.ActiveCfg = Release|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Release|Any CPU.Build.0 = Release|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Release|x64.ActiveCfg = Release|x64 + {B0BAD212-3F8F-4A7A-B767-4219F1278813}.Release|x64.Build.0 = Release|x64 + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Debug|x64.ActiveCfg = Debug|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Debug|x64.Build.0 = Debug|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Release|Any CPU.Build.0 = Release|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Release|x64.ActiveCfg = Release|Any CPU + {00B139BD-77E6-43FC-A532-7C59D0B84408}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/utils/GUINodeUtils.cs b/utils/GUINodeUtils.cs deleted file mode 100644 index 35cd0b9..0000000 --- a/utils/GUINodeUtils.cs +++ /dev/null @@ -1,280 +0,0 @@ -using Dalamud.Logging; -using FFXIVClientStructs.FFXIV.Component.GUI; -using System; -using System.Collections.Generic; -using System.Numerics; -using System.Runtime.InteropServices; - -namespace MgAl2O4.Utils -{ - // Dalamud.Interface.UIDebug is amazing - - public class GUINodeUtils - { - public static unsafe AtkResNode* PickChildNode(AtkResNode* maybeCompNode, int childIdx, int expectedNumChildren) - { - if (maybeCompNode != null && (int)maybeCompNode->Type >= 1000) - { - var compNode = (AtkComponentNode*)maybeCompNode; - if (compNode->Component->UldManager.NodeListCount == expectedNumChildren && childIdx < expectedNumChildren) - { - return compNode->Component->UldManager.NodeList[childIdx]; - } - } - - return null; - } - - public static unsafe AtkResNode* PickChildNode(AtkComponentBase* compPtr, int childIdx, int expectedNumChildren) - { - if (compPtr != null && compPtr->UldManager.NodeListCount == expectedNumChildren && childIdx < expectedNumChildren) - { - return compPtr->UldManager.NodeList[childIdx]; - } - - return null; - } - - public static unsafe AtkResNode*[] GetImmediateChildNodes(AtkResNode* node) - { - var listAddr = new List(); - if (node != null && node->ChildNode != null) - { - listAddr.Add((ulong)node->ChildNode); - - node = node->ChildNode; - while (node->PrevSiblingNode != null) - { - listAddr.Add((ulong)node->PrevSiblingNode); - node = node->PrevSiblingNode; - } - } - - return ConvertToNodeArr(listAddr); - } - - public static unsafe AtkResNode*[] GetAllChildNodes(AtkResNode* node) - { - if (node != null) - { - var list = new List(); - RecursiveAppendChildNodes(node, list); - - return ConvertToNodeArr(list); - } - - return null; - } - - private static unsafe void RecursiveAppendChildNodes(AtkResNode* node, List listAddr) - { - if (node != null) - { - listAddr.Add((ulong)node); - - // step inside - if (node->ChildNode != null) - { - RecursiveAppendChildNodes(node->ChildNode, listAddr); - - AtkResNode* linkNode = node->ChildNode; - while (linkNode->PrevSiblingNode != null) - { - RecursiveAppendChildNodes(linkNode->PrevSiblingNode, listAddr); - linkNode = linkNode->PrevSiblingNode; - } - - // no need to check next siblings here? - } - } - } - - private static unsafe AtkResNode*[] ConvertToNodeArr(List listAddr) - { - if (listAddr.Count > 0) - { - var typedArr = new AtkResNode*[listAddr.Count]; - for (int idx = 0; idx < listAddr.Count; idx++) - { - typedArr[idx] = (AtkResNode*)listAddr[idx]; - } - - return typedArr; - } - - return null; - } - - public static unsafe AtkResNode* PickNode(AtkResNode*[] nodes, int nodeIdx, int expectedNumNodes) - { - if (nodes != null && nodes.Length == expectedNumNodes && nodeIdx < expectedNumNodes) - { - return nodes[nodeIdx]; - } - - return null; - } - - public static unsafe AtkResNode* GetChildNode(AtkResNode* node) - { - return node != null ? node->ChildNode : null; - } - - public static unsafe string GetNodeTexturePath(AtkResNode* maybeImageNode) - { - if (maybeImageNode != null && maybeImageNode->Type == NodeType.Image) - { - var imageNode = (AtkImageNode*)maybeImageNode; - if (imageNode->PartsList != null && imageNode->PartId <= imageNode->PartsList->PartCount) - { - var textureInfo = imageNode->PartsList->Parts[imageNode->PartId].UldAsset; - var texType = textureInfo->AtkTexture.TextureType; - if (texType == TextureType.Resource) - { - var texFileNameStdString = &textureInfo->AtkTexture.Resource->TexFileResourceHandle->ResourceHandle.FileName; - var texString = texFileNameStdString->Length < 16 - ? Marshal.PtrToStringAnsi((IntPtr)texFileNameStdString->Buffer) - : Marshal.PtrToStringAnsi((IntPtr)texFileNameStdString->BufferPtr); - - return texString; - } - } - } - - return null; - } - - public static unsafe string GetNodeText(AtkResNode* maybeTextNode) - { - if (maybeTextNode != null && maybeTextNode->Type == NodeType.Text) - { - var textNode = (AtkTextNode*)maybeTextNode; - var text = Marshal.PtrToStringUTF8(new IntPtr(textNode->NodeText.StringPtr)); - return text; - } - - return null; - } - - public static unsafe Vector2 GetNodePosition(AtkResNode* node) - { - var pos = new Vector2(node->X, node->Y); - var par = node->ParentNode; - while (par != null) - { - pos *= new Vector2(par->ScaleX, par->ScaleY); - pos += new Vector2(par->X, par->Y); - par = par->ParentNode; - } - - return pos; - } - - public static unsafe Vector2 GetNodeScale(AtkResNode* node) - { - if (node == null) return new Vector2(1, 1); - var scale = new Vector2(node->ScaleX, node->ScaleY); - while (node->ParentNode != null) - { - node = node->ParentNode; - scale *= new Vector2(node->ScaleX, node->ScaleY); - } - - return scale; - } - - public static unsafe (Vector2, Vector2) GetNodePosAndSize(AtkResNode* node) - { - if (node != null) - { - var pos = GetNodePosition(node); - var scale = GetNodeScale(node); - var size = new Vector2(node->Width * scale.X, node->Height * scale.Y); - - return (pos, size); - } - - return (Vector2.Zero, Vector2.Zero); - } - -#if DEBUG - private class ParsableNode - { - public ulong nodeAddr; - public string content; - public int childIdx; - public int numChildren; - public int depth; - public NodeType type; - public string debugPath; - } - - private static unsafe bool RecursiveAppendParsableChildNodes(AtkResNode* node, int depth, int childIdx, List list, string debugPath) - { - bool hasParsableChildNodes = false; - bool hasContent = false; - - if (node != null) - { - // check if this node is interesting for parser (empty string is still interesting) - string content = GetNodeText(node); - content = (content != null) ? content : GetNodeTexturePath(node); - hasContent = (content != null); - - int numChildNodes = 0; - int insertIdx = list.Count; - - if ((int)node->Type < 1000) - { - // step inside - if (node->ChildNode != null) - { - hasParsableChildNodes = RecursiveAppendParsableChildNodes(node->ChildNode, depth + 1, numChildNodes, list, debugPath + "," + numChildNodes); - numChildNodes++; - - AtkResNode* linkNode = node->ChildNode; - - while (linkNode->PrevSiblingNode != null) - { - var hasParsableSibling = RecursiveAppendParsableChildNodes(linkNode->PrevSiblingNode, depth + 1, numChildNodes, list, debugPath + "," + numChildNodes); - hasParsableChildNodes = hasParsableChildNodes || hasParsableSibling; - linkNode = linkNode->PrevSiblingNode; - numChildNodes++; - } - - // no need to check next siblings here? - } - } - else - { - var compNode = (AtkComponentNode*)node; - for (int idx = 0; idx < compNode->Component->UldManager.NodeListCount; idx++) - { - hasParsableChildNodes = RecursiveAppendParsableChildNodes(compNode->Component->UldManager.NodeList[idx], depth + 1, numChildNodes, list, debugPath + "," + numChildNodes); - numChildNodes++; - } - } - - if (hasParsableChildNodes || hasContent) - { - list.Insert(insertIdx, new ParsableNode() { nodeAddr = (ulong)node, content = content, childIdx = childIdx, numChildren = numChildNodes, depth = depth, debugPath = debugPath, type = node->Type }); - } - } - - return hasParsableChildNodes || hasContent; - } - - public static unsafe void LogParsableNodes(AtkResNode* node) - { - var list = new List(); - RecursiveAppendParsableChildNodes(node, 0, 0, list, ""); - - foreach (var entry in list) - { - var prefix = entry.depth > 0 ? new string(' ', entry.depth * 2) : ""; - PluginLog.Log($"{prefix}> '{entry.content}' idx:{entry.childIdx}, children:{entry.numChildren}, type:{entry.type}, addr:{entry.nodeAddr:X}, path:{entry.debugPath}"); - } - } -#endif // DEBUG - } -}