diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 1d77ac6a..10cd17a6 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -6125,10 +6125,33 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA: case Opcode::SMSG_RESET_RANGED_COMBAT_TIMER: case Opcode::SMSG_PROFILEDATA_RESPONSE: - case Opcode::SMSG_PLAY_TIME_WARNING: packet.setReadPos(packet.getSize()); break; + case Opcode::SMSG_PLAY_TIME_WARNING: { + // uint32 type (0=normal, 1=heavy, 2=tired/restricted) + uint32 minutes played + if (packet.getSize() - packet.getReadPos() >= 4) { + uint32_t warnType = packet.readUInt32(); + uint32_t minutesPlayed = (packet.getSize() - packet.getReadPos() >= 4) + ? packet.readUInt32() : 0; + const char* severity = (warnType >= 2) ? "[Tired] " : "[Play Time] "; + char buf[128]; + if (minutesPlayed > 0) { + uint32_t h = minutesPlayed / 60; + uint32_t m = minutesPlayed % 60; + if (h > 0) + std::snprintf(buf, sizeof(buf), "%sYou have been playing for %uh %um.", severity, h, m); + else + std::snprintf(buf, sizeof(buf), "%sYou have been playing for %um.", severity, m); + } else { + std::snprintf(buf, sizeof(buf), "%sYou have been playing for a long time.", severity); + } + addSystemChatMessage(buf); + addUIError(buf); + } + break; + } + // ---- Item query multiple (same format as single, re-use handler) ---- case Opcode::SMSG_ITEM_QUERY_MULTIPLE_RESPONSE: handleItemQueryResponse(packet); diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 468d100d..9a020d6a 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -11656,6 +11656,21 @@ void GameScreen::renderMinimapMarkers(game::GameHandler& gameHandler) { } } + // Hover tooltip: show player's WoW coordinates (canonical X=North, Y=West) + { + ImVec2 mouse = ImGui::GetMousePos(); + float mdx = mouse.x - centerX; + float mdy = mouse.y - centerY; + if (mdx * mdx + mdy * mdy <= mapRadius * mapRadius) { + glm::vec3 playerCanon = core::coords::renderToCanonical(playerRender); + ImGui::BeginTooltip(); + ImGui::TextColored(ImVec4(0.9f, 0.9f, 0.5f, 1.0f), + "%.1f, %.1f", playerCanon.x, playerCanon.y); + ImGui::TextDisabled("Ctrl+click to ping"); + ImGui::EndTooltip(); + } + } + auto applyMuteState = [&]() { auto* activeRenderer = core::Application::getInstance().getRenderer(); float masterScale = soundMuted_ ? 0.0f : static_cast(pendingMasterVolume) / 100.0f;