From 0033aecd3c0bedc14ba9fd5cff64a5d4b0022b26 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Mon, 2 Oct 2023 14:08:02 +0200 Subject: [PATCH] Use better hook for changed jobs. --- Glamourer.GameData/Offsets.cs | 2 +- Glamourer/Interop/JobService.cs | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Glamourer.GameData/Offsets.cs b/Glamourer.GameData/Offsets.cs index 347ced8..a6b5d1f 100644 --- a/Glamourer.GameData/Offsets.cs +++ b/Glamourer.GameData/Offsets.cs @@ -13,7 +13,7 @@ public static class Offsets 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 ChangeCustomize = "E8 ?? ?? ?? ?? 41 0F B6 C5 66 41 89 86"; } diff --git a/Glamourer/Interop/JobService.cs b/Glamourer/Interop/JobService.cs index 4a91338..fd00dd7 100644 --- a/Glamourer/Interop/JobService.cs +++ b/Glamourer/Interop/JobService.cs @@ -31,19 +31,24 @@ public class JobService : IDisposable public void 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))] private readonly Hook _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.Original(data, jobIndex); + _changeJobHook.OriginalDisposeSafe(data, oldJobIndex, newJobIndex); + + // Do not trigger on creation (Adventurer -> Anything) + if (oldJobIndex is 0) + return; + var actor = (Actor)(data - _characterDataOffset); - var job = Jobs.TryGetValue((byte)jobIndex, out var j) ? j : Jobs[0]; - var oldJob = Jobs.TryGetValue(old, out var o) ? o : Jobs[0]; - Glamourer.Log.Excessive($"{actor} changed job from {oldJob} to {job}"); - JobChanged?.Invoke(actor, oldJob, job); + var newJob = Jobs.TryGetValue(newJobIndex, out var j) ? j : Jobs[0]; + var oldJob = Jobs.TryGetValue(oldJobIndex, out var o) ? o : Jobs[0]; + + Glamourer.Log.Excessive($"{actor} changed job from {oldJob} to {newJob}."); + JobChanged?.Invoke(actor, oldJob, newJob); } }