diff --git a/SplatoonScripts/Duties/Dawntrail/The Futures Rewritten/P5 Paradise Regained.cs b/SplatoonScripts/Duties/Dawntrail/The Futures Rewritten/P5 Paradise Regained.cs index 8fd3138a..3f603d86 100644 --- a/SplatoonScripts/Duties/Dawntrail/The Futures Rewritten/P5 Paradise Regained.cs +++ b/SplatoonScripts/Duties/Dawntrail/The Futures Rewritten/P5 Paradise Regained.cs @@ -4,6 +4,7 @@ using Dalamud.Interface.Components; using ECommons; using ECommons.Configuration; +using ECommons.GameFunctions; using ECommons.Hooks.ActionEffectTypes; using ECommons.ImGuiMethods; using ECommons.MathHelpers; @@ -34,6 +35,12 @@ public enum Direction NorthWest = 315 } + public enum FirstBaitType + { + GoToSecondOrFirstTower, + GoToOppositeFirstTower + } + public enum MoveType { FirstBait, @@ -41,6 +48,12 @@ public enum MoveType Tower } + public enum SecondBaitType + { + GoToFirstTower, + GoToSafe + } + public enum State { None, @@ -51,26 +64,22 @@ public enum State End } - public enum TowerDirection - { - Clockwise, - CounterClockwise, - NorthEast, - NorthWest - } - public enum TowerType { First, Second, Third, Left, - Right + Right, + FirstSafe, + SecondSafe, + LeftWhenSecondCleave, + RightWhenSecondCleave } private readonly List _towers = []; - private AttackType? _currentAttack; + private AttackType? _firstAttack; private Vector3 _firstBaitPosition; private Vector3 _secondBaitPosition; @@ -78,7 +87,7 @@ public enum TowerType private State _state = State.None; public override HashSet? ValidTerritories => [1238]; - public override Metadata? Metadata => new(1, "Garume"); + public override Metadata? Metadata => new(2, "Garume"); public Config C => Controller.GetConfig(); @@ -119,6 +128,13 @@ public override void OnSetup() overlayVOffset = 3f, overlayText = "<< Next >>" }); + + Controller.TryRegisterElement("TankAOE", new Element(0) + { + radius = 5f, + thicc = 6f, + color = EColor.RedBright.ToUint() + }); } public Direction ReverseDirection(Direction direction) @@ -185,6 +201,16 @@ public void HidePredictTower() { if (Controller.TryGetElementByName("PredictTower", out var predictTower)) predictTower.Enabled = false; } + + public void SetAoe(Vector3 position) + { + SetElementPosition("TankAOE", position); + } + + public void HideAoe() + { + if (Controller.TryGetElementByName("TankAOE", out var aoe)) aoe.Enabled = false; + } public override void OnUpdate() { @@ -196,76 +222,204 @@ public override void OnUpdate() Controller.GetRegisteredElements().Where(x => x.Key is "Bait" or "Tower").Each(e => e.Value.color = GradientColor.Get(C.BaitColor1, C.BaitColor2).ToUint()); - + + if (_state == State.FirstTower) { + if (C.ShowAOE) + { + Vector3 aoePosition; + if (_firstAttack == AttackType.Light) + { + aoePosition = FakeParty.Get().Select(x => x.Position) + .MaxBy(x => Vector3.Distance(x, new Vector3(100, 0, 100))); + } + else + { + aoePosition = FakeParty.Get().Select(x => x.Position) + .MinBy(x => Vector3.Distance(x, new Vector3(100, 0, 100))); + } + + SetAoe(aoePosition); + } + var firstTower = _towers[0]; if (C.MoveType == MoveType.FirstBait) { - var tankDirection = ReverseDirection(firstTower.Direction); - var position = new Vector3(100, 0, 96f); - _firstBaitPosition = - MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), ((int)tankDirection).DegreesToRadians(), - position); - SetBaitPosition(_firstBaitPosition); - - position = new Vector3(100, 0, 100 - (_currentAttack == AttackType.Light ? 2f : 14f)); - _secondBaitPosition = - MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), ((int)tankDirection).DegreesToRadians(), - position); - SetPredictBaitPosition(_secondBaitPosition); + switch (C.FirstBaitType) + { + case FirstBaitType.GoToSecondOrFirstTower: + { + var tankDirection = (int)firstTower.Direction + (_firstAttack == AttackType.Light ? -120 : 120); + if (tankDirection >= 360) tankDirection -= 360; + if (tankDirection < 0) tankDirection += 360; + var position = new Vector3(100, 0, 92f); + _firstBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), + position); + + tankDirection = (int)ReverseDirection(firstTower.Direction); + position = new Vector3(100, 0, 100 - (_firstAttack == AttackType.Light ? 2f : 14f)); + _secondBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), + position); + break; + } + case FirstBaitType.GoToOppositeFirstTower: + { + var tankDirection = ReverseDirection(firstTower.Direction); + var position = new Vector3(100, 0, 92f); + _firstBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), ((int)tankDirection).DegreesToRadians(), + position); + SetBaitPosition(_firstBaitPosition); + + position = new Vector3(100, 0, 100 - (_firstAttack == AttackType.Light ? 2f : 14f)); + _secondBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), ((int)tankDirection).DegreesToRadians(), + position); + SetPredictBaitPosition(_secondBaitPosition); + break; + } + } } if (C.MoveType == MoveType.SecondBait) { - var tankDirection = (int)firstTower.Direction + (_currentAttack == AttackType.Light ? -60 : 60); - if (tankDirection >= 360) tankDirection -= 360; - if (tankDirection < 0) tankDirection += 360; - - var radius = new Vector3(100, 0, 100 - (_currentAttack == AttackType.Light ? 14f : 2f)); - _firstBaitPosition = - MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), radius); - SetBaitPosition(_firstBaitPosition); - - var position = new Vector3(100, 0, 96f); - _secondBaitPosition = MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), - tankDirection.DegreesToRadians(), position); - SetPredictBaitPosition(_secondBaitPosition); + switch (C.SecondBaitType) + { + case SecondBaitType.GoToFirstTower: + { + var tankDirection = (int)firstTower.Direction; + + var position = new Vector3(100, 0, 100f - (_firstAttack == AttackType.Light ? 14f : 2f)); + _firstBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), + position); + SetBaitPosition(_firstBaitPosition); + + tankDirection = (int)firstTower.Direction + (_firstAttack == AttackType.Light ? -60 : 60); + position = new Vector3(100, 0, 92f); + _secondBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), + position); + SetPredictBaitPosition(_secondBaitPosition); + break; + } + case SecondBaitType.GoToSafe: + { + var tankDirection = (int)firstTower.Direction + (_firstAttack == AttackType.Light ? -60 : 60); + if (tankDirection >= 360) tankDirection -= 360; + if (tankDirection < 0) tankDirection += 360; + + var radius = new Vector3(100, 0, 100 - (_firstAttack == AttackType.Light ? 14f : 2f)); + _firstBaitPosition = + MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), tankDirection.DegreesToRadians(), radius); + SetBaitPosition(_firstBaitPosition); + + var position = new Vector3(100, 0, 92f); + _secondBaitPosition = MathHelper.RotateWorldPoint(new Vector3(100, 0, 100), + tankDirection.DegreesToRadians(), position); + SetPredictBaitPosition(_secondBaitPosition); + break; + } + } } if (C.MoveType == MoveType.Tower) - { - if (C.TowerType == TowerType.First) - SetTowerPosition(firstTower.Position.ToVector3(0)); + switch (C.TowerType) + { + case TowerType.First: + SetTowerPosition(firstTower.Position.ToVector3(0)); + break; + case TowerType.Second: + { + if (_towers.Count == 2) + SetTowerPosition(_towers[1].Position.ToVector3(0)); + break; + } + case TowerType.Third: + { + if (_towers.Count == 3) + SetPredictTowerPosition(_towers[2].Position.ToVector3(0)); + break; + } + case TowerType.Left: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + { + if (_towers.IndexOf(tower) == 1 && _firstAttack == AttackType.Dark) + SetTowerPosition(tower.Position.ToVector3(0)); + else + SetPredictTowerPosition(tower.Position.ToVector3(0)); + } - if (C.TowerType == TowerType.Second) - if (_towers.Count == 2) - SetTowerPosition(_towers[1].Position.ToVector3(0)); - if (C.TowerType == TowerType.Third) - if (_towers.Count == 3) - SetPredictTowerPosition(_towers[2].Position.ToVector3(0)); - if (C.TowerType == TowerType.Left) - if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + break; + } + case TowerType.Right: + { + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + { + if (_towers.IndexOf(tower) == 1 && _firstAttack == AttackType.Light) + SetTowerPosition(tower.Position.ToVector3(0)); + else + SetPredictTowerPosition(tower.Position.ToVector3(0)); + } + + break; + } + case TowerType.FirstSafe: { - if (_towers.IndexOf(tower) == 1 && _currentAttack == AttackType.Dark) + var isLeft = _firstAttack == AttackType.Dark; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) SetTowerPosition(tower.Position.ToVector3(0)); - else + + break; + } + case TowerType.SecondSafe: + { + var isLeft = _firstAttack == AttackType.Light; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) SetPredictTowerPosition(tower.Position.ToVector3(0)); + + break; } + case TowerType.LeftWhenSecondCleave: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + SetPredictTowerPosition(tower.Position.ToVector3(0)); - if (C.TowerType == TowerType.Right) - if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + break; + } + case TowerType.RightWhenSecondCleave: { - if (_towers.IndexOf(tower) == 1 && _currentAttack == AttackType.Light) - SetTowerPosition(tower.Position.ToVector3(0)); - else + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) SetPredictTowerPosition(tower.Position.ToVector3(0)); + + break; } - } + } } if (_state == State.SecondTower) { + if (C.ShowAOE) + { + Vector3 aoePosition; + if (_firstAttack == AttackType.Light) + { + aoePosition = FakeParty.Get().Select(x => x.Position) + .MinBy(x => Vector3.Distance(x, new Vector3(100, 0, 100))); + } + else + { + aoePosition = FakeParty.Get().Select(x => x.Position) + .MaxBy(x => Vector3.Distance(x, new Vector3(100, 0, 100))); + } + + SetAoe(aoePosition); + } + if (C.MoveType == MoveType.FirstBait) { SetBaitPosition(_secondBaitPosition); @@ -280,39 +434,69 @@ public override void OnUpdate() if (C.MoveType == MoveType.Tower) { - if (C.TowerType == TowerType.First) - HideTower(); - if (C.TowerType == TowerType.Second) + HidePredictTower(); + switch (C.TowerType) { - SetTowerPosition(_towers[1].Position.ToVector3(0)); - HidePredictTower(); - } - - if (C.TowerType == TowerType.Third) - if (_towers.Count == 3) + case TowerType.First: + HideTower(); + break; + case TowerType.Second: + SetTowerPosition(_towers[1].Position.ToVector3(0)); + break; + case TowerType.Third: { - SetTowerPosition(_towers[2].Position.ToVector3(0)); - HidePredictTower(); + if (_towers.Count == 3) SetTowerPosition(_towers[2].Position.ToVector3(0)); + break; } + case TowerType.Left: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); + break; + } + case TowerType.Right: + { + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); + break; + } + case TowerType.FirstSafe: + { + var isLeft = _firstAttack == AttackType.Dark; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); - if (C.TowerType == TowerType.Left) - if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + break; + } + case TowerType.SecondSafe: { - SetTowerPosition(tower.Position.ToVector3(0)); - HidePredictTower(); + var isLeft = _firstAttack == AttackType.Light; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); + + break; } + case TowerType.LeftWhenSecondCleave: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); - if (C.TowerType == TowerType.Right) - if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + break; + } + case TowerType.RightWhenSecondCleave: { - SetTowerPosition(tower.Position.ToVector3(0)); - HidePredictTower(); + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + SetTowerPosition(tower.Position.ToVector3(0)); + + break; } + } } } if (_state == State.ThirdTower) { + HideAoe(); if (C.MoveType == MoveType.FirstBait) { SetBaitPosition(_secondBaitPosition); @@ -327,46 +511,68 @@ public override void OnUpdate() if (C.MoveType == MoveType.Tower) { - if (C.TowerType == TowerType.Second) - HideTower(); + HideTower(); + HidePredictTower(); - if (C.TowerType == TowerType.Third) + switch (C.TowerType) { - SetTowerPosition(_towers[2].Position.ToVector3(0)); - HidePredictTower(); - } + case TowerType.Third: + SetTowerPosition(_towers[2].Position.ToVector3(0)); + break; + case TowerType.Left: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) ShowTowerIfThird(tower); - if (C.TowerType == TowerType.Left) - if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + break; + } + case TowerType.Right: { - if (_towers.IndexOf(tower) == 2) - { - SetTowerPosition(_towers[2].Position.ToVector3(0)); - HidePredictTower(); - } - else - { - HideTower(); - } + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + ShowTowerIfThird(tower); + + break; } + case TowerType.LeftWhenSecondCleave: + { + if (_towers.TryGetFirst(x => x.IsLeft == true, out var tower)) + ShowTowerIfThird(tower); - if (C.TowerType == TowerType.Right) - if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + break; + } + case TowerType.RightWhenSecondCleave: { - if (_towers.IndexOf(tower) == 2) - { - SetTowerPosition(_towers[2].Position.ToVector3(0)); - HidePredictTower(); - } - else - { - HideTower(); - } + if (_towers.TryGetFirst(x => x.IsLeft == false, out var tower)) + ShowTowerIfThird(tower); + + break; + } + case TowerType.FirstSafe: + { + var isLeft = _firstAttack == AttackType.Dark; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) + ShowTowerIfThird(tower); + + break; } + case TowerType.SecondSafe: + { + var isLeft = _firstAttack == AttackType.Light; + if (_towers.TryGetFirst(x => x.IsLeft == isLeft, out var tower)) + ShowTowerIfThird(tower); + + break; + } + } } } } + private void ShowTowerIfThird(TowerData tower) + { + if (_towers.IndexOf(tower) == 2) + SetTowerPosition(_towers[2].Position.ToVector3(0)); + } + public override void OnStartingCast(uint source, uint castId) { @@ -376,8 +582,8 @@ public override void OnStartingCast(uint source, uint castId) _state = State.Start; } - if (_state != State.None && _currentAttack == null && castId == 40233) _currentAttack = AttackType.Dark; - if (_state != State.None && _currentAttack == null && castId == 40313) _currentAttack = AttackType.Light; + if (_state != State.None && _firstAttack == null && castId == 40233) _firstAttack = AttackType.Dark; + if (_state != State.None && _firstAttack == null && castId == 40313) _firstAttack = AttackType.Light; } public override void OnReset() @@ -388,7 +594,7 @@ public override void OnReset() public void Reset() { _state = State.None; - _currentAttack = null; + _firstAttack = null; _towers.Clear(); } @@ -439,15 +645,23 @@ public override void OnActionEffectEvent(ActionEffectSet set) if (set.Action.Value.RowId == 40320) { - if (_state == State.FirstTower) _state = State.SecondTower; - else if (_state == State.SecondTower) _state = State.ThirdTower; - else if (_state == State.ThirdTower) _state = State.End; + _state = _state switch + { + State.FirstTower => State.SecondTower, + State.SecondTower => State.ThirdTower, + State.ThirdTower => State.End, + _ => _state + }; } } public override void OnSettingsDraw() { ImGuiEx.EnumCombo("Move Type", ref C.MoveType); + if (C.MoveType == MoveType.FirstBait) + ImGuiEx.EnumCombo("First Bait Type", ref C.FirstBaitType); + if (C.MoveType == MoveType.SecondBait) + ImGuiEx.EnumCombo("Second Bait Type", ref C.SecondBaitType); if (C.MoveType == MoveType.Tower) ImGuiEx.EnumCombo("Tower Type", ref C.TowerType); @@ -462,11 +676,11 @@ public override void OnSettingsDraw() ImGui.Checkbox("Show Predict", ref C.ShowPredict); ImGui.ColorEdit4("Predict Color", ref C.PredictColor, ImGuiColorEditFlags.NoInputs); - + ImGui.Checkbox("Show Tank AOE", ref C.ShowAOE); if (ImGuiEx.CollapsingHeader("Debug")) { ImGui.Text($"State: {_state}"); - ImGui.Text($"Attack: {_currentAttack}"); + ImGui.Text($"Attack: {_firstAttack}"); ImGui.Text($"First Bait: {_firstBaitPosition}"); ImGui.Text($"Second Bait: {_secondBaitPosition}"); ImGui.Text($"Towers: {_towers.Count}"); @@ -510,10 +724,13 @@ public class Config : IEzConfig { public Vector4 BaitColor1 = 0xFFFF00FF.ToVector4(); public Vector4 BaitColor2 = 0xFFFFFF00.ToVector4(); + public FirstBaitType FirstBaitType = FirstBaitType.GoToOppositeFirstTower; public MoveType MoveType = MoveType.Tower; public Vector4 PredictColor = EColor.RedBright; + public SecondBaitType SecondBaitType = SecondBaitType.GoToSafe; public bool ShowPredict = true; - public TowerType TowerType = TowerType.First; + public TowerType TowerType = TowerType.First; + public bool ShowAOE = true; } } \ No newline at end of file