1
0
forked from liza/Questionable

API 10; DT aetheryte/aethernet data

This commit is contained in:
Liza 2024-07-03 21:00:04 +02:00
parent a842bec29f
commit 28d297ec7c
Signed by: liza
GPG Key ID: 7199F8D727D55F67
21 changed files with 248 additions and 108 deletions

2
LLib

@ -1 +1 @@
Subproject commit b5125d4b3f7cdc0c7514a01764e5b5d4d85f80a7 Subproject commit 93fac6efb01a1272192d929fd863328271512ea4

View File

@ -223,7 +223,25 @@
"Elpis - Poieten Oikos", "Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra", "Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea", "Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron" "Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
] ]
}, },
"AethernetShortcut": { "AethernetShortcut": {
@ -331,7 +349,29 @@
"[Radz-at-Han] Mehryde's Meyhane", "[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama", "[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya", "[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)" "[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
] ]
} }
}, },
@ -345,7 +385,6 @@
}, },
"SkipIf": { "SkipIf": {
"type": "array", "type": "array",
"description": "TODO Not implemented",
"items": { "items": {
"type": "string", "type": "string",
"enum": [ "enum": [

View File

@ -118,6 +118,30 @@ public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut
{ EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" }, { EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
{ EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" }, { EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
{ EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" }, { EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
{ EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
{ EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
{ EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
{ EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
{ EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
{ EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
{ EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
{ EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
{ EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
{ EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
{ EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
{ EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
{ EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
{ EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
{ EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
{ EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
{ EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
{ EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
}; };
private static readonly Dictionary<string, EAetheryteLocation> StringToEnum = private static readonly Dictionary<string, EAetheryteLocation> StringToEnum =

View File

@ -7,7 +7,6 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
private static readonly Dictionary<EAetheryteLocation, string> Values = new() private static readonly Dictionary<EAetheryteLocation, string> Values = new()
{ {
{ EAetheryteLocation.Gridania, "Gridania" }, { EAetheryteLocation.Gridania, "Gridania" },
{ EAetheryteLocation.CentralShroudBentbranchMeadows, "Central Shroud - Bentbranch Meadows" }, { EAetheryteLocation.CentralShroudBentbranchMeadows, "Central Shroud - Bentbranch Meadows" },
{ EAetheryteLocation.EastShroudHawthorneHut, "East Shroud - Hawthorne Hut" }, { EAetheryteLocation.EastShroudHawthorneHut, "East Shroud - Hawthorne Hut" },
{ EAetheryteLocation.SouthShroudQuarrymill, "South Shroud - Quarrymill" }, { EAetheryteLocation.SouthShroudQuarrymill, "South Shroud - Quarrymill" },
@ -101,7 +100,26 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
{ EAetheryteLocation.ElpisPoietenOikos, "Elpis - Poieten Oikos" }, { EAetheryteLocation.ElpisPoietenOikos, "Elpis - Poieten Oikos" },
{ EAetheryteLocation.UltimaThuleReahTahra, "Ultima Thule - Reah Tahra" }, { EAetheryteLocation.UltimaThuleReahTahra, "Ultima Thule - Reah Tahra" },
{ EAetheryteLocation.UltimaThuleAbodeOfTheEa, "Ultima Thule - Abode of the Ea" }, { EAetheryteLocation.UltimaThuleAbodeOfTheEa, "Ultima Thule - Abode of the Ea" },
{ EAetheryteLocation.UltimaThuleBaseOmicron, "Ultima Thule - Base Omicron" } { EAetheryteLocation.UltimaThuleBaseOmicron, "Ultima Thule - Base Omicron" },
{ EAetheryteLocation.Tuliyollal, "Tuliyollal" },
{ EAetheryteLocation.SolutionNine, "Solution Nine" },
{ EAetheryteLocation.UrqopachaWachunpelo, "Urqopacha - Wachunpelo" },
{ EAetheryteLocation.UrqopachaWorlarsEcho, "Urqopacha - Worlar's Echo" },
{ EAetheryteLocation.KozamaukaOkHanu, "Kozama'uka - Ok'hanu" },
{ EAetheryteLocation.KozamaukaManyFires, "Kozama'uka - Many Fires" },
{ EAetheryteLocation.KozamaukaEarthenshire, "Kozama'uka - Earthenshire" },
{ EAetheryteLocation.YakTelIqBraax, "Yak T'el - Iq Br'aax" },
{ EAetheryteLocation.YakTelMamook, "Yak T'el - Mamook" },
{ EAetheryteLocation.ShaaloaniHhusatahwi, "Shaaloani - Hhusatahwi" },
{ EAetheryteLocation.ShaaloaniShesheneweziSprings, "Shaaloani - Sheshenewezi Springs" },
{ EAetheryteLocation.ShaaloaniMehwahhetsoan, "Shaaloani - Mehwahhetsoan" },
{ EAetheryteLocation.HeritageFoundYyasulaniStation, "Heritage Found - Yyasulani Station" },
{ EAetheryteLocation.HeritageFoundTheOutskirts, "Heritage Found - The Outskirts" },
{ EAetheryteLocation.HeritageFoundElectropeStrike, "Heritage Found - Electrope Strike" },
{ EAetheryteLocation.LivingMemoryLeynodeMnemo, "Living Memory - Leynode Mnemo" },
{ EAetheryteLocation.LivingMemoryLeynodePyro, "Living Memory - Leynode Pyro" },
{ EAetheryteLocation.LivingMemoryLeynodeAero, "Living Memory - Leynode Aero" },
}; };
public static bool IsLargeAetheryte(EAetheryteLocation aetheryte) => Values.ContainsKey(aetheryte); public static bool IsLargeAetheryte(EAetheryteLocation aetheryte) => Values.ContainsKey(aetheryte);

View File

@ -205,5 +205,47 @@ public enum EAetheryteLocation
ElpisPoietenOikos = 178, ElpisPoietenOikos = 178,
UltimaThuleReahTahra = 179, UltimaThuleReahTahra = 179,
UltimaThuleAbodeOfTheEa = 180, UltimaThuleAbodeOfTheEa = 180,
UltimaThuleBaseOmicron = 181 UltimaThuleBaseOmicron = 181,
Tuliyollal = 216,
TuliyollalDirigibleLanding = 218,
TuliyollalTheResplendentQuarter = 219,
TuliyollalTheForardCabins = 220,
TuliyollalBaysideBevyMarketplace = 221,
TuliyollalVollokShoonsa = 222,
TuliyollalWachumeqimeqi = 223,
TuliyollalBrightploomPost = 224,
TuliyollalArchOfTheDawnUrqopacha = 225,
TuliyollalArchOfTheDawnKozamauka = 226,
TuliyollalIhuykatumu = 227,
TuliyollalDirigibleLandingYakTel = 228,
TuliyollalXakTuralSkygate = 229,
SolutionNine = 217,
SolutionNineInformationCenter = 230,
SolutionNineTrueVue = 231,
SolutionNineNeonStein = 232,
SolutionNineTheArcadion = 233,
SolutionNineResolution = 234,
SolutionNineNexusArcade = 235,
SolutionNineResidentialSector = 236,
SolutionNineScanningPortNine = 237,
UrqopachaWachunpelo = 200,
UrqopachaWorlarsEcho = 201,
KozamaukaOkHanu = 202,
KozamaukaManyFires = 203,
KozamaukaEarthenshire = 204,
YakTelIqBraax = 205,
YakTelMamook = 206,
ShaaloaniHhusatahwi = 207,
ShaaloaniShesheneweziSprings = 208,
ShaaloaniMehwahhetsoan = 209,
HeritageFoundYyasulaniStation = 210,
HeritageFoundTheOutskirts = 211,
HeritageFoundElectropeStrike = 212,
LivingMemoryLeynodeMnemo = 213,
LivingMemoryLeynodePyro = 214,
LivingMemoryLeynodeAero = 215,
} }

View File

@ -65,7 +65,7 @@ internal sealed unsafe class ChatFunctions
/// <exception cref="InvalidOperationException">If the signature for this function could not be found</exception> /// <exception cref="InvalidOperationException">If the signature for this function could not be found</exception>
private void SendMessageUnsafe(byte[] message) private void SendMessageUnsafe(byte[] message)
{ {
var uiModule = (IntPtr)Framework.Instance()->GetUiModule(); var uiModule = (IntPtr)Framework.Instance()->GetUIModule();
using var payload = new ChatPayload(message); using var payload = new ChatPayload(message);
var mem1 = Marshal.AllocHGlobal(400); var mem1 = Marshal.AllocHGlobal(400);
@ -141,7 +141,7 @@ internal sealed unsafe class ChatFunctions
public void UseEmote(uint dataId, EEmote emote) public void UseEmote(uint dataId, EEmote emote)
{ {
GameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId); IGameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId);
if (gameObject != null) if (gameObject != null)
{ {
_targetManager.Target = gameObject; _targetManager.Target = gameObject;
@ -157,7 +157,7 @@ internal sealed unsafe class ChatFunctions
private static class Signatures private static class Signatures
{ {
internal const string SendChat = "48 89 5C 24 ?? 57 48 83 EC 20 48 8B FA 48 8B D9 45 84 C9"; internal const string SendChat = "48 89 5C 24 ?? 57 48 83 EC 20 48 8B FA 48 8B D9 45 84 C9";
internal const string SanitiseString = "E8 ?? ?? ?? ?? EB 0A 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8D 8D"; internal const string SanitiseString = "E8 ?? ?? ?? ?? 48 8D 4C 24 ?? 0F B6 F0 E8 ?? ?? ?? ?? 48 8D 4D C0";
} }
[StructLayout(LayoutKind.Explicit)] [StructLayout(LayoutKind.Explicit)]

View File

@ -9,6 +9,7 @@ using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects.Enums; using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Ipc.Exceptions;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Control; using FFXIVClientStructs.FFXIV.Client.Game.Control;
@ -43,8 +44,36 @@ internal sealed class MovementController : IDisposable
_logger = logger; _logger = logger;
} }
public bool IsNavmeshReady => _navmeshIpc.IsReady; public bool IsNavmeshReady
public bool IsPathRunning => _navmeshIpc.IsPathRunning; {
get
{
try
{
return _navmeshIpc.IsReady;
}
catch (IpcNotReadyError)
{
return false;
}
}
}
public bool IsPathRunning
{
get
{
try
{
return _navmeshIpc.IsPathRunning;
}
catch (IpcNotReadyError)
{
return false;
}
}
}
public bool IsPathfinding => _pathfindTask is { IsCompleted: false }; public bool IsPathfinding => _pathfindTask is { IsCompleted: false };
public DestinationData? Destination { get; set; } public DestinationData? Destination { get; set; }
public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue; public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue;
@ -121,8 +150,8 @@ internal sealed class MovementController : IDisposable
} }
else if (Destination.DataId != null) else if (Destination.DataId != null)
{ {
GameObject? gameObject = _gameFunctions.FindObjectByDataId(Destination.DataId.Value); IGameObject? gameObject = _gameFunctions.FindObjectByDataId(Destination.DataId.Value);
if (gameObject is Character or EventObj) if (gameObject is ICharacter or IEventObj)
{ {
if (Math.Abs(localPlayerPosition.Y - gameObject.Position.Y) < 1.95f) if (Math.Abs(localPlayerPosition.Y - gameObject.Position.Y) < 1.95f)
Stop(); Stop();

View File

@ -14,13 +14,13 @@ namespace Questionable.Controller;
internal sealed class QuestRegistry internal sealed class QuestRegistry
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
private readonly IDataManager _dataManager; private readonly IDataManager _dataManager;
private readonly ILogger<QuestRegistry> _logger; private readonly ILogger<QuestRegistry> _logger;
private readonly Dictionary<ushort, Quest> _quests = new(); private readonly Dictionary<ushort, Quest> _quests = new();
public QuestRegistry(DalamudPluginInterface pluginInterface, IDataManager dataManager, public QuestRegistry(IDalamudPluginInterface pluginInterface, IDataManager dataManager,
ILogger<QuestRegistry> logger) ILogger<QuestRegistry> logger)
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;

View File

@ -161,7 +161,7 @@ internal static class Move
public ETaskResult Update() public ETaskResult Update()
{ {
GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId); IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
if (gameObject == null || if (gameObject == null ||
(gameObject.Position - clientState.LocalPlayer!.Position).Length() > StopDistance) (gameObject.Position - clientState.LocalPlayer!.Position).Length() > StopDistance)
{ {

View File

@ -82,7 +82,7 @@ internal static class EquipItem
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
if (_targetSlots.Any(x => if (_targetSlots.Any(x =>
inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId)) inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemId == _itemId))
return ETaskResult.TaskComplete; return ETaskResult.TaskComplete;
Equip(); Equip();
@ -100,7 +100,7 @@ internal static class EquipItem
if (equippedContainer == null) if (equippedContainer == null)
return false; return false;
if (_targetSlots.Any(slot => equippedContainer->GetInventorySlot(slot)->ItemID == _itemId)) if (_targetSlots.Any(slot => equippedContainer->GetInventorySlot(slot)->ItemId == _itemId))
{ {
logger.LogInformation("Already equipped {Item}, skipping step", _item.Name?.ToString()); logger.LogInformation("Already equipped {Item}, skipping step", _item.Name?.ToString());
return false; return false;
@ -119,12 +119,12 @@ internal static class EquipItem
for (ushort sourceSlot = 0; sourceSlot < sourceContainer->Size; sourceSlot++) for (ushort sourceSlot = 0; sourceSlot < sourceContainer->Size; sourceSlot++)
{ {
var sourceItem = sourceContainer->GetInventorySlot(sourceSlot); var sourceItem = sourceContainer->GetInventorySlot(sourceSlot);
if (sourceItem == null || sourceItem->ItemID != _itemId) if (sourceItem == null || sourceItem->ItemId != _itemId)
continue; continue;
// Move the item to the first available slot // Move the item to the first available slot
ushort targetSlot = _targetSlots ushort targetSlot = _targetSlots
.Where(x => inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == 0) .Where(x => inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemId == 0)
.Concat(_targetSlots).First(); .Concat(_targetSlots).First();
logger.LogInformation( logger.LogInformation(

View File

@ -59,7 +59,7 @@ internal static class Interact
public bool Start() public bool Start()
{ {
GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId); IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
if (gameObject == null) if (gameObject == null)
{ {
logger.LogWarning("No game object with dataId {DataId}", DataId); logger.LogWarning("No game object with dataId {DataId}", DataId);
@ -104,7 +104,7 @@ internal static class Interact
if (!_interacted) if (!_interacted)
{ {
GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId); IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject)) if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject))
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
@ -116,7 +116,7 @@ internal static class Interact
return ETaskResult.TaskComplete; return ETaskResult.TaskComplete;
} }
private unsafe bool HasAnyMarker(GameObject gameObject) private unsafe bool HasAnyMarker(IGameObject gameObject)
{ {
if (SkipMarkerCheck || gameObject.ObjectKind != ObjectKind.EventNpc) if (SkipMarkerCheck || gameObject.ObjectKind != ObjectKind.EventNpc)
return true; return true;

View File

@ -10,7 +10,7 @@ namespace Questionable;
internal sealed class DalamudInitializer : IDisposable internal sealed class DalamudInitializer : IDisposable
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
private readonly IFramework _framework; private readonly IFramework _framework;
private readonly ICommandManager _commandManager; private readonly ICommandManager _commandManager;
private readonly QuestController _questController; private readonly QuestController _questController;
@ -20,7 +20,7 @@ internal sealed class DalamudInitializer : IDisposable
private readonly QuestWindow _questWindow; private readonly QuestWindow _questWindow;
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
public DalamudInitializer(DalamudPluginInterface pluginInterface, IFramework framework, public DalamudInitializer(IDalamudPluginInterface pluginInterface, IFramework framework,
ICommandManager commandManager, QuestController questController, MovementController movementController, ICommandManager commandManager, QuestController questController, MovementController movementController,
GameUiController gameUiController, NavigationShortcutController navigationShortcutController, GameUiController gameUiController, NavigationShortcutController navigationShortcutController,
WindowSystem windowSystem, QuestWindow questWindow, DebugOverlay debugOverlay, ConfigWindow configWindow) WindowSystem windowSystem, QuestWindow questWindow, DebugOverlay debugOverlay, ConfigWindow configWindow)

View File

@ -28,7 +28,7 @@ internal sealed class AetheryteData
TerritoryIds = territoryIds.AsReadOnly(); TerritoryIds = territoryIds.AsReadOnly();
TownTerritoryIds = dataManager.GetExcelSheet<TerritoryType>()! TownTerritoryIds = dataManager.GetExcelSheet<TerritoryType>()!
.Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name) && x.TerritoryIntendedUse == 0) .Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name) && x.TerritoryIntendedUse.Row == 0)
.Select(x => (ushort)x.RowId) .Select(x => (ushort)x.RowId)
.ToList(); .ToList();
} }
@ -214,6 +214,41 @@ internal sealed class AetheryteData
{ EAetheryteLocation.UltimaThuleReahTahra, new(-544.152f, 74.32666f, 269.6421f) }, { EAetheryteLocation.UltimaThuleReahTahra, new(-544.152f, 74.32666f, 269.6421f) },
{ EAetheryteLocation.UltimaThuleAbodeOfTheEa, new(64.286255f, 272.48022f, -657.49603f) }, { EAetheryteLocation.UltimaThuleAbodeOfTheEa, new(64.286255f, 272.48022f, -657.49603f) },
{ EAetheryteLocation.UltimaThuleBaseOmicron, new(489.2804f, 437.5829f, 333.63843f) }, { EAetheryteLocation.UltimaThuleBaseOmicron, new(489.2804f, 437.5829f, 333.63843f) },
{ EAetheryteLocation.Tuliyollal, new(-24.093994f, 0.77819824f, 7.583679f) },
{ EAetheryteLocation.TuliyollalDirigibleLanding, new(-413.68738f, 2.9754639f, -45.975464f) },
{ EAetheryteLocation.TuliyollalTheResplendentQuarter, new(-187.1214f, 39.93274f, 6.088318f) },
{ EAetheryteLocation.TuliyollalTheForardCabins, new(-149.73682f, -15.030151f, 198.90125f) },
{ EAetheryteLocation.TuliyollalBaysideBevyMarketplace, new(-14.999634f, -10.025269f, 135.57642f) },
{ EAetheryteLocation.TuliyollalVollokShoonsa, new(-99.13794f, 100.72473f, -222.03406f) },
{ EAetheryteLocation.TuliyollalWachumeqimeqi, new(166.27747f, -17.990417f, 38.742676f) },
{ EAetheryteLocation.TuliyollalBrightploomPost, new(71.7937f, 47.074097f, -333.21124f) },
{ EAetheryteLocation.SolutionNine, new(-0.015319824f, 8.987488f, -0.015319824f) },
{ EAetheryteLocation.SolutionNineInformationCenter, new(-30.441833f, -6.0579224f, 209.3385f) },
{ EAetheryteLocation.SolutionNineTrueVue, new(382.6809f, 59.983154f, 76.67651f) },
{ EAetheryteLocation.SolutionNineNeonStein, new(258.28943f, 50.736206f, 148.72961f) },
{ EAetheryteLocation.SolutionNineTheArcadion, new(374.77686f, 60.01367f, 325.67322f) },
{ EAetheryteLocation.SolutionNineResolution, new(-32.059265f, 38.04065f, -345.2354f) },
{ EAetheryteLocation.SolutionNineNexusArcade, new(-160.05188f, -0.015319824f, 21.591492f) },
{ EAetheryteLocation.SolutionNineResidentialSector, new(-378.13385f, 13.992493f, 136.49194f) },
{ EAetheryteLocation.UrqopachaWachunpelo, new(332.96704f, -160.11298f, -416.22034f) },
{ EAetheryteLocation.UrqopachaWorlarsEcho, new(465.62903f, 114.94617f, 634.9126f) },
{ EAetheryteLocation.KozamaukaOkHanu, new(-169.51251f, 6.576599f, -479.42322f) },
{ EAetheryteLocation.KozamaukaManyFires, new(541.16125f, 117.41809f, 203.60107f) },
{ EAetheryteLocation.KozamaukaEarthenshire, new(-477.53113f, 124.04053f, 311.32983f) },
{ EAetheryteLocation.YakTelIqBraax, new(-397.05505f, 23.5141f, -431.93713f) },
{ EAetheryteLocation.YakTelMamook, new(721.40076f, -132.31104f, 526.1769f) },
{ EAetheryteLocation.ShaaloaniHhusatahwi, new(386.40417f, -0.19836426f, 467.61267f) },
{ EAetheryteLocation.ShaaloaniShesheneweziSprings, new(-291.70673f, 19.08899f, -114.54956f) },
{ EAetheryteLocation.ShaaloaniMehwahhetsoan, new(311.36023f, -14.175659f, -567.74243f) },
{ EAetheryteLocation.HeritageFoundYyasulaniStation, new(514.6105f, 145.86096f, 207.56836f) },
{ EAetheryteLocation.HeritageFoundTheOutskirts, new(-223.0412f, 31.937134f, -584.03906f) },
{ EAetheryteLocation.HeritageFoundElectropeStrike, new(-219.53156f, 32.913696f, 120.77515f) },
{ EAetheryteLocation.LivingMemoryLeynodeMnemo, new(-0.22894287f, 57.175537f, 796.9634f) },
{ EAetheryteLocation.LivingMemoryLeynodePyro, new(657.98413f, 28.976807f, -284.01617f) },
{ EAetheryteLocation.LivingMemoryLeynodeAero, new(-255.26825f, 59.433838f, -397.6654f) },
} }
.AsReadOnly(); .AsReadOnly();

View File

@ -10,7 +10,7 @@ internal sealed class LifestreamIpc
private readonly AetheryteData _aetheryteData; private readonly AetheryteData _aetheryteData;
private readonly ICallGateSubscriber<string, bool> _aethernetTeleport; private readonly ICallGateSubscriber<string, bool> _aethernetTeleport;
public LifestreamIpc(DalamudPluginInterface pluginInterface, AetheryteData aetheryteData) public LifestreamIpc(IDalamudPluginInterface pluginInterface, AetheryteData aetheryteData)
{ {
_aetheryteData = aetheryteData; _aetheryteData = aetheryteData;
_aethernetTeleport = pluginInterface.GetIpcSubscriber<string, bool>("Lifestream.AethernetTeleport"); _aethernetTeleport = pluginInterface.GetIpcSubscriber<string, bool>("Lifestream.AethernetTeleport");

View File

@ -20,7 +20,7 @@ internal sealed class NavmeshIpc
private readonly ICallGateSubscriber<float, object> _pathSetTolerance; private readonly ICallGateSubscriber<float, object> _pathSetTolerance;
private readonly ICallGateSubscriber<Vector3, bool, float, Vector3?> _queryPointOnFloor; private readonly ICallGateSubscriber<Vector3, bool, float, Vector3?> _queryPointOnFloor;
public NavmeshIpc(DalamudPluginInterface pluginInterface) public NavmeshIpc(IDalamudPluginInterface pluginInterface)
{ {
_isNavReady = pluginInterface.GetIpcSubscriber<bool>("vnavmesh.Nav.IsReady"); _isNavReady = pluginInterface.GetIpcSubscriber<bool>("vnavmesh.Nav.IsReady");
_navPathfind = _navPathfind =

View File

@ -7,10 +7,10 @@ namespace Questionable.External;
internal sealed class YesAlreadyIpc : IDisposable internal sealed class YesAlreadyIpc : IDisposable
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
private readonly IPluginLog _pluginLog; private readonly IPluginLog _pluginLog;
public YesAlreadyIpc(DalamudPluginInterface pluginInterface, IPluginLog pluginLog) public YesAlreadyIpc(IDalamudPluginInterface pluginInterface, IPluginLog pluginLog)
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;
_pluginLog = pluginLog; _pluginLog = pluginLog;

View File

@ -6,6 +6,7 @@ using System.Numerics;
using Dalamud.Game; using Dalamud.Game;
using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Memory; using Dalamud.Memory;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility; using Dalamud.Utility;
@ -25,8 +26,6 @@ using Questionable.Model.V1;
using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara; using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderCondition; using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderCondition;
using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk; using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
using Emote = Lumina.Excel.GeneratedSheets.Emote;
using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
using Quest = Questionable.Model.Quest; using Quest = Questionable.Model.Quest;
using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType; using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
@ -140,17 +139,17 @@ internal sealed unsafe class GameFunctions
// do the MSQ; if a side quest is the first item do that side quest. // do the MSQ; if a side quest is the first item do that side quest.
// //
// If no quests are marked as 'priority', accepting a new quest adds it to the top of the list. // If no quests are marked as 'priority', accepting a new quest adds it to the top of the list.
for (int i = questManager->TrackedQuestsSpan.Length - 1; i >= 0; --i) for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i)
{ {
ushort currentQuest; ushort currentQuest;
var trackedQuest = questManager->TrackedQuestsSpan[i]; var trackedQuest = questManager->TrackedQuests[i];
switch (trackedQuest.QuestType) switch (trackedQuest.QuestType)
{ {
default: default:
continue; continue;
case 1: // normal quest case 1: // normal quest
currentQuest = questManager->NormalQuestsSpan[trackedQuest.Index].QuestId; currentQuest = questManager->NormalQuests[trackedQuest.Index].QuestId;
break; break;
} }
@ -284,7 +283,7 @@ internal sealed unsafe class GameFunctions
playerState->IsAetherCurrentUnlocked(aetherCurrentId); playerState->IsAetherCurrentUnlocked(aetherCurrentId);
} }
public GameObject? FindObjectByDataId(uint dataId) public IGameObject? FindObjectByDataId(uint dataId)
{ {
foreach (var gameObject in _objectTable) foreach (var gameObject in _objectTable)
{ {
@ -300,15 +299,14 @@ internal sealed unsafe class GameFunctions
public bool InteractWith(uint dataId) public bool InteractWith(uint dataId)
{ {
GameObject? gameObject = FindObjectByDataId(dataId); IGameObject? gameObject = FindObjectByDataId(dataId);
if (gameObject != null) if (gameObject != null)
{ {
_logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.ObjectId); _logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.EntityId);
_targetManager.Target = null; _targetManager.Target = null;
_targetManager.Target = gameObject; _targetManager.Target = gameObject;
long result = (long)TargetSystem.Instance()->InteractWithObject( long result = (long)TargetSystem.Instance()->InteractWithObject((GameObject*)gameObject.Address, false);
(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address, false);
_logger.LogInformation("Interact result: {Result}", result); _logger.LogInformation("Interact result: {Result}", result);
return result > 0; return result > 0;
@ -328,7 +326,7 @@ internal sealed unsafe class GameFunctions
public bool UseItem(uint dataId, uint itemId) public bool UseItem(uint dataId, uint itemId)
{ {
GameObject? gameObject = FindObjectByDataId(dataId); IGameObject? gameObject = FindObjectByDataId(dataId);
if (gameObject != null) if (gameObject != null)
{ {
_targetManager.Target = gameObject; _targetManager.Target = gameObject;
@ -343,10 +341,10 @@ internal sealed unsafe class GameFunctions
public bool UseItemOnGround(uint dataId, uint itemId) public bool UseItemOnGround(uint dataId, uint itemId)
{ {
GameObject? gameObject = FindObjectByDataId(dataId); IGameObject? gameObject = FindObjectByDataId(dataId);
if (gameObject != null) if (gameObject != null)
{ {
var position = (FFXIVClientStructs.FFXIV.Common.Math.Vector3)gameObject.Position; Vector3 position = gameObject.Position;
return ActionManager.Instance()->UseActionLocation(ActionType.KeyItem, itemId, location: &position); return ActionManager.Instance()->UseActionLocation(ActionType.KeyItem, itemId, location: &position);
} }
@ -355,7 +353,7 @@ internal sealed unsafe class GameFunctions
public bool IsObjectAtPosition(uint dataId, Vector3 position, float distance) public bool IsObjectAtPosition(uint dataId, Vector3 position, float distance)
{ {
GameObject? gameObject = FindObjectByDataId(dataId); IGameObject? gameObject = FindObjectByDataId(dataId);
return gameObject != null && (gameObject.Position - position).Length() < distance; return gameObject != null && (gameObject.Position - position).Length() < distance;
} }
@ -376,20 +374,18 @@ internal sealed unsafe class GameFunctions
private bool HasCharacterStatusPreventingMountOrSprint() private bool HasCharacterStatusPreventingMountOrSprint()
{ {
var gameObject = GameObjectManager.GetGameObjectByIndex(0); var localPlayer = _clientState.LocalPlayer;
if (gameObject != null && gameObject->ObjectKind == 1) if (localPlayer == null)
{ return false;
var battleChara = (BattleChara*)gameObject;
StatusManager* statusManager = battleChara->GetStatusManager; var battleChara = (BattleChara*)localPlayer.Address;
StatusManager* statusManager = battleChara->GetStatusManager();
return statusManager->HasStatus(565) || return statusManager->HasStatus(565) ||
statusManager->HasStatus(404) || statusManager->HasStatus(404) ||
statusManager->HasStatus(2729) || statusManager->HasStatus(2729) ||
statusManager->HasStatus(2730); statusManager->HasStatus(2730);
} }
return false;
}
public bool Mount() public bool Mount()
{ {
if (_condition[ConditionFlag.Mounted]) if (_condition[ConditionFlag.Mounted])

View File

@ -1,62 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Dalamud.NET.Sdk/9.0.2">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework> <Version>1.0</Version>
<Version>0.20</Version>
<LangVersion>12</LangVersion>
<Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<OutputPath>dist</OutputPath> <OutputPath>dist</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap> <PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<DebugType>portable</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <Import Project="..\LLib\LLib.targets"/>
<DalamudLibPath>$(appdata)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath> <Import Project="..\LLib\RenameZip.targets"/>
</PropertyGroup>
<PropertyGroup Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'">
<DalamudLibPath>$(DALAMUD_HOME)/</DalamudLibPath>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/> <PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/>
<PackageReference Include="DalamudPackager" Version="2.1.12"/>
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" ExcludeAssets="runtime"/> <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" ExcludeAssets="runtime"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
<PackageReference Include="System.Text.Json" Version="8.0.3"/> <PackageReference Include="System.Text.Json" Version="8.0.3"/>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="Dalamud">
<HintPath>$(DalamudLibPath)Dalamud.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="ImGui.NET">
<HintPath>$(DalamudLibPath)ImGui.NET.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Lumina">
<HintPath>$(DalamudLibPath)Lumina.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Lumina.Excel">
<HintPath>$(DalamudLibPath)Lumina.Excel.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(DalamudLibPath)Newtonsoft.Json.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="FFXIVClientStructs">
<HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\LLib\LLib.csproj"/> <ProjectReference Include="..\LLib\LLib.csproj"/>
<ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/> <ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/>

View File

@ -7,7 +7,6 @@ using Dalamud.Interface.Windowing;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller; using Questionable.Controller;
using Questionable.Controller.Steps; using Questionable.Controller.Steps;
@ -25,7 +24,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
{ {
private readonly ServiceProvider? _serviceProvider; private readonly ServiceProvider? _serviceProvider;
public QuestionablePlugin(DalamudPluginInterface pluginInterface, public QuestionablePlugin(IDalamudPluginInterface pluginInterface,
IClientState clientState, IClientState clientState,
ITargetManager targetManager, ITargetManager targetManager,
IFramework framework, IFramework framework,

View File

@ -13,7 +13,7 @@ namespace Questionable.Windows;
internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
private readonly Configuration _configuration; private readonly Configuration _configuration;
private readonly uint[] _mountIds; private readonly uint[] _mountIds;
@ -23,7 +23,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
["None (manually pick quest)", "Maelstrom", "Twin Adder" /*, "Immortal Flames"*/]; ["None (manually pick quest)", "Maelstrom", "Twin Adder" /*, "Immortal Flames"*/];
[SuppressMessage("Performance", "CA1861", Justification = "One time initialization")] [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")]
public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager) public ConfigWindow(IDalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager)
: base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize) : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize)
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;

View File

@ -26,7 +26,7 @@ namespace Questionable.Windows;
internal sealed class QuestWindow : LWindow, IPersistableWindowConfig internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
private readonly MovementController _movementController; private readonly MovementController _movementController;
private readonly QuestController _questController; private readonly QuestController _questController;
private readonly GameFunctions _gameFunctions; private readonly GameFunctions _gameFunctions;
@ -40,7 +40,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
private readonly QuestRegistry _questRegistry; private readonly QuestRegistry _questRegistry;
private readonly ILogger<QuestWindow> _logger; private readonly ILogger<QuestWindow> _logger;
public QuestWindow(DalamudPluginInterface pluginInterface, public QuestWindow(IDalamudPluginInterface pluginInterface,
MovementController movementController, MovementController movementController,
QuestController questController, QuestController questController,
GameFunctions gameFunctions, GameFunctions gameFunctions,