forked from liza/Questionable
API 10; DT aetheryte/aethernet data
This commit is contained in:
parent
a842bec29f
commit
28d297ec7c
2
LLib
2
LLib
@ -1 +1 @@
|
||||
Subproject commit b5125d4b3f7cdc0c7514a01764e5b5d4d85f80a7
|
||||
Subproject commit 93fac6efb01a1272192d929fd863328271512ea4
|
@ -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": [
|
||||
|
@ -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 =
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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)]
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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(
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
||||
|
2
Questionable/External/LifestreamIpc.cs
vendored
2
Questionable/External/LifestreamIpc.cs
vendored
@ -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");
|
||||
|
2
Questionable/External/NavmeshIpc.cs
vendored
2
Questionable/External/NavmeshIpc.cs
vendored
@ -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 =
|
||||
|
4
Questionable/External/YesAlreadyIpc.cs
vendored
4
Questionable/External/YesAlreadyIpc.cs
vendored
@ -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;
|
||||
|
@ -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])
|
||||
|
@ -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"/>
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user