diff --git a/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1.cs b/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1.cs index 03cccb6793..c665698887 100644 --- a/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1.cs +++ b/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1.cs @@ -15,6 +15,16 @@ class PelagicCleaver2 : Components.SelfTargetedAOEs public PelagicCleaver2() : base(ActionID.MakeSpell(AID.PelagicCleaver2), new AOEShapeCone(40, 30.Degrees())) { } } +class PelagicCleaver1Hint : Components.CastInterruptHint +{ + public PelagicCleaver1Hint() : base(ActionID.MakeSpell(AID.PelagicCleaver1)) { } +} + +class PelagicCleaver2Hint : Components.CastInterruptHint +{ + public PelagicCleaver2Hint() : base(ActionID.MakeSpell(AID.PelagicCleaver2)) { } +} + class WaterFlood : Components.SelfTargetedAOEs { public WaterFlood() : base(ActionID.MakeSpell(AID.WaterFlood), new AOEShapeCircle(6)) { } @@ -33,6 +43,8 @@ public A30TrashPack1States(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() .Raw.Update = () => module.Enemies(OID.Boss).All(e => e.IsDestroyed) && module.Enemies(OID.Triton).All(e => e.IsDead) && module.Enemies(OID.WaterSprite).All(e => e.IsDead) && module.Enemies(OID.WaterSprite).All(e => e.IsDead); diff --git a/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1Enums.cs b/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1Enums.cs index d665579869..411ba2a3cb 100644 --- a/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1Enums.cs +++ b/BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1Enums.cs @@ -16,7 +16,7 @@ public enum AID : uint PelagicCleaver2 = 35852, // Triton->self, 5.0s cast, range 40 60-degree cone Water = 35469, // Water Sprite/Divine Sprite->player, no cast, single-target WaterFlood = 35442, // Water Sprite->self, 3.0s cast, range 6 circle - WaterBurst = 35443, // Water Sprite->self, no cast, range 40 circle + WaterBurst = 35443, // Water Sprite->self, no cast, range 40 circle, raidwide when Water Sprite dies DivineFlood = 35440, // Divine Sprite->self, 3.0s cast, range 6 circle - DivineBurst = 35441, // Divine Sprite->self, no cast, range 40 circle + DivineBurst = 35441, // Divine Sprite->self, no cast, range 40 circle, raidwide when Divine Sprite dies }; \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakEnums.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakEnums.cs index 354f9ab6fd..7f198f1d0c 100644 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakEnums.cs +++ b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakEnums.cs @@ -3,10 +3,7 @@ public enum OID : uint { Boss = 0x404C, // R9.496, x1 ThaliakClone = 0x404D, // R9.496, x1 - ThaliakHelper = 0x233C, // R0.500, x44, 523 type - WindWreathedPortal = 0x1EB91D, // R0.500, x1, EventObj type - HieroglyphikaIndicator = 0x40AA, // R0.500, x1 // Rotation Indicator - UnknownActor = 0x400E, // R0.500, x1 + Helper = 0x233C, // R0.500, x44, 523 type }; public enum AID : uint diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakStates.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakStates.cs index 28f40e2027..b4ea906104 100644 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakStates.cs +++ b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/A31ThaliakStates.cs @@ -17,6 +17,7 @@ public A31ThaliakStates(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter(); } } diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakHieroglyphika.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakHieroglyphika.cs index 49e1232e48..15f32d0421 100644 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakHieroglyphika.cs +++ b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakHieroglyphika.cs @@ -10,7 +10,7 @@ class Hieroglyphika : Components.GenericAOEs public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes.Take(14); - private static WPos RotateAroundOrigin(float rotatebydegrees, WPos origin, WPos caster) + private static WPos RotateAroundOrigin(float rotatebydegrees, WPos origin, WPos caster) //TODO: consider moving to utils for future use { float x = MathF.Cos(rotatebydegrees * RadianConversion) * (caster.X - origin.X) - MathF.Sin(rotatebydegrees * RadianConversion) * (caster.Z - origin.Z); float z = MathF.Sin(rotatebydegrees * RadianConversion) * (caster.X - origin.X) + MathF.Cos(rotatebydegrees * RadianConversion) * (caster.Z - origin.Z); diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakCrash.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosis.cs similarity index 66% rename from BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakCrash.cs rename to BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosis.cs index 0908bdee67..175db9e849 100644 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakCrash.cs +++ b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosis.cs @@ -1,4 +1,29 @@ namespace BossMod.Endwalker.Alliance.A31Thaliak; + + +class Rheognosis : Components.RaidwideCast +{ + public Rheognosis() : base(ActionID.MakeSpell(AID.RheognosisKnockback), "Raidwide + Knockback") { } +} + +class RheognosisKnockback : Components.Knockback +{ + private Source? _knockback; + + public override IEnumerable Sources(BossModule module, int slot, Actor actor) => Utils.ZeroOrOne(_knockback); + public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID is AID.Rheognosis or AID.RheognosisPetrine) + _knockback = new(module.Bounds.Center, 25, module.WorldState.CurrentTime.AddSeconds(20.2f), Direction: spell.Rotation + 180.Degrees(), Kind: Kind.DirForward); + } + + public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID == AID.RheognosisKnockback) + _knockback = null; + } +} + public class RheognosisCrash : Components.Exaflare { private static readonly Angle _rot1 = 90.Degrees(); @@ -26,7 +51,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) { - if ((AID)spell.Action.ID == AID.RheognosisCrashExaflare) + if (Lines.Count > 0 && (AID)spell.Action.ID == AID.RheognosisCrashExaflare) { ++NumCasts; int index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1)); @@ -35,4 +60,4 @@ public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent Lines.RemoveAt(index); } } -} +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosisKnockback.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosisKnockback.cs deleted file mode 100644 index e85b930144..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakRheognosisKnockback.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A31Thaliak; - -class RheognosisKnockback : Components.Knockback -{ - private Source? _knockback; - - public override IEnumerable Sources(BossModule module, int slot, Actor actor) => Utils.ZeroOrOne(_knockback); - public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) - { - if ((AID)spell.Action.ID is AID.Rheognosis or AID.RheognosisPetrine) - _knockback = new(module.Bounds.Center, 25, module.WorldState.CurrentTime.AddSeconds(20.2f), Direction: spell.Rotation + 180.Degrees(), Kind: Kind.DirForward); - } - - public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell) - { - if ((AID)spell.Action.ID == AID.RheognosisKnockback) - _knockback = null; - } -} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakTetraktys.cs b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakTetraktys.cs index 36889c5650..8318a5376d 100644 --- a/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakTetraktys.cs +++ b/BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakTetraktys.cs @@ -13,7 +13,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state class TetraTriangles : Components.GenericAOEs { - private readonly List<(WPos source, AOEShape shape, Angle direction, DateTime activation)> _casters = []; + private readonly List _aoes = []; private static readonly AOEShapeTriangle tri = new(16); private static readonly AOEShapeTriangle triBig = new(32); private static readonly AOEShapeRect rect = new(30, 8); @@ -30,9 +30,9 @@ class TetraTriangles : Components.GenericAOEs public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) { - foreach (var c in _casters) - if (_casters.Count > 0) - yield return new(c.shape, c.source, c.direction, c.activation); + foreach (var c in _aoes) + if (_aoes.Count > 0) + yield return new(c.Shape, c.Origin, c.Rotation, c.Activation); } public override void OnEventEnvControl(BossModule module, byte index, uint state) @@ -43,77 +43,77 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state { if (index == 0x07) //07, 0A, 0D always activate together { - _casters.Add((new WPos(-929, 948.5f), tri, _rot1, _activation)); - _casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation)); - _casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation)); + _aoes.Add(new(tri, new WPos(-929, 948.5f), _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation)); + _aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation)); } if (index == 0x05) //05, 08, 0B always activate together { - _casters.Add((new WPos(-945, 948.5f), tri, _rot1, _activation)); - _casters.Add((new WPos(-937, 934.644f), tri, _rot1, _activation)); - _casters.Add((new WPos(-945, 921), tri, _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-945, 948.5f), _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-937, 934.644f), _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-945, 921), _rot1, _activation)); } if (index == 0x06) //06, 09, 0C always activate together { - _casters.Add((new WPos(-937, 962.356f), tri, _rot3, _activation)); - _casters.Add((new WPos(-961, 948.5f), tri, _rot1, _activation)); - _casters.Add((new WPos(-953, 934.644f), tri, _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-937, 962.356f), _rot3, _activation)); + _aoes.Add(new(tri, new WPos(-961, 948.5f), _rot1, _activation)); + _aoes.Add(new(tri, new WPos(-953, 934.644f), _rot1, _activation)); } if (index == 0x0E) - _casters.Add((new WPos(-945, 921), triBig, _rot1, _activation)); + _aoes.Add(new(triBig, new WPos(-945, 921), _rot1, _activation)); if (index == 0x0F) - _casters.Add((new WPos(-953, 934.644f), triBig, _rot1, _activation)); + _aoes.Add(new(triBig, new WPos(-953, 934.644f), _rot1, _activation)); if (index == 0x10) - _casters.Add((new WPos(-937, 934.644f), triBig, _rot1, _activation)); + _aoes.Add(new(triBig, new WPos(-937, 934.644f), _rot1, _activation)); if (index == 0x13 && TutorialDone) //pair 13+15 always happen together after tutorial { - _casters.Add((new WPos(-961, 948.7f), tri, _rot1, _activation2)); - _casters.Add((new WPos(-937, 962.356f), tri, _rot6, _activation2)); - _casters.Add((new WPos(-933, 955.428f), rect, _rot4, _activation2)); - _casters.Add((new WPos(-941, 955.428f), rect, _rot5, _activation2)); - _casters.Add((new WPos(-937, 948.5f), rect, _rot2, _activation2)); - _casters.Add((new WPos(-957, 955.428f), rect, _rot7, _activation2)); + _aoes.Add(new(tri, new WPos(-961, 948.7f), _rot1, _activation2)); + _aoes.Add(new(tri, new WPos(-937, 962.356f), _rot6, _activation2)); + _aoes.Add(new(rect, new WPos(-933, 955.428f), _rot4, _activation2)); + _aoes.Add(new(rect, new WPos(-941, 955.428f), _rot5, _activation2)); + _aoes.Add(new(rect, new WPos(-937, 948.5f), _rot2, _activation2)); + _aoes.Add(new(rect, new WPos(-957, 955.428f), _rot7, _activation2)); } if (index == 0x12 && TutorialDone) //pair 12+16 always happen together after tutorial { - _casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation2)); - _casters.Add((new WPos(-929, 948.7f), tri, _rot1, _activation2)); - _casters.Add((new WPos(-933, 955.428f), rect, _rot8, _activation2)); - _casters.Add((new WPos(-941.173f, 941.828f), rect, _rot9, _activation2)); - _casters.Add((new WPos(-948.827f, 941.828f), rect, _rot5, _activation2)); - _casters.Add((new WPos(-945, 935), rect, _rot2, _activation2)); + _aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation2)); + _aoes.Add(new(tri, new WPos(-929, 948.7f), _rot1, _activation2)); + _aoes.Add(new(rect, new WPos(-933, 955.428f), _rot8, _activation2)); + _aoes.Add(new(rect, new WPos(-941.173f, 941.828f), _rot9, _activation2)); + _aoes.Add(new(rect, new WPos(-948.827f, 941.828f), _rot5, _activation2)); + _aoes.Add(new(rect, new WPos(-945, 935), _rot2, _activation2)); } if (index == 0x11 && TutorialDone) //pair 11+14 always happen together after tutorial { - _casters.Add((new WPos(-945, 921), tri, _rot1, _activation2)); - _casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation2)); - _casters.Add((new WPos(-945, 934.8f), rect, _rot1, _activation2)); - _casters.Add((new WPos(-953, 948.5f), rect, _rot2, _activation2)); - _casters.Add((new WPos(-957, 955.428f), rect, _rot5, _activation2)); - _casters.Add((new WPos(-949, 955.428f), rect, _rot4, _activation2)); + _aoes.Add(new(tri, new WPos(-945, 921), _rot1, _activation2)); + _aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation2)); + _aoes.Add(new(rect, new WPos(-945, 934.8f), _rot1, _activation2)); + _aoes.Add(new(rect, new WPos(-953, 948.5f), _rot2, _activation2)); + _aoes.Add(new(rect, new WPos(-957, 955.428f), _rot5, _activation2)); + _aoes.Add(new(rect, new WPos(-949, 955.428f), _rot4, _activation2)); } if (index == 0x14 && !TutorialDone) { - _casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation)); - _casters.Add((new WPos(-949, 955.428f), rect, _rot4, _activation)); - _casters.Add((new WPos(-957, 955.428f), rect, _rot5, _activation)); - _casters.Add((new WPos(-953, 948.5f), rect, _rot2, _activation)); + _aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation)); + _aoes.Add(new(rect, new WPos(-949, 955.428f), _rot4, _activation)); + _aoes.Add(new(rect, new WPos(-957, 955.428f), _rot5, _activation)); + _aoes.Add(new(rect, new WPos(-953, 948.5f), _rot2, _activation)); TutorialDone = true; } if (index == 0x15 && !TutorialDone) { - _casters.Add((new WPos(-937, 962.356f), tri, _rot6, _activation)); - _casters.Add((new WPos(-937, 948.5f), rect, _rot2, _activation)); - _casters.Add((new WPos(-933, 955.428f), rect, _rot4, _activation)); - _casters.Add((new WPos(-941, 955.428f), rect, _rot5, _activation)); + _aoes.Add(new(tri, new WPos(-937, 962.356f), _rot6, _activation)); + _aoes.Add(new(rect, new WPos(-937, 948.5f), _rot2, _activation)); + _aoes.Add(new(rect, new WPos(-933, 955.428f), _rot4, _activation)); + _aoes.Add(new(rect, new WPos(-941, 955.428f), _rot5, _activation)); TutorialDone = true; } if (index == 0x12 && !TutorialDone) { - _casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation)); - _casters.Add((new WPos(-945, 935), rect, _rot2, _activation)); - _casters.Add((new WPos(-948.827f, 941.828f), rect, _rot5, _activation)); - _casters.Add((new WPos(-941.173f, 941.828f), rect, _rot9, _activation)); + _aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation)); + _aoes.Add(new(rect, new WPos(-945, 935), _rot2, _activation)); + _aoes.Add(new(rect, new WPos(-948.827f, 941.828f), _rot5, _activation)); + _aoes.Add(new(rect, new WPos(-941.173f, 941.828f), _rot9, _activation)); TutorialDone = true; } } @@ -121,7 +121,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) { - if (_casters.Count > 0 && (AID)spell.Action.ID is AID.TetraBlueTriangles or AID.TetraGreenTriangles or AID.TetraktuosKosmosTri or AID.TetraktuosKosmosRect) - _casters.RemoveAt(0); + if (_aoes.Count > 0 && (AID)spell.Action.ID is AID.TetraBlueTriangles or AID.TetraGreenTriangles or AID.TetraktuosKosmosTri or AID.TetraktuosKosmosRect) + _aoes.RemoveAt(0); } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenEnum.cs b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenEnum.cs index 9c732790a7..a98eeb67d8 100644 --- a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenEnum.cs +++ b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenEnum.cs @@ -3,7 +3,7 @@ public enum OID : uint { Boss = 0x4024, // R7.000, x1 - LlymlaenHelper = 0x233C, // R0.500, x25, 523 type + Helper = 0x233C, // R0.500, x25, 523 type Thalaos = 0x4027, // R6.300, x1 Perykos = 0x4026, // R6.300, x1 SeaFoam = 0x4029, // R1.500, spawn during fight diff --git a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenNavigatorsTrident.cs b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenNavigatorsTrident.cs index 777bc8bef9..28548bcc93 100644 --- a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenNavigatorsTrident.cs +++ b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenNavigatorsTrident.cs @@ -53,4 +53,6 @@ public override void OnCastFinished(BossModule module, Actor caster, ActorCastIn ++NumCasts; } } + + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenSurgingWave.cs b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenSurgingWave.cs index da08ff404b..6bb9141aa3 100644 --- a/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenSurgingWave.cs +++ b/BossMod/Modules/Endwalker/Alliance/A32Llymlaen/LlymlaenSurgingWave.cs @@ -4,6 +4,7 @@ class SurgingWavesArenaChange : BossComponent { public enum Arena { Normal, ExtendWest, ExtendEast } public Arena Shape { get; private set; } + private bool Shockwave; public override void OnEventEnvControl(BossModule module, byte index, uint state) { @@ -13,15 +14,25 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state Shape = Arena.Normal; } if (state == 0x00800040 && index == 0x49) - { - module.Arena.Bounds = new ArenaBoundsRect(new(-30.5f, -900), 49.5f, 10); Shape = Arena.ExtendWest; - } if (state == 0x08000400 && index == 0x49) - { - module.Arena.Bounds = new ArenaBoundsRect(new(30.5f, -900), 49.5f, 10); Shape = Arena.ExtendEast; - } + } + public override void Update(BossModule module) + { + + if (Shockwave && Shape == Arena.Normal) + Shockwave = false; + if (Shockwave && Shape == Arena.ExtendWest) + module.Arena.Bounds = new ArenaBoundsRect(new(-40, -900), 40, 10); + if (Shockwave && Shape == Arena.ExtendEast) + module.Arena.Bounds = new ArenaBoundsRect(new(40, -900), 40, 10); + } + + public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID == AID.Shockwave) + Shockwave = true; } public override void DrawArenaForeground(BossModule module, int pcSlot, Actor pc, MiniArena arena) diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33Oschon.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33Oschon.cs index 7a2575d19f..0041a37bc8 100644 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33Oschon.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33Oschon.cs @@ -1,17 +1,77 @@ namespace BossMod.Endwalker.Alliance.A33Oschon; -class TheArrow2 : Components.BaitAwayCast +class SuddenDownpour : Components.RaidwideCast { - public TheArrow2() : base(ActionID.MakeSpell(AID.TheArrow2), new AOEShapeCircle(6), true) { } + public SuddenDownpour() : base(ActionID.MakeSpell(AID.SuddenDownpour2)) { } } -class FlintedFoehnStack : Components.StackWithCastTargets +class LoftyPeaks : Components.RaidwideCast { - public FlintedFoehnStack() : base(ActionID.MakeSpell(AID.FlintedFoehnStack), 6) { } + public LoftyPeaks() : base(ActionID.MakeSpell(AID.LoftyPeaks), "Raidwide x5 coming") { } } -[ModuleInfo(GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 11300)] +class TrekShot : Components.SelfTargetedAOEs +{ + public TrekShot() : base(ActionID.MakeSpell(AID.TrekShot), new AOEShapeCone(65, 60.Degrees())) { } +} + +class TrekShot2 : Components.SelfTargetedAOEs +{ + public TrekShot2() : base(ActionID.MakeSpell(AID.TrekShot2), new AOEShapeCone(65, 60.Degrees())) { } +} + +class TheArrow : Components.BaitAwayCast +{ + public TheArrow() : base(ActionID.MakeSpell(AID.TheArrow), new AOEShapeCircle(6), true) { } +} + +class TheArrowP2 : Components.BaitAwayCast +{ + public TheArrowP2() : base(ActionID.MakeSpell(AID.TheArrowP2), new AOEShapeCircle(10), true) { } +} + +class PitonPull : Components.LocationTargetedAOEs +{ + public PitonPull() : base(ActionID.MakeSpell(AID.PitonPull), 22) { } +} + +class Altitude : Components.LocationTargetedAOEs +{ + public Altitude() : base(ActionID.MakeSpell(AID.Altitude), 6) { } +} + +class DownhillSmall : Components.LocationTargetedAOEs +{ + public DownhillSmall() : base(ActionID.MakeSpell(AID.DownhillSmall), 6) { } +} + +class DownhillBig : Components.LocationTargetedAOEs +{ + public DownhillBig() : base(ActionID.MakeSpell(AID.DownhillBig), 8) { } +} + +[ModuleInfo(PrimaryActorOID = (uint)OID.OschonP1, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 11300)] public class A33Oschon : BossModule { - public A33Oschon(WorldState ws, Actor primary) : base(ws, primary, new ArenaBoundsRect(new(-0.015f, 749.996f), 25, 25)) { } + private Actor? _oschonP1; + private Actor? _oschonP2; + + public Actor? OschonP1() => PrimaryActor; + public Actor? OschonP2() => _oschonP2; + + public A33Oschon(WorldState ws, Actor primary) : base(ws, primary, new ArenaBoundsSquare(new(0, 750), 25)) { } + + protected override void UpdateModule() + { + // TODO: this is an ugly hack, think how multi-actor fights can be implemented without it... + // the problem is that on wipe, any actor can be deleted and recreated in the same frame + _oschonP1 ??= StateMachine.ActivePhaseIndex == 0 ? Enemies(OID.OschonP1).FirstOrDefault() : null; + _oschonP2 ??= StateMachine.ActivePhaseIndex == 1 ? Enemies(OID.OschonP2).FirstOrDefault() : null; + } + + protected override void DrawEnemies(int pcSlot, Actor pc) + { + Arena.Actor(_oschonP1, ArenaColor.Enemy); + Arena.Actor(_oschonP2, ArenaColor.Enemy); + } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonEnum.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonEnum.cs index 02f77c0a10..1f93096171 100644 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonEnum.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonEnum.cs @@ -2,77 +2,92 @@ public enum OID : uint { - Boss = 0x406D, // R8.000, x1 - OschonBig = 0x406F, // R24.990, spawn during fight + OschonP1 = 0x406D, // R8.000, x1 + OschonP2 = 0x406F, // R24.990, spawn during fight OschonsAvatar = 0x406E, // R8.000, x4 - OschonHelper = 0x233C, // R0.500, x40, 523 type - Unknown = 0x400E, // R0.500, x1 - Actor1e8fb8 = 0x1E8FB8, // R2.000, x1, EventObj type - Actor1e8f2f = 0x1E8F2F, // R0.500, x1, EventObj type - PedestalOfPassage = 0x1EB91A, // R0.500, x1, EventObj type - ExitToTheOmphalos = 0x1EB91E, // R0.500, x1, EventObj type + Helper = 0x233C, // R0.500, x40, 523 type }; public enum AID : uint { AutoAttack = 35906, // Oschon->player, no cast, single-target - AutoAttackBig = 35907, // OschonBig->player, no cast, single-target - Ability1 = 35224, // Oschon->location, no cast, single-target - Ability2 = 34863, // OschonHelper->self, no cast, single-target - Ability3 = 34864, // OschonHelper->self, no cast, single-target - Ability4 = 34862, // OschonHelper->self, no cast, single-target - Ability5 = 34865, // OschonHelper->self, no cast, single-target + Teleport = 35224, // Oschon->location, no cast, single-target, boss teleports mid + TrekShotVisual1 = 34863, // OschonHelper->self, no cast, single-target + TrekShotVisual2 = 34862, // OschonHelper->self, no cast, single-target + TrekShotVisual3 = 35214, // Oschon->self, 6.0s cast, single-target + TrekShotVisual4 = 35213, // Oschon->self, 6.0s cast, single-target + TrekShot = 35908, // OschonHelper->self, 9.5s cast, range 65 120-degree cone + TrekShot2 = 35215, // OschonHelper->self, 9.5s cast, range 65 120-degree cone - TrekShot1 = 35214, // Oschon->self, 6.0s cast, single-target - TrekShot2 = 35908, // OschonHelper->self, 9.5s cast, range 65 ?-degree cone // wide frontal cone AoE - TrekShot3 = 35213, // Oschon->self, 6.0s cast, single-target - TrekShot4 = 35215, // OschonHelper->self, 9.5s cast, range 65 ?-degree cone // wide frontal cone AoE - - SwingingDraw1 = 35210, // OschonsAvatar->self, 7.0s cast, single-target - SwingingDraw2 = 35212, // OschonsAvatar->self, 2.0s cast, range 65 120-degree cone // wide frontal cone AoE - SwingingDraw3 = 35211, // OschonsAvatar->self, 7.0s cast, single-target - Reproduce = 35209, // Oschon->self, 3.0s cast, single-target // Summons an OschonsAvatar add; The add will use Swinging Draw + Reproduce = 35209, // Oschon->self, 3.0s cast, single-target, summons an OschonsAvatar adds for Swinging Draws + SwingingDrawCW = 35210, // OschonsAvatar->self, 7.0s cast, single-target + SwingingDrawCCW = 35211, // OschonsAvatar->self, 7.0s cast, single-target + SwingingDrawVisualCW = 34864, // OschonHelper->self, no cast, single-target + SwingingDrawVisualCCW = 34865, // OschonHelper->self, no cast, single-target + SwingingDraw = 35212, // OschonsAvatar->self, 2.0s cast, range 65 120-degree cone SuddenDownpour1 = 35225, // Oschon->self, 4.0s cast, single-target - SuddenDownpour2 = 36026, // OschonHelper->self, 5.0s cast, range 60 circle // Raidwide + SuddenDownpour2 = 36026, // OschonHelper->self, 5.0s cast, range 60 circle, raidwide - Downhill1 = 35231, // Oschon->self, 3.0s cast, single-target - Downhill2 = 35233, // OschonHelper->location, 8.5s cast, range 6 circle // Summons several circle AoE telegraphs. This is used with Climbing Shot. - ClimbingShot = 35217, // Oschon->self, 5.0s cast, range 80 circle // knockback; Soaring Minuet immediately follows - ClimbingShot2 = 35216, // Oschon->self, 5.0s cast, range 80 circle // knockback; Soaring Minuet immediately follows - ClimbingShot3 = 35219, // Oschon->self, 5,0s cast, range 80 circle, knockback 20, direction 6 (?) + DownhillVisual = 35231, // Oschon->self, 3.0s cast, single-target + Downhill = 35233, // OschonHelper->location, 8.5s cast, range 6 circle + ClimbingShot = 35217, // Oschon->self, 5.0s cast, range 80 circle, knockback 20, dir away from source + ClimbingShot2 = 35216, // Oschon->self, 5.0s cast, range 80 circle, knockback 20, dir away from source + ClimbingShot3 = 35219, // Oschon->self, 5,0s cast, range 80 circle, knockback 20, dir away from source + ClimbingShot4 = 35218, // Boss->self, 5,0s cast, range 80 circle, knockback 20, dir away from source - SoaringMinuet1 = 36110, // Oschon->self, 5.0s cast, range 65 270-degree cone // 270 degree frontal cleave from the boss. Only has a brief AoE indicator. - SoaringMinuet2 = 35220, // Oschon->self, 5.0s cast, range 65 270-degree cone // 270 degree frontal cleave from the boss. Only has a brief AoE indicator. + SoaringMinuet1 = 36110, // Oschon->self, 5.0s cast, range 65 270-degree cone + SoaringMinuet2 = 35220, // Oschon->self, 5.0s cast, range 65 270-degree cone - FlintedFoehn1 = 35235, // Oschon->self, 4.5s cast, single-target - FlintedFoehnStack = 35237, // OschonHelper->players, no cast, range 6 circle // Multi-hit stack AoE + FlintedFoehnVisual = 35235, // Oschon->self, 4.5s cast, single-target + FlintedFoehnStack = 35237, // OschonHelper->players, no cast, range 6 circle, stack 6 times - TheArrow1 = 35227, // Oschon->self, 4.0s cast, single-target - TheArrow2 = 35229, // OschonHelper->players, 5.0s cast, range 6 circle // Telegraphed AoE tankbusters on all three tanks. + TheArrowVisual = 35227, // Oschon->self, 4.0s cast, single-target + TheArrow = 35229, // OschonHelper->players, 5.0s cast, range 6 circle, tankbusters - LoftyPeaks = 35239, // Oschon->self, 5.0s cast, single-target // Phase Change - MovingMountains = 36067, // OschonHelper->self, no cast, range 60 circle // Raidwide - PeakPeril = 36068, // OschonHelper->self, no cast, range 60 circle // Raidwide - Shockwave = 35240, // OschonHelper->self, 8.4s cast, range 60 circle // Raidwide -}; + //during phase change + LoftyPeaks = 35239, // Oschon->self, 5.0s cast, single-target, applies status effect 2970 + MovingMountains = 36067, // OschonHelper->self, no cast, range 60 circle, raidwide x3 + PeakPeril = 36068, // OschonHelper->self, no cast, range 60 circle, raidwide + Shockwave = 35240, // OschonHelper->self, 8.4s cast, range 60 circle, raidwide -public enum SID : uint -{ - Windburn1 = 3069, // none->player, extra=0x0 - Windburn2 = 3070, // none->player, extra=0x0 - Unknown = 2970, // Oschon->Oschon, extra=0x294 - Weakness = 43, // none->player, extra=0x0 - VulnerabilityUp = 1789, // OschonsAvatar/Oschon/OschonHelper->player, extra=0x1/0x2 - Transcendent = 418, // none->player, extra=0x0 - TheRoadTo80 = 1411, // none->player, extra=0x0 - Invincibility = 1570, // none->player, extra=0x0 + //P2 + AutoAttackP2 = 35907, // OschonBig->player, no cast, single-target + + PitonPull1Visual = 35241, // OschonBig->self, 8.0s cast, single-target, NW and ES visual + PitonPull3Visual2 = 35242, // OschonBig->self, 8.0s cast, single-target, NE and SW visual + PitonPull = 35243, // OschonHelper->location, 8.5s cast, range 22 circle + + AltitudeVisual1 = 35247, // OschonBig->location, 6.0s cast, single-target + AltitudeVisual2 = 35248, // OschonHelper->location, 2.0s cast, range 6 circle + Altitude = 35249, // OschonHelper->location, 7.0s cast, range 6 circle + + FlintedFoehnVisualP2 = 35236, // OschonBig->self, 4.5s cast, single-target + FlintedFoehnStackP2 = 35238, // OschonHelper->players, no cast, range 8 circle, stack 6 times + + WanderingShotVisual = 36087, // OschonBig->self, 7.0s cast, range 40 width 40 rect + WanderingShotVisual2 = 36086, // OschonBig->self, 7.0s cast, range 40 width 40 rect + GreatWhirlwind = 35246, // OschonHelper->location, 3.6s cast, range 23 circle + + TheArrowVisualP2 = 35228, // OschonBig->self, 6.0s cast, single-target + TheArrowP2 = 35230, // OschonHelper->player, 7.0s cast, range 10 circle, tankbuster + + ArrowTrailVisual = 35250, // OschonBig->self, 3.0s cast, single-target + ArrowTrailExa = 35252, // OschonHelper->self, no cast, range 10 width 10 rect + ArrowTrailTelegraph = 35251, // OschonHelper->self, 2.0s cast, range 40 width 10 rect + + DownhillVisualP2 = 35232, // OschonBig->self, 3.0s cast, single-target + DownhillSmall = 35909, // OschonHelper->location, 3.0s cast, range 6 circle + DownhillBig = 35234, // OschonHelper->location, 14.0s cast, range 8 circle + WanderingVolley = 35245, // OschonBig->self, 10.0s cast, range 40 width 40 rect, damage fall off raidwide, knockback 12 left/right + WanderingVolley2 = 35244, // OschonBig->self, 10.0s cast, range 40 width 40 rect, damage fall off raidwide, knockback 12 left/right }; public enum IconID : uint { FlintedFoehnStack = 316, // player - Icon_344 = 344, // player + TankbusterP1 = 344, // player + TankbusterP2 = 500, // player }; \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonStates.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonStates.cs index 093ebf4945..7f23539cae 100644 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonStates.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/A33OschonStates.cs @@ -1,22 +1,50 @@ namespace BossMod.Endwalker.Alliance.A33Oschon; +class Phase2ArenaUpdate : BossComponent +{ + public override void OnEventEnvControl(BossModule module, byte index, uint state) + { + if (state == 0x00200010 && index == 0x42) + module.Arena.Bounds = new ArenaBoundsSquare(new(0, 750), 20); + } +} + class A33OschonStates : StateMachineBuilder { - public A33OschonStates(BossModule module) : base(module) + private readonly A33Oschon _module; + public A33OschonStates(A33Oschon module) : base(module) { - TrivialPhase() - .ActivateOnEnter() + _module = module; + SimplePhase(0, id => { SimpleState(id, 10000, "Enrage"); }, "P1") + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - //.ActivateOnEnter() // this is here to test what these do - //.ActivateOnEnter() - //.ActivateOnEnter() - //.ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .Raw.Update = () => !Module.PrimaryActor.IsTargetable; + SimplePhase(1, id => { SimpleState(id, 20000, "Enrage"); }, "P2") + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .Raw.Update = () => _module.OschonP2 != null && _module.OschonP2()?.HP.Cur == 1; } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonDownhillClimb.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonDownhillClimb.cs index a57bc79dcb..e72e89b283 100644 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonDownhillClimb.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonDownhillClimb.cs @@ -1,42 +1,44 @@ namespace BossMod.Endwalker.Alliance.A33Oschon; -class Downhill2 : Components.LocationTargetedAOEs +class DownhillP1 : Components.LocationTargetedAOEs { - public Downhill2() : base(ActionID.MakeSpell(AID.Downhill2), 6) { } + public DownhillP1() : base(ActionID.MakeSpell(AID.Downhill), 6) { } } class ClimbingShot : Components.KnockbackFromCastTarget { public ClimbingShot() : base(ActionID.MakeSpell(AID.ClimbingShot), 20) { } + + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } class ClimbingShot2 : Components.KnockbackFromCastTarget { public ClimbingShot2() : base(ActionID.MakeSpell(AID.ClimbingShot2), 20) { } -} -class SoaringMinuet1 : Components.SelfTargetedAOEs -{ - public SoaringMinuet1() : base(ActionID.MakeSpell(AID.SoaringMinuet1), new AOEShapeCone(65, 135.Degrees())) { } -} -class SoaringMinuet2 : Components.SelfTargetedAOEs -{ - public SoaringMinuet2() : base(ActionID.MakeSpell(AID.SoaringMinuet2), new AOEShapeCone(65, 135.Degrees())) { } + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } -class Ability1 : Components.LocationTargetedAOEs +class ClimbingShot3 : Components.KnockbackFromCastTarget { - public Ability1() : base(ActionID.MakeSpell(AID.Ability1), 6) { } + public ClimbingShot3() : base(ActionID.MakeSpell(AID.ClimbingShot3), 20) { } + + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } -class Ability2 : Components.SelfTargetedAOEs + +class ClimbingShot4 : Components.KnockbackFromCastTarget { - public Ability2() : base(ActionID.MakeSpell(AID.Ability2), new AOEShapeCone(65, 135.Degrees())) { } + public ClimbingShot4() : base(ActionID.MakeSpell(AID.ClimbingShot4), 20) { } + + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } -class Ability3 : Components.SelfTargetedAOEs + +class SoaringMinuet1 : Components.SelfTargetedAOEs { - public Ability3() : base(ActionID.MakeSpell(AID.Ability3), new AOEShapeCone(65, 135.Degrees())) { } + public SoaringMinuet1() : base(ActionID.MakeSpell(AID.SoaringMinuet1), new AOEShapeCone(65, 135.Degrees())) { } } -class Ability4 : Components.SelfTargetedAOEs + +class SoaringMinuet2 : Components.SelfTargetedAOEs { - public Ability4() : base(ActionID.MakeSpell(AID.Ability4), new AOEShapeCone(65, 135.Degrees())) { } + public SoaringMinuet2() : base(ActionID.MakeSpell(AID.SoaringMinuet2), new AOEShapeCone(65, 135.Degrees())) { } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonFlintedFoehn.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonFlintedFoehn.cs index 4bcacf6c2e..4b5250534f 100644 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonFlintedFoehn.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonFlintedFoehn.cs @@ -1,17 +1,53 @@ namespace BossMod.Endwalker.Alliance.A33Oschon; -class FlintedFoehn : Components.UniformStackSpread +class FlintedFoehnP1 : Components.UniformStackSpread { - public FlintedFoehn() : base(6, 0) { } + public int NumCasts { get; private set; } + + public FlintedFoehnP1() : base(6, 0) { } + + public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) + { + if ((AID)spell.Action.ID == AID.FlintedFoehnStack) + { + ++NumCasts; + if (NumCasts == 6) + { + Stacks.Clear(); + NumCasts = 0; + } + } + } + public override void OnEventIcon(BossModule module, Actor actor, uint iconID) { if (iconID == (uint)IconID.FlintedFoehnStack) - AddStack(actor, module.WorldState.CurrentTime.AddSeconds(10.45f)); + AddStack(actor, module.WorldState.CurrentTime.AddSeconds(4.5f)); } +} + +class FlintedFoehnP2 : Components.UniformStackSpread +{ + public int NumCasts { get; private set; } + + public FlintedFoehnP2() : base(8, 0) { } public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) { - if ((AID)spell.Action.ID is AID.FlintedFoehnStack) - Stacks.Clear(); + if ((AID)spell.Action.ID == AID.FlintedFoehnStackP2) + { + ++NumCasts; + if (NumCasts == 6) + { + Stacks.Clear(); + NumCasts = 0; + } + } + } + + public override void OnEventIcon(BossModule module, Actor actor, uint iconID) + { + if (iconID == (uint)IconID.FlintedFoehnStack) + AddStack(actor, module.WorldState.CurrentTime.AddSeconds(4.5f)); } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2ArrowTrail.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2ArrowTrail.cs new file mode 100644 index 0000000000..38304eadbe --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2ArrowTrail.cs @@ -0,0 +1,24 @@ +namespace BossMod.Endwalker.Alliance.A33Oschon; + +public class ArrowTrail : Components.Exaflare +{ + public ArrowTrail() : base(new AOEShapeRect(5, 5, 5)) { } + + public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID is AID.ArrowTrailTelegraph) + Lines.Add(new() { Next = caster.Position, Advance = 5 * caster.Rotation.ToDirection(), NextExplosion = spell.NPCFinishAt.AddSeconds(2.3f), TimeToMove = 0.5f, ExplosionsLeft = 8, MaxShownExplosions = 3 }); + } + + public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) + { + if (Lines.Count > 0 && (AID)spell.Action.ID == AID.ArrowTrailExa) + { + ++NumCasts; + int index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1)); + AdvanceLine(module, Lines[index], caster.Position); + if (Lines[index].ExplosionsLeft == 0) + Lines.RemoveAt(index); + } + } +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingShot.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingShot.cs new file mode 100644 index 0000000000..4450c0e826 --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingShot.cs @@ -0,0 +1,28 @@ +namespace BossMod.Endwalker.Alliance.A33Oschon; + +class GreatWhirlwind : Components.GenericAOEs +{ + private AOEInstance? _aoe; + private static readonly AOEShapeCircle circle = new(23); + + public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => Utils.ZeroOrOne(_aoe); + + public override void OnEventEnvControl(BossModule module, byte index, uint state) + { + var _activation = module.WorldState.CurrentTime.AddSeconds(10.7f); + + if (index == 0x48) + { + if (state == 0x00200010) + _aoe = new(circle, new WPos(-0.015f, 759.975f), activation: _activation); + if (state == 0x00020001) + _aoe = new(circle, new WPos(-0.015f, 739.986f), activation: _activation); + } + } + + public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) + { + if ((AID)spell.Action.ID == AID.GreatWhirlwind) + _aoe = null; + } +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigBigAOEs.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingVolley.cs similarity index 56% rename from BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigBigAOEs.cs rename to BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingVolley.cs index 68104ea83d..0da2a7abc0 100644 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigBigAOEs.cs +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonP2WanderingVolley.cs @@ -1,34 +1,8 @@ -namespace BossMod.Endwalker.Alliance.A34OschonBig; - -class PitonPullAOE : Components.LocationTargetedAOEs -{ - public PitonPullAOE() : base(ActionID.MakeSpell(AID.PitonPullAOE), 22) { } -} - - -class AltitudeAOE : Components.LocationTargetedAOEs -{ - public AltitudeAOE() : base(ActionID.MakeSpell(AID.AltitudeAOE), 6) { } -} - -class GreatWhirlwindAOE : Components.LocationTargetedAOEs -{ - public GreatWhirlwindAOE() : base(ActionID.MakeSpell(AID.GreatWhirlwindAOE), 23) { } -} - -class DownhillSmallAOE : Components.LocationTargetedAOEs -{ - public DownhillSmallAOE() : base(ActionID.MakeSpell(AID.DownhillSmallAOE), 6) { } -} - -class DownhillBigAOE : Components.LocationTargetedAOEs -{ - public DownhillBigAOE() : base(ActionID.MakeSpell(AID.DownhillBigAOE), 8) { } -} +namespace BossMod.Endwalker.Alliance.A33Oschon; class WanderingVolley : Components.Knockback { - private List _sources = new(); + private readonly List _sources = []; private static AOEShapeCone _shape = new(30, 90.Degrees()); public override IEnumerable Sources(BossModule module, int slot, Actor actor) => _sources; @@ -38,7 +12,7 @@ public override void OnCastStarted(BossModule module, Actor caster, ActorCastInf if ((AID)spell.Action.ID is AID.WanderingVolley or AID.WanderingVolley2) { _sources.Clear(); - // charge always happens through center, so create two sources with origin at center looking orthogonally + // happens through center, so create two sources with origin at center looking orthogonally _sources.Add(new(module.Bounds.Center, 12, spell.NPCFinishAt, _shape, spell.Rotation + 90.Degrees(), Kind.DirForward)); _sources.Add(new(module.Bounds.Center, 12, spell.NPCFinishAt, _shape, spell.Rotation - 90.Degrees(), Kind.DirForward)); } @@ -52,27 +26,41 @@ public override void OnCastFinished(BossModule module, Actor caster, ActorCastIn ++NumCasts; } } + + public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos); } class WanderingVolleyAOE : Components.GenericAOEs { - private List _aoes = new(); + private AOEInstance? _aoe; + + private static readonly AOEShapeRect _shape = new(40, 5, 40); - private static AOEShapeRect _shape = new(40, 5, 40); + public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => Utils.ZeroOrOne(_aoe); - public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes; public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) { if ((AID)spell.Action.ID is AID.WanderingVolley or AID.WanderingVolley2) - _aoes.Add(new(_shape, caster.Position, spell.Rotation, spell.NPCFinishAt)); + _aoe = new(_shape, caster.Position, spell.Rotation, spell.NPCFinishAt); } + public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell) { if ((AID)spell.Action.ID is AID.WanderingVolley or AID.WanderingVolley2) { - _aoes.Clear(); + _aoe = null; ++NumCasts; } } +} + +class WanderingVolleyRaidwide1 : Components.RaidwideCast +{ + public WanderingVolleyRaidwide1() : base(ActionID.MakeSpell(AID.WanderingVolley)) { } +} + +class WanderingVolleyRaidwide2 : Components.RaidwideCast +{ + public WanderingVolleyRaidwide2() : base(ActionID.MakeSpell(AID.WanderingVolley2)) { } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingDraw.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingDraw.cs new file mode 100644 index 0000000000..8355fd1a96 --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingDraw.cs @@ -0,0 +1,46 @@ +namespace BossMod.Endwalker.Alliance.A33Oschon; + +class SwingingDraw : Components.GenericAOEs +{ + private const float maxError = MathF.PI / 180; + private readonly List _aoes = []; + + private static readonly AOEShapeCone _shape = new(60, 60.Degrees()); + + public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes; + public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) + { + var _activation = spell.NPCFinishAt.AddSeconds(6.1f); + if ((AID)spell.Action.ID == AID.SwingingDrawCW) + { + if (caster.Position.AlmostEqual(new(-10, 740), 1) && caster.Rotation.AlmostEqual(-135.Degrees(), maxError)) + _aoes.Add(new(_shape, new(0, 725), 0.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(10, 740), 1) && caster.Rotation.AlmostEqual(135.Degrees(), maxError)) + _aoes.Add(new(_shape, new(25, 750), -90.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(10, 760), 1) && caster.Rotation.AlmostEqual(45.Degrees(), maxError)) + _aoes.Add(new(_shape, new(0, 775), 180.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(-10, 760), 1) && caster.Rotation.AlmostEqual(-45.Degrees(), maxError)) + _aoes.Add(new(_shape, new(-25, 750), 90.Degrees(), _activation)); + } + if ((AID)spell.Action.ID == AID.SwingingDrawCCW) + { + if (caster.Position.AlmostEqual(new(10, 760), 1) && caster.Rotation.AlmostEqual(45.Degrees(), maxError)) + _aoes.Add(new(_shape, new(0, 775), 180.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(-10, 760), 1) && caster.Rotation.AlmostEqual(-45.Degrees(), maxError)) + _aoes.Add(new(_shape, new(25, 750), -90.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(10, 740), 1) && caster.Rotation.AlmostEqual(135.Degrees(), maxError)) + _aoes.Add(new(_shape, new(0, 725), 0.Degrees(), _activation)); + if (caster.Position.AlmostEqual(new(-10, 740), 1) && caster.Rotation.AlmostEqual(-135.Degrees(), maxError)) + _aoes.Add(new(_shape, new(-25, 750), 90.Degrees(), _activation)); + } + } + + public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID == AID.SwingingDraw) + { + _aoes.Clear(); + ++NumCasts; + } + } +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingTrekShots.cs b/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingTrekShots.cs deleted file mode 100644 index 3f431b8e64..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A33Oschon/OschonSwingingTrekShots.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A33Oschon; - -class TrekDraws : Components.GenericAOEs -{ - private List _aoes = []; - - private static AOEShapeCone _shape = new(65, 60.Degrees()); - - public override IEnumerable ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes; - - public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) - { - if ((AID)spell.Action.ID is AID.TrekShot2 or AID.TrekShot4 or AID.SwingingDraw2) - _aoes.Add(new(_shape, caster.Position, spell.Rotation, spell.NPCFinishAt)); - } - - public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell) - { - if ((AID)spell.Action.ID is AID.TrekShot2 or AID.TrekShot4 or AID.SwingingDraw2) - { - _aoes.Clear(); - ++NumCasts; - } - } -} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBig.cs b/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBig.cs deleted file mode 100644 index efa9f2f5ab..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBig.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A34OschonBig; - -class TheArrowTankbuster : Components.BaitAwayCast -{ - public TheArrowTankbuster() : base(ActionID.MakeSpell(AID.TheArrowTankbuster), new AOEShapeCircle(10), true) { } -} - -[ModuleInfo(GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 11300)] -public class A34Oschon : BossModule -{ - public A34Oschon(WorldState ws, Actor primary) : base(ws, primary, new ArenaBoundsRect(new(0, 750), 20, 20)) { } -} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBigEnums.cs b/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBigEnums.cs deleted file mode 100644 index b73275151f..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonBigEnums.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A34OschonBig; - -public enum OID : uint -{ - Boss = 0x406F, // R24.990, x1 - OschonSmall = 0x406D, // R8.000, x1 - OschonsAvatar = 0x406E, // R8.000, x4 - OschonHelper = 0x233C, // R0.500, x40, 523 type - PedestalOfPassage = 0x1EB91A, // R0.500, x1, EventObj type - ExitToTheOmphalos = 0x1EB91E, // R0.500, x1, EventObj type - Actor1e8fb8 = 0x1E8FB8, // R2.000, x1, EventObj type - Actor1e8f2f = 0x1E8F2F, // R0.500, x1, EventObj type - Unknown = 0x400E, // R0.500, spawn during fight -}; - -public enum AID : uint -{ - _AutoAttack_ = 35907, // OschonBig->player, no cast, single-target - PitonPull1Visual = 35241, // OschonBig->self, 8.0s cast, single-target // NW and ES Visual - PitonPull3Visual2 = 35242, // OschonBig->self, 8.0s cast, single-target // NE and SW Visual - PitonPullAOE = 35243, // OschonHelper->location, 8.5s cast, range 22 circle // Massive AOEs - - AltitudeVisual1 = 35247, // OschonBig->location, 6.0s cast, single-target // Visual - AltitudeVisual2 = 35248, // OschonHelper->location, 2.0s cast, range 6 circle - AltitudeAOE = 35249, // OschonHelper->location, 7.0s cast, range 6 circle // Multiple AOEs - - //For the life of me couldnt figure out why this would not appear - FlintedFoehnVisual = 35236, // OschonBig->self, 4.5s cast, single-target // Visual - FlintedFoehnStack = 35238, // OschonHelper->players, no cast, range 8 circle // Multihit party stack - - WanderingShotVisual = 36087, // OschonBig->self, 7.0s cast, range 40 width 40 rect - WanderingShot2 = 36086, // OschonBig->self, 7.0s cast, range 40 width 40 rect - - GreatWhirlwindAOE = 35246, // OschonHelper->location, 3.6s cast, range 23 circle // Massive AOE - - TheArrowVisual = 35228, // OschonBig->self, 6.0s cast, single-target - TheArrowTankbuster = 35230, // OschonHelper->player, 7.0s cast, range 10 circle // Tankbuster - - - //Not finished - ArrowTrailVisual = 35250, // OschonBig->self, 3.0s cast, single-target - ArrowTrailAOE = 35252, // OschonHelper->self, no cast, range 10 width 10 rect // Arrows will travel down several columns in the arena, telegraphed by red areas - ArrowTrailRectAOE = 35251, // OschonHelper->self, 2.0s cast, range 40 width 10 rect // telegraph for ArrowTrailAOE - - DownhillVisual = 35232, // OschonBig->self, 3.0s cast, single-target - DownhillSmallAOE = 35909, // OschonHelper->location, 3.0s cast, range 6 circle - DownhillBigAOE = 35234, // OschonHelper->location, 14.0s cast, range 8 circle - - WanderingVolley = 35245, // OschonBig->self, 10.0s cast, range 40 width 40 rect - WanderingVolley2 = 35244, // OschonBig->self, 10.0s cast, range 40 width 40 rect -}; - -public enum SID : uint -{ - VulnerabilityUp = 1789, // OschonHelper->player, extra=0x1/0x2/0x3 - Weakness = 43, // none->player, extra=0x0 - Transcendent = 418, // none->player, extra=0x0 - SustainedDamage = 2935, // OschonHelper->player, extra=0x0 -}; - -public enum IconID : uint -{ - FlintedFoehnMarker = 316, // player - Arrowbuster = 500, // player -}; \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonStates.cs b/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonStates.cs deleted file mode 100644 index 6c5c4d579e..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/A34OschonStates.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A34OschonBig; - -class A34OschonStates : StateMachineBuilder -{ - public A34OschonStates(BossModule module) : base(module) - { - TrivialPhase() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - //.ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter(); - } -} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigArrowExaflare.cs b/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigArrowExaflare.cs deleted file mode 100644 index 8f79ff0cf6..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigArrowExaflare.cs +++ /dev/null @@ -1,3 +0,0 @@ -//namespace BossMod.Endwalker.Alliance.A34Oschon -// class ArrowTrail : Components.Exaflare -// i give up lol diff --git a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigFlintedFoehn.cs b/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigFlintedFoehn.cs deleted file mode 100644 index bdb74d16c2..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A34OschonBig/OschonBigFlintedFoehn.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A34OschonBig; - -class BigFlintedFoehn : Components.UniformStackSpread -{ - public int NumCasts { get; private set; } - - public BigFlintedFoehn() : base(6, 0, 6) { } - - public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell) - { - if ((AID)spell.Action.ID == AID.FlintedFoehnStack && module.WorldState.Actors.Find(spell.TargetID) is var target && target != null) - AddStack(target); - } - - public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell) - { - if ((AID)spell.Action.ID is AID.FlintedFoehnStack) - ++NumCasts; - } -} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3.cs b/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3.cs new file mode 100644 index 0000000000..3f7cfc8b0c --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3.cs @@ -0,0 +1,54 @@ +namespace BossMod.Endwalker.Alliance.A34TrashPack2; + +class RingOfSkylight : Components.SelfTargetedAOEs +{ + public RingOfSkylight() : base(ActionID.MakeSpell(AID.RingOfSkylight), new AOEShapeDonut(8, 30)) { } +} + +class SkylightCross : Components.SelfTargetedAOEs +{ + public SkylightCross() : base(ActionID.MakeSpell(AID.SkylightCross), new AOEShapeCross(60, 4)) { } +} + +class Skylight : Components.SelfTargetedAOEs +{ + public Skylight() : base(ActionID.MakeSpell(AID.SkylightCross), new AOEShapeCircle(6)) { } +} + +class RingOfSkylightHint : Components.CastInterruptHint +{ + public RingOfSkylightHint() : base(ActionID.MakeSpell(AID.RingOfSkylight)) { } +} + +class SkylightCrossHint : Components.CastInterruptHint +{ + public SkylightCrossHint() : base(ActionID.MakeSpell(AID.SkylightCross)) { } +} + +public class A34TrashPack2States : StateMachineBuilder +{ + public A34TrashPack2States(BossModule module) : base(module) + { + TrivialPhase() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .Raw.Update = () => module.Enemies(OID.Boss).All(e => e.IsDead) && module.Enemies(OID.AngelosMikros).All(e => e.IsDead); + } +} + +[ModuleInfo(GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 12481)] +public class A34TrashPack2 : BossModule +{ + public A34TrashPack2(WorldState ws, Actor primary) : base(ws, primary, new ArenaBoundsRect(new(800, 770), 15, 25)) { } + + protected override void DrawEnemies(int pcSlot, Actor pc) + { + foreach (var e in Enemies(OID.Boss)) + Arena.Actor(e, ArenaColor.Enemy); + foreach (var e in Enemies(OID.AngelosMikros)) + Arena.Actor(e, ArenaColor.Enemy); + } +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3Enums.cs b/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3Enums.cs new file mode 100644 index 0000000000..e35a872575 --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A34TrashPack2/A34TrashPack3Enums.cs @@ -0,0 +1,15 @@ +namespace BossMod.Endwalker.Alliance.A34TrashPack2; + +public enum OID : uint +{ + Boss = 0x4013, // R=3.6 + AngelosMikros = 0x4014, // R=2.0 +}; + +public enum AID : uint +{ + AutoAttack = 870, // 4014/4013->player, no cast, single-target + Skylight = 35446, // 4014->self, 3,0s cast, range 6 circle + SkylightCross = 35445, // 4013->self, 5,0s cast, range 60 width 8 cross + RingOfSkylight = 35444, // 4013->self, 5,0s cast, range ?-30 donut +}; diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaEnums.cs b/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaEnums.cs deleted file mode 100644 index 0700185b7b..0000000000 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaEnums.cs +++ /dev/null @@ -1,189 +0,0 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia -{ - - public enum OID : uint - { - Boss = 0x4086, // R11.000, x1 - Helper = 0x233C, // R0.500, x14, 523 type - Avatar = 0x4087, // R11.000, spawn during fight - Trident = 0x408E, // R3.000, spawn during fight - FistOfWrath = 0x408C, // R3.600, spawn during fight - FistOfJudgment = 0x408D, // R3.600, spawn during fight - WardensFlame = 0x408B, // R2.400, spawn during fight - HydrostasisQuick = 0x408A, // R1.000, spawn during fight - FistPortalHelper = 0x408F, // R1.000, spawn during fight - _Gen_Actor4028 = 0x4028, // R1.000, spawn during fight - MatronsBreathHelper = 0x4090, // R1.000, spawn during fight, related somehow to MatronsBreath - GoldSafeZone = 0x1EB846, // R0.500, EventObj type, spawn during fight - BlueSafeZone = 0x1EB845, // R0.500, EventObj type, spawn during fight - GoldTower = 0x1EB844, // R0.500, EventObj type, spawn during fight - BlueTower = 0x1EB843, // R0.500, EventObj type, spawn during fight - Exit = 0x1E850B, // R0.500, x1, EventObj type - Graha = 0xFEA51, // R0.500-8.000, EventNpc type, spawn during fight lol - }; - - public enum AID : uint - { - _Weaponskill_Attack1 = 35326, // Eulogia->self, no cast, single-target - _Weaponskill_Attack2 = 35327, // Helper->player, no cast, single-target - DawnOfTime = 35331, // Eulogia->self, 5.0s cast, range 70 circle - Teleport = 35330, // Eulogia->location, no cast, single-target // 99% sure this is the teleport - _Ability_2 = 35336, // Eulogia->self, no cast, single-target - _Ability_3 = 35337, // Eulogia->self, no cast, single-target - _Ability_4 = 36066, // Eulogia->self, no cast, single-target - _Weaponskill_1 = 35360, // Avatar->self, 0.5s cast, single-target - _Weaponskill_2 = 35361, // Avatar->self, 0.5s cast, single-target - _Weaponskill_3 = 35358, // Avatar->self, 0.5s cast, single-target - _Weaponskill_4 = 35359, // Avatar->self, 0.5s cast, single-target - _Weaponskill_5 = 35357, // Avatar->self, 0.5s cast, single-target - _Weaponskill_6 = 35397, // FistOfWrath->self, no cast, single-target - _Weaponskill_7 = 35398, // FistOfJudgment->self, no cast, single-target - - FirstFormRight = 35338, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstRight - FirstFormLeft = 35341, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstLeft - FirstFormAOE = 35344, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstAOE - SecondFormRight = 35339, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceSecondRight - SecondFormLeft = 35342, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceSecondLeft - SecondFormAOE = 35345, // Eulogia->self, 7.0s cast, single-target (inferred, no log) // visual for QuintessenceSecondAOE - ThirdFormRight = 35340, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdRight - ThirdFormLeft = 35343, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdLeft - ThirdFormAOE = 35346, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdAOE - QuintessenceSetup = 35350, // Eulogia->self, 4.0s cast, single-target // teleport - Quintessence1stSpot = 35351, // Eulogia->location, no cast, single-target, // casting location - Quintessence2ndSpot = 35352, // Eulogia->location, no cast, single-target, // casting location - Quintessence3rdSpot = 35353, // Eulogia->location, no cast, single-target, // casting location - QuintessenceFirstRight = 35354, // Helper->self, 4.8s cast, range 50 180-degree cone - QuintessenceFirstLeft = 35355, // Helper->self, 4.8s cast, range 50 180-degree cone - QuintessenceFirstAOE = 35356, // Helper->self, 4.8s cast, range 8 50 donut - QuintessenceSecondRight = 36069, // Helper->self, 8.3s cast, range 50 180-degree cone - QuintessenceSecondLeft = 36070, // Helper->self, 8.3s cast, range 50 180-degree cone - QuintessenceSecondAOE = 36071, // Helper->self, 8.3s cast, range 8 50 donut (inferred, no log) - QuintessenceThirdRight = 36072, // Helper->self, 11.9s cast, range 50 180-degree cone - QuintessenceThirdLeft = 36073, // Helper->self, 11.9s cast, range 50 180-degree cone - QuintessenceThirdAOE = 36074, // Helper->self, 11.9s cast, range 8 50 donut - - SunbeamSelf = 35328, // Eulogia->self, 5.0s cast, single-target visual (tankbuster) - SunbeamTankBuster = 35329, // Helper->players, 5.0s cast, range 6 circle, tankbusters - - TheWhorl = 35375, // Eulogia->self, 7.0s cast, range 40 circle, raidwide, adds a bleed AOE around arena - - LovesLight = 35376, // Eulogia->self, 4.0s cast, single-target - FullBright = 35377, // Eulogia->self, 3.0s cast, single-target - FirstBlush1 = 35379, // Helper->self, 10.3s cast, range 80 width 25 rect - FirstBlush2 = 35380, // Helper->self, 12.3s cast, range 80 width 25 rect - FirstBlush3 = 35381, // Helper->self, 14.3s cast, range 80 width 25 rect - FirstBlush4 = 35382, // Helper->self, 16.3s cast, range 80 width 25 rect - - SolarFans = 35387, // Eulogia->self, 3.0s cast, single-target - SolarFansAOE = 35388, // WardensFlame->location, 4.0s cast, width 10 rect charge - RadiantRhythm = 35389, // Eulogia->self, no cast, range 100 circle - TeleportFlame = 35390, // WardensFlame->location, no cast, single-target - RadiantFlight = 35391, // Helper->self, 0.5s cast, range 30 90-degree cone - RadiantFlourish = 35393, // WardensFlame->self, 3.0s cast, range 25 circle - RadiantFinish = 35392, // Eulogia->self, 3.0s cast, single-target - - TimeAndTide = 35378, // Eulogia->self, 6.0s cast, single-target, single-target, visual (speed up time) - Hydrostasis = 35383, // Eulogia->self, 4.0s cast, single-target, 4.0s cast, single-target, visual (knockbacks) - HydrostasisAOE1 = 35384, // Helper->self, 7.0s cast, range 72 circle, knockback 28 dir 6 - HydrostasisAOE2 = 35385, // Helper->self, 10.0s cast, range 72 circle, knockback 28 dir 6 - HydrostasisAOE3 = 35386, // Helper->self, 13.0s cast, range 72 circle, knockback 28 dir 6 - - DestructiveBolt = 36076, // Eulogia->self, 6.0s cast, single-target, tankbuster visual - DestructiveBoltStack = 36093, // Helper->players, 7.0s cast, range 6 circle, stack marker - - HieroglyphikaVisual = 35395, // Eulogia->self, 5.0s cast, single-target - HieroglyphikaAOE = 35396, // Helper->self, 3.0s cast, range 12 width 12 rect - HandOfTheDestroyerWrath = 35399, // Eulogia->self, 7.5s cast, single-target - HandOfTheDestroyerJudgment = 35400, // Eulogia->self, 7.5s cast, single-target - HandOfTheDestroyerWrathAOE = 35401, // FistOfWrath->self, 8.0s cast, range 90 width 40 rect - HandOfTheDestroyerJudgmentAOE = 35402, // FistOfJudgment->self, 8.0s cast, range 90 width 40 rect - - MatronsBreath = 35403, // Eulogia->self, 3.0s cast, single-target, visual (color towers) - Giltblossoms = 35405, // Helper->self, no cast, range 100 circle, blue tower explosion - Blueblossoms = 35404, // Helper->self, no cast, range 100 circle, gold tower explosion - - TorrentialTridents = 35406, // Eulogia->self, 2.0s cast, single-target - Landing = 35407, // Trident->self, no cast, range 80 circle - LightningBolt = 35408, // Trident->self, 5.0s cast, range 18 circle - ByregotStrikeJump = 35410, // Eulogia->location, 6.0s cast, range 8 circle - ByregotStrikeKnockback = 35411, // Helper->self, 6.7s cast, range 45 circle, knockback 20, dir 6 - ByregotStrikeCone = 35412, // Helper->self, 6.7s cast, range 90 30-degree cone - - ThousandfoldThrustFirst1 = 35415, // Eulogia->self, 5.0s cast, single-target - ThousandfoldThrustFirst2 = 35416, // Eulogia->self, 5.0s cast, single-target - ThousandfoldThrustAOEFirst = 35417, // Helper->self, 6.3s cast, range 60 180-degree cone - ThousandfoldThrustAOERest = 35418, // Helper->self, no cast, range 60 180-degree cone - - AsAboveSoBelow = 35419, // Eulogia->self, 5.0s cast, range 40 circle - AsAboveSoBelowAlt = 35420, // Eulogia->self, 5.0s cast, range 40 circle - - ClimbingShot1 = 36106, // Eulogia->self, 8.0s cast, range 40 circle - ClimbingShot2 = 35431, // Eulogia->self, no cast, range 40 circle - ClimbingShot3 = 35429, // Eulogia->self, no cast, range 40 circle - ClimbingShot4 = 36107, // Eulogia->self, 8.0s cast, range 40 circle - ClimbingShot5 = 35430, // Eulogia->self, no cast, range 40 circle - ClimbingShot6 = 35432, // Eulogia->self, no cast, range 40 circle, knockback 20, dir 6 - - OnceBurnedFake = 36094, // Helper->self, 9.0s cast, range 6 circle - EverFireFake = 36095, // Helper->self, 9.0s cast, range 6 circle - OnceBurnedFirst = 36096, // Helper->self, 9.0s cast, range 6 circle - EverfireFirst = 36097, // Helper->self, 9.0s cast, range 6 circle - OnceBurnedRest = 36098, // Helper->self, no cast, range 6 circle - EverfireRest = 36099, // Helper->self, no cast, range 6 circle - - - //SoaringMinuet = 35220, // Inferred from splatoon, no log - SoaringMinuet = 35433, // Eulogia->self, 7.0s cast, range 40 ?-degree cone - //SoaringMinuet = 36110, // Inferred from splatoon, no log - - TheBuildersArt = 35362, // Helper->self, no cast, range 80 circle, raidwide - TheDestroyersMight = 35363, // Helper->self, no cast, range 80 circle, raidwide - TheWardensRadiance = 35364, // Helper->self, no cast, range 80 circle, raidwide - TheTradersEquity = 35365, // Helper->self, no cast, range 80 circle, raidwide - TheMatronsPlenty = 35366, // Helper->self, no cast, range 80 circle, raidwide - TheKeepersGravity = 35367, // Helper->self, no cast, range 80 circle, raidwide - TheFurysAmbition = 35368, // Helper->self, no cast, range 80 circle, raidwide - TheLoversDevotion = 35369, // Helper->self, no cast, range 80 circle, raidwide - TheScholarsWisdom = 35370, // Helper->self, no cast, range 80 circle, raidwide - TheSpinnersCunning = 35371, // Helper->self, no cast, range 80 circle, raidwide - TheNavigatorsCommand = 35373, // Helper->self, no cast, range 80 circle, raidwide - TheWanderersWhimsy = 35374, // Helper->self, no cast, range 80 circle, raidwide - EudaimonEorzea1 = 35372, // Eulogia->self, 22.2s cast, single-target - EudaimonEorzea2 = 36091, // Helper->self, 24.9s cast, range 40 circle - }; - - public enum SID : uint - { - VulnerabilityUp = 1789, // Helper/FistOfJudgment/Trident->player, extra=0x1/0x2 - Weakness = 43, // none->player, extra=0x0 - Transcendent = 418, // none->player, extra=0x0 - Glow = 2056, // WardensFlame->WardensFlame/UnknownEnemy2, extra=0x195/0x29E/0x29F/0x2A0/0x2A1/0x2A2/0x2A3/0x2A4/0x2A5/0x2A6/0x2A7/0x2A8/0x2A9 - Inscribed = 3732, // none->player, extra=0x0 - Bleeding = 3077, // none->player, extra=0x0 - Bleeding2 = 3078, // none->player, extra=0x0 - Bind = 2518, // none->player, extra=0x0 - BloomingGold = 3460, // none->player, extra=0x0 - BloomingBlue = 3459, // none->player, extra=0x0 - BrinkOfDeath = 44, // none->player, extra=0x0 - }; - - public enum TetherID : uint - { - HydrostasisQuick = 219, // HydrostasisQuick->Eulogia - }; - - public enum IconID : uint - { - Stackmarker = 317, // player - Sunbeam = 344, // player // Used in GolbezEX for VoidMeteor and Endsinger for Hubris - FistOfWrath = 487, // FistPortalHelper // Might be FistOfJudgment - FistOfJudgment = 490, // FistPortalHelper // Might be FistOfWrath - ThousandfoldThrust1 = 388, // Eulogia - ThousandfoldThrust2 = 389, // Eulogia - Order1 = 398, // MatronsBreathHelper - Order2 = 399, // MatronsBreathHelper - Order3 = 400, // MatronsBreathHelper - Order4 = 401, // MatronsBreathHelper - }; - -} diff --git a/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3.cs b/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3.cs new file mode 100644 index 0000000000..0efa4fa74c --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3.cs @@ -0,0 +1,47 @@ +namespace BossMod.Endwalker.Alliance.A35TrashPack3; + +class RingOfSkylight : Components.SelfTargetedAOEs +{ + public RingOfSkylight() : base(ActionID.MakeSpell(AID.RingOfSkylight), new AOEShapeDonut(8, 30)) { } +} + +class SkylightCross : Components.SelfTargetedAOEs +{ + public SkylightCross() : base(ActionID.MakeSpell(AID.SkylightCross), new AOEShapeCross(60, 4)) { } +} + +class RingOfSkylightHint : Components.CastInterruptHint +{ + public RingOfSkylightHint() : base(ActionID.MakeSpell(AID.RingOfSkylight)) { } +} + +class SkylightCrossHint : Components.CastInterruptHint +{ + public SkylightCrossHint() : base(ActionID.MakeSpell(AID.SkylightCross)) { } +} + + +public class A35TrashPack2States : StateMachineBuilder +{ + public A35TrashPack2States(BossModule module) : base(module) + { + TrivialPhase() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .Raw.Update = () => module.Enemies(OID.Boss).All(e => e.IsDead); + } +} + +[ModuleInfo(GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 12481)] +public class A35TrashPack2 : BossModule +{ + public A35TrashPack2(WorldState ws, Actor primary) : base(ws, primary, new ArenaBoundsSquare(new(800, 910), 19)) { } + + protected override void DrawEnemies(int pcSlot, Actor pc) + { + foreach (var e in Enemies(OID.Boss)) + Arena.Actor(e, ArenaColor.Enemy); + } +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3Enums.cs b/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3Enums.cs new file mode 100644 index 0000000000..2a2be3bafb --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A35TrashPack3/A35TrashPack3Enums.cs @@ -0,0 +1,13 @@ +namespace BossMod.Endwalker.Alliance.A35TrashPack3; + +public enum OID : uint +{ + Boss = 0x40E1, // R=3.6 +}; + +public enum AID : uint +{ + AutoAttack = 870, // 40E1->player, no cast, single-target + SkylightCross = 35445, // 40E1->self, 5,0s cast, range 60 width 8 cross + RingOfSkylight = 35444, // 40E1->self, 5,0s cast, range ?-30 donut +}; diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35Eulogia.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35Eulogia.cs similarity index 97% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35Eulogia.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35Eulogia.cs index 876c3066b3..07c56e44c8 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35Eulogia.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35Eulogia.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class SoaringMinuet : Components.SelfTargetedAOEs { diff --git a/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaEnums.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaEnums.cs new file mode 100644 index 0000000000..b22a720924 --- /dev/null +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaEnums.cs @@ -0,0 +1,186 @@ +namespace BossMod.Endwalker.Alliance.A36Eulogia; + +public enum OID : uint +{ + Boss = 0x4086, // R11.000, x1 + Helper = 0x233C, // R0.500, x14, 523 type + Avatar = 0x4087, // R11.000, spawn during fight + Trident = 0x408E, // R3.000, spawn during fight + FistOfWrath = 0x408C, // R3.600, spawn during fight + FistOfJudgment = 0x408D, // R3.600, spawn during fight + WardensFlame = 0x408B, // R2.400, spawn during fight + HydrostasisQuick = 0x408A, // R1.000, spawn during fight + FistPortalHelper = 0x408F, // R1.000, spawn during fight + _Gen_Actor4028 = 0x4028, // R1.000, spawn during fight + MatronsBreathHelper = 0x4090, // R1.000, spawn during fight, related somehow to MatronsBreath + GoldSafeZone = 0x1EB846, // R0.500, EventObj type, spawn during fight + BlueSafeZone = 0x1EB845, // R0.500, EventObj type, spawn during fight + GoldTower = 0x1EB844, // R0.500, EventObj type, spawn during fight + BlueTower = 0x1EB843, // R0.500, EventObj type, spawn during fight + Exit = 0x1E850B, // R0.500, x1, EventObj type + Graha = 0xFEA51, // R0.500-8.000, EventNpc type, spawn during fight lol +}; + +public enum AID : uint +{ + _Weaponskill_Attack1 = 35326, // Eulogia->self, no cast, single-target + _Weaponskill_Attack2 = 35327, // Helper->player, no cast, single-target + DawnOfTime = 35331, // Eulogia->self, 5.0s cast, range 70 circle + Teleport = 35330, // Eulogia->location, no cast, single-target // 99% sure this is the teleport + _Ability_2 = 35336, // Eulogia->self, no cast, single-target + _Ability_3 = 35337, // Eulogia->self, no cast, single-target + _Ability_4 = 36066, // Eulogia->self, no cast, single-target + _Weaponskill_1 = 35360, // Avatar->self, 0.5s cast, single-target + _Weaponskill_2 = 35361, // Avatar->self, 0.5s cast, single-target + _Weaponskill_3 = 35358, // Avatar->self, 0.5s cast, single-target + _Weaponskill_4 = 35359, // Avatar->self, 0.5s cast, single-target + _Weaponskill_5 = 35357, // Avatar->self, 0.5s cast, single-target + _Weaponskill_6 = 35397, // FistOfWrath->self, no cast, single-target + _Weaponskill_7 = 35398, // FistOfJudgment->self, no cast, single-target + + FirstFormRight = 35338, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstRight + FirstFormLeft = 35341, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstLeft + FirstFormAOE = 35344, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceFirstAOE + SecondFormRight = 35339, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceSecondRight + SecondFormLeft = 35342, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceSecondLeft + SecondFormAOE = 35345, // Eulogia->self, 7.0s cast, single-target (inferred, no log) // visual for QuintessenceSecondAOE + ThirdFormRight = 35340, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdRight + ThirdFormLeft = 35343, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdLeft + ThirdFormAOE = 35346, // Eulogia->self, 7.0s cast, single-target // visual for QuintessenceThirdAOE + QuintessenceSetup = 35350, // Eulogia->self, 4.0s cast, single-target // teleport + Quintessence1stSpot = 35351, // Eulogia->location, no cast, single-target, // casting location + Quintessence2ndSpot = 35352, // Eulogia->location, no cast, single-target, // casting location + Quintessence3rdSpot = 35353, // Eulogia->location, no cast, single-target, // casting location + QuintessenceFirstRight = 35354, // Helper->self, 4.8s cast, range 50 180-degree cone + QuintessenceFirstLeft = 35355, // Helper->self, 4.8s cast, range 50 180-degree cone + QuintessenceFirstAOE = 35356, // Helper->self, 4.8s cast, range 8 50 donut + QuintessenceSecondRight = 36069, // Helper->self, 8.3s cast, range 50 180-degree cone + QuintessenceSecondLeft = 36070, // Helper->self, 8.3s cast, range 50 180-degree cone + QuintessenceSecondAOE = 36071, // Helper->self, 8.3s cast, range 8 50 donut (inferred, no log) + QuintessenceThirdRight = 36072, // Helper->self, 11.9s cast, range 50 180-degree cone + QuintessenceThirdLeft = 36073, // Helper->self, 11.9s cast, range 50 180-degree cone + QuintessenceThirdAOE = 36074, // Helper->self, 11.9s cast, range 8 50 donut + + SunbeamSelf = 35328, // Eulogia->self, 5.0s cast, single-target visual (tankbuster) + SunbeamTankBuster = 35329, // Helper->players, 5.0s cast, range 6 circle, tankbusters + + TheWhorl = 35375, // Eulogia->self, 7.0s cast, range 40 circle, raidwide, adds a bleed AOE around arena + + LovesLight = 35376, // Eulogia->self, 4.0s cast, single-target + FullBright = 35377, // Eulogia->self, 3.0s cast, single-target + FirstBlush1 = 35379, // Helper->self, 10.3s cast, range 80 width 25 rect + FirstBlush2 = 35380, // Helper->self, 12.3s cast, range 80 width 25 rect + FirstBlush3 = 35381, // Helper->self, 14.3s cast, range 80 width 25 rect + FirstBlush4 = 35382, // Helper->self, 16.3s cast, range 80 width 25 rect + + SolarFans = 35387, // Eulogia->self, 3.0s cast, single-target + SolarFansAOE = 35388, // WardensFlame->location, 4.0s cast, width 10 rect charge + RadiantRhythm = 35389, // Eulogia->self, no cast, range 100 circle + TeleportFlame = 35390, // WardensFlame->location, no cast, single-target + RadiantFlight = 35391, // Helper->self, 0.5s cast, range 30 90-degree cone + RadiantFlourish = 35393, // WardensFlame->self, 3.0s cast, range 25 circle + RadiantFinish = 35392, // Eulogia->self, 3.0s cast, single-target + + TimeAndTide = 35378, // Eulogia->self, 6.0s cast, single-target, single-target, visual (speed up time) + Hydrostasis = 35383, // Eulogia->self, 4.0s cast, single-target, 4.0s cast, single-target, visual (knockbacks) + HydrostasisAOE1 = 35384, // Helper->self, 7.0s cast, range 72 circle, knockback 28 dir 6 + HydrostasisAOE2 = 35385, // Helper->self, 10.0s cast, range 72 circle, knockback 28 dir 6 + HydrostasisAOE3 = 35386, // Helper->self, 13.0s cast, range 72 circle, knockback 28 dir 6 + + DestructiveBolt = 36076, // Eulogia->self, 6.0s cast, single-target, tankbuster visual + DestructiveBoltStack = 36093, // Helper->players, 7.0s cast, range 6 circle, stack marker + + HieroglyphikaVisual = 35395, // Eulogia->self, 5.0s cast, single-target + HieroglyphikaAOE = 35396, // Helper->self, 3.0s cast, range 12 width 12 rect + HandOfTheDestroyerWrath = 35399, // Eulogia->self, 7.5s cast, single-target + HandOfTheDestroyerJudgment = 35400, // Eulogia->self, 7.5s cast, single-target + HandOfTheDestroyerWrathAOE = 35401, // FistOfWrath->self, 8.0s cast, range 90 width 40 rect + HandOfTheDestroyerJudgmentAOE = 35402, // FistOfJudgment->self, 8.0s cast, range 90 width 40 rect + + MatronsBreath = 35403, // Eulogia->self, 3.0s cast, single-target, visual (color towers) + Giltblossoms = 35405, // Helper->self, no cast, range 100 circle, blue tower explosion + Blueblossoms = 35404, // Helper->self, no cast, range 100 circle, gold tower explosion + + TorrentialTridents = 35406, // Eulogia->self, 2.0s cast, single-target + Landing = 35407, // Trident->self, no cast, range 80 circle + LightningBolt = 35408, // Trident->self, 5.0s cast, range 18 circle + ByregotStrikeJump = 35410, // Eulogia->location, 6.0s cast, range 8 circle + ByregotStrikeKnockback = 35411, // Helper->self, 6.7s cast, range 45 circle, knockback 20, dir 6 + ByregotStrikeCone = 35412, // Helper->self, 6.7s cast, range 90 30-degree cone + + ThousandfoldThrustFirst1 = 35415, // Eulogia->self, 5.0s cast, single-target + ThousandfoldThrustFirst2 = 35416, // Eulogia->self, 5.0s cast, single-target + ThousandfoldThrustAOEFirst = 35417, // Helper->self, 6.3s cast, range 60 180-degree cone + ThousandfoldThrustAOERest = 35418, // Helper->self, no cast, range 60 180-degree cone + + AsAboveSoBelow = 35419, // Eulogia->self, 5.0s cast, range 40 circle + AsAboveSoBelowAlt = 35420, // Eulogia->self, 5.0s cast, range 40 circle + + ClimbingShot1 = 36106, // Eulogia->self, 8.0s cast, range 40 circle + ClimbingShot2 = 35431, // Eulogia->self, no cast, range 40 circle + ClimbingShot3 = 35429, // Eulogia->self, no cast, range 40 circle + ClimbingShot4 = 36107, // Eulogia->self, 8.0s cast, range 40 circle + ClimbingShot5 = 35430, // Eulogia->self, no cast, range 40 circle + ClimbingShot6 = 35432, // Eulogia->self, no cast, range 40 circle, knockback 20, dir 6 + + OnceBurnedFake = 36094, // Helper->self, 9.0s cast, range 6 circle + EverFireFake = 36095, // Helper->self, 9.0s cast, range 6 circle + OnceBurnedFirst = 36096, // Helper->self, 9.0s cast, range 6 circle + EverfireFirst = 36097, // Helper->self, 9.0s cast, range 6 circle + OnceBurnedRest = 36098, // Helper->self, no cast, range 6 circle + EverfireRest = 36099, // Helper->self, no cast, range 6 circle + + + //SoaringMinuet = 35220, // Inferred from splatoon, no log + SoaringMinuet = 35433, // Eulogia->self, 7.0s cast, range 40 ?-degree cone + //SoaringMinuet = 36110, // Inferred from splatoon, no log + + TheBuildersArt = 35362, // Helper->self, no cast, range 80 circle, raidwide + TheDestroyersMight = 35363, // Helper->self, no cast, range 80 circle, raidwide + TheWardensRadiance = 35364, // Helper->self, no cast, range 80 circle, raidwide + TheTradersEquity = 35365, // Helper->self, no cast, range 80 circle, raidwide + TheMatronsPlenty = 35366, // Helper->self, no cast, range 80 circle, raidwide + TheKeepersGravity = 35367, // Helper->self, no cast, range 80 circle, raidwide + TheFurysAmbition = 35368, // Helper->self, no cast, range 80 circle, raidwide + TheLoversDevotion = 35369, // Helper->self, no cast, range 80 circle, raidwide + TheScholarsWisdom = 35370, // Helper->self, no cast, range 80 circle, raidwide + TheSpinnersCunning = 35371, // Helper->self, no cast, range 80 circle, raidwide + TheNavigatorsCommand = 35373, // Helper->self, no cast, range 80 circle, raidwide + TheWanderersWhimsy = 35374, // Helper->self, no cast, range 80 circle, raidwide + EudaimonEorzea1 = 35372, // Eulogia->self, 22.2s cast, single-target + EudaimonEorzea2 = 36091, // Helper->self, 24.9s cast, range 40 circle +}; + +public enum SID : uint +{ + VulnerabilityUp = 1789, // Helper/FistOfJudgment/Trident->player, extra=0x1/0x2 + Weakness = 43, // none->player, extra=0x0 + Transcendent = 418, // none->player, extra=0x0 + Glow = 2056, // WardensFlame->WardensFlame/UnknownEnemy2, extra=0x195/0x29E/0x29F/0x2A0/0x2A1/0x2A2/0x2A3/0x2A4/0x2A5/0x2A6/0x2A7/0x2A8/0x2A9 + Inscribed = 3732, // none->player, extra=0x0 + Bleeding = 3077, // none->player, extra=0x0 + Bleeding2 = 3078, // none->player, extra=0x0 + Bind = 2518, // none->player, extra=0x0 + BloomingGold = 3460, // none->player, extra=0x0 + BloomingBlue = 3459, // none->player, extra=0x0 + BrinkOfDeath = 44, // none->player, extra=0x0 +}; + +public enum TetherID : uint +{ + HydrostasisQuick = 219, // HydrostasisQuick->Eulogia +}; + +public enum IconID : uint +{ + Stackmarker = 317, // player + Sunbeam = 344, // player // Used in GolbezEX for VoidMeteor and Endsinger for Hubris + FistOfWrath = 487, // FistPortalHelper // Might be FistOfJudgment + FistOfJudgment = 490, // FistPortalHelper // Might be FistOfWrath + ThousandfoldThrust1 = 388, // Eulogia + ThousandfoldThrust2 = 389, // Eulogia + Order1 = 398, // MatronsBreathHelper + Order2 = 399, // MatronsBreathHelper + Order3 = 400, // MatronsBreathHelper + Order4 = 401, // MatronsBreathHelper +}; \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaStates.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaStates.cs similarity index 95% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaStates.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaStates.cs index 99385378e0..481f022500 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/A35EulogiaStates.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/A35EulogiaStates.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class A35EulogiaStates : StateMachineBuilder { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaAboveBelow.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaAboveBelow.cs similarity index 97% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaAboveBelow.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaAboveBelow.cs index a6437f86fc..703437fe2f 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaAboveBelow.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaAboveBelow.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class AsAboveSoBelow : Components.Exaflare { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaByregotStrike.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaByregotStrike.cs similarity index 95% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaByregotStrike.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaByregotStrike.cs index e88e0e4299..dac68f93d3 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaByregotStrike.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaByregotStrike.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class ByregotStrikeJump : Components.LocationTargetedAOEs { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHandOfTheDestroyer.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHandOfTheDestroyer.cs similarity index 94% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHandOfTheDestroyer.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHandOfTheDestroyer.cs index 364b214c66..42205cdba9 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHandOfTheDestroyer.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHandOfTheDestroyer.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class HandOfTheDestroyer : Components.GenericAOEs { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHieroglyphika.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHieroglyphika.cs similarity index 94% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHieroglyphika.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHieroglyphika.cs index 13c8116f67..eb3543e865 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHieroglyphika.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHieroglyphika.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class Hieroglyphika : Components.GenericAOEs { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHydrostasis.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHydrostasis.cs similarity index 95% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHydrostasis.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHydrostasis.cs index 82fbff3423..013a88b5a5 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaHydrostasis.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaHydrostasis.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class Hydrostasis : Components.Knockback { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaMatronsBreath.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaMatronsBreath.cs similarity index 96% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaMatronsBreath.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaMatronsBreath.cs index 68e7c87ac4..550c629b8f 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaMatronsBreath.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaMatronsBreath.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class MatronsBreath : BossComponent { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaQuintessence.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaQuintessence.cs similarity index 98% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaQuintessence.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaQuintessence.cs index e62892a422..1748280a61 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaQuintessence.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaQuintessence.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class Quintessence : Components.GenericAOEs { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaSolarFans.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaSolarFans.cs similarity index 97% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaSolarFans.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaSolarFans.cs index 068f2e7a33..f19b5747aa 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaSolarFans.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaSolarFans.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class SolarFans : BossComponent { diff --git a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaThousandfoldThrust.cs b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaThousandfoldThrust.cs similarity index 95% rename from BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaThousandfoldThrust.cs rename to BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaThousandfoldThrust.cs index e88c64f54f..57b5288c85 100644 --- a/BossMod/Modules/Endwalker/Alliance/A35Eulogia/EulogiaThousandfoldThrust.cs +++ b/BossMod/Modules/Endwalker/Alliance/A36Eulogia/EulogiaThousandfoldThrust.cs @@ -1,4 +1,4 @@ -namespace BossMod.Endwalker.Alliance.A35Eulogia; +namespace BossMod.Endwalker.Alliance.A36Eulogia; class ThousandfoldThrust : Components.GenericAOEs {