From 5596f0fa2d8432a9706feaac6f228d6a58494686 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Mon, 28 Sep 2026 11:45:27 -0500 Subject: [PATCH] fix(ugc): a client back at character select starts its UGC switches afresh Switching characters keeps the connection (the client sends CHARACTER_LIST_REQUEST to the world it's in), so the per-client UGC state (waiting requests, pending mesh switches, the 3-switches-per-model cap) carried over to the next character. It's now dropped as on a disconnect. Co-Authored-By: Claude Opus 5.5 --- dGame/dUtilities/UgcManifest.h | 2 +- dWorldServer/WorldServer.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dGame/dUtilities/UgcManifest.h b/dGame/dUtilities/UgcManifest.h index 9c561f84c..68fc721cc 100644 --- a/dGame/dUtilities/UgcManifest.h +++ b/dGame/dUtilities/UgcManifest.h @@ -66,7 +66,7 @@ namespace UgcManifest { // clients to served meshes that are due void Update(); - // A client left: its waiting requests are dropped + // A client left (or went back to character select): its waiting requests and pending switches are dropped void OnDisconnect(const SystemAddress& sysAddr); // The UGC server made these models' meshes (again, with a new checksum): each one placed in this world is sent the diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 373a5fd90..62d180c6e 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -1229,6 +1229,8 @@ namespace { auto user = UserManager::Instance()->GetUser(sysAddr); if (!user || !user->GetLastUsedChar()) return; Game::entityManager->DestroyEntity(user->GetLastUsedChar()->GetEntity()); + // Back at character select on the same connection: forget this client's UGC requests and switches + UgcManifest::OnDisconnect(sysAddr); } //This loops prevents users who aren't authenticated to double-request the char list, which