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

3.8 KiB
Raw Permalink Blame History

战斗邀请响应功能修复

问题描述

当玩家在游戏大厅收到战斗邀请时,输入 accept 20241111reject 20241111 会被识别为"无效选项",无法正确处理邀请响应。

错误场景

【20245738】>
*** 20241111 邀请你战斗!***
输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝
【20245738】> accept 20241111
无效选项。请输入1-5。  ❌ 错误提示

原因分析

GameClient::handleLobbyInput() 函数中,代码只处理数字选项 1-5没有处理 acceptreject 命令。

修复前的代码

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|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. 添加邀请队列,显示所有待处理的邀请