From 830bb3f1054557aac878705566f7c6f5886a8c60 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 15:09:50 -0700 Subject: [PATCH] Handle defense messages, death/corpse, barber shop, channel count, gametime - SMSG_DEFENSE_MESSAGE: display PvP zone attack alerts in system chat - SMSG_CORPSE_RECLAIM_DELAY: notify player of corpse reclaim timer - SMSG_DEATH_RELEASE_LOC: log spirit healer coordinates after death - SMSG_ENABLE_BARBER_SHOP: log barber shop activation (no UI yet) - SMSG_FEIGN_DEATH_RESISTED: show resisted feign death message - SMSG_CHANNEL_MEMBER_COUNT: consume channel member count update - SMSG_GAMETIME_SET/UPDATE/BIAS, SMSG_GAMESPEED_SET: consume server time sync - SMSG_ACHIEVEMENT_DELETED/CRITERIA_DELETED: consume removal notifications - Fix unused screenH variable warning in quest objective tracker --- src/game/game_handler.cpp | 66 +++++++++++++++++++++++++++++++++++++++ src/ui/game_screen.cpp | 3 +- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index aae8eaae..922dd711 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -1886,6 +1886,72 @@ void GameHandler::handlePacket(network::Packet& packet) { break; } + // ---- Zone defense messages ---- + case Opcode::SMSG_DEFENSE_MESSAGE: { + // uint32 zoneId + string message — used for PvP zone attack alerts + if (packet.getSize() - packet.getReadPos() >= 5) { + /*uint32_t zoneId =*/ packet.readUInt32(); + std::string defMsg = packet.readString(); + if (!defMsg.empty()) { + addSystemChatMessage("[Defense] " + defMsg); + } + } + break; + } + case Opcode::SMSG_CORPSE_RECLAIM_DELAY: { + // uint32 delayMs before player can reclaim corpse + if (packet.getSize() - packet.getReadPos() >= 4) { + uint32_t delayMs = packet.readUInt32(); + uint32_t delaySec = (delayMs + 999) / 1000; + addSystemChatMessage("You can reclaim your corpse in " + + std::to_string(delaySec) + " seconds."); + LOG_DEBUG("SMSG_CORPSE_RECLAIM_DELAY: ", delayMs, "ms"); + } + break; + } + case Opcode::SMSG_DEATH_RELEASE_LOC: { + // uint32 mapId + float x + float y + float z — spirit healer position + if (packet.getSize() - packet.getReadPos() >= 16) { + uint32_t mapId = packet.readUInt32(); + float x = packet.readFloat(); + float y = packet.readFloat(); + float z = packet.readFloat(); + LOG_INFO("SMSG_DEATH_RELEASE_LOC: map=", mapId, " x=", x, " y=", y, " z=", z); + } + break; + } + case Opcode::SMSG_ENABLE_BARBER_SHOP: + // Sent by server when player sits in barber chair — triggers barber shop UI + // No payload; we don't have barber shop UI yet, so just log + LOG_INFO("SMSG_ENABLE_BARBER_SHOP: barber shop available"); + break; + case Opcode::SMSG_FEIGN_DEATH_RESISTED: + addSystemChatMessage("Your Feign Death attempt was resisted."); + LOG_DEBUG("SMSG_FEIGN_DEATH_RESISTED"); + break; + case Opcode::SMSG_CHANNEL_MEMBER_COUNT: { + // string channelName + uint8 flags + uint32 memberCount + std::string chanName = packet.readString(); + if (packet.getSize() - packet.getReadPos() >= 5) { + /*uint8_t flags =*/ packet.readUInt8(); + uint32_t count = packet.readUInt32(); + LOG_DEBUG("SMSG_CHANNEL_MEMBER_COUNT: channel=", chanName, " members=", count); + } + break; + } + case Opcode::SMSG_GAMETIME_SET: + case Opcode::SMSG_GAMETIME_UPDATE: + case Opcode::SMSG_GAMETIMEBIAS_SET: + case Opcode::SMSG_GAMESPEED_SET: + // Server-side time/speed synchronization — consume without processing + packet.setReadPos(packet.getSize()); + break; + case Opcode::SMSG_ACHIEVEMENT_DELETED: + case Opcode::SMSG_CRITERIA_DELETED: + // Consume achievement/criteria removal notifications + packet.setReadPos(packet.getSize()); + break; + // ---- Combat clearing ---- case Opcode::SMSG_ATTACKSWING_DEADTARGET: // Target died mid-swing: clear auto-attack diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 4993b2eb..eae66ab5 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -4240,8 +4240,7 @@ void GameScreen::renderQuestObjectiveTracker(game::GameHandler& gameHandler) { if (questLog.empty()) return; auto* window = core::Application::getInstance().getWindow(); - float screenW = window ? static_cast(window->getWidth()) : 1280.0f; - float screenH = window ? static_cast(window->getHeight()) : 720.0f; + float screenW = window ? static_cast(window->getWidth()) : 1280.0f; constexpr float TRACKER_W = 220.0f; constexpr float RIGHT_MARGIN = 10.0f;