Use better hook for changed jobs.

This commit is contained in:
Ottermandias 2023-10-02 14:08:02 +02:00
parent 36ab87d28e
commit 0033aecd3c
2 changed files with 14 additions and 9 deletions

View file

@ -13,7 +13,7 @@ public static class Offsets
public static class Sigs public static class Sigs
{ {
public const string ChangeJob = "88 51 ?? 44 3B CA"; public const string ChangeJob = "48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 41 56 41 57 48 83 EC ?? 80 61";
public const string FlagSlotForUpdate = "48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 8B DA 49 8B F0 48 8B F9 83 FA 0A"; public const string FlagSlotForUpdate = "48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 8B DA 49 8B F0 48 8B F9 83 FA 0A";
public const string ChangeCustomize = "E8 ?? ?? ?? ?? 41 0F B6 C5 66 41 89 86"; public const string ChangeCustomize = "E8 ?? ?? ?? ?? 41 0F B6 C5 66 41 89 86";
} }

View file

@ -31,19 +31,24 @@ public class JobService : IDisposable
public void Dispose() public void Dispose()
=> _changeJobHook.Dispose(); => _changeJobHook.Dispose();
private delegate void ChangeJobDelegate(nint data, uint job); private delegate void ChangeJobDelegate(nint data, byte oldJob, byte newJob);
[Signature(Sigs.ChangeJob, DetourName = nameof(ChangeJobDetour))] [Signature(Sigs.ChangeJob, DetourName = nameof(ChangeJobDetour))]
private readonly Hook<ChangeJobDelegate> _changeJobHook = null!; private readonly Hook<ChangeJobDelegate> _changeJobHook = null!;
private void ChangeJobDetour(nint data, uint jobIndex) private void ChangeJobDetour(nint data, byte oldJobIndex, byte newJobIndex)
{ {
var old = ((Actor)(data - _characterDataOffset)).Job; _changeJobHook.OriginalDisposeSafe(data, oldJobIndex, newJobIndex);
_changeJobHook.Original(data, jobIndex);
// Do not trigger on creation (Adventurer -> Anything)
if (oldJobIndex is 0)
return;
var actor = (Actor)(data - _characterDataOffset); var actor = (Actor)(data - _characterDataOffset);
var job = Jobs.TryGetValue((byte)jobIndex, out var j) ? j : Jobs[0]; var newJob = Jobs.TryGetValue(newJobIndex, out var j) ? j : Jobs[0];
var oldJob = Jobs.TryGetValue(old, out var o) ? o : Jobs[0]; var oldJob = Jobs.TryGetValue(oldJobIndex, out var o) ? o : Jobs[0];
Glamourer.Log.Excessive($"{actor} changed job from {oldJob} to {job}");
JobChanged?.Invoke(actor, oldJob, job); Glamourer.Log.Excessive($"{actor} changed job from {oldJob} to {newJob}.");
JobChanged?.Invoke(actor, oldJob, newJob);
} }
} }