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

Commit

Permalink
fix: fixed some rotation and the major file.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Jan 31, 2024
1 parent 50def16 commit cb79bc6
Show file tree
Hide file tree
Showing 25 changed files with 370 additions and 780 deletions.
210 changes: 78 additions & 132 deletions DefaultRotations/Healer/AST_Default.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace DefaultRotations.Healer;

[RotationDesc(ActionID.Divination)]
[RotationDesc(ActionID.DivinationPvE)]
[SourceCode(Path = "main/DefaultRotations/Healer/AST_Default.cs")]
public sealed class AST_Default : AstrologianRotation
{
Expand All @@ -12,230 +12,176 @@ public sealed class AST_Default : AstrologianRotation

protected override IRotationConfigSet CreateConfiguration()
=> base.CreateConfiguration()
.SetFloat(RotationSolver.Basic.Configuration.ConfigUnitType.Seconds, CombatType.PvE, "UseEarthlyStarTime", 15, "Use Earthly Star during countdown timer.", 4, 20);
.SetFloat(ConfigUnitType.Seconds, CombatType.PvE, "UseEarthlyStarTime", 15, "Use Earthly Star during countdown timer.", 4, 20);

static IBaseAction AspectedBeneficDefense { get; } = new BaseAction(ActionID.AspectedBenefic, ActionOption.Hot)
protected override IAction? CountDownAction(float remainTime)
{
ChoiceTarget = TargetFilter.FindAttackedTarget,
ActionCheck = (b, m) => b.IsJobCategory(JobRole.Tank),
TargetStatus = new StatusID[] { StatusID.AspectedBenefic },
};

protected override IAction CountDownAction(float remainTime)
{
if (remainTime < Malefic.CastTime + CountDownAhead
&& Malefic.CanUse(out var act, CanUseOption.IgnoreClippingCheck)) return act;
if (remainTime < MaleficPvE.Info.CastTime + CountDownAhead
&& MaleficPvE.CanUse(out var act)) return act;
if (remainTime < 3 && UseBurstMedicine(out act)) return act;
if (remainTime < 4 && AspectedBeneficDefense.CanUse(out act, CanUseOption.IgnoreClippingCheck)) return act;
if (remainTime is < 4 and > 3 && AspectedBeneficPvE.CanUse(out act)) return act;
if (remainTime < Configs.GetFloat("UseEarthlyStarTime")
&& EarthlyStar.CanUse(out act, CanUseOption.IgnoreClippingCheck)) return act;
if (remainTime < 30 && Draw.CanUse(out act, CanUseOption.IgnoreClippingCheck)) return act;
&& EarthlyStarPvE.CanUse(out act)) return act;
if (remainTime < 30 && DrawPvE.CanUse(out act)) return act;

return base.CountDownAction(remainTime);
}

