Skip to content

Commit e7d8c93

Browse files
Merge pull request #969 from FFXIV-CombatReborn/mergeWIP2
merge vbm
2 parents b5af0dc + eca9311 commit e7d8c93

File tree

3 files changed

+41
-32
lines changed

3 files changed

+41
-32
lines changed

BossMod/Autorotation/Standard/xan/AI/Tank.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -204,22 +204,25 @@ private bool ShouldRanged(StrategyValues strategy, Actor? primaryTarget)
204204

205205
private void AutoProtect()
206206
{
207-
var threat = Hints.PriorityTargets.FirstOrDefault(x =>
208-
// skip all of this for fates mobs, we can't provoke them and probably don't care about this anyway
209-
x.Actor.FateID == 0
210-
&& World.Actors.Find(x.Actor.TargetID) is Actor victim
211-
&& victim.IsAlly
212-
&& victim.Class.GetRole() != Role.Tank
207+
var threat = Hints.PotentialTargets.TakeWhile(t => t.Priority >= AIHints.Enemy.PriorityInvincible).FirstOrDefault(x =>
208+
// fate mobs are immune to provoke and we probably don't care about this anyway
209+
x.Actor.FateID == default
210+
&& World.Party.FindSlot(x.Actor.TargetID) is var slot && slot >= 0
211+
&& World.Party[slot]!.Class.GetRole() != Role.Tank
213212
);
214213
if (threat != null)
215214
{
216-
if (Player.DistanceToHitbox(threat.Actor) > 3)
217-
Hints.ActionsToExecute.Push(JobActions.Ranged, threat.Actor, ActionQueue.Priority.VeryHigh);
218-
else
219-
// in case all mobs are in melee range, but there aren't enough mobs to switch to aoe
220-
Hints.ForcedTarget = threat.Actor;
221-
215+
// provoke works on invincible mobs
222216
Hints.ActionsToExecute.Push(ActionID.MakeSpell(ClassShared.AID.Provoke), threat.Actor, ActionQueue.Priority.Medium);
217+
218+
if (threat.Priority > AIHints.Enemy.PriorityInvincible)
219+
{
220+
if (Player.DistanceToHitbox(threat.Actor) > 3)
221+
Hints.ActionsToExecute.Push(JobActions.Ranged, threat.Actor, ActionQueue.Priority.ManualGCD - 100);
222+
else
223+
// in case all mobs are in melee range, but there aren't enough mobs to switch to aoe
224+
Hints.ForcedTarget = threat.Actor;
225+
}
223226
}
224227

225228
foreach (var rw in Raidwides)
@@ -231,7 +234,7 @@ private void AutoProtect()
231234
}
232235

233236
foreach (var (ally, t) in Tankbusters)
234-
if (ally != Player && (t - World.CurrentTime).TotalSeconds < 4)
237+
if (ally != Player && (t - World.CurrentTime).TotalSeconds < 4d)
235238
Hints.ActionsToExecute.Push(JobActions.AllyMit.ID, ally, ActionQueue.Priority.Low);
236239
}
237240

BossMod/Framework/WorldStateGameSync.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ sealed class WorldStateGameSync : IDisposable
7373

7474
private readonly unsafe delegate* unmanaged<ContainerInterface*, float> _calculateMoveSpeedMulti;
7575

76-
private unsafe delegate void ProcessMapEffectDelegate(byte* data);
76+
private unsafe delegate void ProcessMapEffectDelegate(ContentDirector* director, byte* packet);
7777

7878
private readonly Hook<ProcessMapEffectDelegate> _processMapEffect1Hook;
7979
private readonly Hook<ProcessMapEffectDelegate> _processMapEffect2Hook;
@@ -143,12 +143,15 @@ public unsafe WorldStateGameSync(WorldState ws, ActionManagerEx amex)
143143
_calculateMoveSpeedMulti = (delegate* unmanaged<ContainerInterface*, float>)Service.SigScanner.ScanText("E8 ?? ?? ?? ?? 44 0F 28 D8 45 0F 57 D2");
144144
Service.Log($"[WSG] CalculateMovementSpeedMultiplier address = 0x{(nint)_calculateMoveSpeedMulti:X}");
145145

