Przeglądaj źródła

起服&工单9问题

jeson_fxd 2 tygodni temu
rodzic
commit
7d9e461755

+ 26 - 0
.cursor/mcp.json

@@ -0,0 +1,26 @@
+{
+  "mcpServers": {
+    "filesystem": {
+      "command": "npx",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-filesystem",
+        "D:/WorkSpace/project/chuanzhanServer"
+      ]
+    },
+    "sequential-thinking": {
+      "command": "npx",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-sequential-thinking"
+      ]
+    },
+    "memory": {
+      "command": "npx",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-memory"
+      ]
+    }
+  }
+}

+ 7 - 8
apollo_60000/serverlist.json

@@ -1,15 +1,14 @@
-[
+[
   {
     "id": 1,
     "index": 0,
-    "name": "测试服1区",
-    "address": "47.109.111.123:19821",
+    "name": "fxd测试",
+    "address": "192.168.0.85:18081",
     "state": 1,
-   "is_open": true,
-   "capacity":2000,
+    "is_open": true,
+    "capacity": 2000,
     "serverid": 1,
     "groupid": 1,
-    "note": "测试服"
+    "note": "local"
   }
-
-]
+]

+ 3 - 1
docs/文档/打包发布起服.md

@@ -57,8 +57,9 @@ cd /data/CzServer/develop
 ```shell
 #注意_output.server.zip 和 _output.server文件夹都需要删除
 
-#替换/删除完成后,进入对应目录 执行重启命令
+#替换/删除完成后,进入对应目录
 cd /data/CzServer/_output.server/dev 
+# 执行重启命令
 ./start.sh restart
 ```
 
@@ -71,5 +72,6 @@ cd /data/CzServer/_output.server/dev
 #战斗服的文件存放路径不一样;同样完成操作后重启
 cd /data/CzServer
 ./publish.sh battle
