Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
fix: changed the target of fake name.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed May 8, 2023
1 parent fcade4b commit de76d67
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 39 deletions.
2 changes: 1 addition & 1 deletion FakeName/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class Configuration : IPluginConfiguration

public bool Enabled = false;

public bool PartyMemberReplace = false;
public bool AllPlayerReplace = false;

public string FakeNameText = "";

Expand Down
64 changes: 56 additions & 8 deletions FakeName/Hooker.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -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,
};
}
}
61 changes: 32 additions & 29 deletions FakeName/Replacer.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
{
Expand All @@ -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
Expand All @@ -62,29 +67,27 @@ 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;
if (player == null) return false;

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;
}
}

Expand All @@ -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,
};
}

Expand Down
4 changes: 4 additions & 0 deletions FakeName/Service.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -25,4 +26,7 @@ internal class Service

[PluginService]
internal static PartyList PartyList { get; private set; }

[PluginService]
internal static ObjectTable ObjectTable { get; private set; }
}
2 changes: 1 addition & 1 deletion FakeName/Windows/ConfigWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down

0 comments on commit de76d67

Please sign in to comment.