Skip to content

Commit

Permalink
Merge pull request #489 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
P3S fixes
  • Loading branch information
CarnifexOptimus authored Dec 7, 2024
2 parents e27797d + cc5e351 commit 6f97fb1
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 226 deletions.
1 change: 0 additions & 1 deletion BossMod/BossModule/BossModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ protected virtual void Dispose(bool disposing)
{
StateMachine.Reset();
ClearComponents(_ => true);

_subscriptions.Dispose();
}

Expand Down
15 changes: 2 additions & 13 deletions BossMod/Components/Adds.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public override void DrawArenaForeground(int pcSlot, Actor pc)
public class AddsMulti(BossModule module, uint[] oids, int priority = 0) : BossComponent(module)
{
public readonly uint[] OIDs = oids;
public readonly List<Actor> Actors = [];
public readonly List<Actor> Actors = module.Enemies(oids);
public IEnumerable<Actor> ActiveActors => Actors.Where(a => a.IsTargetable && !a.IsDead);

public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignment assignment, AIHints hints)
Expand All @@ -35,17 +35,6 @@ public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignme

public override void DrawArenaForeground(int pcSlot, Actor pc)
{
Arena.Actors(Actors);
}

public override void OnActorCreated(Actor actor)
{
if (OIDs.Contains(actor.OID))
Actors.Add(actor);
}

public override void OnActorDestroyed(Actor actor)
{
Actors.Remove(actor);
Arena.Actors(Module.Enemies(OIDs));
}
}
11 changes: 5 additions & 6 deletions BossMod/Modules/Endwalker/Savage/P3SPhoinix/BirdTether.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class BirdTether(BossModule module) : BossComponent(module)

public override void Update()
{
Service.Log($"{NumFinishedChains}");
_playersInAOE.Reset();
var birdsLarge = Module.Enemies(OID.SunbirdLarge);
for (var i = 0; i < Math.Min(birdsLarge.Count, _chains.Length); ++i)
Expand Down Expand Up @@ -107,8 +108,6 @@ public override void DrawArenaForeground(int pcSlot, Actor pc)
{
// draw all birds and all players
var birdsLarge = Module.Enemies(OID.SunbirdLarge);
foreach (var bird in birdsLarge)
Arena.Actor(bird, Colors.Enemy);
foreach ((var i, var player) in Raid.WithSlot())
Arena.Actor(player, _playersInAOE[i] ? Colors.PlayerInteresting : Colors.PlayerGeneric);

Expand All @@ -129,9 +128,9 @@ public override void DrawArenaForeground(int pcSlot, Actor pc)
Arena.AddLine(pc.Position, p2.Position, (pc.Tether.ID == (uint)TetherID.LargeBirdFar) ? Colors.Safe : Colors.Danger);
}

if (bird.Position != Module.Center)
if (bird.Position != Arena.Center)
{
var safespot = bird.Position + (Module.Center - bird.Position).Normalized() * _chargeMinSafeDistance;
var safespot = bird.Position + (Arena.Center - bird.Position).Normalized() * _chargeMinSafeDistance;
Arena.AddCircle(safespot, 1, Colors.Safe);
}
}
Expand All @@ -151,9 +150,9 @@ public override void DrawArenaForeground(int pcSlot, Actor pc)
{
Arena.AddLine(bird.Position, pc.Position, (p1.Tether.ID == (uint)TetherID.LargeBirdFar) ? Colors.Safe : Colors.Danger);

if (bird.Position != Module.Center)
if (bird.Position != Arena.Center)
{
var safespot = bird.Position + (Module.Center - bird.Position).Normalized() * _chargeMinSafeDistance;
var safespot = bird.Position + (Arena.Center - bird.Position).Normalized() * _chargeMinSafeDistance;
Arena.AddCircle(safespot, 1, Colors.Safe);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ private WPos PositionForOrder(int order)
// TODO: consider how this can be improved...
var markID = (int)Waymark.N1 + (order - 1) % 4;
var wm = WorldState.Waymarks[markID];
return wm != null ? new(wm.Value.XZ()) : Module.Center;
return wm != null ? new(wm.Value.XZ()) : Arena.Center;
}
}
23 changes: 0 additions & 23 deletions BossMod/Modules/Endwalker/Savage/P3SPhoinix/DevouringBrand.cs

This file was deleted.

111 changes: 35 additions & 76 deletions BossMod/Modules/Endwalker/Savage/P3SPhoinix/Fireplume.cs
Original file line number Diff line number Diff line change
@@ -1,58 +1,22 @@
namespace BossMod.Endwalker.Savage.P3SPhoinix;

// state related to 'single' and 'multi' fireplumes (normal or parts of gloryplume)
class Fireplume(BossModule module) : BossComponent(module)
class Fireplume(BossModule module) : Components.GenericAOEs(module)
{
private WPos? _singlePos;
private Angle _multiStartingDirection;
private int _multiStartedCasts;
private int _multiFinishedCasts;
private static readonly AOEShapeCircle circleBig = new(15);
private static readonly AOEShapeCircle circleSmall = new(10);
private readonly List<AOEInstance> _aoes = [];

private const float _singleRadius = 15;
private const float _multiRadius = 10;
private const float _multiPairOffset = 15;

public override void AddHints(int slot, Actor actor, TextHints hints)
{
if (_singlePos != null && actor.Position.InCircle(_singlePos.Value, _singleRadius))
{
hints.Add("GTFO from plume!");
}

if (_multiStartedCasts > _multiFinishedCasts)
{
if (_multiFinishedCasts > 0 && actor.Position.InCircle(Module.Center, _multiRadius) ||
_multiFinishedCasts < 8 && InPair(_multiStartingDirection + 45.Degrees(), actor) ||
_multiFinishedCasts < 6 && InPair(_multiStartingDirection - 90.Degrees(), actor) ||
_multiFinishedCasts < 4 && InPair(_multiStartingDirection - 45.Degrees(), actor) ||
_multiFinishedCasts < 2 && InPair(_multiStartingDirection, actor))
{
hints.Add("GTFO from plume!");
}
}
}

public override void DrawArenaBackground(int pcSlot, Actor pc)
public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_singlePos != null)
{
Arena.ZoneCircle(_singlePos.Value, _singleRadius, Colors.AOE);
}