+进入文件夹后,有 start.sh* 和stop.sh* 2个脚本文件,分别代表起服和停服
 ```
 

+ 447 - 0
docs/文档/服务器起服&连接异常.md

@@ -0,0 +1,447 @@
+# 服务器起服 & 客户端连接异常排查
+
+> 整理自 Cursor Agent 对话(2026-06-11)  
+> 服务端项目:`D:\WorkSpace\project\chuanzhanServer`  
+> Unity 客户端:`D:\WorkSpace\jyyz_game\client`
+
+---
+
+## 目录
+
+1. [架构与端口规划](#1-架构与端口规划)
+2. [本地起服完整流程](#2-本地起服完整流程)
+3. [起服异常:AccountServer 拉取静态配置失败](#3-起服异常accountserver-拉取静态配置失败)
+4. [Unity 客户端连接服务器流程](#4-unity-客户端连接服务器流程)
+5. [`address=` 日志在哪里打印](#5-address-日志在哪里打印)
+6. [为什么本地 `serverlist.json` 没生效](#6-为什么本地-serverlistjson-没生效)
+7. [验证清单](#7-验证清单)
+8. [常见误区](#8-常见误区)
+9. [关键文件索引](#9-关键文件索引)
+10. [总结](#10-总结)
+
+---
+
+## 1. 架构与端口规划
+
+### 1.1 两类地址(极易混淆)
+
+配置和日志里的 `127.0.0.1` 分两类:
+
+| 类型 | 说明 | 谁提供 |
+|------|------|--------|
+| **静态配置 URL** | `serverlist.json`、停服配置等 | 需独立 HTTP 静态服务(80 / 8000) |
+| **游戏服自身服务** | 账号、支付、Connector TCP 等 | `OpenCards.Server.Main` 进程 |
+
+### 1.2 端口对照表
+
+| 服务 | 端口 | 协议 | 说明 |
+|------|------|------|------|
+| 静态配置(无端口) | 80 | HTTP | 停服/更新/版本记录 JSON |
+| 区服列表 | 8000 | HTTP | `serverlist.json` |
+| AccountServer | 18081 | HTTP | 登录、账号 API |
+| PayServer | 18082 | HTTP | 支付 |
+| AdminService | 18088 | HTTP | GM 后台 |
+| **Connector(客户端游戏连接)** | **19821** | **TCP** | `local` 单节点默认 |
+| Connector 2 区 | 19822 | TCP | `local2` 多节点 2 区 |
+| Redis | 6379 | TCP | 依赖服务 |
+| MySQL | 3306 | TCP | Pay 等模块依赖 |
+
+> **注意**:`18081` 是 HTTP 账号接口,`19821` 才是 Unity 客户端建立游戏长连接的 TCP 端口。`serverlist.json` 里的 `address` 必须写 Connector 地址(如 `127.0.0.1:19821`),不能写 `18081`。
+
+---
+
+## 2. 本地起服完整流程
+
+建议每次本地调试按以下顺序操作:
+
+### 第一步:启动依赖
+
+- Redis(`6379`)
+- MySQL(若启用 Pay 等模块)
+
+### 第二步:启动静态配置 HTTP 服务
+
+```powershell
+# 以管理员身份运行(80 端口可能需要管理员权限)
+powershell -ExecutionPolicy Bypass -File D:\WorkSpace\project\chuanzhanServer\scripts\start_local_static.ps1
+```
+
+或手动启动:
+
+```powershell
+python -m http.server 80 --directory D:\WorkSpace\project\chuanzhanServer\local_static\port80
+python -m http.server 8000 --directory D:\WorkSpace\project\chuanzhanServer\local_static\port8000
+```
+
+### 第三步:以管理员身份启动游戏服
+
+```powershell
+cd server\src\_output.server\net5.0
+OpenCards.Server.Main.exe local
+```
+
+Windows 下 HTTP 监听 `http://+:18081` 等需 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
+```
+
+### 第四步:验证端口
+
+```powershell
+netstat -ano | findstr "LISTENING" | findstr ":80 :8000 :18081 :18082 :18088 :19821"
+```
+
+---
+
+## 3. 起服异常:AccountServer 拉取静态配置失败
+
+### 3.1 现象
+
+```
+ERROR AccountServer - 由于目标计算机积极拒绝,无法连接。 (127.0.0.1:80),url:
+                                http://127.0.0.1/cjw_60000_stop_server.json
+
+System.Net.Http.HttpRequestException : 由于目标计算机积极拒绝,无法连接。 (127.0.0.1:80)
+```
+
+### 3.2 原因
+
+**不是游戏服没起来**,而是 AccountServer 启动后会 **主动 HTTP 拉取外部静态 JSON**,本机 80 / 8000 没有 HTTP 服务时会报「积极拒绝连接」。
+
+`_launch_server_local.xml` 相关配置:
+
+```xml
+<StopServerDataURL>http://127.0.0.1/cjw_60000_stop_server.json</StopServerDataURL>
+<ServerListUrl>http://127.0.0.1:8000/serverlist.json</ServerListUrl>
+<UpdateServerConfig>http://127.0.0.1/update_server_config.json</UpdateServerConfig>
+<!-- 以及 android/ios 版本记录配置 -->
+```
+
+| URL | 需要的本地服务 |
+|-----|----------------|
+| `http://127.0.0.1:8000/serverlist.json` | 8000 端口静态文件服务 |
+| `http://127.0.0.1/xxx.json`(无端口 = 80) | 80 端口静态文件服务 |
+
+### 3.3 本地静态配置目录
+
+项目已准备:
+
+| 端口 | 目录 | 说明 |
+|------|------|------|
+| 80 | `local_static/port80/` | 停服、更新、版本记录等 JSON |
+| 8000 | `local_static/port8000/` | 区服列表 `serverlist.json` |
+
+启动脚本:`scripts/start_local_static.ps1`
+
+### 3.4 备选:改用 OSS 远程地址
+
+不想搭本地静态服时,参考 `_launch_server_dev.xml` 将 URL 改为 OSS:
+
+```xml
+<StopServerDataURL>https://zqtfcn.oss-cn-shanghai.aliyuncs.com/apollo/cjw_60000_stop_server.json</StopServerDataURL>
+<ServerListUrl>https://zqtfcn.oss-cn-shanghai.aliyuncs.com/apollo/serverlist.json</ServerListUrl>
+```
+
+使用远程列表时,`address` 仍需改成本机 Connector 地址。
+
+---
+
+## 4. Unity 客户端连接服务器流程
+
+整体链路如下:
+
+```
+┌─────────────────────────────────────────────────────────────────┐
+│  Unity 客户端                                                    │
+├─────────────────────────────────────────────────────────────────┤
+│  热更/版本检查 → LoginMgr.login_url(账号服 HTTP 地址)          │
+│       ↓                                                          │
+│  获取区服列表(见下方两条链路)                                   │
+│       ↓                                                          │
+│  账号登录 → s2c_gateUrl(SDK 模式)或 serverlist.address(DEBUG)│
+│       ↓                                                          │
+│  loginCtrl.EnterServer → LoginMgr.EnterServerRequest(address)    │
+│       ↓                                                          │
+│  connector.Connect(address)  →  Connector TCP(19821/19822)     │
+└─────────────────────────────────────────────────────────────────┘
+```
+
+### 4.1 区服列表的两条独立链路
+
+| 链路 | 触发方 | 数据来源 | 影响范围 |
+|------|--------|----------|----------|
+| **链路 A:DEBUG 登录** | `LoginMgr.GetServerUrl()` | Unity C# 硬编码/配置的 URL | `loginCtrl.serverlist_data` → `address` |
+| **链路 B:账号服** | AccountServer 启动拉取 | `_launch_server.xml` 的 `ServerListUrl` | 登录返回 `s2c_gateUrl` |
+
+**只改仓库里的 JSON 文件,不等于 Unity 一定会用到**——必须让对应链路的 URL 指向你的 JSON,且静态 HTTP 服务在运行。
+
+### 4.2 DEBUG 模式 vs SDK 模式
+
+| 模式 | 判定 | address 来源 |
+|------|------|-------------|
+| **DEBUG** | `loginCtrl.LOGINDEBUG = true`(`PLAT_ID == NORAML` 时默认 true) | `LoginMgr.GetServerUrl()` → `serverlist_data[].address` |
+| **SDK** | 走第三方/平台登录 | 账号登录响应 `s2c_gateUrl` ← AccountServer 从 serverlist 读出 |
+
+SDK 模式下账号服赋值逻辑:
+
+```csharp
+// AccountServer.HandleLogin.cs
+rsp.s2c_gateUrl = serverInfo.address;
+```
+
+---
+
+## 5. `address=` 日志在哪里打印
+
+连接地址会在 **Lua 和 C# 两层** 打印。
+
+### 5.1 Lua 层
+
+文件:`server/src/data/ClientScript/gameControl/login/loginCtrl.lua`
+
+```lua
+function loginCtrl.EnterServer(uuid, token, serverID, address)
+    if not address then
+        -- 从 serverlist_data 按 serverid 查找
+        for i = 1, #loginCtrl.serverlist_data do
+            local v = loginCtrl.serverlist_data[i]
+            if v.serverid == tonumber(serverID) then
+                address = v.address
+                break
+            end
+        end
+    end
+    print("address=" .. address)   -- ← 此处打印
+    LoginMgr.EnterServerRequest(address, uuid, token, ...)
+end
+```
+
+调用入口(DEBUG 模式):
+
+- `loginView.lua` → `InitCompInDEBUG()` → 选服后 `loginCtrl.EnterServer(...)`
+
+### 5.2 C# 层(Unity)
+
+文件:`jyyz_game/client/Assets/Scripts/Common/LoginMgr.cs`
+
+```csharp
+public static void EnterServerRequest(string address, string account, string token, int sessionId, LuaFunction callBack)
+{
+    Debug.Log("EnterServerRequest=address=" + address);  // ← Unity 控制台也会打印
+    connector.Connect(address, 15000, new ClientEnterServerRequest() { ... });
+}
+```
+
+若看到 `address=127.0.0.1:19822`,说明客户端拿到的区服列表里该服的 `address` 字段就是 `127.0.0.1:19822`。
+
+### 5.3 关于 `19822` 端口
+
+- `local` 单节点:Connector 默认 **19821**(`_launch_server_local.xml`)
+- `local2` 多节点:2 区 Connector 为 **19822**(`_launch_server_local2.xml`)
+
+若选了 `serverid=2` 或 serverlist 中 2 区写了 `19822`,日志就会显示该地址。需与当前实际起服配置和监听端口一致。
+
+---
+
+## 6. 为什么本地 `serverlist.json` 没生效
+
+### 6.1 链路 A:Unity DEBUG 模式(最常见)
+
+`LoginMgr.GetServerUrl` 从 **Unity 工程 C# 里配置的 URL** 下载列表,**不会自动读** 服务端仓库里的文件。
+
+当前客户端实现(`LoginMgr.cs`):
+
+```csharp
+public static void GetServerUrl(bool isDebug, LuaFunction callBack)
+{
+    // string url = DataPathHelper.server_list;  // 已注释
+    string url = "http://192.168.0.85/serverlist.json";  // ← 硬编码 URL
+    string returnText = wc.DownloadString(url);
+    // 包装为 {"servers": [...]} 后回调 Lua
+    callBack.call(serverData);
+}
+```
+
+**要让本地 serverlist 生效,需修改此处 URL**,例如:
+
+```csharp
+string url = "http://127.0.0.1:8000/serverlist.json";
+// 或本机 80 端口:http://127.0.0.1/serverlist.json
+```
+
+并确保对应端口的静态 HTTP 服务已启动。
+
+### 6.2 链路 B:账号服(影响 `s2c_gateUrl`)
+
+账号服从 `_launch_server.xml` 的 `ServerListUrl` 拉取:
+
+```xml
+<!-- _launch_server_local.xml -->
+<ServerListUrl>http://127.0.0.1:8000/serverlist.json</ServerListUrl>
+```
+
+生效条件:
+
+1. **8000 端口静态 HTTP 在运行**
+2. **游戏服已重启**(AccountServer 启动时拉取并缓存)
+3. **`address` 字段正确**(Connector TCP 端口,非 HTTP 端口)
+
+可通过账号服接口验证缓存内容:
+
+```
+http://127.0.0.1:18081/account/getserverlist
+```
+
+AccountServer 日志中也可看到:
+
+```
+GetServerList 服务器列表地址 : http://127.0.0.1:8000/serverlist.json
+GetServerList content : 1,true,127.0.0.1:19821,...
+```
+
+### 6.3 `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"
+  }
+]
+```
+
+字段注意:
+
+| 字段 | 要求 |
+|------|------|
+| `address` | `IP:端口`,**不要** `http://`,**不要** 尾部 `/` |
+| `address` 端口 | 必须是 Connector(19821),**不是** 18081 |
+| `id` | 账号服用 `id` 做 map key,需与登录时 `serverid` 对应 |
+| `is_open` | `true` 才会进入有效区服列表 |
+
+### 6.4 错误示例
+
+```json
+"address": "192.168.0.85:18081/"
+```
+
+问题:
+
+- `18081` 是账号 HTTP 接口,不是游戏 TCP 入口
+- 尾部 `/` 可能导致地址解析异常
+
+---
+
+## 7. 验证清单
+
+### 7.1 端口监听
+
+```powershell
+netstat -ano | findstr "LISTENING" | findstr ":80 :8000 :18081 :18082 :18088 :19821 :19822"
+```
+
+| 端口 | 期望 |
+|------|------|
+| 80 | LISTENING(静态配置) |
+| 8000 | LISTENING(serverlist) |
+| 18081 | LISTENING(AccountServer) |
+| 19821 | LISTENING(Connector,local 模式) |
+| 19822 | LISTENING(仅 local2 的 2 区) |
+
+### 7.2 静态配置可访问
+
+```powershell
+Invoke-WebRequest -Uri "http://127.0.0.1/cjw_60000_stop_server.json" -UseBasicParsing
+Invoke-WebRequest -Uri "http://127.0.0.1:8000/serverlist.json" -UseBasicParsing
+```
+
+### 7.3 账号服区服列表
+
+```powershell
+Invoke-WebRequest -Uri "http://127.0.0.1:18081/account/getserverlist" -UseBasicParsing
+```
+
+确认返回 JSON 中 `address` 为 `127.0.0.1:19821`(或你期望的 Connector 地址)。
+
+### 7.4 客户端实际连接地址
+
+Unity 控制台搜索:
+
+- Lua:`address=`
+- C#:`EnterServerRequest=address=`
+
+两者应一致,且与 `netstat` 中 Connector 监听端口匹配。
+
+---
+
+## 8. 常见误区
+
+| 误区 | 说明 |
+|------|------|
+| 只改仓库 JSON,不改 Unity `LoginMgr.cs` | DEBUG 模式走 `GetServerUrl` 硬编码 URL,不读本地文件 |
+| `address` 写成 `18081` | 那是 HTTP 账号接口,客户端 TCP 应连 19821 |
+| 只改 JSON 不重启游戏服 | AccountServer 启动时拉取一次 serverlist 并缓存 |
+| 8000 静态服未启动 | `ServerListUrl` 指向 8000 但无进程监听 → 拉取失败 |
+| 起服配置与 serverlist 端口不一致 | `local` 用 19821,`local2` 二区用 19822,需对应 |
+| 混淆 80 报错与客户端连不上 | 80 是 AccountServer 拉停服配置;客户端连的是 Connector TCP |
+
+---
+
+## 9. 关键文件索引
+
+### 服务端
+
+| 主题 | 路径 |
+|------|------|
+| 本地起服配置 | `server/src/server/OpenCards.Server.Main/_launch_server_local.xml` |
+| 多节点本地配置(含 19822) | `server/src/server/OpenCards.Server.Main/_launch_server_local2.xml` |
+| OSS 配置参考 | `server/src/server/OpenCards.Server.Main/_launch_server_dev.xml` |
+| AccountServer 拉取 serverlist | `server/src/server/OpenCards.Server.Account/Modules/AccountServer.HanldeServerListData.cs` |
+| 登录返回 gateUrl | `server/src/server/OpenCards.Server.Account/Modules/AccountServer.HandleLogin.cs` |
+| 本地静态配置(80) | `local_static/port80/` |
+| 本地静态配置(8000) | `local_static/port8000/` |
+| 静态服启动脚本 | `scripts/start_local_static.ps1` |
+| 配置样例 | `apollo_60000/` |
+
+### 客户端 Lua
+
+| 主题 | 路径 |
+|------|------|
+| 打印 `address=` | `server/src/data/ClientScript/gameControl/login/loginCtrl.lua` |
+| DEBUG 选服登录 | `server/src/data/ClientScript/gameView/login/loginView.lua` |
+| 热更设置 login_url | `server/src/data/ClientScript/HotUpdate/HotUpdateCtrl.lua` |
+
+### Unity C#
+
+| 主题 | 路径 |
+|------|------|
+| 拉取 serverlist(DEBUG) | `jyyz_game/client/Assets/Scripts/Common/LoginMgr.cs` → `GetServerUrl` |
+| TCP 连接 Connector | `jyyz_game/client/Assets/Scripts/Common/LoginMgr.cs` → `EnterServerRequest` |
+
+---
+
+## 10. 总结
+
+| 问题 | 结论 |
+|------|------|
+| 起服报 `127.0.0.1:80` 拒绝 | 需独立静态 HTTP(80/8000),游戏服不提供这些 JSON |
+| `address=` 在哪打印 | Lua `loginCtrl.EnterServer` + C# `LoginMgr.EnterServerRequest` |
+| 本地 serverlist 不生效 | DEBUG 改 `LoginMgr.GetServerUrl` URL;SDK 改 `ServerListUrl` + 启静态服 + 重启游戏服 |
+| 客户端应连哪个端口 | Connector TCP:**19821**(local)或 **19822**(local2 二区),不是 18081 |
+| 推荐本地联调顺序 | 静态服(80/8000) → 游戏服 → 改 Unity URL → 验证 getserverlist → 看 `address=` 日志 |
+
+---
+
+*文档由 Cursor 对话自动整理生成*

