From d42095f1d9f88df8fef4fbe10efae863dfb0d801 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sun, 18 Sep 2022 19:01:42 +0200 Subject: [PATCH] build abbreviated own username in chat self --- .../GameConfig/GameConfigHelper.cs | 74 +++++++++++++++++++ .../Configuration/GameConfig/LogNameType.cs | 16 ++++ PlayerTags/Features/ChatTagTargetFeature.cs | 47 +++++++++++- PlayerTags/Plugin.cs | 1 + 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 PlayerTags/Configuration/GameConfig/GameConfigHelper.cs create mode 100644 PlayerTags/Configuration/GameConfig/LogNameType.cs diff --git a/PlayerTags/Configuration/GameConfig/GameConfigHelper.cs b/PlayerTags/Configuration/GameConfig/GameConfigHelper.cs new file mode 100644 index 0000000..c10df56 --- /dev/null +++ b/PlayerTags/Configuration/GameConfig/GameConfigHelper.cs @@ -0,0 +1,74 @@ +using FFXIVClientStructs.FFXIV.Client.UI.Misc; +using Lumina.Excel.GeneratedSheets; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlayerTags.Configuration.GameConfig +{ + public class GameConfigHelper + { + private static GameConfigHelper instance = null; + private unsafe static ConfigModule* configModule = null; + + public static GameConfigHelper Instance + { + get + { + instance ??= new GameConfigHelper(); + return instance; + } + } + + private GameConfigHelper() + { + unsafe + { + configModule = ConfigModule.Instance(); + } + } + + private int? GetIntValue(ConfigOption option) + { + int? value = null; + + unsafe + { + var index = configModule->GetIndex(option); + if (index.HasValue) + value = configModule->GetIntValue(index.Value); + } + + return value; + } + + public LogNameType? GetLogNameType() + { + LogNameType? logNameType = null; + int? value = GetIntValue(ConfigOption.LogNameType); + + if (value.HasValue) + { + switch (value) + { + case 0: + logNameType = LogNameType.FullName; + break; + case 1: + logNameType = LogNameType.LastNameShorted; + break; + case 2: + logNameType = LogNameType.FirstNameShorted; + break; + case 3: + logNameType = LogNameType.Initials; + break; + } + } + + return logNameType; + } + } +} diff --git a/PlayerTags/Configuration/GameConfig/LogNameType.cs b/PlayerTags/Configuration/GameConfig/LogNameType.cs new file mode 100644 index 0000000..3605357 --- /dev/null +++ b/PlayerTags/Configuration/GameConfig/LogNameType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlayerTags.Configuration.GameConfig +{ + public enum LogNameType + { + FullName, + LastNameShorted, + FirstNameShorted, + Initials + } +} diff --git a/PlayerTags/Features/ChatTagTargetFeature.cs b/PlayerTags/Features/ChatTagTargetFeature.cs index c9a23d6..3c9142b 100644 --- a/PlayerTags/Features/ChatTagTargetFeature.cs +++ b/PlayerTags/Features/ChatTagTargetFeature.cs @@ -3,11 +3,14 @@ using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.Text; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; +using FFXIVClientStructs.FFXIV.Client.UI.Misc; using Lumina.Excel.GeneratedSheets; using PlayerTags.Configuration; +using PlayerTags.Configuration.GameConfig; using PlayerTags.Data; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using Action = System.Action; @@ -179,6 +182,44 @@ namespace PlayerTags.Features return stringMatches; } + private string BuildPlayername(string name) + { + var logNameType = GameConfigHelper.Instance.GetLogNameType(); + var result = string.Empty; + + if (logNameType != null) + { + var nameSplitted = name.Split(' '); + + if (nameSplitted.Length > 1) + { + var firstName = nameSplitted[0]; + var lastName = nameSplitted[1]; + + switch (logNameType) + { + case LogNameType.FullName: + result = $"{firstName} {lastName}"; + break; + case LogNameType.LastNameShorted: + result = $"{firstName} {lastName[..1]}."; + break; + case LogNameType.FirstNameShorted: + result = $"{firstName[..1]}. {lastName}"; + break; + case LogNameType.Initials: + result = $"{firstName[..1]}. {lastName[..1]}."; + break; + } + } + } + + if (string.IsNullOrEmpty(result)) + result = name; + + return result; + } + private void SplitOffPartyNumberPrefix(SeString sender, XivChatType type) { if (type == XivChatType.Party || type == XivChatType.Alliance) @@ -223,7 +264,8 @@ namespace PlayerTags.Features if (textPayload.Text == playerName) { playerTextPayloads.Add(textPayload); - textPayload.Text = textPayload.Text; + //textPayload.Text = textPayload.Text; + textPayload.Text = playerName; } else { @@ -264,6 +306,9 @@ namespace PlayerTags.Features foreach (var playerTextPayload in playerTextPayloads) { + // Fix displaying of abbreviated own player name as the game does this after the chat message handler + playerTextPayload.Text = BuildPlayername(playerTextPayload.Text); + // This does some dodgy shit for an unknown reason. // Typically when you receive a player payload followed by a text payload, it displays the text // and links it with the player payload. When trying to make one of these manually, it displays the player payload separately, diff --git a/PlayerTags/Plugin.cs b/PlayerTags/Plugin.cs index 98d87e2..4d4017d 100644 --- a/PlayerTags/Plugin.cs +++ b/PlayerTags/Plugin.cs @@ -1,6 +1,7 @@ using Dalamud.Game.Command; using Dalamud.Plugin; using Dalamud.Plugin.Internal; +using FFXIVClientStructs.FFXIV.Client.UI.Misc; using PlayerTags.Configuration; using PlayerTags.Data; using PlayerTags.Features;