From 875b77d00b3610c99f4d5b78ed960ae354b44c97 Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Thu, 11 Jul 2024 22:25:40 -0400 Subject: [PATCH 1/6] fix --- .../Dungeon/D01Ihuykatumu/D013Apollyon.cs | 81 +++++++------------ 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs b/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs index 6ca552b32..086879c18 100644 --- a/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs +++ b/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs @@ -30,78 +30,57 @@ class Blade(BossModule module) : Components.SingleTargetCast(module, ActionID.Ma class HighWind(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.HighWind)); class BladesOfFamine(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BladesOfFamine), new AOEShapeRect(50, 6)); class WingOfLightning(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.WingOfLightning), new AOEShapeCone(40, 22.5f.Degrees()), maxCasts: 8); -class LightningHelper(BossModule module) : Components.PersistentVoidzone(module, 4, m => m.Enemies(OID.LightningAOE)); +class LightningHelper(BossModule module) : Components.PersistentVoidzone(module, 4, m => m.Enemies(OID.LightningAOE).Where(x => x.EventState != 7)); class ThunderIII(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.ThunderIII), 6); class BladeAOE(BossModule module) : Components.BaitAwayCast(module, ActionID.MakeSpell(AID.BladeAOE), new AOEShapeCircle(6), centerAtTarget: true); -class WindSickle(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.WindSickle), new AOEShapeDonut(6, 60)); +class WindSickle(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.WindSickle), new AOEShapeDonut(5, 60)); class RazorStorm(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RazorStorm), new AOEShapeRect(40, 20)); class Levinsickle(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.Levinsickle), 4); class LevinsickleSpark(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.LevinsickleSpark), 4); -// first aoe is 10 seconds after windwhistle -// rest are 8 seconds after previous -class Whirlwind(BossModule module) : Components.GenericAOEs(module) +class CuttingWind(BossModule module) : Components.GenericAOEs(module) { - private int _activations; - private DateTime _nextActivation; + private readonly List _aoes = []; + private static readonly AOEShapeRect Shape = new(36, 4, 36); + public override IEnumerable ActiveAOEs(int slot, Actor actor) => _aoes.Take(4); + + private readonly List _northPositions = [new(-111.688f, 253.942f), new(-102.276f, 264.313f), new(-108.922f, 276.528f)]; + private readonly List _southPositions = [new(-102.935f, 274.357f), new(-108.935f, 262.224f), new(-105.733f, 252.340f)]; + + private static readonly float[] CastTimers = [8.9f, 16.9f, 24.9f]; private static readonly List Rotations = [0.Degrees(), 45.Degrees(), 90.Degrees(), 135.Degrees()]; - public override void OnCastFinished(Actor caster, ActorCastInfo spell) + private void AddAOEs(WPos pos, float delay) { - if ((AID)spell.Action.ID == AID.Windwhistle) - _nextActivation = WorldState.FutureTime(10); + foreach (var angle in Rotations) + _aoes.Add(new(Shape, pos, angle, Module.WorldState.FutureTime(delay))); } - public override void DrawArenaBackground(int pcSlot, Actor pc) + public override void OnActorCreated(Actor actor) { - foreach (var c in ActiveAOEs(pcSlot, pc)) + if ((OID)actor.OID == OID.Whirlwind) { - c.Shape.Draw(Arena, c.Origin, c.Rotation, c.Color); - c.Shape.Outline(Arena, c.Origin, c.Rotation, ArenaColor.AOE); + var coords = actor.Position.Z < 265 ? _northPositions : _southPositions; + foreach (var (c, d) in coords.Zip(CastTimers)) + AddAOEs(c, d); } } public override void OnEventCast(Actor caster, ActorCastEvent spell) { - if ((AID)spell.Action.ID == AID.Cuttingwind) - { - _activations += 1; - _nextActivation = WorldState.FutureTime(8); - } - } - - public override void OnActorDestroyed(Actor actor) - { - _activations = 0; - _nextActivation = default; - } - - public override IEnumerable ActiveAOEs(int slot, Actor actor) - { - if (_activations >= 12) - yield break; - - var whirlwind = Module.Enemies(OID.Whirlwind).FirstOrDefault(); - if (whirlwind == null) - yield break; - - var whirlyHelper = Module.Enemies(OID.Helper).FirstOrDefault(x => x.NameID == 12715); - if (whirlyHelper == null) - yield break; - - foreach (var angle in Rotations) - { - yield return new AOEInstance(new AOEShapeRect(72, 4, 72), whirlwind.Position, angle, _nextActivation, Shade(_nextActivation), _nextActivation < WorldState.FutureTime(4)); - } + if (_aoes.Count > 0 && (AID)spell.Action.ID == AID.Cuttingwind) + _aoes.RemoveAt(0); } +} - private uint Shade(DateTime activation) +class Whirlwind(BossModule module) : Components.PersistentVoidzone(module, 4, m => m.Enemies(OID.Whirlwind)) +{ + public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignment assignment, AIHints hints) { - var clampedETA = Math.Clamp((activation - WorldState.CurrentTime).TotalSeconds, 0, 4); - var opacity = 1 - clampedETA / 4; - var alpha = (uint)(opacity * 96) + 32; - return 0x008080 + alpha * 0x1000000; + base.AddAIHints(slot, actor, assignment, hints); + if (Sources(Module).FirstOrDefault() is Actor w) + hints.AddForbiddenZone(new AOEShapeRect(6, 4, 4), w.Position, w.Rotation); } } @@ -122,7 +101,9 @@ public D013ApollyonStates(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() - .ActivateOnEnter(); + .ActivateOnEnter() + .ActivateOnEnter() + ; } } From 8a2ef8228ac632f9f0d41e5a3b4a2cb0a8169f07 Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Thu, 11 Jul 2024 22:57:34 -0400 Subject: [PATCH 2/6] ok that status was important --- .../Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs index 650889a04..31d3810db 100644 --- a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs +++ b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs @@ -19,6 +19,7 @@ public enum SID : uint { // frozen adds always get both 3944 and 3445, no idea what the difference is. i just picked my favorite Frozen = 3944, // none->_Gen_RorrlohTeh/_Gen_QorrlohTeh1, extra=0x0 + Frozen2 = 3445 } class FrostingFracas(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.FrostingFracas)); @@ -64,7 +65,7 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell) public override void OnStatusGain(Actor actor, ActorStatus status) { - if ((SID)status.ID is SID.Frozen && _casters.ContainsKey(actor)) + if ((SID)status.ID is SID.Frozen or SID.Frozen2 && _casters.ContainsKey(actor)) { _casters[actor] = true; _numFrozen += 1; From 3987d1cc17c124171337b2f2e81701bf22e94473 Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Thu, 11 Jul 2024 22:59:04 -0400 Subject: [PATCH 3/6] comment --- .../Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs index 31d3810db..ccb121731 100644 --- a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs +++ b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D021RyoqorTerteh.cs @@ -17,7 +17,6 @@ public enum AID : uint public enum SID : uint { - // frozen adds always get both 3944 and 3445, no idea what the difference is. i just picked my favorite Frozen = 3944, // none->_Gen_RorrlohTeh/_Gen_QorrlohTeh1, extra=0x0 Frozen2 = 3445 } From c4e590b9a06a6d631fabc7b04dc9893fefd8a92f Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:26:15 -0400 Subject: [PATCH 4/6] donut --- .../Modules/Dawntrail/Dungeon/D02WorqorZormor/D022Kahderyor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D022Kahderyor.cs b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D022Kahderyor.cs index 014c549a2..dd3940aed 100644 --- a/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D022Kahderyor.cs +++ b/BossMod/Modules/Dawntrail/Dungeon/D02WorqorZormor/D022Kahderyor.cs @@ -154,7 +154,7 @@ public override void AddHints(int slot, Actor actor, TextHints hints) } } class SeedCrystals(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.SeedCrystals), 6); -class CyclonicRing(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CyclonicRing), new AOEShapeDonut(15, 40)); +class CyclonicRing(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CyclonicRing), new AOEShapeDonut(7.5f, 40)); class StalagmiteCircle(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.StalagmiteCircle), new AOEShapeCircle(15)); class EyeOfTheFierce(BossModule module) : Components.CastGaze(module, ActionID.MakeSpell(AID.EyeOfTheFierce)); From 48fa6821ac1f05937dfcdbb1bcd130afed046084 Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:28:41 -0400 Subject: [PATCH 5/6] reset camera after gaze --- BossMod/AI/AIBehaviour.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BossMod/AI/AIBehaviour.cs b/BossMod/AI/AIBehaviour.cs index 3ccd43ec6..7f1cc5b92 100644 --- a/BossMod/AI/AIBehaviour.cs +++ b/BossMod/AI/AIBehaviour.cs @@ -180,7 +180,7 @@ private void UpdateMovement(Actor player, Actor master, Targeting target, Action var toDest = _naviDecision.Destination != null ? _naviDecision.Destination.Value - player.Position : new(); var distSq = toDest.LengthSq(); ctrl.NaviTargetPos = _naviDecision.Destination; - //_ctrl.NaviTargetRot = distSq >= 0.01f ? toDest.Normalized() : null; + ctrl.NaviTargetRot = null; ctrl.NaviTargetVertical = master != player ? master.PosRot.Y : null; ctrl.AllowInterruptingCastByMovement = player.CastInfo != null && _naviDecision.LeewaySeconds <= (player.CastInfo.FinishAt - WorldState.CurrentTime).TotalSeconds - 0.5; ctrl.ForceCancelCast = player.CastInfo != null && TargetIsForbidden(player.CastInfo.TargetID); From a15eba9316868410e1e972d6a376746c0b903a5c Mon Sep 17 00:00:00 2001 From: xanunderscore <149614526+xanunderscore@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:02:49 -0400 Subject: [PATCH 6/6] use instances from replay --- .../Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs b/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs index 086879c18..e53d06d27 100644 --- a/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs +++ b/BossMod/Modules/Dawntrail/Dungeon/D01Ihuykatumu/D013Apollyon.cs @@ -45,8 +45,8 @@ class CuttingWind(BossModule module) : Components.GenericAOEs(module) public override IEnumerable ActiveAOEs(int slot, Actor actor) => _aoes.Take(4); - private readonly List _northPositions = [new(-111.688f, 253.942f), new(-102.276f, 264.313f), new(-108.922f, 276.528f)]; - private readonly List _southPositions = [new(-102.935f, 274.357f), new(-108.935f, 262.224f), new(-105.733f, 252.340f)]; + private readonly List _northPositions = [new(-111.69f, 253.94f), new(-102.28f, 264.31f), new(-108.92f, 276.53f)]; + private readonly List _southPositions = [new(-102.93f, 274.36f), new(-108.68f, 262.22f), new(-105.73f, 252.34f)]; private static readonly float[] CastTimers = [8.9f, 16.9f, 24.9f]; private static readonly List Rotations = [0.Degrees(), 45.Degrees(), 90.Degrees(), 135.Degrees()];