diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs index bc254dfe72..3aa6f4ef78 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs @@ -34,6 +34,8 @@ public enum AID : uint RunawayRunoff = 29911, // Helper->self, 9.0s cast, range 60 circle Gigantomill = 29898, // Boss->self, 8.0s cast, range 72 width 10 cross + RollingBoulder = 29914, // Helper->self, no cast, range 10 width 10 rect + } public enum IconID : uint diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013Gladiator.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013Gladiator.cs index d828b33f7a..8be995019a 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013Gladiator.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013Gladiator.cs @@ -1,30 +1,160 @@ +using System.Linq; + namespace BossMod.Endwalker.Variant.V01SS.V013Gladiator; class SunderedRemains(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SunderedRemains), new AOEShapeCircle(10)); -class RingOfMight1Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight1Out), new AOEShapeCircle(8)); -class RingOfMight2Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight2Out), new AOEShapeCircle(13)); -class RingOfMight3Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight3Out), new AOEShapeCircle(18)); -class RingOfMight1In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight1In), new AOEShapeDonut(8, 30)); -class RingOfMight2In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight2In), new AOEShapeDonut(13, 30)); -class RingOfMight3In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight3In), new AOEShapeDonut(18, 30)); - class RackAndRuin(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RackAndRuin), new AOEShapeRect(40, 2.5f), 8); class FlashOfSteel1(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.FlashOfSteel1), "Raidwide"); class FlashOfSteel2(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.FlashOfSteel2), "Raidwide"); class MightySmite(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.MightySmite), "Tankbuster"); -class RushOfMightFront(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMightFront), new AOEShapeCone(60, 90.Degrees())); -class RushOfMightBack(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMightBack), new AOEShapeCone(60, 90.Degrees())); -//class RushOfMight1(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight1), new AOEShapeCone(40, 180.Degrees())); -//class RushOfMight2(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight2), new AOEShapeCone(40, 180.Degrees())); -//class RushOfMight3(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight3), new AOEShapeCone(40, 180.Degrees())); - class BitingWindBad(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.BitingWindBad), 4); class ShatteringSteel(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ShatteringSteel), "Get in bigger Whirlwind to dodge"); class ViperPoisonPatterns(BossModule module) : Components.PersistentVoidzoneAtCastTarget(module, 6, ActionID.MakeSpell(AID.BitingWindBad), m => m.Enemies(OID.WhirlwindBad).Where(z => z.EventState != 7), 0); +class RingOfMight1(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual)) +{ + private List _castersRingOfMightOut = new(); + private List _castersRingOfMightIn = new(); + + private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(13); + private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(13, 30); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) + { + if (_castersRingOfMightOut.Count > 0) + return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + else + return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + } + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Add(caster); + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Remove(caster); + } + + private List? CastersForSpell(ActionID spell) => (AID)spell.ID switch + { + AID.RingOfMight1Out => _castersRingOfMightOut, + AID.RingOfMight1In => _castersRingOfMightIn, + _ => null + }; +} + +class RingOfMight2(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual)) +{ + private List _castersRingOfMightOut = new(); + private List _castersRingOfMightIn = new(); + + private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(18); + private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(18, 30); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) + { + if (_castersRingOfMightOut.Count > 0) + return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + else + return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + } + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Add(caster); + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Remove(caster); + } + + private List? CastersForSpell(ActionID spell) => (AID)spell.ID switch + { + AID.RingOfMight2Out => _castersRingOfMightOut, + AID.RingOfMight2In => _castersRingOfMightIn, + _ => null + }; +} + +class RingOfMight3(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual)) +{ + private List _castersRingOfMightOut = new(); + private List _castersRingOfMightIn = new(); + + private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(8); + private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(8, 30); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) + { + if (_castersRingOfMightOut.Count > 0) + return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + else + return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + } + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Add(caster); + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Remove(caster); + } + + private List? CastersForSpell(ActionID spell) => (AID)spell.ID switch + { + AID.RingOfMight3Out => _castersRingOfMightOut, + AID.RingOfMight3In => _castersRingOfMightIn, + _ => null + }; +} + +class RushOfMight(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual)) +{ + private List _castersRushOfMightFront = new(); + private List _castersRushOfMightBack = new(); + + private static readonly AOEShape _shapeRushOfMightFront = new AOEShapeCone(60, 90.Degrees()); + private static readonly AOEShape _shapeRushOfMightBack = new AOEShapeCone(60, 90.Degrees()); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) + { + if (_castersRushOfMightFront.Count > 0) + return _castersRushOfMightFront.Select(c => new AOEInstance(_shapeRushOfMightFront, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + else + return _castersRushOfMightBack.Select(c => new AOEInstance(_shapeRushOfMightBack, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + } + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Add(caster); + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Remove(caster); + } + + private List? CastersForSpell(ActionID spell) => (AID)spell.ID switch + { + AID.RushOfMightFront => _castersRushOfMightFront, + AID.RushOfMightBack => _castersRushOfMightBack, + _ => null + }; +} + +class FlashOfSteelMeteor(BossModule module) : Components.CastLineOfSightAOE(module, ActionID.MakeSpell(AID.FlashOfSteelMeteor), 60, false) +{ + public override IEnumerable BlockerActors() => Module.Enemies(OID.AntiqueBoulder).Where(a => !a.IsDead); +} + class SculptorsPassion(BossModule module) : Components.GenericWildCharge(module, 4, ActionID.MakeSpell(AID.SculptorsPassion)) { public override void OnEventCast(Actor caster, ActorCastEvent spell) diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs index afacd67138..67a3749447 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs @@ -7,6 +7,7 @@ public enum OID : uint Regret = 0x39A1, // R1.000, x0 (spawn during fight) WhirlwindSafe = 0x39A2, // R2.000, x0 (spawn during fight) WhirlwindBad = 0x3AEC, // R1.330, x0 (spawn during fight) + AntiqueBoulder = 0x39A3, // R1.800, x0 (spawn during fight) } public enum AID : uint @@ -33,6 +34,11 @@ public enum AID : uint RingOfMight2In = 30275, // Helper->self, 12.0s cast, range 13-30 donut RingOfMight3In = 30276, // Helper->self, 12.0s cast, range 18-30 donut + FlashOfSteelMeteor = 30287, // Boss->self, 5.0s cast, range 60 circle + + Landing = 30288, // AntiqueBoulder->self, 7.0s cast, range 50 circle + + RushOfMight1 = 30266, // Boss->location, 10.0s cast, range 25 width 3 rect aoe RushOfMight2 = 30267, // Boss->location, 10.0s cast, range 25 width 3 rect aoe RushOfMight3 = 30268, // Boss->location, 10.0s cast, range 25 width 3 rect aoe diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorStates.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorStates.cs index f720428b5d..64faaa1601 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorStates.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorStates.cs @@ -7,20 +7,14 @@ public V013GladiatorStates(BossModule module) : base(module) TrivialPhase() .ActivateOnEnter() .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() - //.ActivateOnEnter() - //.ActivateOnEnter() - //.ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter(); } diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGah.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGah.cs index 9cf57778a4..2e96511f86 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGah.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGah.cs @@ -3,7 +3,6 @@ class Burn(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Burn), new AOEShapeCircle(12)); class PureFire2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.PureFire2), new AOEShapeCircle(6)); - class CastShadowFirst(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CastShadowFirst), new AOEShapeCone(50, 45.Degrees())); class CastShadowNext(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CastShadowNext), new AOEShapeCone(50, 45.Degrees())); @@ -13,5 +12,39 @@ class ShowOfStrength(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ShowOfStrength)); +class CastShadow(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.CastShadow)) +{ + private List _castersShadowFirst = new(); + private List _castersShadowNext = new(); + + private static readonly AOEShape _shapeShadowFirst = new AOEShapeCone(50, 45.Degrees()); + private static readonly AOEShape _shapeShadowNext = new AOEShapeCone(50, 45.Degrees()); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) + { + if (_castersShadowFirst.Count > 0) + return _castersShadowFirst.Select(c => new AOEInstance(_shapeShadowFirst, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + else + return _castersShadowNext.Select(c => new AOEInstance(_shapeShadowNext, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt)); + } + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Add(caster); + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + CastersForSpell(spell.Action)?.Remove(caster); + } + + private List? CastersForSpell(ActionID spell) => (AID)spell.ID switch + { + AID.CastShadowFirst => _castersShadowFirst, + AID.CastShadowNext => _castersShadowNext, + _ => null + }; +} + [ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "CombatReborn Team", PrimaryActorOID = (uint)OID.Boss, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 868, NameID = 11394)] public class V014ZelessGah(WorldState ws, Actor primary) : BossModule(ws, primary, new ArenaBoundsRect(new(289, -105), 15, 20)); diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahEnums.cs index 0596f33771..c85ea0f8a2 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahEnums.cs @@ -16,7 +16,7 @@ public enum AID : uint AutoAttack = 6499, // Boss->player, no cast, single-target Burn = 29839, // BallOfFire->self, 1.5s cast, range 12 circle - CastShadow1 = 29850, // Boss->self, 4.8s cast, single-target + CastShadow = 29850, // Boss->self, 4.8s cast, single-target CastShadowFirst = 29851, // Helper->self, 5.5s cast, range 65 ?-degree cone CastShadowNext = 29853, // Helper->self, 7.5s cast, range 65 ?-degree cone @@ -26,6 +26,8 @@ public enum AID : uint FiresteelFracture = 29868, // Boss->self/player, 5.0s cast, range 40 ?-degree cone InfernBrand = 29841, // Boss->self, 4.0s cast, single-target + BlazingBenifice = 29861, // 39B1->self, 1.5s cast, range 100 width 10 rect + InfernGale1 = 29858, // Boss->self, 4.0s cast, single-target InfernGale2 = 29859, // Helper->player, no cast, single-target diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahStates.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahStates.cs index 73db6bc368..8852eca089 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahStates.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V014ZelessGah/V014ZelessGahStates.cs @@ -7,8 +7,7 @@ public V014ZelessGahStates(BossModule module) : base(module) TrivialPhase() .ActivateOnEnter() .ActivateOnEnter() - .ActivateOnEnter() - .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter();