|
|
@@ -0,0 +1,302 @@
|
|
|
+# chuanzhanServer 对话记录
|
|
|
+
|
|
|
+**日期:** 2026-06-10
|
|
|
+**项目:** chuanzhanServer
|
|
|
+**整理内容:** 战斗逻辑位置与战斗结算超时问题、本地起服 127.0.0.1 地址无法访问问题
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、战斗逻辑存放位置与战斗结算报错
|
|
|
+
|
|
|
+### 1.1 问题描述
|
|
|
+
|
|
|
+战斗结束后,GameNode 日志出现如下报错:
|
|
|
+
|
|
|
+```
|
|
|
+ERROR session:111115_1@GameNode1 - A Task Timeout Exception!
|
|
|
+DeepFrozen.RPC.Remote.RpcException : A Task Timeout Exception!
|
|
|
+
|
|
|
+ERROR ConnectorService_1 - Request is : TypeCodec : OpenCards.Core.Protocol.Client.ClientFightResultRequest (217603)
|
|
|
+```
|
|
|
+
|
|
|
+日志时间线示例:
|
|
|
+
|
|
|
+```
|
|
|
+00:06:32 ClientEnterGameRequest Reconnect(玩家重连)
|
|
|
+00:06:32 StartLogicService
|
|
|
+00:06:40 ClientFightResultRequest 超时(约 8 秒)
|
|
|
+00:07:33 ClientFightResultRequest 再次超时(客户端重试)
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 1.2 战斗逻辑存放位置
|
|
|
+
|
|
|
+项目采用 **客户端 Lua 跑战斗 + 服务端 C# 结算/校验** 的架构。
|
|
|
+
|
|
|
+#### 客户端战斗核心(Lua)
|
|
|
+
|
|
|
+**主目录:** `server/src/data/ClientScript/battle/`
|
|
|
+
|
|
|
+| 文件/目录 | 作用 |
|
|
|
+|-----------|------|
|
|
|
+| `battle_main.lua` | 战斗入口,按模式创建不同 Battle 实例 |
|
|
|
+| `battle_core.lua` | 战斗核心循环(tick、update、结算) |
|
|
|
+| `mode/battle_stage.lua` | 主线关卡战斗模式 |
|
|
|
+| `entity/`、`skill/`、`buff/`、`ai/` | 实体、技能、Buff、AI |
|
|
|
+| `server.lua` | 服务端无头战斗入口(供战斗服校验用) |
|
|
|
+
|
|
|
+**客户端控制层:**
|
|
|
+
|
|
|
+- `gameControl/battle/battleCtrl.lua` — 战斗流程控制
|
|
|
+- `gameControl/battleResult/battleResultCtrl.lua` — 战斗结束后发起 `ClientFightResultRequest`
|
|
|
+
|
|
|
+#### 服务端战斗结算(C#)
|
|
|
+
|
|
|
+| 文件 | 作用 |
|
|
|
+|------|------|
|
|
|
+| `OpenCards.Server.Logic/Module/FightModules.cs` | 战斗结果处理核心:`HandleClientFightResultRequest` |
|
|
|
+| `OpenCards.Core/Protocol/Client/0x35200.Logic.Fight.cs` | 协议定义 `ClientFightResultRequest` |
|
|
|
+
|
|
|
+#### 独立战斗校验服
|
|
|
+
|
|
|
+| 位置 | 作用 |
|
|
|
+|------|------|
|
|
|
+| `server_battle/GameLogic/BattleServer.cs` | HTTP 战斗服,监听 `/fight/reqstartbattle` |
|
|
|
+| `OpenCards.Server.Battle/BattleServer.cs` | 集成版战斗服(当前 Lua 调用被注释) |
|
|
|
+
|
|
|
+战斗校验 HTTP 地址:
|
|
|
+
|
|
|
+```csharp
|
|
|
+public static string FightPostURL = "http://127.0.0.1:8088/fight/reqstartbattle";
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 1.3 报错原因分析
|
|
|
+
|
|
|
+报错性质是 **RPC 超时**,不是战斗 Lua 逻辑本身抛错。
|
|
|
+
|
|
|
+**调用链:**
|
|
|
+
|
|
|
+```
|
|
|
+客户端 → ConnectorService → SessionService → LogicService(FightModule) → 返回响应
|
|
|
+```
|
|
|
+
|
|
|
+**`ClientFightResultRequest` 服务端处理流程(`FightModules.HandleClientFightResultRequest`):**
|
|
|
+
|
|
|
+1. 校验 `FightMod / StageId / RandomUuid` 是否与开战时一致
|
|
|
+2. (可选)HTTP 调用战斗服重跑校验
|
|
|
+3. 触发 `AsyncEventHandleFightResult` 发奖励、更新关卡
|
|
|
+4. 同步 Public / Center / Bill 等服务
|
|
|
+
|
|
|
+#### 最可能的原因
|
|
|
+
|
|
|
+**① 重连与战斗结算并发冲突(高度可疑)**
|
|
|
+
|
|
|
+重连时 `LogicService` 处理 `ClientEnterGameRequest`,其中有同步阻塞:
|
|
|
+
|
|
|
+```csharp
|
|
|
+// LogicService.cs 第 726 行
|
|
|
+Provider.Execute(NotifyModulesClientEnterGameMustDataAsync).Wait();
|
|
|
+```
|
|
|
+
|
|
|
+`LogicService` 为单线程消息队列,`ClientFightResultRequest` 会排在重连逻辑之后,超过 RPC 超时阈值即报 `Task Timeout Exception`。
|
|
|
+
|
|
|
+**② 下游 RPC 服务响应慢或不可用**
|
|
|
+
|
|
|
+战斗胜利后的结算链路会调用:
|
|
|
+
|
|
|
+- `StageRankModule.CheckStageRankInfo` → StageRank 服务
|
|
|
+- `SyncStageInfo` → Public / Center 服务
|
|
|
+- `HandleSvaeBillInfo` → Bill 服务(保存战报)
|
|
|
+
|
|
|
+任一服务卡住都会导致超时。
|
|
|
+
|
|
|
+**③ 主线战斗校验已被关闭**
|
|
|
+
|
|
|
+`FightModules.cs` 中主线 PVE 的 HTTP 战斗校验代码已被注释:
|
|
|
+
|
|
|
+```csharp
|
|
|
+log.Info("================== 关闭战斗校验 ==================");
|
|
|
+// RequestBattleService(battlerinfo, RandomUuid, ResultInfo);
|
|
|
+```
|
|
|
+
|
|
|
+因此超时**不太可能是**战斗服 Lua 跑战斗太慢,更可能是 LogicService 排队或下游 RPC 阻塞。
|
|
|
+
|
|
|
+**④ RandomUuid 不匹配(会快速失败,不会超时)**
|
|
|
+
|
|
|
+若 `RandomUuid` 与开战时不一致,会直接返回 `CODE_CAN_NOT_FIGHT_CHAPTER`,不会等到超时。
|
|
|
+
|
|
|
+**⑤ ArenaPinnacle 警告无关**
|
|
|
+
|
|
|
+日志中 `Region 1 round contestants is not 8, grouping contestants failed!` 是竞技场巅峰赛分组问题,与本次战斗结算无直接关系。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 1.4 排查建议
|
|
|
+
|
|
|
+1. 查 GameNode1 完整日志,搜索 `111115` + `HandleClientFightResultRequest` / `Enter Game`,看重连与战斗结算是否重叠。
|
|
|
+2. 检查下游服务是否正常:StageRankService、PublicService、CenterService、BillService。
|
|
|
+3. 确认 RPC 超时配置(`_launch_server.xml` 中 `DefaultTaskExecuteTimeout`,默认 60000ms)。
|
|
|
+4. 客户端侧:战斗结束后若网络断开又重连,可在重连成功后再提交战斗结果。
|
|
|
+5. 检查 `_launch_server.xml` 中 `DefaultTaskExecuteTimeout` 是否被改得过短(如 5000–8000ms)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、本地起服后 127.0.0.1 地址无法访问
|
|
|
+
|
|
|
+### 2.1 问题描述
|
|
|
+
|
|
|
+使用 `_launch_server_local.xml` 起服后,配置中的 `127.0.0.1` 相关网址仍无法访问。
|
|
|
+
|
|
|
+**配置文件路径:** `server/src/server/OpenCards.Server.Main/_launch_server_local.xml`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2.2 两类 127.0.0.1 地址(关键)
|
|
|
+
|
|
|
+配置里的地址分两类,很多**不是**游戏服自己提供的页面。
|
|
|
+
|
|
|
+#### 类型 A:静态配置文件 URL(游戏服不会提供)
|
|
|
+
|
|
|
+```xml
|
|
|
+<ServerListUrl>http://127.0.0.1:8000/serverlist.json</ServerListUrl>
|
|
|
+<StopServerDataURL>http://127.0.0.1/cjw_60000_stop_server.json</StopServerDataURL>
|
|
|
+<UpdateServerConfig>http://127.0.0.1/update_server_config.json</UpdateServerConfig>
|
|
|
+<AndroidClientVersionRecordConfig>http://127.0.0.1/android_version_record_file.json</AndroidClientVersionRecordConfig>
|
|
|
+<!-- 以及 ios 相关配置 -->
|
|
|
+```
|
|
|
+
|
|
|
+这些是 **AccountServer 启动后主动去拉取的配置**,需要本地另起静态 HTTP 服务,游戏服本身不托管这些 JSON。
|
|
|
+
|
|
|
+| URL | 需要的本地服务 |
|
|
|
+|-----|----------------|
|
|
|
+| `http://127.0.0.1:8000/serverlist.json` | 8000 端口静态文件服务 |
|
|
|
+| `http://127.0.0.1/xxx.json`(无端口 = 80) | 80 端口静态文件服务 |
|
|
|
+
|
|
|
+仓库里虽有 `apollo_60000/serverlist.json` 等文件,但:
|
|
|
+
|
|
|
+- 文件名与配置不一致(如 `stop_server_list.json` vs `cjw_60000_stop_server.json`)
|
|
|
+- 没有自动部署到 8000/80 端口的机制
|
|
|
+- `serverlist.json` 里的 `address` 多为远程 IP,本地需改成 `127.0.0.1:19821`
|
|
|
+
|
|
|
+#### 类型 B:游戏服自身 HTTP/TCP 服务
|
|
|
+
|
|
|
+| 服务 | 地址 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| AccountServer | `http://127.0.0.1:18081/account/` | 账号/区服 API |
|
|
|
+| PayServer | `http://127.0.0.1:18082/pay/` | 支付 |
|
|
|
+| AdminService | `http://127.0.0.1:18088/api/` | 管理后台 |
|
|
|
+| Connector | `127.0.0.1:19821` | 客户端 TCP 连接 |
|
|
|
+
|
|
|
+由 `ServiceLauncher`(`OpenCards.Server.Main` 单节点模式)拉起。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2.3 当时环境检查结果
|
|
|
+
|
|
|
+本机端口检查:**只有 Redis 6379 在监听**,18081、18082、18088、19821、8000 均未监听。
|
|
|
+
|
|
|
+说明游戏服 HTTP 未成功启动,或进程已退出;仅“执行了起服命令”不够,需确认进程在跑且端口已绑定。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2.4 常见原因与处理
|
|
|
+
|
|
|
+| 原因 | 说明 | 处理 |
|
|
|
+|------|------|------|
|
|
|
+| 误把配置拉取地址当可访问页面 | `8000/serverlist.json` 需独立静态服 | 在 JSON 目录执行 `python -m http.server 8000` |
|
|
|
+| 本地缺少配置文件 | `cjw_60000_stop_server.json` 等不存在 | 从 `apollo_60000/` 复制重命名,或改 XML URL |
|
|
|
+| serverlist 地址不是本机 | 仓库内多为远程 IP | 改为 `"address": "127.0.0.1:19821"` |
|
|
|
+| Windows URL ACL 未注册 | `http://+:18081` 等需管理员权限 | 以管理员运行,或手动 `netsh http add urlacl` |
|
|
|
+| 依赖未就绪 | Redis、MySQL、战斗服 | Redis 已运行;Pay 需 MySQL;8088 战斗服在 local 配置中被注释 |
|
|
|
+| 启动方式与配置不匹配 | local.xml 仅 GlobalConfig | Main 用 `OpenCards.Server.Main.exe local`;多节点用 DotNetCore + local2 |
|
|
|
+
|
|
|
+**本地 serverlist.json 示例:**
|
|
|
+
|
|
|
+```json
|
|
|
+[
|
|
|
+ {
|
|
|
+ "id": 1,
|
|
|
+ "index": 0,
|
|
|
+ "name": "本地1区",
|
|
|
+ "address": "127.0.0.1:19821",
|
|
|
+ "state": 1,
|
|
|
+ "is_open": true,
|
|
|
+ "capacity": 2000,
|
|
|
+ "serverid": 1,
|
|
|
+ "groupid": 1,
|
|
|
+ "note": "local"
|
|
|
+ }
|
|
|
+]
|
|
|
+```
|
|
|
+
|
|
|
+**Windows URL ACL 手动注册:**
|
|
|
+
|
|
|
+```powershell
|
|
|
+netsh http add urlacl url=http://+:18081/account/ user=Everyone
|
|
|
+netsh http add urlacl url=http://+:18082/pay/ user=Everyone
|
|
|
+netsh http add urlacl url=http://+:18088/api/ user=Everyone
|
|
|
+netsh http add urlacl url=http://+:18089/chat/ user=Everyone
|
|
|
+```
|
|
|
+
|
|
|
+**Main 单节点启动:**
|
|
|
+
|
|
|
+```powershell
|
|
|
+cd server\src\_output.server\net5.0
|
|
|
+OpenCards.Server.Main.exe local
|
|
|
+```
|
|
|
+
|
|
|
+**验证端口:**
|
|
|
+
|
|
|
+```powershell
|
|
|
+netstat -ano | findstr "18081 19821 8000"
|
|
|
+```
|
|
|
+
|
|
|
+**快速改法(不想搭静态服):**
|
|
|
+
|
|
|
+将 `_launch_server_local.xml` 中的 `ServerListUrl` 等改为 OSS 地址(参考 `_launch_server_dev.xml`),本地联调时把 serverlist 中的 `address` 改成本机 IP:19821。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2.5 推荐本地调试步骤
|
|
|
+
|
|
|
+1. **以管理员身份**启动 Redis(已有)和 MySQL(Pay 需要)。
|
|
|
+2. 准备静态 JSON,启动 8000 端口 HTTP 服务。
|
|
|
+3. 确认 `serverlist.json` 中 `address` 为 `127.0.0.1:19821`。
|
|
|
+4. 以管理员身份启动 `OpenCards.Server.Main.exe local`。
|
|
|
+5. `netstat` 确认 18081、19821、8000 端口监听。
|
|
|
+6. 验证:
|
|
|
+ - 静态配置:`http://127.0.0.1:8000/serverlist.json`
|
|
|
+ - 账号服:`http://127.0.0.1:18081/account/getserverlist`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、关键文件索引
|
|
|
+
|
|
|
+| 主题 | 路径 |
|
|
|
+|------|------|
|
|
|
+| 战斗 Lua 核心 | `server/src/data/ClientScript/battle/` |
|
|
|
+| 战斗结算 C# | `server/src/server/OpenCards.Server.Logic/Module/FightModules.cs` |
|
|
|
+| 战斗协议 | `server/src/core/OpenCards.Core/Protocol/Client/0x35200.Logic.Fight.cs` |
|
|
|
+| 战斗校验服 | `server_battle/GameLogic/BattleServer.cs` |
|
|
|
+| 本地起服配置 | `server/src/server/OpenCards.Server.Main/_launch_server_local.xml` |
|
|
|
+| 完整多节点配置 | `server/src/server/OpenCards.Server.Main/_launch_server_local2.xml` |
|
|
|
+| 单节点启动器 | `server/src/server/OpenCards.Server.Main/ServiceLauncher.cs` |
|
|
|
+| 起服入口 | `server/src/server/OpenCards.Server.Main/Program.cs` |
|
|
|
+| 静态配置样例 | `apollo_60000/serverlist.json` 等 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、总结
|
|
|
+
|
|
|
+| 问题 | 结论 |
|
|
|
+|------|------|
|
|
|
+| 战斗逻辑在哪 | 主要在 `server/src/data/ClientScript/battle/`(Lua),结算在 `FightModules.cs` |
|
|
|
+| 战斗结算超时 | RPC 超时;重连阻塞 LogicService 或 StageRank/Center/Bill 下游慢 |
|
|
|
+| 127.0.0.1 无法访问 | 8000/80 为外部静态配置源,需自建 HTTP;18081 等需游戏服成功启动 + 管理员 URL ACL |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+*文档由 Cursor 对话自动整理生成*
|