+ 1 - 0
local_static/port80/android_version_record_file.json

@@ -0,0 +1 @@
+[]

+ 1 - 0
local_static/port80/android_zip_record_file.json

@@ -0,0 +1 @@
+[]

+ 10 - 0
local_static/port80/cjw_60000_stop_server.json

@@ -0,0 +1,10 @@
+[
+  {
+    "id": 1081,
+    "server_id": 2,
+    "state": 2,
+    "start_time": 1662804900,
+    "stop_time": 1662806700,
+    "advance_send_email_time": 3
+  }
+]

+ 1 - 0
local_static/port80/ios_version_record_file.json

@@ -0,0 +1 @@
+[]

+ 1 - 0
local_static/port80/ios_zip_record_file.json

@@ -0,0 +1 @@
+[]

+ 14 - 0
local_static/port80/serverlist.json

@@ -0,0 +1,14 @@
+[
+  {
+    "id": 1,
+    "index": 0,
+    "name": "fxd测试",
+    "address": "192.168.0.85:19821",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": 1,
+    "groupid": 1,
+    "note": "local"
+  }
+]

+ 12 - 0
local_static/port80/update_server_config.json

@@ -0,0 +1,12 @@
+[
+  {
+    "productLine": "dev",
+    "deviceType": "android",
+    "targetAppVersion": "0.0.0",
+    "forceUpdateUrl": "https://www.baidu.com/sov_{0}_{1}.apk",
+    "resServerUrlPrefix": "http://127.0.0.1/apollo_60000",
+    "loginServerUrl": "http://127.0.0.1:18081/",
+    "appVersionReview": "0.0.0",
+    "loginServerUrlReview": "http://127.0.0.1:18081/"
+  }
+]

