diff --git a/src/server/room/room.cpp b/src/server/room/room.cpp index 89c4ccad1bfb657831cb8a13d06d0b8293d5bae0..f53ce60e41dded241bef2e9aba7cf0d3ae8d5828 100644 --- a/src/server/room/room.cpp +++ b/src/server/room/room.cpp @@ -666,6 +666,11 @@ void Room::_gameOver() { addRunRate(p->getId(), mode); } + // 游戏结束变回来 + if (p->getState() == Player::Trust) { + p->setState(Player::Online); + } + // 踢了并非人类,但是注意下面的两个kick不会释放player if (!p->isOnline()) { if (p->getState() == Player::Offline) { @@ -826,6 +831,23 @@ void Room::kickPlayer(Player &player, const Packet &pkt) { }); } +void Room::trust(Player &player, const Packet &pkt) { + // 仅在对局中允许托管 + if (!isStarted()) return; + + // 将玩家置为托管 + if (player.getState() != Player::Trust) { + player.setState(Player::Trust); + if (player.thinking()) { + auto thread = this->thread().lock(); + if (thread) thread->wakeUp(id, "player_trust"); + } + } else { + player.setState(Player::Online); + } +} + + void Room::ready(Player &player, const Packet &) { setPlayerReady(player, !player.isReady()); } @@ -853,9 +875,9 @@ void Room::handlePacket(Player &sender, const Packet &packet) { {"KickPlayer", &Room::kickPlayer}, {"Ready", &Room::ready}, {"StartGame", &Room::startGame}, + {"Trust", &Room::trust}, {"Chat", &Room::chat}, }; - if (packet.command == "PushRequest") { std::string_view sv; auto ret = cbor_stream_decode( diff --git a/src/server/room/room.h b/src/server/room/room.h index ee992b27dec3392cef748a5e21e05254557eb903..25cdb6bb0aa59e0ab2ace2a6a603823149f10fef 100644 --- a/src/server/room/room.h +++ b/src/server/room/room.h @@ -135,4 +135,6 @@ private: void kickPlayer(Player &, const Packet &); void ready(Player &, const Packet &); void startGame(Player &, const Packet &); + void trust(Player &, const Packet &); + }; diff --git a/src/server/user/player.cpp b/src/server/user/player.cpp index 75335a55789e8f55fc043f9edd54fcc694eb9b88..c97ffab5ef85eeaa7197e7025284f6f85d8eb832 100644 --- a/src/server/user/player.cpp +++ b/src/server/user/player.cpp @@ -211,7 +211,7 @@ std::string Player::waitForReply(int timeout) { } void Player::doNotify(const std::string_view &command, const std::string_view &data) { - if (getState() != Player::Online) + if (!isOnline()) return; // spdlog::debug("[TX](id={} connId={} state={} Room={}): {} {}", id, connId, getStateString(), roomId, command, toHex(data));