mirror of
https://github.com/ChuXunYu/OnlineRpg.git
synced 2026-01-30 23:41:26 +00:00
3.8 KiB
3.8 KiB
战斗邀请响应功能修复
问题描述
当玩家在游戏大厅收到战斗邀请时,输入 accept 20241111 或 reject 20241111 会被识别为"无效选项",无法正确处理邀请响应。
错误场景
【20245738】>
*** 20241111 邀请你战斗!***
输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝
【20245738】> accept 20241111
无效选项。请输入1-5。 ❌ 错误提示
原因分析
在 GameClient::handleLobbyInput() 函数中,代码只处理数字选项 1-5,没有处理 accept 和 reject 命令。
修复前的代码
void GameClient::handleLobbyInput(const std::string& input) {
if (input.empty()) {
return;
}
if (input == "1") {
// Chat
...
} else if (input == "2") {
// List players
...
}
// ... 其他选项
else {
std::cout << "无效选项。请输入1-5。" << std::endl; // ❌ 所有非1-5的输入都报错
}
}
解决方案
在 handleLobbyInput() 函数开头添加邀请响应命令的处理逻辑:
修复后的代码
void GameClient::handleLobbyInput(const std::string& input) {
if (input.empty()) {
return;
}
// ✅ 新增:检查是否是邀请响应命令
if (input.find("accept ") == 0 || input.find("reject ") == 0) {
size_t spacePos = input.find(' ');
if (spacePos != std::string::npos) {
std::string response = input.substr(0, spacePos); // "accept" 或 "reject"
std::string inviter = input.substr(spacePos + 1); // 邀请者用户名
bool accept = (response == "accept");
std::string msg = Protocol::buildMessage(Protocol::C2S_INVITE_RSP,
{inviter, accept ? "yes" : "no"});
sendMessage(msg);
}
return; // 处理完毕,直接返回
}
// 原有的菜单选项处理
if (input == "1") {
...
}
...
}
功能说明
1. 命令格式解析
- 检测以
accept或reject开头的输入 - 提取命令类型(accept/reject)
- 提取邀请者用户名
2. 协议构建
accept username→ 发送INVITE_RSP|username|yesreject username→ 发送INVITE_RSP|username|no
3. 服务器处理
服务器收到邀请响应后,会通过 ClientHandler::handleInviteResponse() 处理:
- 验证邀请是否有效
- 接受:创建战斗房间,双方进入战斗
- 拒绝:通知邀请者被拒绝
正确使用流程
玩家A(邀请方)
【20241111】> 3
目标玩家用户名:20245738
【服务器】邀请已发送(等待服务器实现此消息)
玩家B(被邀请方)
【20245738】>
*** 20241111 邀请你战斗!***
输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝
【20245738】> accept 20241111
接受邀请后
*** 战斗开始!***
对手:20241111
...
>>> 你的回合 <<<
【战斗】>
拒绝邀请
【20245738】> reject 20241111
【服务器】已拒绝邀请
相关文件
src/client/GameClient.cpp- 客户端输入处理src/server/ClientHandler.cpp- 服务器邀请响应处理src/server/GameLobby.cpp- 大厅邀请逻辑include/common/Protocol.h- 协议定义
编译状态
✅ 已重新编译 ✅ 客户端:76KB ✅ 服务器:1.7MB ✅ 无编译错误
测试建议
- 启动服务器
- 启动两个客户端(玩家A和玩家B)
- 玩家A邀请玩家B
- 玩家B输入
accept 玩家A用户名 - 验证双方是否成功进入战斗
后续优化建议
- 添加邀请发送成功的确认消息
- 添加邀请超时机制(如30秒自动取消)
- 支持简化命令:直接输入
accept接受最近的邀请 - 添加邀请队列,显示所有待处理的邀请