+ 14 - 0
local_static/port8000/serverlist.json

@@ -0,0 +1,14 @@
+[
+  {
+    "id": 1,
+    "index": 0,
+    "name": "fxd测试",
+    "address": "192.168.0.85:18081",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": 1,
+    "groupid": 1,
+    "note": "local"
+  }
+]

+ 1 - 0
local_static_test/test.json

@@ -0,0 +1 @@
+[]

+ 40 - 0
scripts/start_local_static.ps1

@@ -0,0 +1,40 @@
+# Local static JSON HTTP servers for AccountServer config fetch
+# Run in elevated PowerShell if port 80 fails
+
+$root = Split-Path -Parent $PSScriptRoot
+$port80Dir = Join-Path $root "local_static\port80"
+$port8000Dir = Join-Path $root "local_static\port8000"
+
+function Test-PortListening([int]$Port) {
+    $conn = Get-NetTCPConnection -LocalPort $Port -State Listen -ErrorAction SilentlyContinue
+    return $null -ne $conn
+}
+
+if (Test-PortListening 80) {
+    Write-Host "[skip] port 80 already listening"
+} else {
+    Write-Host "[start] port 80 -> $port80Dir"
+    Start-Process python -ArgumentList "-m http.server 80 --directory `"$port80Dir`"" -WindowStyle Minimized
+}
+
+if (Test-PortListening 8000) {
+    Write-Host "[skip] port 8000 already listening"
+} else {
+    Write-Host "[start] port 8000 -> $port8000Dir"
+    Start-Process python -ArgumentList "-m http.server 8000 --directory `"$port8000Dir`"" -WindowStyle Minimized
+}
+
+Start-Sleep -Seconds 2
+Write-Host ""
+Write-Host "verify:"
+foreach ($url in @(
+    "http://127.0.0.1/cjw_60000_stop_server.json",
+    "http://127.0.0.1:8000/serverlist.json"
+)) {
+    try {
+        $r = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 5
+        Write-Host "  OK   $url  HTTP $($r.StatusCode)"
+    } catch {
+        Write-Host "  FAIL $url  $($_.Exception.Message)"
+    }
+}

