fix(world): preserve portal materialization effects

Route accepted Hidden and UnHide transitions through retail's internal typed-script path so their DAT scripts queue while the owner is cell-less and resume at the destination. Consume ACE's successful teleport control statuses silently, matching retail HandleFailureEvent.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-16 08:14:48 +02:00
parent bfb4b26dff
commit 4b1bceefbb
12 changed files with 142 additions and 8 deletions

View file

@ -139,6 +139,9 @@ public sealed class ChatLog
/// </remarks>
public void OnWeenieError(uint errorId, string? param)
{
if (WeenieErrorMessages.IsSilentClientControlStatus(errorId))
return;
// Phase I (post-launch fix): translate the wire code into the
// retail-faithful template via WeenieErrorMessages. Many codes
// are *informational* (e.g. 0x051B "You have entered the X

View file

@ -32,6 +32,20 @@ namespace AcDream.Core.Chat;
/// </summary>
public static class WeenieErrorMessages
{
/// <summary>
/// Returns true for internal client-control statuses that retail consumes
/// without adding a line to the chat scroll.
/// </summary>
/// <remarks>
/// <c>ClientCommunicationSystem::HandleFailureEvent</c>
/// (<c>0x00571990</c>) has no display case for ILeftTheWorld
/// (<c>0x003B</c>) or ITeleported (<c>0x003C</c>). ACE sends the latter
/// after a successful portal use; presenting it as a failure is therefore
/// an acdream-only artifact.
/// </remarks>
public static bool IsSilentClientControlStatus(uint errorCode) =>
errorCode is 0x003Bu or 0x003Cu;
/// <summary>
/// Format a WeenieError / WeenieErrorWithString into a human-readable
/// system-message string.