Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
fix: try to fix with sight. It is hard.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 12, 2023
1 parent 442b178 commit 6365291
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 24 deletions.
1 change: 1 addition & 0 deletions RotationSolver/Actions/BaseAction/BaseAction_Display.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public unsafe void Display(bool IsActive) => this.DrawEnableTexture(IsActive, ()
#if DEBUG
try
{
ImGui.Text("Can Target: " + CanTargetTo(Target));
ImGui.Text("Have One:" + HaveOneChargeDEBUG.ToString());
ImGui.Text("Is Real GCD: " + IsRealGCD.ToString());
ImGui.Text("Recast One: " + RecastTimeOneChargeDEBUG.ToString());
Expand Down
29 changes: 20 additions & 9 deletions RotationSolver/Actions/BaseAction/BaseAction_Target.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,10 @@ private bool TargetAreaFriend(float range, bool mustUse, PlayerCharacter player)

private bool TargetPartyAndHostile(float range, bool mustUse, out BattleChara target)
{
var availableCharas = TargetUpdater.PartyMembers.Union(TargetUpdater.HostileTargets).Where(b => b.ObjectId != Service.ClientState.LocalPlayer.ObjectId);
availableCharas = TargetFilter.GetObjectInRadius(availableCharas, range);
var availableCharas = TargetUpdater.PartyMembers.Union(TargetUpdater.HostileTargets)
.Where(b => b.ObjectId != Service.ClientState.LocalPlayer.ObjectId);
availableCharas = TargetFilter.GetObjectInRadius(availableCharas, range).Where(CanTargetTo);

//特殊选队友的方法。
target = ChoiceTarget(availableCharas, mustUse);
if (target == null) return false;
return true;
Expand Down Expand Up @@ -247,7 +247,8 @@ private bool TargetParty(float range, int aoeCount, bool mustUse, out BattleChar
}
else
{
availableCharas = TargetFilter.GetObjectInRadius(availableCharas, range);
availableCharas = TargetFilter.GetObjectInRadius(availableCharas, range)
.Where(CanTargetTo);
//特殊选队友的方法。
target = ChoiceTarget(availableCharas, mustUse);
}
Expand Down Expand Up @@ -292,10 +293,11 @@ private bool TargetHostile(float range, bool mustUse, int aoeCount, out BattleCh

private bool TargetHostileManual(BattleChara b, bool mustUse, int aoeCount, out BattleChara target)
{
target = b;
if (!CanTargetTo(b)) return false;

if (_action.CastType == 1)
{
target = b;

if (!mustUse)
{
//No need to dot.
Expand All @@ -312,7 +314,6 @@ private bool TargetHostileManual(BattleChara b, bool mustUse, int aoeCount, out
{
if (GetMostObjects(TargetFilterFuncEot(TargetUpdater.HostileTargets, mustUse), aoeCount).Contains(b))
{
target = b;
return true;
}
}
Expand Down Expand Up @@ -348,7 +349,7 @@ private IEnumerable<BattleChara> GetMostObjects(IEnumerable<BattleChara> targets
{
var range = Range;
var canAttack = targets.Where(t => t.DistanceToPlayer() <= range + _action.EffectRange);
var canGetObj = canAttack.Where(t => t.DistanceToPlayer() <= range);
var canGetObj = canAttack.Where(t => t.DistanceToPlayer() <= range && CanTargetTo(t));

if (_action.CastType == 1) return canGetObj;

Expand Down Expand Up @@ -454,7 +455,7 @@ private IEnumerable<BattleChara> TargetFilterFuncEot(IEnumerable<BattleChara> ta
/// </summary>
/// <param name="tar"></param>
/// <returns>True for add Eot.</returns>
private bool CheckStatus(BattleChara tar)
bool CheckStatus(BattleChara tar)
{
if (tar == null) return false;

Expand All @@ -463,6 +464,16 @@ private bool CheckStatus(BattleChara tar)
return tar.WillStatusEndGCD((uint)Service.Configuration.AddDotGCDCount, 0, true, TargetStatus);
}

unsafe bool CanTargetTo(BattleChara tar)
{
if (tar == null) return false;

var id = ActionManager.GetActionInRangeOrLoS(AdjustedID, (FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)Service.Player,
(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)tar.Address);

return id is 0 or 565;
}

/// <summary>
/// 开启攻击标记且有攻击标记目标且不开AOE。
/// </summary>
Expand Down
3 changes: 2 additions & 1 deletion RotationSolver/Service.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using Dalamud.Game.Gui.Toast;
using Dalamud.IoC;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
using RotationSolver.Configuration;
using RotationSolver.Localization;
using RotationSolver.SigReplacers;
Expand All @@ -27,7 +28,7 @@ internal static unsafe FFXIVClientStructs.FFXIV.Client.Game.Character.CharacterM
=> FFXIVClientStructs.FFXIV.Client.Game.Character.CharacterManager.Instance();

internal static unsafe FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara* Player
=> (FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara*)(void*)ClientState.LocalPlayer.Address;
=> Control.Instance()->LocalPlayer;
internal static LocalizationManager Localization { get; set; }

internal static PluginConfiguration Configuration { get; set; }
Expand Down
5 changes: 5 additions & 0 deletions RotationSolver/SigReplacers/PluginAddressResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@ protected override void Setup64Bit(SigScanner scanner)
IsActionIdReplaceable = scanner.ScanText("E8 ?? ?? ?? ?? 84 C0 74 4C 8B D3");

//IDK
//Some day in ClientStructs.
CanAttackFunction = scanner.ScanText("48 89 5C 24 ?? 57 48 83 EC 20 48 8B DA 8B F9 E8 ?? ?? ?? ?? 4C 8B C3 ");
MovingController = scanner.ScanText("40 55 53 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 83 79 ?? ??");

//https://github.com/Tischel/ActionTimeline/blob/master/ActionTimeline/Helpers/TimelineManager.cs#L86
ReceiveAbilty = scanner.ScanText("4C 89 44 24 ?? 55 56 41 54 41 55 41 56");

//https://github.com/xorus/EngageTimer/blob/main/Game/CountdownHook.cs
CountdownTimerAdress = scanner.ScanText("48 89 5C 24 ?? 57 48 83 EC 40 8B 41");

//https://github.com/BardMusicPlayer/Hypnotoad-Plugin/blob/7928be6735daf28e94121c3cf1c1dbbef0d97bcf/HypnotoadPlugin/Offsets/Offsets.cs#L18
Expand Down
11 changes: 4 additions & 7 deletions RotationSolver/Updaters/ActionUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@ namespace RotationSolver.Updaters;

internal static class ActionUpdater
{
private static unsafe IntPtr ComboTimer => (IntPtr)((byte*)ActionManager.Instance() + 0x60);
public static unsafe float ComboTime => *(float*)ComboTimer;
private static IntPtr LastComboMove => ComboTimer + 4;
public static unsafe ActionID LastComboAction => *(ActionID*)LastComboMove;
public static unsafe float ComboTime => ActionManager.Instance()->Combo.Timer;
public static unsafe ActionID LastComboAction => (ActionID)ActionManager.Instance()->Combo.Action;

static DateTime _startCombatTime = DateTime.MinValue;
public static TimeSpan CombatTime
Expand Down Expand Up @@ -80,7 +78,7 @@ internal static void UpdateNextAction()
internal unsafe static void UpdateActionInfo()
{
var last = InCombat;
InCombat = Service.Conditions[Dalamud.Game.ClientState.Conditions.ConditionFlag.InCombat];
InCombat = Service.Conditions[ConditionFlag.InCombat];
if(!last && InCombat)
{
_startCombatTime = DateTime.Now;
Expand Down Expand Up @@ -185,8 +183,7 @@ internal unsafe static void DoAction()
|| Service.Conditions[ConditionFlag.SufferingStatusAffliction2]
|| Service.Conditions[ConditionFlag.RolePlaying]
|| Service.Conditions[ConditionFlag.InFlight]
//Skip the action queue.
|| *(bool*)((IntPtr)ActionManager.Instance() + 0x68)) return;
|| ActionManager.Instance()->ActionQueued) return;

//GCD
var canUseGCD = WeaponRemain <= Service.Configuration.WeaponFaster;
Expand Down
11 changes: 5 additions & 6 deletions RotationSolver/Updaters/TargetUpdater_Friends.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Objects.Types;
using FFXIVClientStructs.FFXIV.Client.Game.Group;
using FFXIVClientStructs.FFXIV.Client.UI;
using RotationSolver.Commands;
using RotationSolver.Data;
Expand Down Expand Up @@ -41,19 +42,15 @@ internal static partial class TargetUpdater
/// </summary>
internal static IEnumerable<BattleChara> AllianceTanks { get; private set; } = new PlayerCharacter[0];

[EditorBrowsable(EditorBrowsableState.Never)]
internal static ObjectListDelay<BattleChara> DeathPeopleAll { get; } = new (
()=>(Service.Configuration.DeathDelayMin, Service.Configuration.DeathDelayMax));

[EditorBrowsable(EditorBrowsableState.Never)]
internal static ObjectListDelay<BattleChara> DeathPeopleParty { get; } = new(
() => (Service.Configuration.DeathDelayMin, Service.Configuration.DeathDelayMax));

[EditorBrowsable(EditorBrowsableState.Never)]
internal static ObjectListDelay<BattleChara> WeakenPeople { get; } = new(
() => (Service.Configuration.WeakenDelayMin, Service.Configuration.WeakenDelayMax));

[EditorBrowsable(EditorBrowsableState.Never)]
internal static ObjectListDelay<BattleChara> DyingPeople { get; } = new(
() => (Service.Configuration.WeakenDelayMin, Service.Configuration.WeakenDelayMax));
/// <summary>
Expand Down Expand Up @@ -86,7 +83,7 @@ internal static partial class TargetUpdater
[EditorBrowsable(EditorBrowsableState.Never)]
internal static bool CanHealSingleSpell { get; private set; } = false;

internal static unsafe bool HavePet => (IntPtr)Service.CharacterManager->LookupPetByOwnerObject(Service.Player) != IntPtr.Zero;
internal static unsafe bool HavePet { get; private set; }

internal static unsafe bool HaveCompanion => (IntPtr)Service.CharacterManager->LookupBuddyByOwnerObject(Service.Player) != IntPtr.Zero;

Expand All @@ -105,9 +102,11 @@ private unsafe static void UpdateFriends(IEnumerable<BattleChara> allTargets)
{
#region Friend
PartyMembers = GetPartyMembers(allTargets);

AllianceMembers = allTargets.OfType<PlayerCharacter>();

var mayPet = allTargets.OfType<BattleNpc>().Where(npc => npc.OwnerId == Service.ClientState.LocalPlayer.ObjectId);
HavePet = mayPet.Any(npc => npc.BattleNpcKind == BattleNpcSubKind.Pet);

PartyTanks = PartyMembers.GetJobCategory(JobRole.Tank);
PartyHealers = PartyMembers.GetJobCategory(JobRole.Healer);
AllianceTanks = AllianceMembers.GetJobCategory(JobRole.Tank);
Expand Down
1 change: 1 addition & 0 deletions RotationSolver/Updaters/TargetUpdater_Hostile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Logging;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
using FFXIVClientStructs.FFXIV.Client.Game.Fate;
using FFXIVClientStructs.FFXIV.Client.UI;
using Lumina.Excel.GeneratedSheets;
Expand Down
3 changes: 2 additions & 1 deletion RotationSolver/Windows/OverlayWindow.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
using ImGuiNET;
using RotationSolver.Actions.BaseAction;
using RotationSolver.Data;
Expand Down Expand Up @@ -93,7 +94,7 @@ private unsafe static void DrawMoveTarget()
{
if (Service.GameGui.WorldToScreen(t.Position, out var p))
{
//ImGui.GetWindowDrawList().AddText(p, color, $"FateId: {((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)(void*)t.Address)->FateId}");
//ImGui.GetWindowDrawList().AddText(p, color, $"Is In View: {TargetSystem.Instance()->IsObjectInViewRange(t.GetAddress())}");

//ImGui.GetWindowDrawList().AddText(p, color, $"Boss Ratio (Max): {t.MaxHp / calHealth:F2}\nDying Ratio (Current): {t.CurrentHp / calHealth:F2}");
}
Expand Down

0 comments on commit 6365291

Please sign in to comment.