+ 462 - 0
server/src/data/ClientScript/Protocol/generated/_enum.lua

@@ -0,0 +1,462 @@
+SyncClientRoleDataType = {
+	Level = 1,
+	Exp = 2,
+	Diamond = 3,
+	AutoDisband = 4,
+	Coin = 5,
+	HeroDisbandUnlock = 6,
+	HeroRollbackUnlock = 7,
+	HeroReplacementUnlock = 8,
+	HeroPackCount = 9,
+	HeroPackOpenCnt = 10,
+	CryStalLevel = 11,
+	CryStalStep = 12,
+	CryStalState = 13,
+	CrystalBuyGirdByMatCnt = 14,
+	CrystalBuyGirdByDiamondCnt = 15,
+	VipLevel = 16,
+	VipExp = 17,
+	LastGeTimeBoxTime = 18,
+	QuickTimeCount = 19,
+	LastRefreshDataTime = 20,
+	HeroExp = 21,
+	ArenaValorID = 22,
+	WorldMapShowNonFriend = 23,
+	StrangerGroupID = 24,
+	FriendPoint = 25,
+	ChangeNameCount = 26,
+	ArenaHighendTier = 27,
+	ArenaHighendCoinTime = 28,
+	HeroReplacementConfigId = 29,
+	AccumulationTime = 30,
+	TotalTimeLimit = 31,
+	StageRankState = 32,
+	StageRanking = 33,
+	ReceiveStageChallengeTask = 34,
+	AcumulateActivityState = 35,
+	CryStalHighestLevel = 36,
+	ArenaValorCurrentRank = 37,
+	ArenaHighendCumulativeCoin = 38,
+	ArenaValorScore = 39,
+	ArenaValorFightVictoryTimes = 40,
+	ArenaValorHistoricHighestScore = 41,
+	ArenaValorTier = 42,
+	ArenaValorHistoricHighestTier = 43,
+	PresetHeroSelect1 = 44,
+	PresetHeroSelect2 = 45,
+}
+
+SyncClientFormationType = {
+	Battle = 1,
+	Team = 2,
+	TowerTeam1 = 3,
+	ArenaValorAttackTeam = 4,
+	ArenaValorDefendTeam = 5,
+	ArenaHighendAttackTeam = 6,
+	ArenaHighendDefendTeam = 7,
+	ArenaPinnacleTeam = 8,
+	ShowTeam = 10,
+	MazeTeam = 11,
+	TowerTeam2 = 12,
+	TowerTeam3 = 13,
+	TowerTeam4 = 14,
+	TowerTeam5 = 15,
+	TowerTeam6 = 16,
+	TowerTeam7 = 17,
+	AbyssMazeTeam = 21,
+	TopOfTime = 22,
+	GuildHunter = 23,
+	GuildSecret = 24,
+	Battle2 = 32,
+	Battle3 = 33,
+	Battle4 = 34,
+	Battle5 = 35,
+	QiJing = 36,
+	WishSummonBoss = 37,
+	NewGuildBoss = 38,
+	Dungeon_Gold = 41,
+	Dungeon_Exp = 42,
+	Dungeon_Hero = 43,
+	Dungeon_Artifact = 44,
+	Dungeon_Rune = 45,
+}
+
+CopyType = {
+	QiJingTanXian = 1,
+	ShiGuangNiLv = 2,
+	HeroTrial = 3,
+}
+
+SyncClientSummonType = {
+	Diamond = 1,
+	Race = 2,
+	Friend = 3,
+	Optional = 4,
+	Astrology = 5,
+	TimeLimited = 6,
+	Wish = 7,
+}
+
+SyncClientDrawType = {
+	Single = 1,
+	Ten = 2,
+}
+
+SyncClientRaceType = {
+	Human = 1,
+	Barbarian = 2,
+	Sui = 3,
+	Undead = 4,
+	God = 5,
+}
+
+MailConfigType = {
+	System = 1,
+	Guild = 2,
+	GuildSecret = 3,
+}
+
+PinnacleServiceType = {
+	Game = 0,
+	Public = 1,
+}
+
+SyncClientPinnacleStageType = {
+	Vacuum = 0,
+	Offseason = 1,
+	CompetitionPrepare = 2,
+	Group = 3,
+	Ro64 = 4,
+	Ro32 = 5,
+	Ro16 = 6,
+	QuarterFinals = 7,
+	SemiFinals = 8,
+	ChampionshipFinals = 9,
+}
+
+SyncClientCompetitionPeriodType = {
+	NotCompetition = 0,
+	Prepare = 1,
+	LockFormation = 2,
+	ResultShow = 3,
+}
+
+SyncClientCompetitionRankType = {
+	ChampionShip = 1,
+	Final2 = 2,
+	Final4 = 4,
+	Final8 = 8,
+	Ro16 = 16,
+	Ro32 = 32,
+	Ro64 = 64,
+	Group = 128,
+}
+
+ContestantGatherStateType = {
+	NotStartGatherYet = 0,
+	IsGathering = 1,
+	CompleteGathering = 2,
+	IncompleteGathering = 3,
+}
+
+CheckSeasonState = {
+	SeasonNotChange = 0,
+	OverSeason = 1,
+	OverSeason = 1,
+}
+
+StageRankStateType = {
+	StageRankStateType_0 = 0,
+	StageRankStateType_Season_1 = 1,
+	StageRankStateType_Season_End = 2,
+	StageRankStateType_Season_2 = 3,
+	StageRankStateType_End = 4,
+}
+
+FeedbackStateType = {
+	FeedbackStateType_0 = 0,
+	FeedbackStateType_Can_GetReward = 1,
+	FeedbackStateType_Already_Get = 2,
+}
+
+TargetTaskStatus = {
+	Unfinished = 0,
+	Unclaimed = 1,
+	Claimed = 2,
+}
+
+LoginActivityType = {
+	Online = 1,
+	Days = 2,
+}
+
+RoleType = {
+	Stranger = 0,
+	SameAreaFriend = 1,
+	SameArenGuildMember = 2,
+	SameAreaFriendAndGuildMember = 3,
+	OtherAreaFriend = 4,
+	OtherAreaGuildMember = 5,
+	OtherAreaFriendAndGuildMember = 6,
+}
+
+AddItemSpecialReason = {
+}
+
+ItemType = {
+	Tool = 1,
+	Hero = 2,
+	Weapon = 3,
+	Relic = 4,
+	Artifact = 5,
+	Hallows = 6,
+}
+
+ItemAdditionType = {
+	ItemAdditionType_Common = 0,
+	ItemAdditionType_VIP = 1,
+	ItemAdditionType_Subscribe = 2,
+	ItemAdditionType_Stars = 3,
+}
+
+MailReadType = {
+	UnRead = 1,
+	Readed = 2,
+}
+
+MailClaimType = {
+	UnClaim = 1,
+	Claimed = 2,
+}
+
+MailOperateType = {
+	Read = 1,
+	Claim = 2,
+	Del = 3,
+}
+
+JoinGuildCheckType = {
+	NoCheck = 0,
+	NeedCheck = 1,
+	AbadonJoin = 2,
+}
+
+GuildMemberType = {
+	Leader = 1,
+	Presbyter = 2,
+	Member = 3,
+}
+
+GuildPrivilegeType = {
+	ChangePosition = 1,
+	HandleApplyJoinGuild = 2,
+	OpenActivity = 3,
+	InfoSetting = 4,
+	GuildMail = 5,
+	ChangeGuildPlace = 6,
+	ChangeProtector = 7,
+	KickOutGuild = 8,
+	SummonBoss = 9,
+	InviteJoin = 10,
+}
+
+GuildEventType = {
+	PlayerJoinGuild = 1,
+	PlayerExitGuild = 2,
+	PlayerKickoutGuild = 3,
+	PlayerPositionChanged = 4,
+	CreateGuild = 5,
+	SetProtector = 6,
+	CancelProtector = 7,
+	AutoChangeLeader = 8,
+}
+
+EnumHeroSourceType = {
+	HeroSourceType_None = 0,
+	HeroSourceType_Friend = 1,
+	HeroSourceType_Guild = 2,
+}
+
+EnumRelationType = {
+	RelationType_None = 0,
+	RelationType_Guild = 1,
+	RelationType_Friend = 2,
+	RelationType_GuildFriend = 3,
+	RelationType_Self = 4,
+}
+
+GetStatus = {
+	NotGet = 0,
+	UnGet = 1,
+	Got = 2,
+}
+
+ApplyStatus = {
+	NotApply = 0,
+	Applied = 1,
+	Have = 2,
+}
+
+FightType = {
+	FightType_Main = 1,
+	FightType_Maze = 2,
+	FightType_Coy = 3,
+	FightType_GuildPK = 4,
+	FightType_FriendPK = 5,
+	FightType_GuildHunter = 6,
+	FightType_GuildSecret = 7,
+	FightType_Tower = 10,
+	FightType_ArenaValor = 11,
+	FightType_ArenaHighend = 12,
+	FightType_ArenaPinnacle = 13,
+	FightType_GuangZhu = 14,
+	FightType_LieCi = 15,
+	FightType_CangCui = 16,
+	FightType_QianHai = 17,
+	FightType_YueSheng = 18,
+	FightType_JiYuan = 19,
+	FightType_QiJing = 20,
+	FightType_Dungeon_Gold = 31,
+	FightType_Dungeon_Exp = 32,
+	FightType_Dungeon_Hero = 33,
+	FightType_Dungeon_Artifact = 34,
+	FightType_Dungeon_Rune = 35,
+	FightType_ActivityBoss = 101,
+	FightType_TimeLimitedSpecialTraining = 102,
+	FightType_WishSummon_Activity_Boss = 103,
+	FightType_GuildBOSS = 104,
+	FightType_TOTAL_NUM = 105,
+}
+
+FightResultType = {
+	FightResultType_Win = 1,
+	FightResultType_Fail = 2,
+	FightResultType_Exit = 3,
+	FightResultType_Timeout = 4,
+}
+
+TowerType = {
+	TowerType_WangZuo = 1,
+	TowerType_GuangZhu = 2,
+	TowerType_LieCi = 3,
+	TowerType_CangCui = 4,
+	TowerType_QianHai = 5,
+	TowerType_YueSheng = 6,
+	TowerType_JiYuan = 7,
+}
+
+GetTimeRewardType = {
+	GET_TIME_TYPE_ORDER = 0,
+	GET_TIME_TYPE_QUICK = 1,
+}
+
+CryState = {
+	Cry_UNKNOWN = 0,
+	Cry_Rank = 1,
+	Cry_Already_Rank = 2,
+}
+
+CryGirdCostType = {
+	Cry_COST_CRY = 1,
+	Cry_COST_GAMES = 2,
+}
+
+VoidKeyLinkType = {
+	VoidKeyLinkType_Use = 1,
+	VoidKeyLinkType_Remove = 2,
+}
+
+ForeignAidHeroUseStatus = {
+	FREE = 1,
+	USE_FETTERS = 2,
+	USE_TASK = 3,
+}
+
+LifeTreeUpgradeType = {
+	CORE_BLESS_TYPE = 1,
+	ASSIST_BLESS_TYPE = 2,
+	MAGE_BLESS_TYPE = 3,
+	WARRIOR_BLESS_TYPE = 4,
+	TANK_BLESS_TYPE = 5,
+	RANGER_BLESS_TYPE = 6,
+}
+
+Platform = {
+	None = 0,
+	Googleplay = 1,
+	Appstore = 2,
+}
+
+OrderState = {
+	None = 0,
+	Purchased = 1,
+	Completed = 2,
+}
+
+ChatType = {
+	WorldChat = 1,
+	LocalChat = 2,
+	GuildChat = 3,
+	PrivateChat = 4,
+}
+
+ChannelStatus = {
+	Unimpeded = 0,
+	Jam = 1,
+	Full = 2,
+}
+
+HotType = {
+	HeroHot = 1,
+	TeamHot = 2,
+	EquipHot = 3,
+	furnitureHot = 4,
+}
+
+HotRankType = {
+	MainRank = 1,
+	TowerRank = 2,
+	GuangZhuRank = 3,
+	LieCiRank = 4,
+	CangCuiRank = 5,
+	QianHaiRank = 6,
+	YueShengRank = 7,
+	JiYuanRank = 8,
+	ValorArenaRank = 9,
+	HighendArenaRank = 10,
+	PinnacleArenaRank = 11,
+	RaceEquipRank = 12,
+	GodEquipRank = 13,
+	VoidEquipRank = 14,
+}
+
+TimeLimitedActivityType = {
+	SummonCountReward = 1,
+	PassCheck = 2,
+	DailyTask = 3,
+	AchievementTask = 4,
+	DirectGift = 5,
+	SpecialTraining = 6,
+	ExpGift = 7,
+}
+
+TimeLimitedClaimStatus = {
+	Unfinished = 0,
+	Unclaimed = 1,
+	Claimed = 2,
+}
+
+WishSummonActivityType = {
+	WishSummon = 1,
+	BossChallenge = 2,
+	HeroGift = 3,
+	WeekCard = 4,
+	LimitedGift = 5,
+}
+
+NewServerActivityType = {
+	LoginDay = 1,
+	BossChallenge = 2,
+	LimitedGift = 3,
+}
+