if (_multiStartedCasts > _multiFinishedCasts)
var count = _aoes.Count;
for (var i = 0; i < count; ++i)
{
if (_multiFinishedCasts > 0) // don't draw center aoe before first explosion, it's confusing - but start drawing it immediately after first explosion, to simplify positioning
Arena.ZoneCircle(Module.Center, _multiRadius, _multiFinishedCasts >= 6 ? Colors.Danger : Colors.AOE);

// don't draw more than two next pairs
if (_multiFinishedCasts < 8)
DrawPair(_multiStartingDirection + 45.Degrees(), _multiStartedCasts > 6 && _multiFinishedCasts >= 4);
if (_multiFinishedCasts < 6)
DrawPair(_multiStartingDirection - 90.Degrees(), _multiStartedCasts > 4 && _multiFinishedCasts >= 2);
if (_multiFinishedCasts < 4)
DrawPair(_multiStartingDirection - 45.Degrees(), _multiStartedCasts > 2);
if (_multiFinishedCasts < 2)
DrawPair(_multiStartingDirection, true);
var aoe = _aoes[i];
if (i < 2)
yield return count > 1 ? aoe with { Color = Colors.Danger } : aoe;
else if (i is > 1 and < 8)
yield return aoe with { Risky = false };
}
}

Expand All @@ -62,42 +26,37 @@ public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
case AID.ExperimentalFireplumeSingleAOE:
case AID.ExperimentalGloryplumeSingleAOE:
_singlePos = caster.Position;
_aoes.Add(new(circleBig, spell.LocXZ, default, Module.CastFinishAt(spell)));
break;
case AID.ExperimentalFireplumeMultiAOE:
case AID.ExperimentalGloryplumeMultiAOE:
if (_multiStartedCasts++ == 0)
_multiStartingDirection = Angle.FromDirection(caster.Position - Module.Center);
if (_aoes.Count == 0)
{
var startingDirection = Angle.FromDirection(caster.Position - Arena.Center);
for (var i = 0; i < 4; ++i)
{
var activation = Module.CastFinishAt(spell, i * 1);
var dir = 15 * (startingDirection - i * 45.Degrees()).ToDirection();
_aoes.Add(new(circleSmall, Arena.Center + dir, default, activation));
_aoes.Add(new(circleSmall, Arena.Center - dir, default, activation));
}
_aoes.Add(new(circleSmall, Arena.Center, default, Module.CastFinishAt(spell, 4)));
}
break;
}
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
switch ((AID)spell.Action.ID)
{
case AID.ExperimentalFireplumeSingleAOE:
case AID.ExperimentalGloryplumeSingleAOE:
_singlePos = null;
break;
case AID.ExperimentalFireplumeMultiAOE:
case AID.ExperimentalGloryplumeMultiAOE:
++_multiFinishedCasts;
break;
}
}

private bool InPair(Angle direction, Actor actor)
{
var offset = _multiPairOffset * direction.ToDirection();
return actor.Position.InCircle(Module.Center - offset, _multiRadius)
|| actor.Position.InCircle(Module.Center + offset, _multiRadius);
}

private void DrawPair(Angle direction, bool imminent)
{
var offset = _multiPairOffset * direction.ToDirection();
Arena.ZoneCircle(Module.Center + offset, _multiRadius, imminent ? Colors.Danger : Colors.AOE);
Arena.ZoneCircle(Module.Center - offset, _multiRadius, imminent ? Colors.Danger : Colors.AOE);
if (_aoes.Count != 0)
switch ((AID)spell.Action.ID)
{
case AID.ExperimentalFireplumeSingleAOE:
case AID.ExperimentalGloryplumeSingleAOE:
case AID.ExperimentalFireplumeMultiAOE:
case AID.ExperimentalGloryplumeMultiAOE:
_aoes.RemoveAt(0);
break;
}
}
}
16 changes: 15 additions & 1 deletion BossMod/Modules/Endwalker/Savage/P3SPhoinix/P3S.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
namespace BossMod.Endwalker.Savage.P3SPhoinix;

class HeatOfCondemnation(BossModule module) : Components.TankbusterTether(module, ActionID.MakeSpell(AID.HeatOfCondemnationAOE), (uint)TetherID.HeatOfCondemnation, 6);
class DevouringBrand(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.DevouringBrandAOE), new AOEShapeCross(40, 5));
class SunBirdLarge(BossModule module) : Components.Adds(module, (uint)OID.SunbirdLarge)
{
public int FinishedTethers;
public override void Update()
{
var comp = Module.FindComponent<BirdTether>();
if (comp != null)
FinishedTethers = comp.NumFinishedChains;
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 807, NameID = 10720, PlanLevel = 90)]
class SunBirdSmall(BossModule module) : Components.Adds(module, (uint)OID.SunbirdSmall);
class DarkenedFireAdd(BossModule module) : Components.Adds(module, (uint)OID.DarkenedFire);

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "Malediktus", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 807, NameID = 10720, PlanLevel = 90)]
public class P3S(WorldState ws, Actor primary) : BossModule(ws, primary, new(100, 100), new ArenaBoundsCircle(20));
Loading

0 comments on commit 6f97fb1

Please sign in to comment.