Skip to content

Commit

Permalink
Try to make movements more precise
Browse files Browse the repository at this point in the history
  • Loading branch information
Limiana committed Dec 14, 2024
1 parent 4593e91 commit cbcc239
Showing 1 changed file with 190 additions and 45 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Numerics;
using Dalamud.Game.ClientState.Conditions;
Expand Down Expand Up @@ -430,6 +431,8 @@ public override void OnUpdate()


var myMove = _players.SafeSelect(BasePlayer.GameObjectId)?.MoveType.ToString();
var forcedPosition = ResolveRedAeroMove();
forcedPosition ??= ResolveRedBlizzardMove();
if(myMove != null)
{
foreach(var move in Enum.GetValues<MoveType>())
Expand All @@ -450,58 +453,67 @@ public override void OnUpdate()
element.Enabled = true;
element.color = GradientColor.Get(C.BaitColor1, C.BaitColor2).ToUint();
element.tether = true;
if(forcedPosition != null)
{
element.SetOffPosition(forcedPosition.Value.ToVector3(0));
element.radius = 0.25f;
}
}
}
}
}

switch(GetStage())

if(forcedPosition == null)
{
case MechanicStage.Step1_Spread:
BurnHourglassUniversal();
break;
case MechanicStage.Step2_FirstHourglass:
IceHitDragon();
break;
case MechanicStage.Step3_IcesAndWinds:
BurnHourglassUniversal();
break;
case MechanicStage.Step4_SecondHourglass:
if(C.HitTiming == HitTiming.Early && BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
HitDragonAndAero();
}
else
{
switch(GetStage())
{
case MechanicStage.Step1_Spread:
BurnHourglassUniversal();
}
break;
case MechanicStage.Step5_PerformDodges:
if(C.HitTiming == HitTiming.Late && BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
HitDragonAndAero();
}
else
{
break;
case MechanicStage.Step2_FirstHourglass:
IceHitDragon();
break;
case MechanicStage.Step3_IcesAndWinds:
BurnHourglassUniversal();
}
break;
case MechanicStage.Step6_ThirdHourglass:
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Blue))
{
CorrectCleanse();
}
else
{
PlaceReturn();
}
break;
case MechanicStage.Step7_SpiritTaker:
Split();
break;
default:
//PluginLog.Debug("No step");
break;
break;
case MechanicStage.Step4_SecondHourglass:
if(C.HitTiming == HitTiming.Early && BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
HitDragonAndAero();
}
else
{
BurnHourglassUniversal();
}
break;
case MechanicStage.Step5_PerformDodges:
if(C.HitTiming == HitTiming.Late && BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
HitDragonAndAero();
}
else
{
BurnHourglassUniversal();
}
break;
case MechanicStage.Step6_ThirdHourglass:
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Blue))
{
CorrectCleanse();
}
else
{
PlaceReturn();
}
break;
case MechanicStage.Step7_SpiritTaker:
Split();
break;
default:
//PluginLog.Debug("No step");
break;
}
}
}

Expand All @@ -525,7 +537,7 @@ void ProcessAutoCast()
UseAntiKb();
}

if(C.UseMitigation && C.MitigationAction != 0 && BasePlayer.StatusList.Any(x => x.StatusId == 2452 && x.RemainingTime < 4f))
if(C.UseMitigation && C.MitigationAction != 0 && BasePlayer.StatusList.Any(x => x.StatusId == 2452 && x.RemainingTime < 6f))
{
if(!Svc.Condition[ConditionFlag.DutyRecorderPlayback])
{
Expand Down Expand Up @@ -1232,6 +1244,139 @@ public record PlayerData
public bool HasDebuff => Debuff != null && Color != null;
}

public static class RedAeroEastMovements
{
public static Vector2 Step1_InitialDodge = new(112, 115);
public static Vector2 Step2_KnockPlayers = new(109.9f, 117); //only when purple hourglass on our side
public static Vector2 Step3_DodgeSecondHourglass = new(107.8f, 117.9f);
public static Vector2 Step4_DodgeExa = new(100, 117);
}

Vector2? ResolveRedAeroMove()
{
if(_players.SafeSelect(BasePlayer.GameObjectId)?.MoveType.EqualsAny(MoveType.RedAeroEast, MoveType.RedAeroWest) != true) return null;
var isPlayerWest = _players.SafeSelect(BasePlayer.GameObjectId)?.MoveType == MoveType.RedAeroWest;
var isLateHourglassSameSide = (_lateHourglassDirection == Direction.NorthEast || _lateHourglassDirection == Direction.SouthWest) == isPlayerWest;
var stage = GetStage();
if(stage == MechanicStage.Step1_Spread)
{
return MirrorX(RedAeroEastMovements.Step1_InitialDodge, isPlayerWest);
}
if(stage == MechanicStage.Step2_FirstHourglass)
{
if(isLateHourglassSameSide)
{
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Aero))
{
return MirrorX(RedAeroEastMovements.Step2_KnockPlayers, isPlayerWest);
}
else
{
Alert(C.HitDragonText.Get());
return (isPlayerWest ? WestDragon : EastDragon)?.Position.ToVector2();
}
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
if(stage == MechanicStage.Step3_IcesAndWinds)
{
if(isLateHourglassSameSide)
{
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
Alert(C.HitDragonText.Get());
return (isPlayerWest ? WestDragon : EastDragon)?.Position.ToVector2();
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
if(stage == MechanicStage.Step4_SecondHourglass)
{
if(isLateHourglassSameSide)
{
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
Alert(C.HitDragonText.Get());
return (isPlayerWest ? WestDragon : EastDragon)?.Position.ToVector2();
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
if(stage == MechanicStage.Step5_PerformDodges)
{
if(BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
Alert(C.HitDragonText.Get());
return (isPlayerWest ? WestDragon : EastDragon)?.Position.ToVector2();
}
else
{
return MirrorX(RedAeroEastMovements.Step3_DodgeSecondHourglass, isPlayerWest);
}
}
return null;
}

Vector2? ResolveRedBlizzardMove()
{
if(_players.SafeSelect(BasePlayer.GameObjectId)?.MoveType.EqualsAny(MoveType.RedBlizzardWest, MoveType.RedBlizzardEast) != true) return null;
var isPlayerWest = _players.SafeSelect(BasePlayer.GameObjectId)?.MoveType == MoveType.RedBlizzardWest;
var isLateHourglassSameSide = (_lateHourglassDirection == Direction.NorthEast || _lateHourglassDirection == Direction.SouthWest) == isPlayerWest;
var stage = GetStage();
if(stage <= MechanicStage.Step5_PerformDodges)
{
if(!BasePlayer.StatusList.Any(x => x.StatusId == (uint)Debuff.Red))
{
if(isLateHourglassSameSide)
{
if(stage <= MechanicStage.Step4_SecondHourglass)
{

return MirrorX(new(119, 103), isPlayerWest);
}
else
{
return MirrorX(new(105, 82), isPlayerWest);
}
}
else
{
return MirrorX(new(105, 82), isPlayerWest);
}
}
}
return null;
}

Vector2 MirrorX(Vector2 x, bool mirror)
{
if(mirror)
{
return x with { X = 100f - Math.Abs(x.X - 100f) };
}
else
{
return x;
}
}

public class Config : IEzConfig
{
public InternationalString AvoidWaveText = new() { En = "Avoid Wave", Jp = "波をよけろ!" };
Expand Down

0 comments on commit cbcc239

Please sign in to comment.