[submodule "vendor/NotificationMasterAPI"]
path = vendor/NotificationMasterAPI
url = https://github.com/NightmareXIV/NotificationMasterAPI.git
-[submodule "vendor/pictomancy"]
- path = vendor/pictomancy
- url = https://github.com/sourpuh/ffxiv_pictomancy.git
commands:
- mkdir release
- mv Questionable/dist/Questionable/latest.zip release/Questionable-${CI_COMMIT_TAG##v}.zip
- - mv Questionable/dist/Questionable/Questionable.json release/Questionable-${CI_COMMIT_TAG##v}.json.d12
+ - mv Questionable/dist/Questionable/Questionable.json release/Questionable-${CI_COMMIT_TAG##v}.json.d13
when:
- event: tag
ref: refs/tags/v*
<Project>
<PropertyGroup Condition="$(MSBuildProjectName) != 'GatheringPathRenderer'">
- <Version>5.23</Version>
+ <Version>6.0</Version>
</PropertyGroup>
</Project>
-<Project Sdk="Dalamud.NET.Sdk/12.0.2">
+<Project Sdk="Dalamud.NET.Sdk/13.0.0">
<PropertyGroup>
<Version>0.3</Version>
<OutputPath>dist</OutputPath>
<ItemGroup>
<ProjectReference Include="..\LLib\LLib.csproj" />
<ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj" />
- <ProjectReference Include="..\vendor\pictomancy\Pictomancy\Pictomancy.csproj" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Pictomancy" Version="0.0.1" />
</ItemGroup>
<Import Project="..\LLib\LLib.targets"/>
-using Dalamud.Interface.Windowing;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface.Windowing;
using Dalamud.Plugin;
-using ImGuiNET;
namespace GatheringPathRenderer.Windows;
using System.Globalization;
using System.Linq;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using Lumina.Excel.Sheets;
using Questionable.Model.Gathering;
"net9.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
- "requested": "[12.0.0, )",
- "resolved": "12.0.0",
- "contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
+ "requested": "[13.0.0, )",
+ "resolved": "13.0.0",
+ "contentHash": "Mb3cUDSK/vDPQ8gQIeuCw03EMYrej1B4J44a1AvIJ9C759p9XeqdU9Hg4WgOmlnlPe0G7ILTD32PKSUpkQNa8w=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"Microsoft.SourceLink.Common": "8.0.0"
}
},
+ "Pictomancy": {
+ "type": "Direct",
+ "requested": "[0.0.1, )",
+ "resolved": "0.0.1",
+ "contentHash": "o40yKEYUsUmHLGEyfi2dzrPJBaiYGAL6Jwc32NOZUx9znXvwL0RS2A3AOGzi4wHhTEfTesLuU5yNIs60hT4ayg==",
+ "dependencies": {
+ "SharpDX.D3DCompiler": "4.2.0",
+ "SharpDX.Direct2D1": "4.2.0",
+ "SharpDX.Direct3D11": "4.2.0",
+ "SharpDX.Mathematics": "4.2.0"
+ }
+ },
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
"SharpDX": "4.2.0"
}
},
+ "SharpDX.Mathematics": {
+ "type": "Transitive",
+ "resolved": "4.2.0",
+ "contentHash": "R2pcKLgdsP9p5WyTjHmGOZ0ka0zASAZYc6P4L6rSvjYhf6klGYbent7MiVwbkwkt9dD44p5brjy5IwAnVONWGw==",
+ "dependencies": {
+ "NETStandard.Library": "1.6.1",
+ "SharpDX": "4.2.0"
+ }
+ },
"System.AppContext": {
"type": "Transitive",
"resolved": "4.3.0",
"llib": {
"type": "Project",
"dependencies": {
- "DalamudPackager": "[12.0.0, )",
+ "DalamudPackager": "[13.0.0, )",
"JetBrains.Annotations": "[2024.3.0, )"
}
},
- "pictomancy": {
- "type": "Project",
- "dependencies": {
- "SharpDX.D3DCompiler": "[4.2.0, )",
- "SharpDX.Direct2D1": "[4.2.0, )",
- "SharpDX.Direct3D11": "[4.2.0, )"
- }
- },
"questionable.model": {
"type": "Project",
"dependencies": {
-Subproject commit fdadf613fe17bfbcf6899e5a60aa1ba5401ed99e
+Subproject commit f1716ee4827e68c0c6a601928cc0b479dd7dbccd
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
- <Platform>x64</Platform>
+ <Platforms>x64</Platforms>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
-<Project Sdk="Dalamud.NET.Sdk/12.0.2">
+<Project Sdk="Dalamud.NET.Sdk/13.0.0">
<PropertyGroup>
<OutputPath>dist</OutputPath>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
"net9.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
- "requested": "[12.0.0, )",
- "resolved": "12.0.0",
- "contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
+ "requested": "[13.0.0, )",
+ "resolved": "13.0.0",
+ "contentHash": "Mb3cUDSK/vDPQ8gQIeuCw03EMYrej1B4J44a1AvIJ9C759p9XeqdU9Hg4WgOmlnlPe0G7ILTD32PKSUpkQNa8w=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"llib": {
"type": "Project",
"dependencies": {
- "DalamudPackager": "[12.0.0, )",
+ "DalamudPackager": "[13.0.0, )",
"JetBrains.Annotations": "[2024.3.0, )"
}
}
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BBFFC6EA-15B1-48FC-B4D3-D9491278C27F}"
ProjectSection(SolutionItems) = preProject
- Directory.Build.targets = Directory.Build.targets
.woodpecker\build.yaml = .woodpecker\build.yaml
+ Directory.Build.targets = Directory.Build.targets
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vendor", "vendor", "{8F5EC9D5-4CE7-433B-BB3A-782500E84DDB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationMasterAPI", "vendor\NotificationMasterAPI\NotificationMasterAPI\NotificationMasterAPI.csproj", "{9BD494ED-22F2-487B-BCE1-435399A8720E}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pictomancy", "vendor\pictomancy\Pictomancy\Pictomancy.csproj", "{D1AE2F8C-BDE7-457F-A369-973101044A25}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Questionable.IpcTest", "Questionable.IpcTest\Questionable.IpcTest.csproj", "{8572A8B2-2F31-4D17-B207-6A7A2E0579EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuestPaths.JsonValidator", "QuestPaths.JsonValidator\QuestPaths.JsonValidator.csproj", "{2521F2BA-9647-4851-92E1-F56280D1663C}"
{9BD494ED-22F2-487B-BCE1-435399A8720E}.Debug|x64.Build.0 = Debug|x64
{9BD494ED-22F2-487B-BCE1-435399A8720E}.Release|x64.ActiveCfg = Release|x64
{9BD494ED-22F2-487B-BCE1-435399A8720E}.Release|x64.Build.0 = Release|x64
- {D1AE2F8C-BDE7-457F-A369-973101044A25}.Debug|x64.ActiveCfg = Debug|x64
- {D1AE2F8C-BDE7-457F-A369-973101044A25}.Debug|x64.Build.0 = Debug|x64
- {D1AE2F8C-BDE7-457F-A369-973101044A25}.Release|x64.ActiveCfg = Release|x64
- {D1AE2F8C-BDE7-457F-A369-973101044A25}.Release|x64.Build.0 = Release|x64
{8572A8B2-2F31-4D17-B207-6A7A2E0579EF}.Debug|x64.ActiveCfg = Debug|x64
{8572A8B2-2F31-4D17-B207-6A7A2E0579EF}.Debug|x64.Build.0 = Debug|x64
{8572A8B2-2F31-4D17-B207-6A7A2E0579EF}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9BD494ED-22F2-487B-BCE1-435399A8720E} = {8F5EC9D5-4CE7-433B-BB3A-782500E84DDB}
- {D1AE2F8C-BDE7-457F-A369-973101044A25} = {8F5EC9D5-4CE7-433B-BB3A-782500E84DDB}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {E6C60C7E-BEEA-422F-85B3-639BAD5A4B75}
EndGlobalSection
EndGlobal
# CA2000: Dispose objects before losing scope
dotnet_diagnostic.CA2000.severity = warning
+dotnet_code_quality.CA2000.excluded_type_names_with_derived_types = Dalamud.Bindings.ImGui.ImU8String
# CA2002: Do not lock on objects with weak identity
dotnet_diagnostic.CA2002.severity = warning
if (!ShouldHandleUiInteractions)
return;
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
InteractWithBankaCraftworksSupply(addon);
}
if (!ShouldHandleUiInteractions)
return;
- AddonContextIconMenu* addonContextIconMenu = (AddonContextIconMenu*)args.Addon;
+ AddonContextIconMenu* addonContextIconMenu = (AddonContextIconMenu*)args.Addon.Address;
if (!addonContextIconMenu->IsVisible)
return;
private unsafe void CreditScrollPostSetup(AddonEvent type, AddonArgs args)
{
_logger.LogInformation("Closing Credits sequence");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->FireCallbackInt(-2);
}
private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args)
{
_logger.LogInformation("Closing Credits sequence");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->FireCallbackInt(-2);
}
private unsafe void CreditPlayerPostSetup(AddonEvent type, AddonArgs args)
{
_logger.LogInformation("Closing CreditPlayer");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->Close(true);
}
private readonly QuestController _questController;
private readonly IAddonLifecycle _addonLifecycle;
private readonly IGameGui _gameGui;
+ private readonly IFramework _framework;
private readonly ILogger<HelpUiController> _logger;
public HelpUiController(
QuestController questController,
IAddonLifecycle addonLifecycle,
IGameGui gameGui,
+ IFramework framework,
ILogger<HelpUiController> logger)
{
_questController = questController;
_addonLifecycle = addonLifecycle;
_gameGui = gameGui;
+ _framework = framework;
_logger = logger;
_questController.AutomationTypeChanged += CloseHelpWindowsWhenStartingQuests;
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup);
+ _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "EventTutorial", EventTutorialPostSetup);
}
private unsafe void CloseHelpWindowsWhenStartingQuests(object sender, QuestController.EAutomationType e)
GuidePostSetup(addonGuide);
}
+ if (_gameGui.TryGetAddonByName("EventTutorial", out AtkUnitBase* addonEventTutorial))
+ {
+ _logger.LogInformation("EventTutorial window is open");
+ EventTutorialPostSetup(addonEventTutorial);
+ }
+
if (_gameGui.TryGetAddonByName("ContentsTutorial", out AtkUnitBase* addonContentsTutorial))
{
_logger.LogInformation("ContentsTutorial window is open");
if (_questController.StartedQuest?.Quest.Id.Value == 4526)
{
_logger.LogInformation("Closing Unending Codex");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->FireCallbackInt(-2);
}
}
private unsafe void ContentsTutorialPostSetup(AddonEvent type, AddonArgs args)
{
if (_questController.StartedQuest?.Quest.Id.Value is 245 or 3872 or 5253)
- ContentsTutorialPostSetup((AtkUnitBase*)args.Addon);
+ ContentsTutorialPostSetup((AtkUnitBase*)args.Addon.Address);
}
private unsafe void ContentsTutorialPostSetup(AtkUnitBase* addon)
if (_questController.StartedQuest?.Quest.Id.Value == 245)
{
_logger.LogInformation("Closing MultipleHelpWindow");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->FireCallbackInt(-2);
addon->FireCallbackInt(-1);
}
private unsafe void JobHudNoticePostSetup(AddonEvent type, AddonArgs args)
{
if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual)
- JobHudNoticePostSetup((AtkUnitBase*)args.Addon);
+ JobHudNoticePostSetup((AtkUnitBase*)args.Addon.Address);
}
private unsafe void JobHudNoticePostSetup(AtkUnitBase* addon)
private unsafe void GuidePostSetup(AddonEvent type, AddonArgs args)
{
if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual)
- GuidePostSetup((AtkUnitBase*)args.Addon);
+ GuidePostSetup((AtkUnitBase*)args.Addon.Address);
}
private unsafe void GuidePostSetup(AtkUnitBase* addon)
addon->FireCallbackInt(-1);
}
+ private unsafe void EventTutorialPostSetup(AddonEvent type, AddonArgs args)
+ {
+ if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual)
+ {
+ // TODO Verify that this actually works; in initial testing it didn't close the window.
+ _framework.RunOnTick(() =>
+ {
+ if (_gameGui.TryGetAddonByName("EventTutorial", out AtkUnitBase* addonEventTutorial))
+ EventTutorialPostSetup(addonEventTutorial);
+ });
+ }
+ }
+
+ private unsafe void EventTutorialPostSetup(AtkUnitBase* addon)
+ {
+ _logger.LogInformation("Closing EventTutorial window");
+ addon->FireCallbackInt(-1);
+ }
+
+
public void Dispose()
{
+ _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "EventTutorial", EventTutorialPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup);
private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args)
{
- AddonSelectString* addonSelectString = (AddonSelectString*)args.Addon;
+ AddonSelectString* addonSelectString = (AddonSelectString*)args.Addon.Address;
SelectStringPostSetup(addonSelectString, false);
}
private unsafe void CutsceneSelectStringPostSetup(AddonEvent type, AddonArgs args)
{
- AddonCutSceneSelectString* addonCutSceneSelectString = (AddonCutSceneSelectString*)args.Addon;
+ AddonCutSceneSelectString* addonCutSceneSelectString = (AddonCutSceneSelectString*)args.Addon.Address;
CutsceneSelectStringPostSetup(addonCutSceneSelectString, false);
}
private unsafe void SelectIconStringPostSetup(AddonEvent type, AddonArgs args)
{
- AddonSelectIconString* addonSelectIconString = (AddonSelectIconString*)args.Addon;
+ AddonSelectIconString* addonSelectIconString = (AddonSelectIconString*)args.Addon.Address;
SelectIconStringPostSetup(addonSelectIconString, false);
}
private unsafe void SelectYesnoPostSetup(AddonEvent type, AddonArgs args)
{
- AddonSelectYesno* addonSelectYesno = (AddonSelectYesno*)args.Addon;
+ AddonSelectYesno* addonSelectYesno = (AddonSelectYesno*)args.Addon.Address;
SelectYesnoPostSetup(addonSelectYesno, false);
}
_logger.LogInformation("SinglePlayerDutyYesNo: probably Single Player Duty");
return true;
}
- else
- {
- _logger.LogInformation("SinglePlayerDuty: not enabled");
- return false;
- }
- }
return false;
}
private unsafe void DifficultySelectYesNoPostSetup(AddonEvent type, AddonArgs args)
{
- AtkUnitBase* addonDifficultySelectYesNo = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addonDifficultySelectYesNo = (AtkUnitBase*)args.Addon.Address;
DifficultySelectYesNoPostSetup(addonDifficultySelectYesNo, false);
}
private unsafe void PointMenuPostSetup(AddonEvent type, AddonArgs args)
{
- AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon.Address;
PointMenuPostSetup(addonPointMenu);
}
return;
_logger.LogInformation("Confirming selected housing ward");
- AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
+ AtkUnitBase* addon = (AtkUnitBase*)args.Addon.Address;
addon->FireCallbackInt(0);
}
// heritage found: yyupye's halo (farm, npc: Mahuwsa)
new BlacklistedPoint(1191, new(-108f, 29.25f, -350.75f), new(-107.56289f, 29.008266f, -348.80087f)),
new BlacklistedPoint(1191, new(-105.75f, 29.75f, -351f), new(-105.335304f, 29.017048f, -348.85077f)),
+
+ // solution nine: walks behind the bar in front of the backrooms thing
+ new BlacklistedPoint(1186, new(284.25f, 50.75f, 171.25f), new(284.25f, 50.75f, 166.25f)),
+ new BlacklistedPoint(1186, new(283.75f, 50.75f, 167.25f), new(284.25f, 50.75f, 166.25f)),
+ new BlacklistedPoint(1186, new(287.75f, 51.25f, 172f), new(288.875f, 50.75f, 166.25f)),
];
private readonly IClientState _clientState;
sourceInventoryType, sourceSlot, InventoryType.EquippedItems, targetSlot);
int result = inventoryManager->MoveItemSlot(sourceInventoryType, sourceSlot,
- InventoryType.EquippedItems, targetSlot, 1);
+ InventoryType.EquippedItems, targetSlot, true);
logger.LogInformation("MoveItemSlot result: {Result}", result);
return;
}
private readonly ITargetManager _targetManager;
private readonly ILogger<ChatFunctions> _logger;
private readonly ProcessChatBoxDelegate _processChatBox;
- private readonly delegate* unmanaged<Utf8String*, int, IntPtr, void> _sanitiseString;
public ChatFunctions(ISigScanner sigScanner, IDataManager dataManager, GameFunctions gameFunctions,
ITargetManager targetManager, ILogger<ChatFunctions> logger)
_logger = logger;
_processChatBox =
Marshal.GetDelegateForFunctionPointer<ProcessChatBoxDelegate>(sigScanner.ScanText(Signatures.SendChat));
- _sanitiseString =
- (delegate* unmanaged<Utf8String*, int, IntPtr, void>)sigScanner.ScanText(Signatures.SanitiseString);
_emoteCommands = dataManager.GetExcelSheet<Emote>()
.Where(x => x.RowId > 0)
{
var uText = Utf8String.FromString(text);
- _sanitiseString(uText, 0x27F, IntPtr.Zero);
+ uText->SanitizeString((AllowedEntities)0x27F);
var sanitised = uText->ToString();
uText->Dtor();
private static class Signatures
{
internal const string SendChat = "48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B F2 48 8B F9 45 84 C9";
- internal const string SanitiseString = "E8 ?? ?? ?? ?? EB 0A 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8D AE";
}
[StructLayout(LayoutKind.Explicit)]
-<Project Sdk="Dalamud.NET.Sdk/12.0.2">
+<Project Sdk="Dalamud.NET.Sdk/13.0.0">
<PropertyGroup>
<OutputPath>dist</OutputPath>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
IKeyState keyState,
IContextMenu contextMenu,
IToastGui toastGui,
- IGameInteropProvider gameInteropProvider)
+ IGameInteropProvider gameInteropProvider,
+ IAetheryteList aetheryteList)
{
ArgumentNullException.ThrowIfNull(pluginInterface);
ArgumentNullException.ThrowIfNull(chatGui);
serviceCollection.AddSingleton(contextMenu);
serviceCollection.AddSingleton(toastGui);
serviceCollection.AddSingleton(gameInteropProvider);
+ serviceCollection.AddSingleton(aetheryteList);
serviceCollection.AddSingleton(new WindowSystem(nameof(Questionable)));
serviceCollection.AddSingleton((Configuration?)pluginInterface.GetPluginConfig() ?? new Configuration());
using System.Collections.Generic;
-using System.Text;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
-using ImGuiNET;
namespace Questionable.Windows.ConfigComponents;
return $"{(includePrefix ? SeIconChar.LevelEn.ToIconString() : string.Empty)}{FormatLevel(level / 10, false)}{(SeIconChar.Number0 + level % 10).ToIconChar()}";
}
- /// <summary>
- /// The default implementation for <see cref="ImGui.GetClipboardText"/> throws an NullReferenceException if the clipboard is empty, maybe also if it doesn't contain text.
- /// </summary>
- protected unsafe string? GetClipboardText()
- {
- byte* ptr = ImGuiNative.igGetClipboardText();
- if (ptr == null)
- return null;
-
- int byteCount = 0;
- while (ptr[byteCount] != 0)
- ++byteCount;
- return Encoding.UTF8.GetString(ptr, byteCount);
- }
-
protected static void DrawNotes(bool enabledByDefault, IEnumerable<string> notes)
{
using var color = new ImRaii.Color();
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
-using ImGuiNET;
namespace Questionable.Windows.ConfigComponents;
using System.Linq;
using System.Numerics;
using System.Text;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using Dalamud.Utility;
-using ImGuiNET;
using Lumina.Excel.Sheets;
using Questionable.Controller;
using Questionable.Data;
ImGui.SameLine();
- string? clipboardText = GetClipboardText();
- using (ImRaii.Disabled(clipboardText == null ||
+ string clipboardText = ImGui.GetClipboardText();
+ using (ImRaii.Disabled(string.IsNullOrEmpty(clipboardText) ||
!clipboardText.StartsWith(DutyClipboardPrefix, StringComparison.InvariantCulture)))
{
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Paste, "Import from Clipboard"))
{
- clipboardText = clipboardText!.Substring(DutyClipboardPrefix.Length);
+ clipboardText = clipboardText.Substring(DutyClipboardPrefix.Length);
string text = Encoding.UTF8.GetString(Convert.FromBase64String(clipboardText));
Configuration.Duties.WhitelistedDutyCfcIds.Clear();
using System;
using System.Collections.Generic;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using LLib.GameData;
using Lumina.Excel.Sheets;
using Questionable.Controller;
using System;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.Text;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Utility;
-using ImGuiNET;
using Questionable.External;
namespace Questionable.Windows.ConfigComponents;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using Dalamud.Utility;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.External;
using System.Collections.ObjectModel;
using System.Linq;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using LLib.GameData;
using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging;
-using Dalamud.Interface.Utility.Raii;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
-using ImGuiNET;
using LLib.ImGui;
using Questionable.Windows.ConfigComponents;
using System.Globalization;
using System.Linq;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model.Questing;
using System;
using System.Collections.Generic;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Functions;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
-using ImGuiNET;
using LLib.GameData;
using Lumina.Excel.Sheets;
using Questionable.Controller;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Functions;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using Dalamud.Bindings.ImGui;
namespace Questionable.Windows.JournalComponents;
-using Dalamud.Interface.Components;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Functions;
using Questionable.Model;
using System;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model;
-using Dalamud.Interface;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
-using ImGuiNET;
using LLib.ImGui;
using Microsoft.Extensions.Logging;
using Questionable.Windows.ConfigComponents;
using System.Linq;
using System.Numerics;
using System.Text;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using LLib.ImGui;
using Questionable.Controller;
using Questionable.Functions;
}
}
- private List<ElementId> ParseClipboardItems()
+ private static List<ElementId> ParseClipboardItems()
{
- string? clipboardText = GetClipboardText();
+ string clipboardText = ImGui.GetClipboardText();
return DecodeQuestPriority(clipboardText);
}
- public static List<ElementId> DecodeQuestPriority(string? clipboardText)
+ public static List<ElementId> DecodeQuestPriority(string clipboardText)
{
List<ElementId> clipboardItems = new List<ElementId>();
try
{
- if (clipboardText != null && clipboardText.StartsWith(ClipboardPrefix, StringComparison.InvariantCulture))
+ if (string.IsNullOrEmpty(clipboardText) && clipboardText.StartsWith(ClipboardPrefix, StringComparison.InvariantCulture))
{
clipboardText = clipboardText.Substring(ClipboardPrefix.Length);
string text = Encoding.UTF8.GetString(Convert.FromBase64String(clipboardText));
{
_questController.ImportQuestPriority(questElements);
}
-
- /// <summary>
- /// The default implementation for <see cref="ImGui.GetClipboardText"/> throws an NullReferenceException if the clipboard is empty, maybe also if it doesn't contain text.
- /// </summary>
- private unsafe string? GetClipboardText()
- {
- byte* ptr = ImGuiNative.igGetClipboardText();
- if (ptr == null)
- return null;
-
- int byteCount = 0;
- while (ptr[byteCount] != 0)
- ++byteCount;
- return Encoding.UTF8.GetString(ptr, byteCount);
- }
}
using System.Linq;
using System.Numerics;
using System.Text.RegularExpressions;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Controller.Steps.Shared;
using Questionable.Functions;
using System.Diagnostics;
using System.Globalization;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
-using ImGuiNET;
using Microsoft.Extensions.Logging;
using Questionable.Controller;
using Questionable.Data;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Humanizer;
using Humanizer.Localisation;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Functions;
-using Dalamud.Game.Text;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
-using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Functions;
using System;
using System.Globalization;
using System.Numerics;
-using Dalamud.Game.ClientState.Conditions;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
-using FFXIVClientStructs.FFXIV.Client.UI.Agent;
-using ImGuiNET;
using Questionable.Controller;
-using Questionable.External;
-using Questionable.Functions;
namespace Questionable.Windows.QuestComponents;
internal sealed class QuickAccessButtonsComponent
{
- private readonly MovementController _movementController;
- private readonly GameFunctions _gameFunctions;
- private readonly ChatFunctions _chatFunctions;
private readonly QuestRegistry _questRegistry;
- private readonly NavmeshIpc _navmeshIpc;
private readonly QuestValidationWindow _questValidationWindow;
private readonly JournalProgressWindow _journalProgressWindow;
- private readonly IClientState _clientState;
- private readonly ICondition _condition;
private readonly ICommandManager _commandManager;
private readonly IDalamudPluginInterface _pluginInterface;
public QuickAccessButtonsComponent(
- MovementController movementController,
- GameFunctions gameFunctions,
- ChatFunctions chatFunctions,
QuestRegistry questRegistry,
- NavmeshIpc navmeshIpc,
QuestValidationWindow questValidationWindow,
JournalProgressWindow journalProgressWindow,
- IClientState clientState,
- ICondition condition,
ICommandManager commandManager,
IDalamudPluginInterface pluginInterface)
{
- _movementController = movementController;
- _gameFunctions = gameFunctions;
- _chatFunctions = chatFunctions;
_questRegistry = questRegistry;
- _navmeshIpc = navmeshIpc;
_questValidationWindow = questValidationWindow;
_journalProgressWindow = journalProgressWindow;
- _clientState = clientState;
- _condition = condition;
_commandManager = commandManager;
_pluginInterface = pluginInterface;
}
public event EventHandler? Reload;
- public unsafe void Draw()
+ public void Draw()
{
- var map = AgentMap.Instance();
- using (var unused = ImRaii.Disabled(map == null || !map->IsFlagMarkerSet ||
- map->FlagMapMarker.TerritoryId != _clientState.TerritoryType ||
- !_navmeshIpc.IsReady))
- {
- if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Flag, "To Flag"))
- {
- _movementController.Destination = null;
- _chatFunctions.ExecuteCommand(
- $"/vnav {(_condition[ConditionFlag.Mounted] && _gameFunctions.IsFlyingUnlockedInCurrentZone() ? "flyflag" : "moveflag")}");
- }
- }
-
if (_commandManager.Commands.ContainsKey("/vnav"))
{
- ImGui.SameLine();
using (var unused = ImRaii.Disabled(!ImGui.IsKeyDown(ImGuiKey.ModCtrl)))
{
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.GlobeEurope, "Rebuild Navmesh"))
using System.Collections.Generic;
-using ImGuiNET;
+using Dalamud.Bindings.ImGui;
using Questionable.Controller;
namespace Questionable.Windows.QuestComponents;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Client.UI;
-using ImGuiNET;
using LLib.GameUI;
using LLib.ImGui;
using Questionable.Controller;
using System.Globalization;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Common.Math;
-using ImGuiNET;
using LLib.ImGui;
using Questionable.Data;
using Questionable.Validation;
using System;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
-using ImGuiNET;
using LLib.ImGui;
using Questionable.Controller;
using Questionable.Controller.GameUi;
using System.Numerics;
+using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
-using ImGuiNET;
using Questionable.Functions;
using Questionable.Model.Questing;
},
"DalamudPackager": {
"type": "Direct",
- "requested": "[12.0.0, )",
- "resolved": "12.0.0",
- "contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
+ "requested": "[13.0.0, )",
+ "resolved": "13.0.0",
+ "contentHash": "Mb3cUDSK/vDPQ8gQIeuCw03EMYrej1B4J44a1AvIJ9C759p9XeqdU9Hg4WgOmlnlPe0G7ILTD32PKSUpkQNa8w=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"gatheringpaths": {
"type": "Project",
"dependencies": {
- "Questionable.Model": "[5.11.0, )"
+ "Questionable.Model": "[6.0.0, )"
}
},
"llib": {
"type": "Project",
"dependencies": {
- "DalamudPackager": "[12.0.0, )",
+ "DalamudPackager": "[13.0.0, )",
"JetBrains.Annotations": "[2024.3.0, )"
}
},
"questpaths": {
"type": "Project",
"dependencies": {
- "Questionable.Model": "[5.11.0, )"
+ "Questionable.Model": "[6.0.0, )"
}
}
}
+++ /dev/null
-Subproject commit 3b42dc922375d65b4340b88d7c53c6b587b93e06