From e6b7ad73513ab1ad9321986505f13cd1946b402f Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Wed, 24 May 2023 11:26:04 +0200 Subject: [PATCH] Patch 6.4: add Prefix to Nameplate hook & update sigs --- .../AddonNamePlate_SetPlayerNameEventArgs.cs | 1 + ...NamePlate_SetPlayerNameManagedEventArgs.cs | 1 + Pilz.Dalamud/Nameplates/NameplateHooks.cs | 31 ++++++++++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameEventArgs.cs b/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameEventArgs.cs index 3a67e2b..ee54336 100644 --- a/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameEventArgs.cs +++ b/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameEventArgs.cs @@ -12,6 +12,7 @@ namespace Pilz.Dalamud.Nameplates.EventArgs public IntPtr TitlePtr { get; set; } public IntPtr NamePtr { get; set; } public IntPtr FreeCompanyPtr { get; set; } + public IntPtr PrefixPtr { get; set; } public bool IsTitleAboveName { get; set; } public bool IsTitleVisible { get; set; } public int IconID { get; set; } diff --git a/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameManagedEventArgs.cs b/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameManagedEventArgs.cs index 511ff28..defcdf6 100644 --- a/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameManagedEventArgs.cs +++ b/Pilz.Dalamud/Nameplates/EventArgs/AddonNamePlate_SetPlayerNameManagedEventArgs.cs @@ -20,6 +20,7 @@ namespace Pilz.Dalamud.Nameplates.EventArgs public SeString Title { get; internal set; } public SeString Name { get; internal set; } public SeString FreeCompany { get; internal set; } + public SeString Prefix { get; internal set; } public bool IsTitleAboveName { diff --git a/Pilz.Dalamud/Nameplates/NameplateHooks.cs b/Pilz.Dalamud/Nameplates/NameplateHooks.cs index 1d28eb4..1c8d207 100644 --- a/Pilz.Dalamud/Nameplates/NameplateHooks.cs +++ b/Pilz.Dalamud/Nameplates/NameplateHooks.cs @@ -28,9 +28,9 @@ namespace Pilz.Dalamud.Nameplates public event AddonNamePlate_SetPlayerNameManagedEventHandler AddonNamePlate_SetPlayerNameManaged; public delegate void AddonNamePlate_SetPlayerNameManagedEventHandler(AddonNamePlate_SetPlayerNameManagedEventArgs eventArgs); - [Signature("48 89 5C 24 ?? 48 89 6C 24 ?? 56 57 41 54 41 56 41 57 48 83 EC 40 44 0F B6 E2", DetourName = nameof(SetPlayerNameplateDetour))] - private readonly Hook? hook_AddonNamePlate_SetPlayerNameplateDetour = null; - private unsafe delegate IntPtr AddonNamePlate_SetPlayerNameplateDetour(IntPtr playerNameplateObjectPtr, bool isTitleAboveName, bool isTitleVisible, IntPtr titlePtr, IntPtr namePtr, IntPtr freeCompanyPtr, int iconId); + [Signature("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 48 8B 5C 24 ?? 45 38 BE", DetourName = nameof(SetPlayerNameplateDetour))] + private Hook? hook_AddonNamePlate_SetPlayerNameplateDetour = null; + private unsafe delegate IntPtr AddonNamePlate_SetPlayerNameplateDetour(IntPtr playerNameplateObjectPtr, bool isTitleAboveName, bool isTitleVisible, IntPtr titlePtr, IntPtr namePtr, IntPtr freeCompanyPtr, IntPtr prefix, int iconId); /// /// Defines if all hooks are enabled. If this is false, then there might be something wrong or the class already has been disposed. @@ -86,7 +86,7 @@ namespace Pilz.Dalamud.Nameplates return hook != null && hook.IsEnabled; } - private IntPtr SetPlayerNameplateDetour(IntPtr playerNameplateObjectPtr, bool isTitleAboveName, bool isTitleVisible, IntPtr titlePtr, IntPtr namePtr, IntPtr freeCompanyPtr, int iconId) + private IntPtr SetPlayerNameplateDetour(IntPtr playerNameplateObjectPtr, bool isTitleAboveName, bool isTitleVisible, IntPtr titlePtr, IntPtr namePtr, IntPtr freeCompanyPtr, IntPtr prefix, int iconId) { var result = IntPtr.Zero; @@ -98,6 +98,7 @@ namespace Pilz.Dalamud.Nameplates TitlePtr = titlePtr, NamePtr = namePtr, FreeCompanyPtr = freeCompanyPtr, + PrefixPtr = prefix, IsTitleAboveName = isTitleAboveName, IsTitleVisible = isTitleVisible, IconID = iconId @@ -118,6 +119,7 @@ namespace Pilz.Dalamud.Nameplates eventArgs.TitlePtr, eventArgs.NamePtr, eventArgs.FreeCompanyPtr, + prefix, eventArgs.IconID); }; @@ -130,6 +132,7 @@ namespace Pilz.Dalamud.Nameplates var freeTitle = false; var freeName = false; var freeFreeCompany = false; + var freePrefix = false; // Create NamePlateObject if possible var namePlateObj = new SafeNameplateObject(playerNameplateObjectPtr); @@ -141,18 +144,20 @@ namespace Pilz.Dalamud.Nameplates SafeNameplateObject = namePlateObj, Title = GameInterfaceHelper.ReadSeString(eventArgs.TitlePtr), Name = GameInterfaceHelper.ReadSeString(eventArgs.NamePtr), - FreeCompany = GameInterfaceHelper.ReadSeString(eventArgs.FreeCompanyPtr) + FreeCompany = GameInterfaceHelper.ReadSeString(eventArgs.FreeCompanyPtr), + Prefix = GameInterfaceHelper.ReadSeString(eventArgs.PrefixPtr) }; // Get raw string content var titleRaw = managedEventArgs.Title.Encode(); var nameRaw = managedEventArgs.Name.Encode(); var freeCompanyRaw = managedEventArgs.FreeCompany.Encode(); + var prefixRaw = managedEventArgs.Prefix.Encode(); // Invoke Managed Event AddonNamePlate_SetPlayerNameManaged.Invoke(managedEventArgs); - // Get new Title string ontent + // Get new Title string content var titleNewRaw = managedEventArgs.Title.Encode(); if (!titleRaw.SequenceEqual(titleNewRaw)) { @@ -160,7 +165,7 @@ namespace Pilz.Dalamud.Nameplates freeTitle = true; } - // Get new Name string ontent + // Get new Name string content var nameNewRaw = managedEventArgs.Name.Encode(); if (!nameRaw.SequenceEqual(nameNewRaw)) { @@ -168,7 +173,7 @@ namespace Pilz.Dalamud.Nameplates freeName = true; } - // Get new Free Company string ontent + // Get new Free Company string content var freeCompanyNewRaw = managedEventArgs.FreeCompany.Encode(); if (!freeCompanyRaw.SequenceEqual(freeCompanyNewRaw)) { @@ -176,6 +181,14 @@ namespace Pilz.Dalamud.Nameplates freeFreeCompany = true; } + // Get new Prefix string content + var prefixNewRaw = managedEventArgs.Prefix.Encode(); + if (!prefixRaw.SequenceEqual(prefixNewRaw)) + { + eventArgs.PrefixPtr = GameInterfaceHelper.PluginAllocate(prefixNewRaw); + freePrefix = true; + } + // Call Original as we changed something callOriginal(); @@ -186,6 +199,8 @@ namespace Pilz.Dalamud.Nameplates GameInterfaceHelper.PluginFree(eventArgs.NamePtr); if (freeFreeCompany) GameInterfaceHelper.PluginFree(eventArgs.FreeCompanyPtr); + if (freePrefix) + GameInterfaceHelper.PluginFree(eventArgs.PrefixPtr); } else if(!hasDefaultHookEvent) {