diff --git a/BossMod/Components/ThinIce.cs b/BossMod/Components/ThinIce.cs index f217856b3c..e3128f9eb9 100644 --- a/BossMod/Components/ThinIce.cs +++ b/BossMod/Components/ThinIce.cs @@ -2,10 +2,13 @@ namespace BossMod.Components; abstract class ThinIce(BossModule module, uint statusID = 911, float distance = 11, bool stopAtWall = false, bool stopAfterWall = false) : Knockback(module, stopAtWall: stopAtWall, stopAfterWall: stopAfterWall) { + public readonly uint StatusID = statusID; + public readonly float Distance = distance; + public override IEnumerable Sources(int slot, Actor actor) { - if (actor.FindStatus(statusID) != null) - yield return new(actor.Position, distance, default, default, actor.Rotation, Kind.DirForward); + if (actor.FindStatus(StatusID) != null) + yield return new(actor.Position, Distance, default, default, actor.Rotation, Kind.DirForward); } public override void AddHints(int slot, Actor actor, TextHints hints) @@ -17,7 +20,7 @@ public override void AddHints(int slot, Actor actor, TextHints hints) public override void DrawArenaForeground(int pcSlot, Actor pc) { base.DrawArenaForeground(pcSlot, pc); - if (pc.FindStatus(statusID) != null) - Arena.AddCircle(pc.Position, distance, Colors.Vulnerable); + if (pc.FindStatus(StatusID) != null) + Arena.AddCircle(pc.Position, Distance, Colors.Vulnerable); } } diff --git a/BossMod/Modules/Heavensward/Dungeon/D13SohrKhai/D133Hraesvelgr.cs b/BossMod/Modules/Heavensward/Dungeon/D13SohrKhai/D133Hraesvelgr.cs index 7b6eb3da88..784c61aa8b 100644 --- a/BossMod/Modules/Heavensward/Dungeon/D13SohrKhai/D133Hraesvelgr.cs +++ b/BossMod/Modules/Heavensward/Dungeon/D13SohrKhai/D133Hraesvelgr.cs @@ -104,6 +104,12 @@ class ThinIce(BossModule module) : Components.ThinIce(module, stopAtWall: true) { public override bool DestinationUnsafe(int slot, Actor actor, WPos pos) => (Module.FindComponent()?.ActiveAOEs(slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false) || (Module.FindComponent()?.ActiveAOEs(slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false); + + public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignment assignment, AIHints hints) + { + if (actor.FindStatus(StatusID) != null) + hints.AddForbiddenZone(ShapeDistance.InvertedDonut(actor.Position, Distance, Distance + 0.5f)); + } } class D133HraesvelgrStates : StateMachineBuilder diff --git a/BossMod/Modules/RealmReborn/Dungeon/D26Snowcloak/D260NorthernBateleur.cs b/BossMod/Modules/RealmReborn/Dungeon/D26Snowcloak/D260NorthernBateleur.cs index 8d2c424ae4..54ef439cec 100644 --- a/BossMod/Modules/RealmReborn/Dungeon/D26Snowcloak/D260NorthernBateleur.cs +++ b/BossMod/Modules/RealmReborn/Dungeon/D26Snowcloak/D260NorthernBateleur.cs @@ -2,14 +2,15 @@ namespace BossMod.RealmReborn.Dungeon.D26Snowcloak.D260NorthernBateleur; public enum OID : uint { - IceSprite = 0xD31, // R0.9 Boss = 0xD1E, // R0.8 + IceSprite = 0xD31, // R0.9 Hrimthurs = 0xD1F, // R1.69 SnowcloakGoobbue = 0xD1B, // R1.9 WallController1 = 0x1E94F1, WindController1 = 0x1E96D4, WindController2 = 0x1E94F0, WindController3 = 0x1E94F2, + Yeti = 0x3977 // R3.8 } public enum AID : uint @@ -94,7 +95,8 @@ public D260NorthernBateleurStates(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() - .Raw.Update = () => Module.Enemies(OID.IceSprite).Concat(Module.Enemies(OID.Boss)).Concat(Module.Enemies(OID.SnowcloakGoobbue)).All(x => x.IsDeadOrDestroyed); + .Raw.Update = () => module.Enemies(D260NorthernBateleur.Trash).Where(x => x.Position.AlmostEqual(module.Arena.Center, module.Bounds.Radius)).All(x => x.IsDeadOrDestroyed) + || module.Enemies(OID.Yeti).Any(x => x.InCombat); } } @@ -174,12 +176,11 @@ public class D260NorthernBateleur(WorldState ws, Actor primary) : BossModule(ws, public static readonly ArenaBoundsComplex Arena1 = new([new PolygonCustom(vertices1)]); public static readonly ArenaBoundsComplex Arena2 = new([new PolygonCustom(vertices1), new PolygonCustom(vertices2)]); - - protected override bool CheckPull() => Enemies(OID.IceSprite).Concat(Enemies(OID.Boss)) - .Concat(Enemies(OID.Hrimthurs)).Concat(Enemies(OID.SnowcloakGoobbue)).Any(x => x.InCombat); + public static readonly uint[] Trash = [(uint)OID.IceSprite, (uint)OID.Boss, (uint)OID.Hrimthurs, (uint)OID.SnowcloakGoobbue]; + protected override bool CheckPull() => Enemies(Trash).Any(x => x.InCombat && x.Position.AlmostEqual(Arena.Center, Bounds.Radius)); protected override void DrawEnemies(int pcSlot, Actor pc) { - Arena.Actors(Enemies(OID.Hrimthurs).Concat(Enemies(OID.Boss)).Concat(Enemies(OID.SnowcloakGoobbue)).Concat(Enemies(OID.IceSprite))); + Arena.Actors(Enemies(Trash).Where(x => x.Position.AlmostEqual(Arena.Center, Bounds.Radius))); } }