+ 2 - 2
server/src/library/xlslang.runtimeconfig.json

@@ -1,4 +1,4 @@
-{
+{
   "runtimeOptions": {
     "tfm": "net5.0",
     "framework": {
@@ -6,4 +6,4 @@
       "version": "5.0.0"
     }
   }
-}
+}

+ 3 - 2
server/src/server/OpenCards.Server.Logic/LogicService.cs

@@ -25,6 +25,7 @@ using System.Threading;
 using OpenCards.Core.Protocol;
 using OpenCards.Server.Common;
 using OpenCards.Server.Common.Statistic;
+using static Org.BouncyCastle.Bcpg.Attr.ImageAttrib;
 
 namespace OpenCards.Server.Logic
 {
@@ -661,8 +662,8 @@ namespace OpenCards.Server.Logic
             {
                 if (string.IsNullOrWhiteSpace(enter.c2s_UseSource))
                 {
-                    //默认是小游戏模式
-                    roleModule.roleExtDataMapping.UserSource = ConstantDefines.UserSource_MiniGame;
+                    //默认是小游戏模式. 需要修改
+                    roleModule.roleExtDataMapping.UserSource = ConstantDefines.UserSource_Normal;
                 }
                 else
                 {

+ 1 - 1
server/src/server/OpenCards.Server.Main/_launch_server_local.xml

@@ -19,7 +19,7 @@
             <StopServerDataURL>
 				http://127.0.0.1/cjw_60000_stop_server.json
 			</StopServerDataURL>
-            <ServerListUrl>http://127.0.0.1:8000/serverlist.json</ServerListUrl>
+            <ServerListUrl>http://192.168.0.85/serverlist.json</ServerListUrl>
             <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
             <UpdateServerConfig>
 				http://127.0.0.1/update_server_config.json

+ 2 - 1
server/src/server/OpenCards.Server.Main/_launch_server_local2.xml

@@ -63,7 +63,8 @@
           <Config>
             <HttpListen>http://+:18081/account/</HttpListen>
             <SecretKey>3dbf6b137a80d10953507929a0216d8b</SecretKey>
-            <ServerListUrl>http://127.0.0.1/serverlist.json</ServerListUrl>
+            <!--<ServerListUrl>http://127.0.0.1/serverlist.json</ServerListUrl>-->
+            <ServerListUrl>http://192.168.0.85/serverlist.json</ServerListUrl>
             <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
             <StopServerDataURL>http://127.0.0.1/stop_server_list.json</StopServerDataURL>
             <UpdateServerConfig>http://127.0.0.1/update_server_config.json</UpdateServerConfig>

+ 3 - 0
静态服务启动.bat

@@ -0,0 +1,3 @@
+REM 以管理员身份运行(80 端口可能需要)
+powershell -ExecutionPolicy Bypass -File scripts\start_local_static.ps1
+pause