D1 (XC-8): extract shared PrefillTellInput/BuildTellCommand for the two tell-prefill detours

This commit is contained in:
2026-06-16 13:03:26 +02:00
parent f05d7104af
commit 97e58934d6
+32 -16
View File
@@ -317,6 +317,30 @@ internal sealed unsafe class Chat : IDisposable
ReplyInSelectedChatModeHook!.Original(agent); ReplyInSelectedChatModeHook!.Original(agent);
} }
// Pure /tell-prefill command builder, shared by the two native SetTellTarget
// detours and the PayloadHandler Send-Tell payload. Empty/null world drops the
// @World suffix (matches the old IsNullOrEmpty guard); trailing space lets the
// user type straight after. internal static so the Build-Suite can pin it
// frame-free. TEST-MIRROR: ../../../Hellion Build test/GameFunctions/PrefillTellCommandTests.cs
internal static string BuildTellCommand(string name, string? world)
{
var command = $"/tell {name}";
if (!string.IsNullOrEmpty(world))
command += $"@{world}";
command += " ";
return command;
}
// Prefills + focuses our own input bar with a /tell command. The DI/Dalamud
// vorspann (Plugin.InputBar) lives here; the string assembly is BuildTellCommand.
// The in-foray TellSpecial routing (SetEurekaTellChannel) is NOT this helper's
// job — it stays at the call-site (v1.8.1 deferral).
private void PrefillTellInput(string name, string? world)
{
Plugin.InputBar.SetPendingMessage(BuildTellCommand(name, world));
Plugin.InputBar.Activate = true;
}
private bool SetContextTellTarget( private bool SetContextTellTarget(
RaptureShellModule* a1, RaptureShellModule* a1,
Utf8String* playerName, Utf8String* playerName,
@@ -334,14 +358,10 @@ internal sealed unsafe class Chat : IDisposable
// "Send Tell" payload menu does (PayloadHandler), then focus. Prefill- // "Send Tell" payload menu does (PayloadHandler), then focus. Prefill-
// only — no tab switch, no ChatActivatedArgs revival (Flo decision // only — no tab switch, no ChatActivatedArgs revival (Flo decision
// 2026-06-15). The game supplies worldName here, so no sheet lookup. // 2026-06-15). The game supplies worldName here, so no sheet lookup.
var tellName = playerName->ToString(); PrefillTellInput(
var tellWorld = worldName != null ? worldName->ToString() : string.Empty; playerName->ToString(),
var tellCommand = $"/tell {tellName}"; worldName != null ? worldName->ToString() : null
if (!string.IsNullOrEmpty(tellWorld)) );
tellCommand += $"@{tellWorld}";
tellCommand += " ";
Plugin.InputBar.SetPendingMessage(tellCommand);
Plugin.InputBar.Activate = true;
} }
return SetChatLogTellTargetHook!.Original( return SetChatLogTellTargetHook!.Original(
@@ -374,14 +394,10 @@ internal sealed unsafe class Chat : IDisposable
// In-foray right-click -> Send Tell: same prefill path as the non-foray // In-foray right-click -> Send Tell: same prefill path as the non-foray
// tell. The foray-specific TellSpecial channel routing stays deferred // tell. The foray-specific TellSpecial channel routing stays deferred
// (v1.8.1, SetEurekaTellChannel) — prefill-only here (Flo decision 2026-06-15). // (v1.8.1, SetEurekaTellChannel) — prefill-only here (Flo decision 2026-06-15).
var forayName = playerName->ToString(); PrefillTellInput(
var forayWorld = worldName != null ? worldName->ToString() : string.Empty; playerName->ToString(),
var forayCommand = $"/tell {forayName}"; worldName != null ? worldName->ToString() : null
if (!string.IsNullOrEmpty(forayWorld)) );
forayCommand += $"@{forayWorld}";
forayCommand += " ";
Plugin.InputBar.SetPendingMessage(forayCommand);
Plugin.InputBar.Activate = true;
} }
ContextMenuTellInForayHook!.Original( ContextMenuTellInForayHook!.Original(