Skip to content

Commit

Permalink
Merge pull request #582 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
refactor worqor zormor b2+3, some tweaks
  • Loading branch information
CarnifexOptimus authored Jan 26, 2025
2 parents 30614d6 + 1ee82c8 commit 66c20c6
Show file tree
Hide file tree
Showing 30 changed files with 340 additions and 263 deletions.
5 changes: 3 additions & 2 deletions BossMod/BossModule/AIHintsVisualizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ private MapVisualizer BuildZoneVisualizer(Func<WPos, float> shape)
{
var map = new Map();
hints.InitPathfindMap(map);
map.BlockPixelsInside(shape, 0, NavigationDecision.DefaultForbiddenZoneCushion);
map.BlockPixelsInside(shape, 0, map.Resolution * NavigationDecision.DefaultForbiddenZoneCushion);
return new MapVisualizer(map, 0, player.Position);
}

Expand All @@ -68,8 +68,9 @@ private MapVisualizer BuildPathfindingVisualizer()
_navi.Map = new();
hints.PathfindMapBounds.PathfindMap(_navi.Map, hints.PathfindMapCenter);
var imm = NavigationDecision.ImminentExplosionTime(ws.CurrentTime);
var cushion = _navi.Map.Resolution * NavigationDecision.DefaultForbiddenZoneCushion;
foreach (var (shape, activation) in hints.ForbiddenZones)
NavigationDecision.AddBlockerZone(_navi.Map, imm, activation, shape, NavigationDecision.DefaultForbiddenZoneCushion);
NavigationDecision.AddBlockerZone(_navi.Map, imm, activation, shape, cushion);
if (targetEnemy != null)
_navi.MapGoal = NavigationDecision.AddTargetGoal(_navi.Map, targetEnemy.Actor.Position, targetEnemy.Actor.HitboxRadius + player.HitboxRadius + targeting.range, targetEnemy.Actor.Rotation, targeting.pos, 0);
}
Expand Down
13 changes: 12 additions & 1 deletion BossMod/BossModule/BossModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,18 @@ public List<Actor> Enemies(ReadOnlySpan<uint> enemies)
// component management: at most one component of any given type can be active at any time
public readonly List<BossComponent> Components = [];

public T? FindComponent<T>() where T : BossComponent => Components.OfType<T>().FirstOrDefault();
public T? FindComponent<T>() where T : BossComponent
{
var count = Components.Count;
for (var i = 0; i < count; ++i)
{
if (Components[i] is T matchingComponent)
{
return matchingComponent;
}
}
return null;
}
private int componentCount;

public void ActivateComponent<T>() where T : BossComponent
Expand Down
150 changes: 83 additions & 67 deletions BossMod/Data/ActorState.cs

Large diffs are not rendered by default.

