Files
OnlineRpg/战斗邀请响应功能修复.md
2025-10-26 20:44:58 +08:00

148 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 战斗邀请响应功能修复
## 问题描述
当玩家在游戏大厅收到战斗邀请时,输入 `accept 20241111``reject 20241111` 会被识别为"无效选项",无法正确处理邀请响应。
### 错误场景
```
【20245738】>
*** 20241111 邀请你战斗!***
输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝
【20245738】> accept 20241111
无效选项。请输入1-5。 ❌ 错误提示
```
## 原因分析
`GameClient::handleLobbyInput()` 函数中,代码只处理数字选项 1-5没有处理 `accept``reject` 命令。
### 修复前的代码
```cpp
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()` 函数开头添加邀请响应命令的处理逻辑:
### 修复后的代码
```cpp
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|yes`
- `reject 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
✅ 无编译错误
## 测试建议
1. 启动服务器
2. 启动两个客户端玩家A和玩家B
3. 玩家A邀请玩家B
4. 玩家B输入 `accept 玩家A用户名`
5. 验证双方是否成功进入战斗
## 后续优化建议
1. 添加邀请发送成功的确认消息
2. 添加邀请超时机制如30秒自动取消
3. 支持简化命令:直接输入 `accept` 接受最近的邀请
4. 添加邀请队列,显示所有待处理的邀请