diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9124e51 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "LLib"] + path = LLib + url = git@git.carvel.li:liza/LLib.git diff --git a/LLib b/LLib new file mode 160000 index 0000000..abbbec4 --- /dev/null +++ b/LLib @@ -0,0 +1 @@ +Subproject commit abbbec4f26b1a8903b0cd7aa04f00d557602eaf3 diff --git a/Workshoppa.sln b/Workshoppa.sln index 3332f95..13660b0 100644 --- a/Workshoppa.sln +++ b/Workshoppa.sln @@ -2,6 +2,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Workshoppa", "Workshoppa\Workshoppa.csproj", "{4C2E2AD7-D897-4476-A17A-838932D95223}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LLib", "LLib\LLib.csproj", "{43BFEA08-94E9-491B-9A54-5795B9AFB38E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -12,5 +14,9 @@ Global {4C2E2AD7-D897-4476-A17A-838932D95223}.Debug|Any CPU.Build.0 = Debug|Any CPU {4C2E2AD7-D897-4476-A17A-838932D95223}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C2E2AD7-D897-4476-A17A-838932D95223}.Release|Any CPU.Build.0 = Release|Any CPU + {43BFEA08-94E9-491B-9A54-5795B9AFB38E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43BFEA08-94E9-491B-9A54-5795B9AFB38E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43BFEA08-94E9-491B-9A54-5795B9AFB38E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43BFEA08-94E9-491B-9A54-5795B9AFB38E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Workshoppa/Windows/MainWindow.cs b/Workshoppa/Windows/MainWindow.cs index 3183ba4..121d0cb 100644 --- a/Workshoppa/Windows/MainWindow.cs +++ b/Workshoppa/Windows/MainWindow.cs @@ -10,6 +10,7 @@ using Dalamud.Plugin; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using ImGuiNET; +using LLib; using Workshoppa.GameData; namespace Workshoppa.Windows; @@ -53,6 +54,8 @@ internal sealed class MainWindow : Window public override void Draw() { + LImGui.AddPatreonIcon(_pluginInterface); + var currentItem = _configuration.CurrentlyCraftedItem; if (currentItem != null) { diff --git a/Workshoppa/WorkshopPlugin.CraftingLog.cs b/Workshoppa/WorkshopPlugin.CraftingLog.cs index 3604054..35a0e37 100644 --- a/Workshoppa/WorkshopPlugin.CraftingLog.cs +++ b/Workshoppa/WorkshopPlugin.CraftingLog.cs @@ -2,6 +2,7 @@ using System.Linq; using Dalamud.Game.ClientState.Objects.Types; using FFXIVClientStructs.FFXIV.Component.GUI; +using LLib.GameUI; using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType; namespace Workshoppa; @@ -91,7 +92,7 @@ partial class WorkshopPlugin .Select(i => new { WorkshopItemId = atkValues[14 + 4 * i].UInt, - Name = ReadAtkString(atkValues[17 + 4 * i]), + Name = atkValues[17 + 4 * i].ReadAtkString(), }) .ToList(); diff --git a/Workshoppa/WorkshopPlugin.GameFunctions.cs b/Workshoppa/WorkshopPlugin.GameFunctions.cs index 43774c3..8568f80 100644 --- a/Workshoppa/WorkshopPlugin.GameFunctions.cs +++ b/Workshoppa/WorkshopPlugin.GameFunctions.cs @@ -10,6 +10,7 @@ using FFXIVClientStructs.FFXIV.Client.Game.Control; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Component.GUI; +using LLib.GameUI; using Workshoppa.GameData; namespace Workshoppa; @@ -52,30 +53,10 @@ partial class WorkshopPlugin return ((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)obj.Address)->GetNpcID(); } - private unsafe bool TryGetAddonByName(string addonName, out T* addonPtr) - where T : unmanaged - { - var a = _gameGui.GetAddonByName(addonName); - if (a != IntPtr.Zero) - { - addonPtr = (T*)a; - return true; - } - else - { - addonPtr = null; - return false; - } - } - - private unsafe bool IsAddonReady(AtkUnitBase* addon) - { - return addon->IsVisible && addon->UldManager.LoadedState == AtkLoadState.Loaded; - } private unsafe AtkUnitBase* GetCompanyCraftingLogAddon() { - if (TryGetAddonByName("CompanyCraftRecipeNoteBook", out var addon) && IsAddonReady(addon)) + if (_gameGui.TryGetAddonByName("CompanyCraftRecipeNoteBook", out var addon) && LAddon.IsAddonReady(addon)) return addon; return null; @@ -94,35 +75,18 @@ partial class WorkshopPlugin if (addonId == 0) return null; - AtkUnitBase* addon = GetAddonById(addonId); - if (IsAddonReady(addon)) + AtkUnitBase* addon = LAddon.GetAddonById(addonId); + if (LAddon.IsAddonReady(addon)) return addon; } return null; } - private unsafe AtkUnitBase* GetAddonById(uint id) - { - var unitManagers = &AtkStage.GetSingleton()->RaptureAtkUnitManager->AtkUnitManager.DepthLayerOneList; - for (var i = 0; i < 18; i++) - { - foreach (AtkUnitBase* unitBase in unitManagers[i].EntriesSpan) - { - if (unitBase != null && unitBase->ID == id) - { - return unitBase; - } - } - } - - return null; - } - private unsafe bool SelectSelectString(string marker, int choice, Predicate predicate) { - if (TryGetAddonByName("SelectString", out var addonSelectString) && - IsAddonReady(&addonSelectString->AtkUnitBase)) + if (_gameGui.TryGetAddonByName("SelectString", out var addonSelectString) && + LAddon.IsAddonReady(&addonSelectString->AtkUnitBase)) { int entries = addonSelectString->PopupMenu.PopupMenu.EntryCount; if (entries < choice) @@ -146,8 +110,8 @@ partial class WorkshopPlugin private unsafe bool SelectSelectYesno(int choice, Predicate predicate) { - if (TryGetAddonByName("SelectYesno", out var addonSelectYesno) && - IsAddonReady(&addonSelectYesno->AtkUnitBase)) + if (_gameGui.TryGetAddonByName("SelectYesno", out var addonSelectYesno) && + LAddon.IsAddonReady(&addonSelectYesno->AtkUnitBase)) { var text = MemoryHelper.ReadSeString(&addonSelectYesno->PromptText->NodeText).ToString(); text = text.Replace("\n", "").Replace("\r", ""); @@ -166,13 +130,6 @@ partial class WorkshopPlugin return false; } - private unsafe string? ReadAtkString(AtkValue atkValue) - { - if (atkValue.String != null) - return MemoryHelper.ReadSeStringNullTerminated(new nint(atkValue.String)).ToString(); - return null; - } - private unsafe CraftState? ReadCraftState(AtkUnitBase* addonMaterialDelivery) { try @@ -189,7 +146,7 @@ partial class WorkshopPlugin { ItemId = atkValues[12 + i].UInt, IconId = atkValues[24 + i].UInt, - ItemName = ReadAtkString(atkValues[36 + i]), + ItemName = atkValues[36 + i].ReadAtkString(), CrafterIconId = atkValues[48 + i].Int, ItemCountPerStep = atkValues[60 + i].UInt, ItemCountNQ = atkValues[72 + i].UInt, @@ -223,7 +180,7 @@ partial class WorkshopPlugin { // NQ / HQ string // I have no clue, but it doesn't seme like the available HQ item count is strored anywhere in the atkvalues?? - string? s = ReadAtkString(atkValue); + string? s = atkValue.ReadAtkString(); if (s != null) { var parts = s.Replace("\ue03c", "").Split('/'); diff --git a/Workshoppa/Workshoppa.csproj b/Workshoppa/Workshoppa.csproj index 5b19570..8fd39d0 100644 --- a/Workshoppa/Workshoppa.csproj +++ b/Workshoppa/Workshoppa.csproj @@ -23,6 +23,10 @@ $(DALAMUD_HOME)/ + + + + @@ -58,8 +62,6 @@ - - diff --git a/Workshoppa/packages.lock.json b/Workshoppa/packages.lock.json index 6cf1c73..784f99f 100644 --- a/Workshoppa/packages.lock.json +++ b/Workshoppa/packages.lock.json @@ -7,6 +7,9 @@ "requested": "[2.1.12, )", "resolved": "2.1.12", "contentHash": "Sc0PVxvgg4NQjcI8n10/VfUQBAS4O+Fw2pZrAqBdRMbthYGeogzu5+xmIGCGmsEZ/ukMOBuAqiNiB5qA3MRalg==" + }, + "llib": { + "type": "Project" } } }