32 changes: 16 additions & 16 deletions BossMod/Data/ClientState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public void Tick(float dt)
public Event<OpActionRequest> ActionRequested = new();
public sealed record class OpActionRequest(ClientActionRequest Request) : WorldState.Operation
{
protected override void Exec(WorldState ws) => ws.Client.ActionRequested.Fire(this);
protected override void Exec(ref WorldState ws) => ws.Client.ActionRequested.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("CLAR"u8)
.Emit(Request.Action)
.EmitActor(Request.TargetID)
Expand All @@ -207,7 +207,7 @@ public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("C
public Event<OpActionReject> ActionRejected = new();
public sealed record class OpActionReject(ClientActionReject Value) : WorldState.Operation
{
protected override void Exec(WorldState ws) => ws.Client.ActionRejected.Fire(this);
protected override void Exec(ref WorldState ws) => ws.Client.ActionRejected.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("CLRJ"u8)
.Emit(Value.Action)
.Emit(Value.SourceSequence)
Expand All @@ -218,7 +218,7 @@ public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("C
public Event<OpCountdownChange> CountdownChanged = new();
public sealed record class OpCountdownChange(float? Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.CountdownRemaining = Value;
ws.Client.CountdownChanged.Fire(this);
Expand All @@ -235,7 +235,7 @@ public override void Write(ReplayRecorder.Output output)
public Event<OpAnimationLockChange> AnimationLockChanged = new();
public sealed record class OpAnimationLockChange(float Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.AnimationLock = Value;
ws.Client.AnimationLockChanged.Fire(this);
Expand All @@ -246,7 +246,7 @@ protected override void Exec(WorldState ws)
public Event<OpComboChange> ComboChanged = new();
public sealed record class OpComboChange(Combo Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.ComboState = Value;
ws.Client.ComboChanged.Fire(this);
Expand All @@ -257,7 +257,7 @@ protected override void Exec(WorldState ws)
public Event<OpPlayerStatsChange> PlayerStatsChanged = new();
public sealed record class OpPlayerStatsChange(Stats Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.PlayerStats = Value;
ws.Client.PlayerStatsChanged.Fire(this);
Expand All @@ -268,12 +268,12 @@ protected override void Exec(WorldState ws)
public Event<OpCooldown> CooldownsChanged = new();
public sealed record class OpCooldown(bool Reset, List<(int group, Cooldown value)> Cooldowns) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
if (Reset)
Array.Fill(ws.Client.Cooldowns, default);

for (var i = 0; i < Cooldowns.Count; ++i)
var count = Cooldowns.Count;
for (var i = 0; i < count; ++i)
{
var cd = Cooldowns[i];
ws.Client.Cooldowns[cd.group] = cd.value;
Expand All @@ -297,7 +297,7 @@ public override void Write(ReplayRecorder.Output output)
public Event<OpDutyActionsChange> DutyActionsChanged = new();
public sealed record class OpDutyActionsChange(DutyAction Slot0, DutyAction Slot1) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.DutyActions[0] = Slot0;
ws.Client.DutyActions[1] = Slot1;
Expand All @@ -309,7 +309,7 @@ protected override void Exec(WorldState ws)
public Event<OpBozjaHolsterChange> BozjaHolsterChanged = new();
public sealed record class OpBozjaHolsterChange(List<(BozjaHolsterID entry, byte count)> Contents) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
Array.Fill(ws.Client.BozjaHolster, (byte)0);
for (var i = 0; i < Contents.Count; ++i)
Expand Down Expand Up @@ -337,7 +337,7 @@ public sealed record class OpBlueMageSpellsChange(uint[] Values) : WorldState.Op
{
public readonly uint[] Values = Values;

protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
Array.Copy(Values, ws.Client.BlueMageSpells, NumBlueMageSpells);
ws.Client.BlueMageSpellsChanged.Fire(this);
Expand All @@ -359,7 +359,7 @@ public sealed record class OpClassJobLevelsChange(short[] Values) : WorldState.O
{
public readonly short[] Values = Values;

protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
Array.Fill(ws.Client.ClassJobLevels, (short)0);
for (var i = 0; i < Values.Length; ++i)
Expand All @@ -381,7 +381,7 @@ public override void Write(ReplayRecorder.Output output)
public Event<OpActiveFateChange> ActiveFateChanged = new();
public sealed record class OpActiveFateChange(Fate Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.ActiveFate = Value;
ws.Client.ActiveFateChanged.Fire(this);
Expand All @@ -392,7 +392,7 @@ protected override void Exec(WorldState ws)
public Event<OpActivePetChange> ActivePetChanged = new();
public sealed record class OpActivePetChange(Pet Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.ActivePet = Value;
ws.Client.ActivePetChanged.Fire(this);
Expand All @@ -403,7 +403,7 @@ protected override void Exec(WorldState ws)
public Event<OpFocusTargetChange> FocusTargetChanged = new();
public sealed record class OpFocusTargetChange(ulong Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Client.FocusTargetId = Value;
ws.Client.FocusTargetChanged.Fire(this);
Expand Down
4 changes: 2 additions & 2 deletions BossMod/Data/NetworkState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public readonly record struct ServerIPC(Network.ServerIPC.PacketID ID, ushort Op
public Event<OpIDScramble> IDScrambleChanged = new();
public sealed record class OpIDScramble(uint Value) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Network.IDScramble = Value;
ws.Network.IDScrambleChanged.Fire(this);
Expand All @@ -28,7 +28,7 @@ protected override void Exec(WorldState ws)
public Event<OpServerIPC> ServerIPCReceived = new();
public sealed record class OpServerIPC(ServerIPC Packet) : WorldState.Operation
{
protected override void Exec(WorldState ws) => ws.Network.ServerIPCReceived.Fire(this);
protected override void Exec(ref WorldState ws) => ws.Network.ServerIPCReceived.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("IPCS"u8)
.Emit((int)Packet.ID)
.Emit(Packet.Opcode)
Expand Down
4 changes: 2 additions & 2 deletions BossMod/Data/PartyState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public int FindSlot(ReadOnlySpan<char> name, StringComparison cmp = StringCompar
public Event<OpModify> Modified = new();
public sealed record class OpModify(int Slot, Member Member) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
if (Slot >= 0 && Slot < ws.Party.Members.Length)
{
Expand All @@ -176,7 +176,7 @@ protected override void Exec(WorldState ws)
public Event<OpLimitBreakChange> LimitBreakChanged = new();
public sealed record class OpLimitBreakChange(int Cur, int Max) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Party.LimitBreakCur = Cur;
ws.Party.LimitBreakMax = Max;
Expand Down
2 changes: 1 addition & 1 deletion BossMod/Data/WaymarkState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public Vector3? this[Waymark wm]
public Event<OpWaymarkChange> Changed = new();
public sealed record class OpWaymarkChange(Waymark ID, Vector3? Pos) : WorldState.Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Waymarks[ID] = Pos;
ws.Waymarks.Changed.Fire(this);
Expand Down
18 changes: 9 additions & 9 deletions BossMod/Data/WorldState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ public abstract record class Operation

internal void Execute(WorldState ws)
{
Exec(ws);
Exec(ref ws);
Timestamp = ws.CurrentTime;
}

protected abstract void Exec(WorldState ws);
protected abstract void Exec(ref WorldState ws);
public abstract void Write(ReplayRecorder.Output output);
}

Expand Down Expand Up @@ -78,7 +78,7 @@ public List<Operation> CompareToInitial()
public Event<OpFrameStart> FrameStarted = new();
public sealed record class OpFrameStart(FrameState Frame, TimeSpan PrevUpdateTime, ClientState.Gauge GaugePayload, Angle CameraAzimuth) : Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.Frame = Frame;
ws.Client.CameraAzimuth = CameraAzimuth;
Expand All @@ -103,14 +103,14 @@ public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("F
public Event<OpUserMarker> UserMarkerAdded = new();
public sealed record class OpUserMarker(string Text) : Operation
{
protected override void Exec(WorldState ws) => ws.UserMarkerAdded.Fire(this);
protected override void Exec(ref WorldState ws) => ws.UserMarkerAdded.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("UMRK"u8).Emit(Text);
}

public Event<OpRSVData> RSVDataReceived = new();
public sealed record class OpRSVData(string Key, string Value) : Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
Service.LuminaRSV[Key] = Encoding.UTF8.GetBytes(Value); // TODO: reconsider...
ws.RSVEntries[Key] = Value;
Expand All @@ -122,7 +122,7 @@ protected override void Exec(WorldState ws)
public Event<OpZoneChange> CurrentZoneChanged = new();
public sealed record class OpZoneChange(ushort Zone, ushort CFCID) : Operation
{
protected override void Exec(WorldState ws)
protected override void Exec(ref WorldState ws)
{
ws.CurrentZone = Zone;
ws.CurrentCFCID = CFCID;
Expand All @@ -135,14 +135,14 @@ protected override void Exec(WorldState ws)
public Event<OpDirectorUpdate> DirectorUpdate = new();
public sealed record class OpDirectorUpdate(uint DirectorID, uint UpdateID, uint Param1, uint Param2, uint Param3, uint Param4) : Operation
{
protected override void Exec(WorldState ws) => ws.DirectorUpdate.Fire(this);
protected override void Exec(ref WorldState ws) => ws.DirectorUpdate.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("DIRU"u8).Emit(DirectorID, "X8").Emit(UpdateID, "X8").Emit(Param1, "X8").Emit(Param2, "X8").Emit(Param3, "X8").Emit(Param4, "X8");
}

public Event<OpEnvControl> EnvControl = new();
public sealed record class OpEnvControl(byte Index, uint State) : Operation
{
protected override void Exec(WorldState ws) => ws.EnvControl.Fire(this);
protected override void Exec(ref WorldState ws) => ws.EnvControl.Fire(this);
public override void Write(ReplayRecorder.Output output) => output.EmitFourCC("ENVC"u8).Emit(Index, "X2").Emit(State, "X8");
}

Expand All @@ -151,7 +151,7 @@ public sealed record class OpSystemLogMessage(uint MessageId, int[] Args) : Oper
{
public readonly int[] Args = Args;

protected override void Exec(WorldState ws) => ws.SystemLogMessage.Fire(this);
protected override void Exec(ref WorldState ws) => ws.SystemLogMessage.Fire(this);
public override void Write(ReplayRecorder.Output output)
{
output.EmitFourCC("SLOG"u8).Emit(MessageId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ public enum TetherID : uint
Freeze = 272 // RorrlohTeh/QorrlohTeh1->Boss
}

class FrostingFracasArenaChange(BossModule module) : Components.GenericAOEs(module)
class ArenaChange(BossModule module) : Components.GenericAOEs(module)
{
private static readonly AOEShapeDonut donut = new(20, 22.5f);
private static readonly AOEShapeDonut donut = new(20, 23);
private AOEInstance? _aoe;

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor) => Utils.ZeroOrOne(_aoe);
Expand Down Expand Up @@ -141,7 +141,7 @@ class D021RyoqorTertehStates : StateMachineBuilder
public D021RyoqorTertehStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<FrostingFracasArenaChange>()
.ActivateOnEnter<ArenaChange>()
.ActivateOnEnter<FrostingFracas>()
.ActivateOnEnter<IceScreamFrozenSwirl>()
.ActivateOnEnter<SnowBoulder>()
Expand All @@ -150,8 +150,9 @@ public D021RyoqorTertehStates(BossModule module) : base(module)
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus, LTS)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 824, NameID = 12699)]
public class D021RyoqorTerteh(WorldState ws, Actor primary) : BossModule(ws, primary, new(-108, 119), StartingBounds)
public class D021RyoqorTerteh(WorldState ws, Actor primary) : BossModule(ws, primary, StartingBounds.Center, StartingBounds)
{
public static readonly ArenaBounds StartingBounds = new ArenaBoundsCircle(22.5f);
public static readonly ArenaBounds DefaultBounds = new ArenaBoundsCircle(20);
private static readonly WPos arenaCenter = new(-108, 119);
public static readonly ArenaBoundsComplex StartingBounds = new([new Polygon(arenaCenter, 22.5f, 52)]);
public static readonly ArenaBoundsComplex DefaultBounds = new([new Polygon(arenaCenter, 20, 52)]);
}
Loading

0 comments on commit 66c20c6

Please sign in to comment.