diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index c708c2be..79460a17 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -349,6 +349,8 @@ public: void queryServerTime(); void requestPlayedTime(); void queryWho(const std::string& playerName = ""); + uint32_t getTotalTimePlayed() const { return totalTimePlayed_; } + uint32_t getLevelTimePlayed() const { return levelTimePlayed_; } // Social commands void addFriend(const std::string& playerName, const std::string& note = ""); @@ -2224,6 +2226,8 @@ private: uint64_t summonerGuid_ = 0; std::string summonerName_; float summonTimeoutSec_ = 0.0f; + uint32_t totalTimePlayed_ = 0; + uint32_t levelTimePlayed_ = 0; // Trade state TradeStatus tradeStatus_ = TradeStatus::None; diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 0f53c4af..163b44c6 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -18149,6 +18149,9 @@ void GameHandler::handlePlayedTime(network::Packet& packet) { return; } + totalTimePlayed_ = data.totalTimePlayed; + levelTimePlayed_ = data.levelTimePlayed; + if (data.triggerMessage) { // Format total time played uint32_t totalDays = data.totalTimePlayed / 86400; diff --git a/src/ui/inventory_screen.cpp b/src/ui/inventory_screen.cpp index f2b40f7c..e5735977 100644 --- a/src/ui/inventory_screen.cpp +++ b/src/ui/inventory_screen.cpp @@ -730,6 +730,9 @@ void InventoryScreen::render(game::Inventory& inventory, uint64_t moneyCopper) { KeybindingManager::Action::TOGGLE_CHARACTER_SCREEN, false); if (characterDown && !cKeyWasDown) { characterOpen = !characterOpen; + if (characterOpen && gameHandler_) { + gameHandler_->requestPlayedTime(); + } } cKeyWasDown = characterDown; @@ -1142,6 +1145,30 @@ void InventoryScreen::renderCharacterScreen(game::GameHandler& gameHandler) { for (int i = 0; i < 5; ++i) stats[i] = gameHandler.getPlayerStat(i); const int32_t* serverStats = (stats[0] >= 0) ? stats : nullptr; renderStatsPanel(inventory, gameHandler.getPlayerLevel(), gameHandler.getArmorRating(), serverStats); + + // Played time (shown if available, fetched on character screen open) + uint32_t totalSec = gameHandler.getTotalTimePlayed(); + uint32_t levelSec = gameHandler.getLevelTimePlayed(); + if (totalSec > 0 || levelSec > 0) { + ImGui::Separator(); + // Helper lambda to format seconds as "Xd Xh Xm" + auto fmtTime = [](uint32_t sec) -> std::string { + uint32_t d = sec / 86400, h = (sec % 86400) / 3600, m = (sec % 3600) / 60; + char buf[48]; + if (d > 0) snprintf(buf, sizeof(buf), "%ud %uh %um", d, h, m); + else if (h > 0) snprintf(buf, sizeof(buf), "%uh %um", h, m); + else snprintf(buf, sizeof(buf), "%um", m); + return buf; + }; + ImGui::TextDisabled("Time Played"); + ImGui::Columns(2, "##playtime", false); + ImGui::SetColumnWidth(0, 130); + ImGui::Text("Total:"); ImGui::NextColumn(); + ImGui::Text("%s", fmtTime(totalSec).c_str()); ImGui::NextColumn(); + ImGui::Text("This level:"); ImGui::NextColumn(); + ImGui::Text("%s", fmtTime(levelSec).c_str()); ImGui::NextColumn(); + ImGui::Columns(1); + } ImGui::EndTabItem(); }