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",
"Ultima Thule - Reah Tahra",
"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": {
@ -331,7 +349,29 @@
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[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": {
"type": "array",
"description": "TODO Not implemented",
"items": {
"type": "string",
"enum": [

View File

@ -118,6 +118,30 @@ public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut
{ EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
{ EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
{ 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 =

View File

@ -7,7 +7,6 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
private static readonly Dictionary<EAetheryteLocation, string> Values = new()
{
{ EAetheryteLocation.Gridania, "Gridania" },
{ EAetheryteLocation.CentralShroudBentbranchMeadows, "Central Shroud - Bentbranch Meadows" },
{ EAetheryteLocation.EastShroudHawthorneHut, "East Shroud - Hawthorne Hut" },
{ EAetheryteLocation.SouthShroudQuarrymill, "South Shroud - Quarrymill" },
@ -101,7 +100,26 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
{ EAetheryteLocation.ElpisPoietenOikos, "Elpis - Poieten Oikos" },
{ EAetheryteLocation.UltimaThuleReahTahra, "Ultima Thule - Reah Tahra" },
{ 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);

View File

@ -205,5 +205,47 @@ public enum EAetheryteLocation
ElpisPoietenOikos = 178,
UltimaThuleReahTahra = 179,
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>
private void SendMessageUnsafe(byte[] message)
{
var uiModule = (IntPtr)Framework.Instance()->GetUiModule();
var uiModule = (IntPtr)Framework.Instance()->GetUIModule();
using var payload = new ChatPayload(message);
var mem1 = Marshal.AllocHGlobal(400);
@ -141,7 +141,7 @@ internal sealed unsafe class ChatFunctions
public void UseEmote(uint dataId, EEmote emote)
{
GameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId);
IGameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId);
if (gameObject != null)
{
_targetManager.Target = gameObject;
@ -157,7 +157,7 @@ internal sealed unsafe class ChatFunctions
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 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)]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,7 +28,7 @@ internal sealed class AetheryteData
TerritoryIds = territoryIds.AsReadOnly();
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)
.ToList();
}
@ -214,6 +214,41 @@ internal sealed class AetheryteData
{ EAetheryteLocation.UltimaThuleReahTahra, new(-544.152f, 74.32666f, 269.6421f) },
{ EAetheryteLocation.UltimaThuleAbodeOfTheEa, new(64.286255f, 272.48022f, -657.49603f) },
{ 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();

View File

@ -10,7 +10,7 @@ internal sealed class LifestreamIpc
private readonly AetheryteData _aetheryteData;
private readonly ICallGateSubscriber<string, bool> _aethernetTeleport;
public LifestreamIpc(DalamudPluginInterface pluginInterface, AetheryteData aetheryteData)
public LifestreamIpc(IDalamudPluginInterface pluginInterface, AetheryteData aetheryteData)
{
_aetheryteData = aetheryteData;
_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<Vector3, bool, float, Vector3?> _queryPointOnFloor;
public NavmeshIpc(DalamudPluginInterface pluginInterface)
public NavmeshIpc(IDalamudPluginInterface pluginInterface)
{
_isNavReady = pluginInterface.GetIpcSubscriber<bool>("vnavmesh.Nav.IsReady");
_navPathfind =

View File

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

View File

@ -6,6 +6,7 @@ using System.Numerics;
using Dalamud.Game;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Memory;
using Dalamud.Plugin.Services;
using Dalamud.Utility;
@ -25,8 +26,6 @@ using Questionable.Model.V1;
using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderCondition;
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 Quest = Questionable.Model.Quest;
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.
//
// 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;
var trackedQuest = questManager->TrackedQuestsSpan[i];
var trackedQuest = questManager->TrackedQuests[i];
switch (trackedQuest.QuestType)
{
default:
continue;
case 1: // normal quest
currentQuest = questManager->NormalQuestsSpan[trackedQuest.Index].QuestId;
currentQuest = questManager->NormalQuests[trackedQuest.Index].QuestId;
break;
}
@ -284,7 +283,7 @@ internal sealed unsafe class GameFunctions
playerState->IsAetherCurrentUnlocked(aetherCurrentId);
}
public GameObject? FindObjectByDataId(uint dataId)
public IGameObject? FindObjectByDataId(uint dataId)
{
foreach (var gameObject in _objectTable)
{
@ -300,15 +299,14 @@ internal sealed unsafe class GameFunctions
public bool InteractWith(uint dataId)
{
GameObject? gameObject = FindObjectByDataId(dataId);
IGameObject? gameObject = FindObjectByDataId(dataId);
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 = gameObject;
long result = (long)TargetSystem.Instance()->InteractWithObject(
(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address, false);
long result = (long)TargetSystem.Instance()->InteractWithObject((GameObject*)gameObject.Address, false);
_logger.LogInformation("Interact result: {Result}", result);
return result > 0;
@ -328,7 +326,7 @@ internal sealed unsafe class GameFunctions
public bool UseItem(uint dataId, uint itemId)
{
GameObject? gameObject = FindObjectByDataId(dataId);
IGameObject? gameObject = FindObjectByDataId(dataId);
if (gameObject != null)
{
_targetManager.Target = gameObject;
@ -343,10 +341,10 @@ internal sealed unsafe class GameFunctions
public bool UseItemOnGround(uint dataId, uint itemId)
{
GameObject? gameObject = FindObjectByDataId(dataId);
IGameObject? gameObject = FindObjectByDataId(dataId);
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);
}
@ -355,7 +353,7 @@ internal sealed unsafe class GameFunctions
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;
}
@ -376,20 +374,18 @@ internal sealed unsafe class GameFunctions
private bool HasCharacterStatusPreventingMountOrSprint()
{
var gameObject = GameObjectManager.GetGameObjectByIndex(0);
if (gameObject != null && gameObject->ObjectKind == 1)
{
var battleChara = (BattleChara*)gameObject;
StatusManager* statusManager = battleChara->GetStatusManager;
var localPlayer = _clientState.LocalPlayer;
if (localPlayer == null)
return false;
var battleChara = (BattleChara*)localPlayer.Address;
StatusManager* statusManager = battleChara->GetStatusManager();
return statusManager->HasStatus(565) ||
statusManager->HasStatus(404) ||
statusManager->HasStatus(2729) ||
statusManager->HasStatus(2730);
}
return false;
}
public bool Mount()
{
if (_condition[ConditionFlag.Mounted])

View File

@ -1,62 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Dalamud.NET.Sdk/9.0.2">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<Version>0.20</Version>
<LangVersion>12</LangVersion>
<Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<Version>1.0</Version>
<OutputPath>dist</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<DebugType>portable</DebugType>
</PropertyGroup>
<PropertyGroup>
<DalamudLibPath>$(appdata)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
</PropertyGroup>
<PropertyGroup Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'">
<DalamudLibPath>$(DALAMUD_HOME)/</DalamudLibPath>
</PropertyGroup>
<Import Project="..\LLib\LLib.targets"/>
<Import Project="..\LLib\RenameZip.targets"/>
<ItemGroup>
<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="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
<PackageReference Include="System.Text.Json" Version="8.0.3"/>
</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>
<ProjectReference Include="..\LLib\LLib.csproj"/>
<ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/>

View File

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

View File

@ -13,7 +13,7 @@ namespace Questionable.Windows;
internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
{
private readonly DalamudPluginInterface _pluginInterface;
private readonly IDalamudPluginInterface _pluginInterface;
private readonly Configuration _configuration;
private readonly uint[] _mountIds;
@ -23,7 +23,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
["None (manually pick quest)", "Maelstrom", "Twin Adder" /*, "Immortal Flames"*/];
[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)
{
_pluginInterface = pluginInterface;

View File

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