diff --git a/FakeName/Configuration.cs b/FakeName/Configuration.cs index 04d2edd..53b2925 100644 --- a/FakeName/Configuration.cs +++ b/FakeName/Configuration.cs @@ -10,7 +10,7 @@ public class Configuration : IPluginConfiguration public bool Enabled = false; - public bool PartyMemberReplace = false; + public bool AllPlayerReplace = false; public string FakeNameText = ""; diff --git a/FakeName/Hooker.cs b/FakeName/Hooker.cs index e958a93..908ec4e 100644 --- a/FakeName/Hooker.cs +++ b/FakeName/Hooker.cs @@ -1,8 +1,10 @@ using Dalamud.Game.Text; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Hooking; +using Dalamud.Logging; using Dalamud.Utility.Signatures; using System; +using System.Linq; namespace FakeName; @@ -31,32 +33,78 @@ internal unsafe Hooker() AtkTextNodeSetTextHook.Enable(); SetNamePlateHook.Enable(); - Service.ChatGui.ChatMessage += OnChatMessage; } public unsafe void Dispose() { AtkTextNodeSetTextHook.Dispose(); SetNamePlateHook.Dispose(); - Service.ChatGui.ChatMessage -= OnChatMessage; - } private void AtkTextNodeSetTextDetour(IntPtr node, IntPtr text) { + if (!Service.Config.Enabled) + { + AtkTextNodeSetTextHook.Original(node,text); + return; + } + AtkTextNodeSetTextHook.Original(node, Replacer.ChangeName(text)); } private unsafe void SetNamePlateDetour(IntPtr namePlateObjectPtr, bool isPrefixTitle, bool displayTitle, IntPtr titlePtr, IntPtr namePtr, IntPtr fcNamePtr, int iconId) { - SetNamePlateHook.Original(namePlateObjectPtr, isPrefixTitle, displayTitle, - titlePtr, Replacer.ChangeName(namePtr), fcNamePtr, iconId); + try + { + if (!Service.Config.Enabled) + { + SetNamePlateHook.Original(namePlateObjectPtr, isPrefixTitle, displayTitle, + titlePtr, namePtr, fcNamePtr, iconId); + return; + } + + var nameSe = Replacer.GetSeStringFromPtr(namePtr).TextValue; + if (Service.ClientState.LocalPlayer != null && GetNames(Service.ClientState.LocalPlayer.Name.TextValue).Contains(nameSe)) + { + SetNamePlateHook.Original(namePlateObjectPtr, isPrefixTitle, displayTitle, + titlePtr, Replacer.GetPtrFromSeString(Service.Config.FakeNameText), fcNamePtr, iconId); + return; + } + + if (!Service.Config.AllPlayerReplace) + { + SetNamePlateHook.Original(namePlateObjectPtr, isPrefixTitle, displayTitle, + titlePtr, namePtr, fcNamePtr, iconId); + return; + } + + SetNamePlateHook.Original(namePlateObjectPtr, isPrefixTitle, displayTitle, + titlePtr, Replacer.GetPtrFromSeString(Replacer.ChangeName(nameSe)), fcNamePtr, iconId); + } + catch (Exception ex) + { + PluginLog.Error(ex, "Failed to change name plate"); + } } - private void OnChatMessage(XivChatType type, uint senderId, - ref SeString sender, ref SeString message, ref bool isHandled) + private static string[] GetNames(string name) { - Replacer.ChangeSeString(ref sender); + var names = name.Split(' '); + if (names.Length != 2) return new string[] { name }; + + var first = names[0]; + var last = names[1]; + var firstShort = first.ToUpper()[0] + "."; + var lastShort = last.ToUpper()[0] + "."; + + return new string[] + { + name, + $"{first} {lastShort}", + $"{firstShort} {last}", + $"{firstShort} {lastShort}", + first, last, + }; } } diff --git a/FakeName/Replacer.cs b/FakeName/Replacer.cs index 1a32144..7415c13 100644 --- a/FakeName/Replacer.cs +++ b/FakeName/Replacer.cs @@ -1,4 +1,4 @@ -using Dalamud.Game.Libc; +using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Logging; @@ -19,19 +19,7 @@ public static IntPtr ChangeName(IntPtr seStringPtr) var str = GetSeStringFromPtr(seStringPtr); if (ChangeSeString(ref str)) { - var bytes = str.Encode(); - var pointer = Marshal.AllocHGlobal(bytes.Length + 1); - try - { - Marshal.Copy(bytes, 0, pointer, bytes.Length); - Marshal.WriteByte(pointer, bytes.Length, 0); - - return pointer; - } - finally - { - Marshal.FreeHGlobal(pointer); - } + return GetPtrFromSeString(str); } else { @@ -45,7 +33,24 @@ public static IntPtr ChangeName(IntPtr seStringPtr) } } - private static SeString GetSeStringFromPtr(IntPtr seStringPtr) + public static IntPtr GetPtrFromSeString(SeString str) + { + var bytes = str.Encode(); + var pointer = Marshal.AllocHGlobal(bytes.Length + 1); + try + { + Marshal.Copy(bytes, 0, pointer, bytes.Length); + Marshal.WriteByte(pointer, bytes.Length, 0); + + return pointer; + } + finally + { + Marshal.FreeHGlobal(pointer); + } + } + + public static SeString GetSeStringFromPtr(IntPtr seStringPtr) { var offset = 0; unsafe @@ -62,8 +67,6 @@ public static bool ChangeSeString(ref SeString seString) { try { - if (!Service.Config.Enabled) return false; - if (seString.Payloads.All(payload => payload.Type != PayloadType.RawText)) return false; var player = Service.ClientState.LocalPlayer; @@ -71,20 +74,20 @@ public static bool ChangeSeString(ref SeString seString) var result = ReplacePlayerName(seString, GetNames(player.Name.TextValue), Service.Config.FakeNameText); - if (Service.Config.PartyMemberReplace) + if (Service.Config.AllPlayerReplace) { - foreach (var member in Service.PartyList) + foreach (var obj in Service.ObjectTable) { + if (obj is not PlayerCharacter member) continue; var memberName = member.Name.TextValue; if (memberName == player.Name.TextValue) continue; var jobData = member.ClassJob.GameData; if (jobData == null) continue; - var nickName = string.Join(" . ", memberName.Split(' ').Select(s => s.ToUpper()[0])); - var memberReplace = $"{jobData.Abbreviation.RawString} [{nickName}]"; + var nickName = ChangeName(memberName); - result = ReplacePlayerName(seString, GetNames(memberName), memberReplace) || result; + result = ReplacePlayerName(seString, memberName, nickName) || result; } } @@ -97,23 +100,23 @@ public static bool ChangeSeString(ref SeString seString) } } + public static string ChangeName(string str) + { + if(string.IsNullOrEmpty(str)) return str; + return string.Join(" . ", str.Split(' ').Select(s => s.ToUpper().FirstOrDefault())); + } + private static string[] GetNames(string name) { var names = name.Split(' '); if (names.Length != 2) return new string[] { name }; var first = names[0]; - var last = names[1]; - var firstShort = first.ToUpper()[0] + "."; - var lastShort = last.ToUpper()[0] + "."; return new string[] { name, - $"{first} {lastShort}", - $"{firstShort} {last}", - $"{firstShort} {lastShort}", - first, last, + first, }; } diff --git a/FakeName/Service.cs b/FakeName/Service.cs index 4d2ea10..6c6fb5d 100644 --- a/FakeName/Service.cs +++ b/FakeName/Service.cs @@ -1,4 +1,5 @@ using Dalamud.Game.ClientState; +using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Party; using Dalamud.Game.Command; using Dalamud.Game.Gui; @@ -25,4 +26,7 @@ internal class Service [PluginService] internal static PartyList PartyList { get; private set; } + + [PluginService] + internal static ObjectTable ObjectTable { get; private set; } } diff --git a/FakeName/Windows/ConfigWindow.cs b/FakeName/Windows/ConfigWindow.cs index 2e6684e..b60ee6f 100644 --- a/FakeName/Windows/ConfigWindow.cs +++ b/FakeName/Windows/ConfigWindow.cs @@ -25,7 +25,7 @@ public override void Draw() Service.Config.SaveConfig(); } - if (ImGui.Checkbox("Change Party Member's Name", ref Service.Config.PartyMemberReplace)) + if (ImGui.Checkbox("Change All Player's Name", ref Service.Config.AllPlayerReplace)) { Service.Config.SaveConfig(); }