[RotationDesc(ActionID.CelestialIntersection, ActionID.Exaltation)]
protected override bool DefenseSingleAbility(out IAction act)
[RotationDesc(ActionID.CelestialIntersectionPvE, ActionID.ExaltationPvE)]
protected override bool DefenseSingleAbility(out IAction? act)
{
//天星交错
if (CelestialIntersection.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;

//给T减伤,这个很重要。
if (Exaltation.CanUse(out act)) return true;
if (CelestialIntersectionPvE.CanUse(out act, isEmpty:true)) return true;
if (ExaltationPvE.CanUse(out act)) return true;
return base.DefenseSingleAbility(out act);
}

[RotationDesc(ActionID.Macrocosmos)]
protected override bool DefenseAreaGCD(out IAction act)
[RotationDesc(ActionID.MacrocosmosPvE)]
protected override bool DefenseAreaGCD(out IAction? act)
{
if (Macrocosmos.CanUse(out act)) return true;
if (MacrocosmosPvE.CanUse(out act)) return true;
return base.DefenseAreaGCD(out act);
}

[RotationDesc(ActionID.CollectiveUnconscious)]
protected override bool DefenseAreaAbility(out IAction act)
[RotationDesc(ActionID.CollectiveUnconsciousPvE)]
protected override bool DefenseAreaAbility(out IAction? act)
{
if (CollectiveUnconscious.CanUse(out act)) return true;

if (CollectiveUnconsciousPvE.CanUse(out act)) return true;
return base.DefenseAreaAbility(out act);
}

protected override bool GeneralGCD(out IAction act)
protected override bool GeneralGCD(out IAction? act)
{
//Add AspectedBeneficwhen not in combat.
if (NotInCombatDelay && AspectedBeneficDefense.CanUse(out act)) return true;
////Add AspectedBeneficwhen not in combat.
//if (NotInCombatDelay && AspectedBeneficDefensePvE.CanUse(out act)) return true;

//群体输出
if (Gravity.CanUse(out act)) return true;
if (GravityPvE.CanUse(out act)) return true;

//单体输出
if (Combust.CanUse(out act)) return true;
if (Malefic.CanUse(out act)) return true;
if (Combust.CanUse(out act, CanUseOption.MustUse)) return true;
if (CombustPvE.CanUse(out act)) return true;
if (MaleficPvE.CanUse(out act)) return true;
if (CombustPvE.CanUse(out act, skipStatusProvideCheck: true )) return true;

return base.GeneralGCD(out act);
}

[RotationDesc(ActionID.AspectedHelios, ActionID.Helios)]
protected override bool HealAreaGCD(out IAction act)
[RotationDesc(ActionID.AspectedHeliosPvE, ActionID.HeliosPvE)]
protected override bool HealAreaGCD(out IAction? act)
{
//阳星相位
if (AspectedHelios.CanUse(out act)) return true;

//阳星
if (Helios.CanUse(out act)) return true;

if (AspectedHeliosPvE.CanUse(out act)) return true;
if (HeliosPvE.CanUse(out act)) return true;
return base.HealAreaGCD(out act);
}

protected override bool EmergencyAbility(IAction nextGCD, out IAction act)
protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
if (base.EmergencyAbility(nextGCD, out act)) return true;

if (PartyHealers.Count() == 1 && Player.HasStatus(false, StatusID.Silence)
&& HasHostilesInRange && EchoDrops.CanUse(out act)) return true;

if (!InCombat) return false;

//如果要群奶了,先上个天宫图!
if (nextGCD.IsTheSameTo(true, AspectedHelios, Helios))
if (nextGCD.IsTheSameTo(true, AspectedHeliosPvE, HeliosPvE))
{
if (Horoscope.CanUse(out act)) return true;

//中间学派
if (NeutralSect.CanUse(out act)) return true;
if (HoroscopePvE.CanUse(out act)) return true;
if (NeutralSectPvE.CanUse(out act)) return true;
}

//如果要单奶了,先上星位合图!
if (nextGCD.IsTheSameTo(true, Benefic, Benefic2, AspectedBenefic))
if (nextGCD.IsTheSameTo(true, BeneficPvE, BeneficIiPvE, AspectedBeneficPvE))
{
if (Synastry.CanUse(out act)) return true;
if (SynastryPvE.CanUse(out act)) return true;
}
return base.EmergencyAbility(nextGCD, out act);
}

protected override bool GeneralAbility(out IAction act)
protected override bool GeneralAbility(out IAction? act)
{
//如果当前还没有卡牌,那就抽一张
if (Draw.CanUse(out act)) return true;

//如果当前卡牌已经拥有了,就重抽
if (Redraw.CanUse(out act)) return true;

if (DrawPvE.CanUse(out act)) return true;
if (RedrawPvE.CanUse(out act)) return true;
return base.GeneralAbility(out act);
}

[RotationDesc(ActionID.AspectedBenefic, ActionID.BeneficIi, ActionID.Benefic)]
protected override bool HealSingleGCD(out IAction act)
[RotationDesc(ActionID.AspectedBeneficPvE, ActionID.BeneficIiPvE, ActionID.BeneficPvE)]
protected override bool HealSingleGCD(out IAction? act)
{
//吉星相位
if (AspectedBenefic.CanUse(out act)
&& (IsMoving || AspectedBenefic.Target.GetHealthRatio() > 0.4)) return true;
if (AspectedBeneficPvE.CanUse(out act)
&& (IsMoving
|| AspectedBeneficPvE.Target!.Value.Target.GetHealthRatio() > 0.4)) return true;

//福星
if (Benefic2.CanUse(out act)) return true;

//吉星
if (Benefic.CanUse(out act)) return true;
if (BeneficIiPvE.CanUse(out act)) return true;
if (BeneficPvE.CanUse(out act)) return true;

return base.HealSingleGCD(out act);
}

