From 6100483bbb7254f800e005128f26f07c513329fd Mon Sep 17 00:00:00 2001 From: chenshuzhiyi <15782136+chenshuzhiyi@user.noreply.gitee.com> Date: Sat, 27 Sep 2025 00:36:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=A8=E5=B1=80=E5=AD=98?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gamedb_init.sql | 13 ++++++- src/server/gamelogic/rpc-dispatchers.cpp | 18 ++++++---- src/server/user/player.cpp | 46 +++++++++++++++++++----- src/server/user/player.h | 4 +-- 4 files changed, 62 insertions(+), 19 deletions(-) diff --git a/server/gamedb_init.sql b/server/gamedb_init.sql index 73fb98b..a225cfd 100644 --- a/server/gamedb_init.sql +++ b/server/gamedb_init.sql @@ -9,4 +9,15 @@ CREATE TABLE IF NOT EXISTS gameSaves ( ); CREATE INDEX IF NOT EXISTS idx_gameSaves_uid ON gameSaves(uid); -CREATE INDEX IF NOT EXISTS idx_gameSaves_mode ON gameSaves(mode); \ No newline at end of file +CREATE INDEX IF NOT EXISTS idx_gameSaves_mode ON gameSaves(mode); + +CREATE TABLE IF NOT EXISTS globalSaves ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + uid INTEGER NOT NULL, + key TEXT NOT NULL, + data BLOB NOT NULL, + UNIQUE(uid, key) +); + +CREATE INDEX IF NOT EXISTS idx_globalSaves_uid ON globalSaves(uid); +CREATE INDEX IF NOT EXISTS idx_globalSaves_key ON globalSaves(key); diff --git a/src/server/gamelogic/rpc-dispatchers.cpp b/src/server/gamelogic/rpc-dispatchers.cpp index a8136d8..e54e88b 100644 --- a/src/server/gamelogic/rpc-dispatchers.cpp +++ b/src/server/gamelogic/rpc-dispatchers.cpp @@ -418,40 +418,44 @@ static _rpcRet _rpc_Player_getSaveState(const JsonRpcPacket &packet) { } static _rpcRet _rpc_Player_saveGlobalState(const JsonRpcPacket &packet) { - if (!(packet.param_count == 2 && + if (!(packet.param_count == 3 && std::holds_alternative(packet.param1) && - std::holds_alternative(packet.param2) + std::holds_alternative(packet.param2) && + std::holds_alternative(packet.param3) )) { return { false, nullVal }; } auto connId = std::get(packet.param1); - auto jsonData = std::get(packet.param2); + auto key = std::get(packet.param2); + auto jsonData = std::get(packet.param3); auto player = Server::instance().user_manager().findPlayerByConnId(connId).lock(); if (!player) { return { false, nullVal }; } - player->saveGlobalState(jsonData); + player->saveGlobalState(key, jsonData); return { true, nullVal }; } static _rpcRet _rpc_Player_getGlobalSaveState(const JsonRpcPacket &packet) { - if (!(packet.param_count == 1 && - std::holds_alternative(packet.param1) + if (!(packet.param_count == 2 && + std::holds_alternative(packet.param1) && + std::holds_alternative(packet.param2) )) { return { false, nullVal }; } auto connId = std::get(packet.param1); + auto key = std::get(packet.param2); auto player = Server::instance().user_manager().findPlayerByConnId(connId).lock(); if (!player) { return { false, nullVal }; } - std::string result = player->getGlobalSaveState(); + std::string result = player->getGlobalSaveState(key); return { true, result }; } diff --git a/src/server/user/player.cpp b/src/server/user/player.cpp index 8679e26..e25b312 100644 --- a/src/server/user/player.cpp +++ b/src/server/user/player.cpp @@ -403,14 +403,6 @@ std::string Player::getSaveState() { return readSaveState(mode); } -void Player::saveGlobalState(std::string_view jsonData) { - writeSaveState("__global__", jsonData); -} - -std::string Player::getGlobalSaveState() { - return readSaveState("__global__"); -} - void Player::writeSaveState(std::string mode, std::string_view jsonData) { if (!Sqlite3::checkString(mode)) { spdlog::error("Invalid mode string for saveState: {}", mode); @@ -421,7 +413,7 @@ void Player::writeSaveState(std::string mode, std::string_view jsonData) { auto &gamedb = Server::instance().gameDatabase(); auto sql = fmt::format("REPLACE INTO gameSaves (uid, mode, data) VALUES ({},'{}',X'{}')", id, mode, hexData); - gamedb.exec(sql);; + gamedb.exec(sql); } std::string Player::readSaveState(std::string mode) { @@ -442,6 +434,42 @@ std::string Player::readSaveState(std::string mode) { return data; } + spdlog::warn("Returned data is not valid JSON: {}", data); + return "{}"; +} + +void Player::saveGlobalState(std::string_view key, std::string_view jsonData) { + if (!Sqlite3::checkString(key)) { + spdlog::error("Invalid key string for saveGlobalState: {}", std::string(key)); + return; + } + + auto hexData = toHex(jsonData); + auto &gamedb = Server::instance().gameDatabase(); + auto sql = fmt::format("REPLACE INTO globalSaves (uid, key, data) VALUES ({},'{}',X'{}')", id, key, hexData); + + gamedb.exec(sql); +} + + +std::string Player::getGlobalSaveState(std::string_view key) { + if (!Sqlite3::checkString(key)) { + spdlog::error("Invalid key string for getGlobalSaveState: {}", std::string(key)); + return "{}"; + } + + auto sql = fmt::format("SELECT data FROM globalSaves WHERE uid = {} AND key = '{}'", id, key); + + auto result = Server::instance().gameDatabase().select(sql); + if (result.empty() || result[0].count("data") == 0 || result[0]["data"] == "#null") { + return "{}"; + } + + const auto& data = result[0]["data"]; + if (!data.empty() && (data[0] == '{' || data[0] == '[')) { + return data; + } + spdlog::warn("Returned data is not valid JSON: {}", data); return "{}"; } \ No newline at end of file diff --git a/src/server/user/player.h b/src/server/user/player.h index 1b75195..e00c6ae 100644 --- a/src/server/user/player.h +++ b/src/server/user/player.h @@ -100,8 +100,8 @@ public: void saveState(std::string_view jsonData); std::string getSaveState(); // 全局存档 - void saveGlobalState(std::string_view jsonData); - std::string getGlobalSaveState(); + void saveGlobalState(std::string_view key, std::string_view jsonData); + std::string getGlobalSaveState(std::string_view key); private: int id = 0; -- Gitee