mirror of
https://github.com/ChuXunYu/OnlineRpg.git
synced 2026-01-31 07:01:26 +00:00
148 lines
3.8 KiB
Markdown
148 lines
3.8 KiB
Markdown
# 战斗邀请响应功能修复
|
||
|
||
## 问题描述
|
||
|
||
当玩家在游戏大厅收到战斗邀请时,输入 `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. 添加邀请队列,显示所有待处理的邀请
|