using Dalamud.Game.Command;
using Dalamud.Plugin.Services;
using Lumina.Excel.Sheets;
-using Microsoft.Extensions.Logging;
using Questionable.Functions;
using Questionable.Model.Questing;
using Questionable.Windows;
"/qst which - shows all quests starting with your selected target",
"/qst zone - shows all quests starting in the current zone (only includes quests with a known quest path, and currently visible unaccepted quests)")
});
+#if DEBUG
+ _commandManager.AddHandler("/qst@", new CommandInfo(ProcessDebugCommand)
+ {
+ ShowInHelp = false,
+ });
+#endif
}
private void ProcessCommand(string command, string arguments)
{
- if (!_configuration.IsPluginSetupComplete())
- {
- if (string.IsNullOrEmpty(arguments))
- _oneTimeSetupWindow.IsOpen = true;
- else
- _chatGui.PrintError("Please complete the one-time setup first.", MessageTag, TagColor);
+ if (OpenSetupIfNeeded(arguments))
return;
- }
string[] parts = arguments.Split(' ');
switch (parts[0])
}
}
+ private void ProcessDebugCommand(string command, string arguments)
+ {
+ if (OpenSetupIfNeeded(arguments))
+ return;
+
+ string[] parts = arguments.Split(' ');
+ switch (parts[0])
+ {
+ case "abandon-duty":
+ _gameFunctions.AbandonDuty();
+ break;
+ }
+ }
+
+ private bool OpenSetupIfNeeded(string arguments)
+ {
+ if (!_configuration.IsPluginSetupComplete())
+ {
+ if (string.IsNullOrEmpty(arguments))
+ _oneTimeSetupWindow.IsOpen = true;
+ else
+ _chatGui.PrintError("Please complete the one-time setup first.", MessageTag, TagColor);
+ return true;
+ }
+
+ return false;
+ }
+
private void ConfigureDebugOverlay(string[] arguments)
{
if (!_debugOverlay.DrawConditions())
public void Dispose()
{
+#if DEBUG
+ _commandManager.RemoveHandler("/qst@");
+#endif
_commandManager.RemoveHandler("/qst");
}
}
using System.Collections.ObjectModel;
using System.Linq;
using System.Numerics;
+using System.Runtime.InteropServices;
+using Dalamud.Game;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Types;
internal sealed unsafe class GameFunctions
{
- private readonly ReadOnlyDictionary<ushort, byte> _territoryToAetherCurrentCompFlgSet;
- private readonly ReadOnlyDictionary<uint, uint> _contentFinderConditionToContentId;
+ private delegate void AbandonDutyDelegate(bool a1);
private readonly QuestFunctions _questFunctions;
private readonly IDataManager _dataManager;
private readonly IGameGui _gameGui;
private readonly Configuration _configuration;
private readonly ILogger<GameFunctions> _logger;
+ private readonly AbandonDutyDelegate _abandonDuty;
+
+ private readonly ReadOnlyDictionary<ushort, byte> _territoryToAetherCurrentCompFlgSet;
+ private readonly ReadOnlyDictionary<uint, uint> _contentFinderConditionToContentId;
public GameFunctions(
QuestFunctions questFunctions,
IClientState clientState,
IGameGui gameGui,
Configuration configuration,
+ ISigScanner sigScanner,
ILogger<GameFunctions> logger)
{
_questFunctions = questFunctions;
_gameGui = gameGui;
_configuration = configuration;
_logger = logger;
+ _abandonDuty =
+ Marshal.GetDelegateForFunctionPointer<AbandonDutyDelegate>(sigScanner.ScanText(Signatures.AbandonDuty));
_territoryToAetherCurrentCompFlgSet = dataManager.GetExcelSheet<TerritoryType>()
.Where(x => x.RowId > 0)
return slots;
}
+ /// <summary>
+ /// Abandons <em>some</em> quest battles/duties; but not all? Useful for debugging some quest battle/vbm related
+ /// issues.
+ /// </summary>
+ public void AbandonDuty() => _abandonDuty(false);
+
#if false
private byte ExecuteCommand(int id, int a, int b, int c, int d)
{
return 0;
}
#endif
+
+ private static class Signatures
+ {
+ internal const string AbandonDuty = "E8 ?? ?? ?? ?? 41 B2 01 EB 39";
+ }
}