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

Commit

Permalink
feat: added all base rotations, one more time.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 5, 2024
1 parent 8e0db8f commit c064353
Show file tree
Hide file tree
Showing 46 changed files with 3,285 additions and 7,414 deletions.
10 changes: 9 additions & 1 deletion RotationSolver.Basic/Actions/ActionBasicInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,15 @@ public struct ActionBasicInfo
/// <summary>
/// Casting time.
/// </summary>
public readonly unsafe float CastTime => ActionManager.GetAdjustedCastTime(ActionType.Action, AdjustedID) / 1000f;
public readonly unsafe float CastTime => ((ActionID)AdjustedID).GetCastTime();

public readonly unsafe uint MPNeed
{
get
{
var mpOver = _action.Setting.MPOverride?.Invoke();
if (mpOver.HasValue) return mpOver.Value;

var mp = (uint)ActionManager.GetActionCost(ActionType.Action, AdjustedID, 0, 0, 0, 0);
if (mp < 100) return 0;
return mp;
Expand Down Expand Up @@ -99,6 +102,11 @@ internal readonly bool BasicCheck(bool skipStatusProvideCheck, bool skipCombo, b
if (player.HasStatus(true, _action.Setting.StatusProvide)) return false;
}

if(_action.Action.ActionCategory.Row == 15)
{
if (CustomRotation.LimitBreakLevel <= 1) return false;
}

if(!skipCombo && IsGeneralGCD)
{
if (!CheckForCombo()) return false;
Expand Down
3 changes: 3 additions & 0 deletions RotationSolver.Basic/Actions/ActionSetting.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
/// </summary>
public class ActionSetting()
{
public ActionID[]? Ninjutsu { get; set; } = null;
public Func<uint?>? MPOverride { get; set; } = null;
public bool IsMeleeRange { get; set; } = false;
public bool StatusFromSelf { get; set; } = true;
public StatusID[]? TargetStatusProvide { get; set; } = null;
public StatusID[]? TargetStatusNeed { get; set; } = null;
Expand Down
19 changes: 15 additions & 4 deletions RotationSolver.Basic/Actions/ActionTargetInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ private readonly bool CheckTimeToKill(GameObject gameObject)

var targets = GetMostCanTargetObjects(canTargets, canAffects,
skipAoeCheck ? 0 : _action.Config.AoeCount);
var target = FindTargetByType(targets, _action.Setting.TargetType, _action.Config.AutoHealRatio);
var target = FindTargetByType(targets, _action.Setting.TargetType, _action.Config.AutoHealRatio, _action.Setting.IsMeleeRange);
if (target == null) return null;

return new(target, [.. GetAffects(target, canAffects)], target.Position);
Expand Down Expand Up @@ -255,7 +255,8 @@ private readonly bool CheckTimeToKill(GameObject gameObject)
else
{
var availableCharas = DataCenter.AllTargets.Where(b => b.ObjectId != Player.Object.ObjectId);
var target = FindTargetByType(TargetFilter.GetObjectInRadius(availableCharas, range), TargetType.Move, _action.Config.AutoHealRatio);
var target = FindTargetByType(TargetFilter.GetObjectInRadius(availableCharas, range),
TargetType.Move, _action.Config.AutoHealRatio, _action.Setting.IsMeleeRange);
if (target == null) return null;
return new(target, [], target.Position);
}
Expand Down Expand Up @@ -316,7 +317,8 @@ private readonly bool CheckTimeToKill(GameObject gameObject)
else
{
var effectRange = EffectRange;
var attackT = FindTargetByType(DataCenter.AllianceMembers.GetObjectInRadius(range + effectRange), TargetType.BeAttacked, _action.Config.AutoHealRatio);
var attackT = FindTargetByType(DataCenter.AllianceMembers.GetObjectInRadius(range + effectRange),
TargetType.BeAttacked, _action.Config.AutoHealRatio, _action.Setting.IsMeleeRange);

if (attackT == null)
{
Expand Down Expand Up @@ -444,8 +446,15 @@ private readonly bool CanGetTarget(GameObject target, GameObject subTarget)
#endregion

#region TargetFind
private static BattleChara? FindTargetByType(IEnumerable<BattleChara> gameObjects, TargetType type, float healRatio)
private static BattleChara? FindTargetByType(IEnumerable<BattleChara> gameObjects, TargetType type, float healRatio, bool isMeleeRange)
{
if (type == TargetType.Self) return Player.Object;

if (isMeleeRange)
{
gameObjects = gameObjects.Where(t => t.DistanceToPlayer() >= 3 + Service.Config.MeleeRangeOffset);
}

switch (type) // Filter the objects.
{
case TargetType.Death:
Expand Down Expand Up @@ -695,6 +704,7 @@ private readonly bool CanGetTarget(GameObject target, GameObject subTarget)
?? RandomPickByJobs(tars, JobRole.Tank, JobRole.Healer)
?? RandomObject(tars);
}

private static BattleChara? RandomPickByJobs(IEnumerable<BattleChara> tars, params JobRole[] roles)
{
foreach (var role in roles)
Expand Down Expand Up @@ -779,6 +789,7 @@ public enum TargetType : byte

Magical,

Self,
}

public readonly record struct TargetResult(BattleChara? Target, BattleChara[] AffectedTargets, Vector3? Position);
2 changes: 2 additions & 0 deletions RotationSolver.Basic/Actions/BaseAction.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using ECommons.DalamudServices;
using ECommons.GameHelpers;
using FFXIVClientStructs.FFXIV.Client.Game;
using static Dalamud.Interface.Utility.Raii.ImRaii;
using Action = Lumina.Excel.GeneratedSheets.Action;

namespace RotationSolver.Basic.Actions;
Expand Down Expand Up @@ -98,6 +99,7 @@ public bool CanUse(out IAction act, bool skipStatusProvideCheck = false, bool sk
if (!Info.BasicCheck(skipStatusProvideCheck, skipCombo, ignoreCastingCheck)) return false;
if (!Cooldown.CooldownCheck(isEmpty, onLastAbility, ignoreClippingCheck, gcdCountForAbility)) return false;

if (Setting.IsMeleeRange && IActionHelper.IsLastAction(IActionHelper.MovingActions)) return false; //No range actions after moving.
if (Setting.IsFriendly && DataCenter.AverageTimeToKill < Config.TimeToKill) return false;

PreviewTarget = TargetInfo.FindTarget(skipAoeCheck);
Expand Down
5 changes: 5 additions & 0 deletions RotationSolver.Basic/Helpers/ActionIdHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ private static Action GetAction(this ActionID actionID)
{
return Svc.Data.GetExcelSheet<Action>()!.GetRow((uint)actionID)!;
}

public unsafe static float GetCastTime(this ActionID actionID)
{
return ActionManager.GetAdjustedCastTime(ActionType.Action, (uint)actionID) / 1000f; ;
}
}
32 changes: 16 additions & 16 deletions RotationSolver.Basic/Helpers/IActionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,22 @@
/// </summary>
public static class IActionHelper
{
//internal static ActionID[] MovingActions { get; } =
//[
// ActionID.EnAvant,
// ActionID.Plunge,
// ActionID.RoughDivide,
// ActionID.Thunderclap,
// ActionID.Shukuchi,
// ActionID.Intervene,
// //ActionID.CorpsACorps,
// ActionID.HellsIngress,
// ActionID.HissatsuGyoten,
// ActionID.Icarus,
// ActionID.Onslaught,
// //ActionID.SpineShatterDive,
// //ActionID.DragonFireDive,
//];
internal static ActionID[] MovingActions { get; } =
[
ActionID.EnAvantPvE,
ActionID.PlungePvE,
ActionID.RoughDividePvE,
ActionID.ThunderclapPvE,
ActionID.ShukuchiPvE,
ActionID.IntervenePvE,
ActionID.CorpsacorpsPvE,
ActionID.HellsIngressPvE,
ActionID.HissatsuGyotenPvE,
ActionID.IcarusPvE,
ActionID.OnslaughtPvE,
ActionID.SpineshatterDivePvE,
ActionID.DragonfireDivePvE,
];

internal static bool IsLastGCD(bool isAdjust, params IAction[] actions)
{
Expand Down
195 changes: 0 additions & 195 deletions RotationSolver.Basic/Helpers/TargetFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,201 +14,6 @@ namespace RotationSolver.Basic.Helpers;
public static class TargetFilter
{
#region Find one target
internal static IEnumerable<BattleChara> MeleeRangeTargetFilter(IEnumerable<BattleChara> availableCharas)
=> availableCharas.Where(t => t.DistanceToPlayer() >= 3 + Service.Config.MeleeRangeOffset);

//internal static BattleChara DefaultChooseFriend(IEnumerable<BattleChara> availableCharas, bool _)
//{
// if (availableCharas == null || !availableCharas.Any()) return null;

// var player = Svc.ClientState.LocalPlayer;
// var onlyHealSelf = Service.Config.GetValue(PluginConfigBool.OnlyHealSelfWhenNoHealer) && player?.ClassJob.GameData?.GetJobRole() != JobRole.Healer;

// if (onlyHealSelf)
// {
// if (player == null) return null;
// return player;
// }

// availableCharas = availableCharas.Where(StatusHelper.NeedHealing);

// var healerTars = availableCharas.GetJobCategory(JobRole.Healer);
// var tankTars = availableCharas.GetJobCategory(JobRole.Tank);

// var healerTar = tankTars.OrderBy(ObjectHelper.GetHealthRatio).FirstOrDefault();
// if (healerTar != null && healerTar.GetHealthRatio() < Service.Config.GetValue(PluginConfigFloat.HealthHealerRatio))
// return healerTar;

// var tankTar = tankTars.OrderBy(ObjectHelper.GetHealthRatio).FirstOrDefault();
// if (tankTar != null && tankTar.GetHealthRatio() < Service.Config.GetValue(PluginConfigFloat.HealthTankRatio))
// return tankTar;

// var tar = availableCharas.OrderBy(ObjectHelper.GetHealthRatio).FirstOrDefault();
// if (tar.GetHealthRatio() < 1) return tar;

// return tankTars.FirstOrDefault(t => t.HasStatus(false, StatusHelper.TankStanceStatus))
// ?? tankTars.FirstOrDefault();
//}

//internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availableCharas, bool _)
//{
// if (availableCharas == null || !availableCharas.Any()) return null;

// if (Service.Config.GetValue(PluginConfigBool.FilterStopMark))
// {
// var charas = MarkingHelper.FilterStopCharaes(availableCharas);
// if (charas?.Any() ?? false) availableCharas = charas;
// }

// if (DataCenter.TreasureCharas.Length > 0)
// {
// var b = availableCharas.FirstOrDefault(b => b.ObjectId == DataCenter.TreasureCharas[0]);
// if (b != null) return b;
// availableCharas = availableCharas.Where(b => !DataCenter.TreasureCharas.Contains(b.ObjectId));
// }

// var highPriority = availableCharas.Where(ObjectHelper.IsTopPriorityHostile);
// if (highPriority.Any())
// {
// availableCharas = highPriority;
// }

// availableCharas = DefaultTargetingType(availableCharas);


// return availableCharas.FirstOrDefault();
//}

//internal static T FindTargetForMoving<T>(this IEnumerable<T> charas, bool mustUse) where T : GameObject
//{
// if (mustUse)
// {
// var tar = charas.OrderBy(ObjectHelper.DistanceToPlayer).FirstOrDefault();
// if (tar == null) return null;
// if (tar.DistanceToPlayer() < Service.Config.GetValue(Configuration.PluginConfigFloat.DistanceForMoving)) return tar;
// return null;
// }

// if (Service.Config.GetValue(Configuration.PluginConfigBool.MoveTowardsScreenCenter))
// {
// return FindMoveTargetScreenCenter(charas);
// }
// else
// {
// return FindMoveTargetFaceDirection(charas);
// }
//}

//const float DISTANCE_TO_MOVE = 3;
//private static T FindMoveTargetFaceDirection<T>(IEnumerable<T> charas) where T : GameObject
//{
// Vector3 pPosition = Player.Object.Position;
// Vector2 faceVec = Player.Object.GetFaceVector();

// var tars = charas.Where(t =>
// {
// if (t.DistanceToPlayer() < DISTANCE_TO_MOVE) return false;

// Vector3 dir = t.Position - pPosition;
// Vector2 dirVec = new(dir.Z, dir.X);
// double angle = faceVec.AngleTo(dirVec);
// return angle <= Math.PI * Service.Config.GetValue(Configuration.PluginConfigFloat.MoveTargetAngle) / 360;
// }).OrderByDescending(ObjectHelper.DistanceToPlayer);

// return tars.FirstOrDefault();
//}

//private static T FindMoveTargetScreenCenter<T>(IEnumerable<T> charas) where T : GameObject
//{
// var pPosition = Player.Object.Position;
// if (!Svc.GameGui.WorldToScreen(pPosition, out var playerScrPos)) return null;

// var tars = charas.Where(t =>
// {
// if (t.DistanceToPlayer() < DISTANCE_TO_MOVE) return false;

// if (!Svc.GameGui.WorldToScreen(t.Position, out var scrPos)) return false;

// var dir = scrPos - playerScrPos;

// if (dir.Y > 0) return false;

// return Math.Abs(dir.X / dir.Y) < Math.Tan(Math.PI * Service.Config.GetValue(Configuration.PluginConfigFloat.MoveTargetAngle) / 360);
// }).OrderByDescending(ObjectHelper.DistanceToPlayer);

// return tars.FirstOrDefault();
//}

///// <summary>
///// Find the one being attacked.
///// </summary>
///// <param name="charas"></param>
///// <param name="_"></param>
///// <returns></returns>
//public static BattleChara FindAttackedTarget(IEnumerable<BattleChara> charas, bool _)
//{
// if (!charas.Any()) return null;
// var attachedT = charas.Where(tank => tank.TargetObject?.TargetObject == tank);

// if (!attachedT.Any())
// {
// attachedT = charas.Where(tank => tank.HasStatus(false, StatusHelper.TankStanceStatus));
// }

// if (!attachedT.Any())
// {
// attachedT = charas.GetJobCategory(JobRole.Tank);
// }

// if (!attachedT.Any())
// {
// attachedT = charas;
// }

// return attachedT.OrderBy(ObjectHelper.GetHealthRatio).FirstOrDefault();
//}

//internal static IEnumerable<BattleChara> TankRangeTarget(IEnumerable<BattleChara> inputCharas)
// => ProvokeTarget(MeleeRangeTargetFilter(inputCharas));

///// <summary>
///// The target about to be provoked.
///// </summary>
///// <param name="inputCharas"></param>
///// <param name="needDistance"></param>
///// <returns></returns>
//internal static IEnumerable<BattleChara> ProvokeTarget(IEnumerable<BattleChara> inputCharas, bool needDistance = false)
//{
// var loc = Player.Object.Position;

// var targets = inputCharas.Where(target =>
// {
// //Removed the listed names.
// IEnumerable<string> names = Array.Empty<string>();
// if (OtherConfiguration.NoProvokeNames.TryGetValue(Svc.ClientState.TerritoryType, out var ns1))
// names = names.Union(ns1);

// if (names.Any(n => !string.IsNullOrEmpty(n) && new Regex(n).Match(target.Name.ToString()).Success)) return false;

// //Target can move or two big and has a target
// if ((target.GetObjectNPC()?.Unknown12 == 0 || target.HitboxRadius >= 5)
// && (target.TargetObject?.IsValid() ?? false))
// {
// //the target is not a tank role
// if (Svc.Objects.SearchById(target.TargetObjectId) is BattleChara battle
// && !battle.IsJobCategory(JobRole.Tank)
// && (!needDistance || Vector3.Distance(target.Position, loc) > 5))
// {
// return true;
// }
// }
// return false;
// });

// if (!targets.Any()) return inputCharas;
// return targets;
//}

/// <summary>
/// Get the deadth ones in the list.
/// </summary>
Expand Down
Loading

0 comments on commit c064353

Please sign in to comment.