From c50582fc6f420566be90462ee54488051b06224e Mon Sep 17 00:00:00 2001 From: fallenoak Date: Tue, 4 Nov 2025 22:04:43 -0600 Subject: [PATCH] feat(glue): implement CGlueMgr::OnKickReasonMsg --- src/glue/CGlueMgr.cpp | 39 ++++++++++++++++++++++++++++++++++++--- src/glue/CGlueMgr.hpp | 1 + 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index 09305de..fcb2835 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -25,6 +25,7 @@ #include "util/Filesystem.hpp" #include "util/Locale.hpp" #include "util/Log.hpp" +#include #include #include @@ -55,6 +56,7 @@ char CGlueMgr::m_accountName[1280]; float CGlueMgr::m_aspect; bool CGlueMgr::m_authenticated; const CharacterSelectionDisplay* CGlueMgr::m_characterInfo; +int32_t CGlueMgr::m_clientKickReason; char CGlueMgr::m_currentScreen[64]; int32_t CGlueMgr::m_disconnectPending; int32_t CGlueMgr::m_displayingQueueDialog; @@ -528,7 +530,7 @@ int32_t CGlueMgr::NetDisconnectHandler(const void* a1, void* a2) { if (notAccountLogin) { // TODO ConsolePrintf("CGlueMgr::NetDisconnectHandler: Displaying script"); - // TODO FrameScript_SignalEvent(DISCONNECTED_FROM_SERVER, "%d", CGlueMgr::m_clientKickReason); + FrameScript_SignalEvent(DISCONNECTED_FROM_SERVER, "%d", CGlueMgr::m_clientKickReason); ClientServices::LoginConnection()->Logoff(); @@ -557,9 +559,40 @@ int32_t CGlueMgr::NetDisconnectHandler(const void* a1, void* a2) { } int32_t CGlueMgr::OnKickReasonMsg(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg) { - // TODO + // Nothing to read + if (msg->IsRead()) { + CGlueMgr::m_clientKickReason = 0; + return 1; + } - return 0; + uint8_t reason = 0; + msg->Get(reason); + + // Message only contained reason code + if (msg->IsRead()) { + CGlueMgr::m_clientKickReason = reason; + return 1; + } + + // UI isn't currently running + if (!CGlueMgr::m_initialized || CGlueMgr::m_suspended) { + CGlueMgr::m_clientKickReason = reason; + return 1; + } + + // TODO + // + // char v6[16]; + // msg->GetArray(v6, sizeof(v6)); + // + // if (!msg->IsValid()) { + // CGlueMgr::m_clientKickReason = reason; + // return 1; + // } + // + // Sub4042C0(v6); + + return 1; } void CGlueMgr::PollAccountLogin(int32_t errorCode, const char* msg, int32_t complete, int32_t result, WOWCS_OPS op) { diff --git a/src/glue/CGlueMgr.hpp b/src/glue/CGlueMgr.hpp index ae3e6ec..b4cdd69 100644 --- a/src/glue/CGlueMgr.hpp +++ b/src/glue/CGlueMgr.hpp @@ -38,6 +38,7 @@ class CGlueMgr { static float m_aspect; static bool m_authenticated; static const CharacterSelectionDisplay* m_characterInfo; + static int32_t m_clientKickReason; static char m_currentScreen[]; static int32_t m_disconnectPending; static int32_t m_displayingQueueDialog;