146-
var processMapEffectAddr = Service.SigScanner.ScanText("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 4C 8D 47 10 8B D6 48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 4F 10 E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 4C 8D 47 10 8B D6 48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 4F 10 E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 48 8D 4F 10 BA");
147-
_processMapEffect1Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(processMapEffectAddr, ProcessMapEffect1Detour);
146+
var mapEffectAddrs = Service.SigScanner.ScanAllText("40 55 41 57 48 83 EC ?? 48 83 B9");
147+
if (mapEffectAddrs.Length != 3)
148+
throw new InvalidOperationException($"expected 3 matches for multi-MapEffect handlers, but got {mapEffectAddrs.Length}");
149+
150+
_processMapEffect1Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(mapEffectAddrs[0], ProcessMapEffect1Detour);
148151
_processMapEffect1Hook.Enable();
149-
_processMapEffect2Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(processMapEffectAddr + 0x40, ProcessMapEffect2Detour);
152+
_processMapEffect2Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(mapEffectAddrs[1], ProcessMapEffect2Detour);
150153
_processMapEffect2Hook.Enable();
151-
_processMapEffect3Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(processMapEffectAddr + 0x80, ProcessMapEffect3Detour);
154+
_processMapEffect3Hook = Service.Hook.HookFromAddress<ProcessMapEffectDelegate>(mapEffectAddrs[2], ProcessMapEffect3Detour);
152155
_processMapEffect3Hook.Enable();
153156
Service.Log($"[WSG] MapEffect addresses = 0x{_processMapEffect1Hook.Address:X}, 0x{_processMapEffect2Hook.Address:X}, 0x{_processMapEffect3Hook.Address:X}");
154157
}
@@ -1026,27 +1029,28 @@ private unsafe void ProcessPacketOpenTreasureDetour(uint playerID, byte* packet)
10261029
return res;
10271030
}
10281031

1029-
private unsafe void ProcessMapEffect1Detour(byte* data)
1032+
private unsafe void ProcessMapEffect1Detour(ContentDirector* director, byte* packet)
10301033
{
1031-
_processMapEffect1Hook.Original(data);
1032-
ProcessMapEffect(data, 10, 18);
1034+
_processMapEffect1Hook.Original(director, packet);
1035+
ProcessMapEffect(packet, 10, 18);
10331036
}
10341037

1035-
private unsafe void ProcessMapEffect2Detour(byte* data)
1038+
private unsafe void ProcessMapEffect2Detour(ContentDirector* director, byte* packet)
10361039
{
1037-
_processMapEffect2Hook.Original(data);
1038-
ProcessMapEffect(data, 18, 34);
1040+
_processMapEffect2Hook.Original(director, packet);
1041+
ProcessMapEffect(packet, 18, 34);
10391042
}
10401043

1041-
private unsafe void ProcessMapEffect3Detour(byte* data)
1044+
private unsafe void ProcessMapEffect3Detour(ContentDirector* director, byte* packet)
10421045
{
1043-
_processMapEffect3Hook.Original(data);
1044-
ProcessMapEffect(data, 26, 50);
1046+
_processMapEffect3Hook.Original(director, packet);
1047+
ProcessMapEffect(packet, 26, 50);
10451048
}
10461049

10471050
private unsafe void ProcessMapEffect(byte* data, byte offLow, byte offIndex)
10481051
{
1049-
for (var i = 0; i < *data; ++i)
1052+
var count = *data;
1053+
for (var i = 0; i < count; ++i)
10501054
{
10511055
var low = *(ushort*)(data + 2 * i + offLow);
10521056
var high = *(ushort*)(data + 2 * i + 2);

BossMod/Replay/Visualization/IPCList.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ protected override NetworkState.IDScrambleFields GetScramble()
4545
PacketID.ItemInfo,
4646
PacketID.ContainerInfo
4747
];
48+
private bool _filterInvert;
4849

4950
public void Draw(UITree tree, DateTime reference)
5051
{
@@ -59,6 +60,7 @@ public void Draw(UITree tree, DateTime reference)
5960
public void ClearFilters()
6061
{
6162
_filteredPackets.Clear();
63+
_filterInvert = false;
6264
_nodes = null;
6365
}
6466

@@ -70,21 +72,21 @@ private void DrawNodes(UITree tree, List<PacketDecoder.TextNode>? nodes)
7072
DrawNodes(tree, n.Children);
7173
}
7274

73-
private bool FilterOp(NetworkState.OpServerIPC op) => !_filteredPackets.Contains(op.Packet.ID);
75+
private bool FilterOp(NetworkState.OpServerIPC op) => _filterInvert ? _filteredPackets.Contains(op.Packet.ID) : !_filteredPackets.Contains(op.Packet.ID);
7476

7577
private void ContextMenu(NetworkState.OpServerIPC op)
7678
{
7779
if (ImGui.MenuItem($"Filter out opcode {op.Packet.ID}"))
7880
{
7981
_filteredPackets.Add(op.Packet.ID);
82+
_filterInvert = false;
8083
_nodes = null;
8184
}
8285
if (ImGui.MenuItem($"Focus opcode {op.Packet.ID}"))
8386
{
8487
_filteredPackets.Clear();
85-
foreach (var p in Enum.GetValues<PacketID>())
86-
_filteredPackets.Add(p);
87-
_filteredPackets.Remove(op.Packet.ID);
88+
_filteredPackets.Add(op.Packet.ID);
89+
_filterInvert = true;
8890
_nodes = null;
8991
}
9092
}

0 commit comments

Comments
 (0)