protected override bool AttackAbility(out IAction act)
protected override bool AttackAbility(out IAction? act)
{
if (IsBurst && !IsMoving && Divination.CanUse(out act)) return true;

//如果当前还没有皇冠卡牌,那就抽一张
if (MinorArcana.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
if (IsBurst && !IsMoving
&& DivinationPvE.CanUse(out act)) return true;

//如果当前还没有卡牌,那就抽一张
if (Draw.CanUse(out act, IsBurst ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
if (MinorArcanaPvE.CanUse(out act, isEmpty:true)) return true;

//光速,创造更多的内插能力技的机会。
if (IsMoving && Lightspeed.CanUse(out act)) return true;
if (DrawPvE.CanUse(out act, isEmpty: IsBurst)) return true;

if (IsMoving && LightspeedPvE.CanUse(out act)) return true;

if (!IsMoving)
{
//如果没有地星也没有巨星,那就试试看能不能放个。
if (!Player.HasStatus(true, StatusID.EarthlyDominance, StatusID.GiantDominance))
{
if (EarthlyStar.CanUse(out act, CanUseOption.MustUse)) return true;
if (EarthlyStarPvE.CanUse(out act)) return true;
}
//加星星的进攻Buff
if (Astrodyne.CanUse(out act)) return true;
if (AstrodynePvE.CanUse(out act)) return true;
}

if (DrawnCrownCard == CardType.LORD || MinorArcana.WillHaveOneChargeGCD(1, 0))
if (DrawnCrownCard == CardType.LORD || MinorArcanaPvE.Cooldown.WillHaveOneChargeGCD(1, 0))
{
//进攻牌,随便发。或者CD要转好了,赶紧发掉。
if (MinorArcana.CanUse(out act, CanUseOption.MustUse)) return true;
if (MinorArcanaPvE.CanUse(out act)) return true;
}

//发牌
if (Redraw.CanUse(out act)) return true;
if (RedrawPvE.CanUse(out act)) return true;
if (PlayCard(out act)) return true;

return base.AttackAbility(out act);
}

[RotationDesc(ActionID.EssentialDignity, ActionID.CelestialIntersection, ActionID.CelestialOpposition,
ActionID.EarthlyStar, ActionID.Horoscope)]
protected override bool HealSingleAbility(out IAction act)
[RotationDesc(ActionID.EssentialDignityPvE, ActionID.CelestialIntersectionPvE, ActionID.CelestialOppositionPvE,
ActionID.EarthlyStarPvE, ActionID.HoroscopePvE)]
protected override bool HealSingleAbility(out IAction? act)
{
//常规奶
if (EssentialDignity.CanUse(out act)) return true;
//带盾奶
if (CelestialIntersection.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
if (EssentialDignityPvE.CanUse(out act)) return true;
if (CelestialIntersectionPvE.CanUse(out act, isEmpty:true)) return true;

if (DrawnCrownCard == CardType.LADY
&& MinorArcanaPvE.CanUse(out act)) return true;

//奶量牌,要看情况。
if (DrawnCrownCard == CardType.LADY && MinorArcana.CanUse(out act, CanUseOption.MustUse)) return true;
if (CelestialOppositionPvE.CanUse(out act)) return true;

var tank = PartyTanks;
var isBoss = Malefic.Target.IsBossFromTTK();
if (EssentialDignity.IsCoolingDown && tank.Count() == 1 && tank.Any(t => t.GetHealthRatio() < 0.5) && !isBoss)
if (Player.HasStatus(true, StatusID.GiantDominance))
{
//群Hot
if (CelestialOpposition.CanUse(out act)) return true;
act = EarthlyStarPvE;
return true;
}

//如果有巨星主宰
if (Player.HasStatus(true, StatusID.GiantDominance))
{
//需要回血的时候炸了。
act = EarthlyStar;
return true;
}
if (!Player.HasStatus(true, StatusID.HoroscopeHelios, StatusID.Horoscope) && HoroscopePvE.CanUse(out act)) return true;

//天宫图
if (!Player.HasStatus(true, StatusID.HoroscopeHelios, StatusID.Horoscope) && Horoscope.CanUse(out act)) return true;
//阳星天宫图
if (Player.HasStatus(true, StatusID.HoroscopeHelios) && Horoscope.CanUse(out act)) return true;
//超紧急情况天宫图
if (tank.Any(t => t.GetHealthRatio() < 0.3) && Horoscope.CanUse(out act)) return true;
}
if ((Player.HasStatus(true, StatusID.HoroscopeHelios)
|| PartyMembersMinHP < 0.3)
&& HoroscopePvE.CanUse(out act)) return true;

return base.HealSingleAbility(out act);
}

[RotationDesc(ActionID.CelestialOpposition, ActionID.EarthlyStar, ActionID.Horoscope)]
[RotationDesc(ActionID.CelestialOppositionPvE, ActionID.EarthlyStarPvE, ActionID.HoroscopePvE)]
protected override bool HealAreaAbility(out IAction act)
{
//群Hot
if (CelestialOpposition.CanUse(out act)) return true;
if (CelestialOppositionPvE.CanUse(out act)) return true;

//如果有巨星主宰
if (Player.HasStatus(true, StatusID.GiantDominance))
{
//需要回血的时候炸了。
act = EarthlyStar;
act = EarthlyStarPvE;
return true;
}

//天宫图
if (Player.HasStatus(true, StatusID.HoroscopeHelios) && Horoscope.CanUse(out act)) return true;
if (Player.HasStatus(true, StatusID.HoroscopeHelios) && HoroscopePvE.CanUse(out act)) return true;

//奶量牌,要看情况。
if (DrawnCrownCard == CardType.LADY && MinorArcana.CanUse(out act, CanUseOption.MustUse)) return true;
if (DrawnCrownCard == CardType.LADY && MinorArcanaPvE.CanUse(out act)) return true;

return base.HealAreaAbility(out act);
}
Expand Down
3 changes: 1 addition & 2 deletions RotationSolver.Basic/Actions/ActionBasicInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public readonly bool IsOnSlot
{
get
{
if(_action.Action.ClassJob.Row == (uint)Job.BLU)
if (_action.Action.ClassJob.Row == (uint)Job.BLU)
{
return DataCenter.BluSlots.Contains(ID);
}
Expand Down Expand Up @@ -128,7 +128,6 @@ private readonly bool CheckForCombo()
? new ActionID[] { (ActionID)_action.Action.ActionCombo!.Row }
: [];


if (_action.Setting.ComboIds != null) comboActions = [.. comboActions, .. _action.Setting.ComboIds];

if (comboActions.Length > 0)
Expand Down
17 changes: 13 additions & 4 deletions RotationSolver.Basic/Actions/ActionTargetInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private static bool NoAOE

#region Target Finder.
//The delay of finding the targets.
private readonly ObjectListDelay<BattleChara> _canTargets = new (() => (1, 3));
private readonly ObjectListDelay<BattleChara> _canTargets = new (() => Service.Config.TargetDelay);
public readonly IEnumerable<BattleChara> CanTargets
{
get
Expand Down Expand Up @@ -113,6 +113,8 @@ private readonly bool GeneralCheck(BattleChara gameObject)

private readonly bool CheckStatus(GameObject gameObject)
{


if (!_action.Config.ShouldCheckStatus) return true;

if (_action.Setting.TargetStatusProvide != null)
Expand All @@ -132,16 +134,23 @@ private readonly bool CheckStatus(GameObject gameObject)

private readonly bool CheckResistance(GameObject gameObject)
{
if (_action.Info.AttackType == AttackType.Magic) //TODO: special attack type resistance.
if (_action.Info.AttackType == AttackType.Magic)
{
if (gameObject.HasStatus(false, StatusHelper.MagicResistance))
{
return false;
}
}
else if(_action.Info.Aspect != Aspect.Piercing) // Physic
{
if (gameObject.HasStatus(false, StatusID.MagicResistance))
if (gameObject.HasStatus(false, StatusHelper.PhysicResistancec))
{
return false;
}
}
if (Range >= 20) // Range
{
if(gameObject.HasStatus(false, StatusID.RangedResistance, StatusID.EnergyField))
if (gameObject.HasStatus(false, StatusID.RangedResistance, StatusID.EnergyField))
{
return false;
}
Expand Down
4 changes: 4 additions & 0 deletions RotationSolver.Basic/Configuration/ConfigsNew.cs
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,10 @@ internal partial class ConfigsNew : IPluginConfiguration
[Range(0, 0.5f, ConfigUnitType.Seconds)]
public float ActionAheadForLast0GCD { get; set; } = 0.06f;

[UI("This is the delay time.")]
[Range(0, 3, ConfigUnitType.Seconds)]
public Vector2 TargetDelay { get; set; } = new(0, 0);

[UI("This is the clipping time.\nGCD is over. However, RS forgets to click the next action.")]
[Range(0, 1, ConfigUnitType.Seconds)]
public Vector2 WeaponDelay { get; set; } = new(0, 0);
Expand Down
Loading

0 comments on commit cb79bc6

Please sign in to comment.