From faf6c3353bf2cd53c97eda6e657a5e0f5785ccf0 Mon Sep 17 00:00:00 2001 From: nebel <9887+nebel@users.noreply.github.com> Date: Mon, 11 Aug 2025 08:45:35 +0900 Subject: [PATCH 1/2] Don't exit string handler early if name is unchanged --- PrefPro/StringHandler.cs | 71 ++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/PrefPro/StringHandler.cs b/PrefPro/StringHandler.cs index 10dee67..d7ef441 100644 --- a/PrefPro/StringHandler.cs +++ b/PrefPro/StringHandler.cs @@ -21,7 +21,7 @@ public sealed unsafe class StringHandler : IDisposable private readonly LoginState _loginState; private readonly Configuration _configuration; - private HandlerConfig _handlerConfig = HandlerConfig.None; + private NameHandlerConfig _nameHandlerConfig = NameHandlerConfig.None; public StringHandler(LoginState loginState, Configuration configuration) { @@ -74,10 +74,6 @@ private bool FormatStringDetour(TextModule* thisPtr, CStringPointer input, StdDe if (!_configuration.Enabled) goto originalFormatString; - var data = _handlerConfig; - if (!data.Apply) - goto originalFormatString; - var seString = input.AsReadOnlySeStringSpan(); if (seString.IsEmpty || seString.IsTextOnly()) goto originalFormatString; @@ -100,32 +96,45 @@ private bool FormatStringDetour(TextModule* thisPtr, CStringPointer input, StdDe var oldGender = genderParam.IntValue; genderParam.IntValue = _configuration.GetGender(); - var sb = SeStringBuilder.SharedPool.Get(); - + var nameConfig = _nameHandlerConfig; try { - foreach (var payload in seString) + if (nameConfig.Apply) { - if (data.ApplyFull && ShouldHandleStringPayload(payload)) + var sb = SeStringBuilder.SharedPool.Get(); + try { - sb.Append(data.NameFull); + foreach (var payload in seString) + { + if (nameConfig.ApplyFull && ShouldHandleStringPayload(payload)) + { + sb.Append(nameConfig.NameFull); + } + else if (nameConfig.ApplyFirst && ShouldHandleSplitPayload(payload, 1)) + { + sb.Append(nameConfig.NameFirst); + } + else if (nameConfig.ApplyLast && ShouldHandleSplitPayload(payload, 2)) + { + sb.Append(nameConfig.NameLast); + } + else + { + sb.Append(payload); + } + } + fixed (byte* newInput = sb.GetViewAsSpan()) + return _formatStringHook.Original(thisPtr, newInput, localParameters, output); } - else if (data.ApplyFirst && ShouldHandleSplitPayload(payload, 1)) + finally { - sb.Append(data.NameFirst); - } - else if (data.ApplyLast && ShouldHandleSplitPayload(payload, 2)) - { - sb.Append(data.NameLast); - } - else - { - sb.Append(payload); + SeStringBuilder.SharedPool.Return(sb); } } - - fixed (byte* newInput = sb.GetViewAsSpan()) - return _formatStringHook.Original(thisPtr, newInput, localParameters, output); + else + { + return _formatStringHook.Original(thisPtr, input, localParameters, output); + } } catch (Exception ex) { @@ -133,8 +142,6 @@ private bool FormatStringDetour(TextModule* thisPtr, CStringPointer input, StdDe } finally { - SeStringBuilder.SharedPool.Return(sb); - raceParam.IntValue = oldRace; genderParam.IntValue = oldGender; } @@ -147,21 +154,21 @@ public void RefreshConfig() { if (!_loginState.LoggedIn || string.IsNullOrEmpty(_configuration.Name)) { - _handlerConfig = HandlerConfig.None; + _nameHandlerConfig = NameHandlerConfig.None; } else { - _handlerConfig = CreateConfig(_configuration, _loginState.PlayerName); + _nameHandlerConfig = CreateConfig(_configuration, _loginState.PlayerName); } } - private static HandlerConfig CreateConfig(Configuration config, string playerName) + private static NameHandlerConfig CreateConfig(Configuration config, string playerName) { - var data = new HandlerConfig(); + var data = new NameHandlerConfig(); if (string.IsNullOrEmpty(config.Name)) { - return HandlerConfig.None; + return NameHandlerConfig.None; } if (config.Name != playerName) @@ -251,7 +258,7 @@ private static bool ShouldHandleSplitPayload(ReadOnlySePayloadSpan payload, int return false; } - public class HandlerConfig + public class NameHandlerConfig { public bool Apply; public bool ApplyFull; @@ -261,7 +268,7 @@ public class HandlerConfig public ReadOnlySePayload? NameFirst; public ReadOnlySePayload? NameLast; - public static readonly HandlerConfig None = new() + public static readonly NameHandlerConfig None = new() { Apply = false }; From 94df2342c709253c5a408fac775d00014ba25fe2 Mon Sep 17 00:00:00 2001 From: nebel <9887+nebel@users.noreply.github.com> Date: Mon, 11 Aug 2025 08:58:03 +0900 Subject: [PATCH 2/2] Flatten try --- PrefPro/StringHandler.cs | 65 +++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/PrefPro/StringHandler.cs b/PrefPro/StringHandler.cs index d7ef441..7f6243a 100644 --- a/PrefPro/StringHandler.cs +++ b/PrefPro/StringHandler.cs @@ -97,53 +97,50 @@ private bool FormatStringDetour(TextModule* thisPtr, CStringPointer input, StdDe genderParam.IntValue = _configuration.GetGender(); var nameConfig = _nameHandlerConfig; - try + if (_nameHandlerConfig.Apply) { - if (nameConfig.Apply) + var sb = SeStringBuilder.SharedPool.Get(); + try { - var sb = SeStringBuilder.SharedPool.Get(); - try + foreach (var payload in seString) { - foreach (var payload in seString) + if (nameConfig.ApplyFull && ShouldHandleStringPayload(payload)) { - if (nameConfig.ApplyFull && ShouldHandleStringPayload(payload)) - { - sb.Append(nameConfig.NameFull); - } - else if (nameConfig.ApplyFirst && ShouldHandleSplitPayload(payload, 1)) - { - sb.Append(nameConfig.NameFirst); - } - else if (nameConfig.ApplyLast && ShouldHandleSplitPayload(payload, 2)) - { - sb.Append(nameConfig.NameLast); - } - else - { - sb.Append(payload); - } + sb.Append(nameConfig.NameFull); + } + else if (nameConfig.ApplyFirst && ShouldHandleSplitPayload(payload, 1)) + { + sb.Append(nameConfig.NameFirst); + } + else if (nameConfig.ApplyLast && ShouldHandleSplitPayload(payload, 2)) + { + sb.Append(nameConfig.NameLast); + } + else + { + sb.Append(payload); } - fixed (byte* newInput = sb.GetViewAsSpan()) - return _formatStringHook.Original(thisPtr, newInput, localParameters, output); - } - finally - { - SeStringBuilder.SharedPool.Return(sb); } + fixed (byte* newInput = sb.GetViewAsSpan()) + return _formatStringHook.Original(thisPtr, newInput, localParameters, output); } - else + catch (Exception ex) { - return _formatStringHook.Original(thisPtr, input, localParameters, output); + DalamudApi.PluginLog.Error(ex, "PrefPro Exception"); + } + finally + { + SeStringBuilder.SharedPool.Return(sb); + raceParam.IntValue = oldRace; + genderParam.IntValue = oldGender; } } - catch (Exception ex) - { - DalamudApi.PluginLog.Error(ex, "PrefPro Exception"); - } - finally + else { + var result = _formatStringHook.Original(thisPtr, input, localParameters, output); raceParam.IntValue = oldRace; genderParam.IntValue = oldGender; + return result; } originalFormatString: