Fix not being able to attune to aetherytes/aethernet shards if certain other GameObjects share the same DataId
This commit is contained in:
parent
73c6aae1e2
commit
0ed129f8a6
@ -27,6 +27,7 @@
|
|||||||
"Y": -16.246998,
|
"Y": -16.246998,
|
||||||
"Z": 147.02063
|
"Z": 147.02063
|
||||||
},
|
},
|
||||||
|
"StopDistance": 5,
|
||||||
"TerritoryId": 962,
|
"TerritoryId": 962,
|
||||||
"InteractionType": "Interact"
|
"InteractionType": "Interact"
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
"Y": 1.9073486E-06,
|
"Y": 1.9073486E-06,
|
||||||
"Z": 0.16778564
|
"Z": 0.16778564
|
||||||
},
|
},
|
||||||
|
"StopDistance": 5,
|
||||||
"TerritoryId": 987,
|
"TerritoryId": 987,
|
||||||
"InteractionType": "AcceptQuest"
|
"InteractionType": "AcceptQuest"
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.Game.Object;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Questionable.Model;
|
using Questionable.Model;
|
||||||
using Questionable.Model.V1;
|
using Questionable.Model.V1;
|
||||||
|
using ObjectKind = Dalamud.Game.ClientState.Objects.Enums.ObjectKind;
|
||||||
|
|
||||||
namespace Questionable.Controller.Steps.Interactions;
|
namespace Questionable.Controller.Steps.Interactions;
|
||||||
|
|
||||||
@ -37,7 +39,7 @@ internal static class AethernetShard
|
|||||||
if (!gameFunctions.IsAetheryteUnlocked(AetheryteLocation))
|
if (!gameFunctions.IsAetheryteUnlocked(AetheryteLocation))
|
||||||
{
|
{
|
||||||
logger.LogInformation("Attuning to aethernet shard {AethernetShard}", AetheryteLocation);
|
logger.LogInformation("Attuning to aethernet shard {AethernetShard}", AetheryteLocation);
|
||||||
gameFunctions.InteractWith((uint)AetheryteLocation);
|
gameFunctions.InteractWith((uint)AetheryteLocation, ObjectKind.Aetheryte);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
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.Game.ClientState.Objects.Types;
|
||||||
@ -29,6 +28,7 @@ using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderConditi
|
|||||||
using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
|
using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
|
||||||
using EventPathMove = Lumina.Excel.GeneratedSheets.EventPathMove;
|
using EventPathMove = Lumina.Excel.GeneratedSheets.EventPathMove;
|
||||||
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
|
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
|
||||||
|
using ObjectKind = Dalamud.Game.ClientState.Objects.Enums.ObjectKind;
|
||||||
using Quest = Questionable.Model.Quest;
|
using Quest = Questionable.Model.Quest;
|
||||||
using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
|
using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
|
||||||
|
|
||||||
@ -316,11 +316,15 @@ internal sealed unsafe class GameFunctions
|
|||||||
playerState->IsAetherCurrentUnlocked(aetherCurrentId);
|
playerState->IsAetherCurrentUnlocked(aetherCurrentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IGameObject? FindObjectByDataId(uint dataId)
|
public IGameObject? FindObjectByDataId(uint dataId, ObjectKind? kind = null)
|
||||||
{
|
{
|
||||||
foreach (var gameObject in _objectTable)
|
foreach (var gameObject in _objectTable)
|
||||||
{
|
{
|
||||||
if (gameObject.DataId == dataId)
|
if (gameObject.ObjectKind is ObjectKind.Player or ObjectKind.Companion or ObjectKind.MountType
|
||||||
|
or ObjectKind.Retainer or ObjectKind.Housing)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (gameObject.DataId == dataId && (kind == null || kind.Value == gameObject.ObjectKind))
|
||||||
{
|
{
|
||||||
return gameObject;
|
return gameObject;
|
||||||
}
|
}
|
||||||
@ -330,9 +334,9 @@ internal sealed unsafe class GameFunctions
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool InteractWith(uint dataId)
|
public bool InteractWith(uint dataId, ObjectKind? kind = null)
|
||||||
{
|
{
|
||||||
IGameObject? gameObject = FindObjectByDataId(dataId);
|
IGameObject? gameObject = FindObjectByDataId(dataId, kind);
|
||||||
if (gameObject != null)
|
if (gameObject != null)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.EntityId);
|
_logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.EntityId);
|
||||||
@ -342,7 +346,7 @@ internal sealed unsafe class GameFunctions
|
|||||||
long result = (long)TargetSystem.Instance()->InteractWithObject((GameObject*)gameObject.Address, false);
|
long result = (long)TargetSystem.Instance()->InteractWithObject((GameObject*)gameObject.Address, false);
|
||||||
|
|
||||||
_logger.LogInformation("Interact result: {Result}", result);
|
_logger.LogInformation("Interact result: {Result}", result);
|
||||||
return result > 0;
|
return result != 7 && result > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogDebug("Game object is null");
|
_logger.LogDebug("Game object is null");
|
||||||
@ -413,11 +417,14 @@ internal sealed unsafe class GameFunctions
|
|||||||
if (actionRow.TargetArea)
|
if (actionRow.TargetArea)
|
||||||
{
|
{
|
||||||
Vector3 position = gameObject.Position;
|
Vector3 position = gameObject.Position;
|
||||||
result = ActionManager.Instance()->UseActionLocation(ActionType.Action, (uint)action, location: &position);
|
result = ActionManager.Instance()->UseActionLocation(ActionType.Action, (uint)action,
|
||||||
_logger.LogInformation("UseAction {Action} on target area {Target} result: {Result}", action, gameObject,
|
location: &position);
|
||||||
|
_logger.LogInformation("UseAction {Action} on target area {Target} result: {Result}", action,
|
||||||
|
gameObject,
|
||||||
result);
|
result);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action, gameObject.GameObjectId);
|
result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action, gameObject.GameObjectId);
|
||||||
_logger.LogInformation("UseAction {Action} on target {Target} result: {Result}", action, gameObject,
|
_logger.LogInformation("UseAction {Action} on target {Target} result: {Result}", action, gameObject,
|
||||||
result);
|
result);
|
||||||
|
Loading…
Reference in New Issue
Block a user