Skip to content

Commit

Permalink
Merge pull request #66 from FFXIV-CombatReborn/knockback-detection
Browse files Browse the repository at this point in the history
Knockback detection and anti-knockback autouse
  • Loading branch information
NostraThomas99 authored Apr 4, 2024
2 parents ce099ef + cf27d97 commit 94897d1
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 1 deletion.
9 changes: 9 additions & 0 deletions RotationSolver.Basic/Configuration/OtherConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class OtherConfiguration
{
public static HashSet<uint> HostileCastingArea = [];
public static HashSet<uint> HostileCastingTank = [];
public static HashSet<uint> HostileCastingKnockback = [];

public static SortedList<uint, float> AnimationLockTime = [];

Expand Down Expand Up @@ -41,6 +42,7 @@ public static void Init()
Task.Run(() => InitOne(ref BeneficialPositions, nameof(BeneficialPositions)));
Task.Run(() => InitOne(ref RotationSolverRecord, nameof(RotationSolverRecord), false));
Task.Run(() => InitOne(ref NoCastingStatus, nameof(NoCastingStatus)));
Task.Run(() => InitOne(ref HostileCastingKnockback, nameof(HostileCastingKnockback)));
}

public static Task Save()
Expand All @@ -58,8 +60,15 @@ public static Task Save()
await SaveRotationSolverRecord();
await SaveNoProvokeNames();
await SaveNoCastingStatus();
await SaveHostileCastingKnockback();
});
}

private static Task SaveHostileCastingKnockback()
{
return Task.Run(() => Save(HostileCastingKnockback, nameof(HostileCastingKnockback)));
}

public static Task SaveNoCastingStatus()
{
return Task.Run(() => Save(NoCastingStatus, nameof(NoCastingStatus)));
Expand Down
2 changes: 2 additions & 0 deletions RotationSolver.Basic/DataCenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,8 @@ internal set

public static bool IsHostileCastingToTank { get; internal set; }

public static bool IsHostileCastingKnockback { get; internal set; }

public static bool HasPet { get; internal set; }

public static unsafe bool HasCompanion => (IntPtr)Player.BattleChara != IntPtr.Zero
Expand Down
6 changes: 6 additions & 0 deletions RotationSolver/Data/UiString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,18 @@ internal enum UiString
[Description("AoE")]
ConfigWindow_List_HostileCastingArea,

[Description("Knockback")]
ConfigWindow_List_HostileCastingKnockback,

[Description("Use tank personal damage mitigation abilities if the target is casting any of these actions")]
ConfigWindow_List_HostileCastingTankDesc,

[Description("Use AoE damage mitigation abilities if the target is casting any of these actions")]
ConfigWindow_List_HostileCastingAreaDesc,

[Description("Use knockback prevention abilities if the target is casting any of these actions")]
ConfigWindow_List_HostileCastingKnockbackDesc,

[Description("Add Action")]
ConfigWindow_List_AddAction,

Expand Down
9 changes: 8 additions & 1 deletion RotationSolver/UI/RotationConfigWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2086,7 +2086,7 @@ private static void DrawListActions()
ImGui.SetNextItemWidth(ImGui.GetWindowWidth());
ImGui.InputTextWithHint("##Searching the action", UiString.ConfigWindow_List_ActionNameOrId.Local(), ref _actionSearching, 128);

using var table = ImRaii.Table("Rotation Solver List Actions", 2, ImGuiTableFlags.BordersInner | ImGuiTableFlags.Resizable | ImGuiTableFlags.SizingStretchSame);
using var table = ImRaii.Table("Rotation Solver List Actions", 3, ImGuiTableFlags.BordersInner | ImGuiTableFlags.Resizable | ImGuiTableFlags.SizingStretchSame);
if (table)
{
ImGui.TableSetupScrollFreeze(0, 1);
Expand All @@ -2098,6 +2098,9 @@ private static void DrawListActions()
ImGui.TableNextColumn();
ImGui.TableHeader(UiString.ConfigWindow_List_HostileCastingArea.Local());

ImGui.TableNextColumn();
ImGui.TableHeader(UiString.ConfigWindow_List_HostileCastingKnockback.Local());

ImGui.TableNextRow();

ImGui.TableNextColumn();
Expand All @@ -2111,6 +2114,10 @@ private static void DrawListActions()
ImGui.TextWrapped(UiString.ConfigWindow_List_HostileCastingAreaDesc.Local());

DrawActionsList(nameof(OtherConfiguration.HostileCastingArea), OtherConfiguration.HostileCastingArea);

ImGui.TableNextColumn();
ImGui.TextWrapped(UiString.ConfigWindow_List_HostileCastingKnockbackDesc.Local());
DrawActionsList(nameof(OtherConfiguration.HostileCastingKnockback), OtherConfiguration.HostileCastingKnockback);
}
}

Expand Down
5 changes: 5 additions & 0 deletions RotationSolver/Updaters/StateUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ private static AutoStatus StatusFromAutomatic()
status |= AutoStatus.DefenseArea;
}

if (DataCenter.IsHostileCastingKnockback && !hasTimeline)
{
status |= AutoStatus.AntiKnockback;
}

if (DataCenter.Role == JobRole.Healer || DataCenter.Job == ECommons.ExcelServices.Job.PLD) // Help defense.
{
if (DataCenter.PartyMembers.Any((tank) =>
Expand Down
9 changes: 9 additions & 0 deletions RotationSolver/Updaters/TargetUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ private unsafe static void UpdateHostileTargets(IEnumerable<BattleChara> allTarg

DataCenter.IsHostileCastingToTank = IsCastingTankVfx() || DataCenter.AllHostileTargets.Any(IsHostileCastingTank);
DataCenter.IsHostileCastingAOE = IsCastingAreaVfx() || DataCenter.AllHostileTargets.Any(IsHostileCastingArea);
DataCenter.IsHostileCastingKnockback = DataCenter.AllHostileTargets.Any(IsHostileCastingKnockback);

DataCenter.ProvokeTarget = _provokeDelay.Delay(DataCenter.AllHostileTargets.FirstOrDefault(ObjectHelper.CanProvoke));
}
Expand Down Expand Up @@ -185,6 +186,14 @@ private static bool IsHostileCastingArea(BattleChara h)
});
}

private static bool IsHostileCastingKnockback(BattleChara h)
{
return IsHostileCastingBase(h, (act) =>
{
return OtherConfiguration.HostileCastingKnockback.Contains(act.RowId);
});
}

private static bool IsHostileCastingBase(BattleChara h, Func<Action, bool> check)
{
if (!h.IsCasting) return false;
Expand Down
5 changes: 5 additions & 0 deletions RotationSolver/Watcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ private static void ActionFromEnemy(ActionEffectSet set)
{
DataCenter.KnockbackStart = DateTime.Now;
DataCenter.KnockbackFinished = DateTime.Now + TimeSpan.FromSeconds(knock.Distance / (float)knock.Speed);
if (!OtherConfiguration.HostileCastingKnockback.Contains(set.Action.RowId))
{
OtherConfiguration.HostileCastingKnockback.Add(set.Action.RowId);
OtherConfiguration.Save();
}
}
break;
}
Expand Down

0 comments on commit 94897d1

Please sign in to comment.