Просмотр исходного кода

Merge branch 'dev' of http://43.226.57.217:3000/yishanyou/chuanzhanServer into dev

pigflower 2 недель назад
Родитель
Сommit
b5b044e09c
76 измененных файлов с 4885 добавлено и 615 удалено
  1. 26 0
      .cursor/mcp.json
  2. 7 8
      apollo_60000/serverlist.json
  3. 5 0
      data/ClientScript/Protocol/generated/_baseType.lua
  4. 6 0
      data/ClientScript/Protocol/generated/_enum.lua
  5. 1 0
      data/ClientScript/Protocol/generated/_errorCode.lua
  6. 625 0
      docs/GM系统API文档.md
  7. 260 0
      docs/多区配置指南.md
  8. 18 0
      docs/文档/协议修改.md
  9. 77 0
      docs/文档/打包发布起服.md
  10. 447 0
      docs/文档/服务器起服&连接异常.md
  11. 407 0
      docs/文档/配置表修改.md
  12. 1 0
      local_static/port80/android_version_record_file.json
  13. 1 0
      local_static/port80/android_zip_record_file.json
  14. 10 0
      local_static/port80/cjw_60000_stop_server.json
  15. 1 0
      local_static/port80/ios_version_record_file.json
  16. 1 0
      local_static/port80/ios_zip_record_file.json
  17. 14 0
      local_static/port80/serverlist.json
  18. 12 0
      local_static/port80/update_server_config.json
  19. 14 0
      local_static/port8000/serverlist.json
  20. 1 0
      local_static_test/test.json
  21. 40 0
      scripts/start_local_static.ps1
  22. 158 0
      server/src/core/OpenCards.Core/Data/0x40600.NewServerActivity.cs
  23. 1 0
      server/src/core/OpenCards.Core/Data/Constants.cs
  24. 157 0
      server/src/core/OpenCards.Core/ORM/NewServerActivityData.cs
  25. 152 0
      server/src/core/OpenCards.Core/Protocol/Client/0x56000.Logic.NewServerActivity.cs
  26. 2 0
      server/src/core/OpenCards.Core/Protocol/Constants.cs
  27. 28 28
      server/src/data/ClientScript/Data/Market.xlsx/push_gift_depot_limit.lua
  28. 2 567
      server/src/data/ClientScript/Data/_luaversion_.lua
  29. 6 6
      server/src/data/ClientScript/Data/activity_time.xlsx/activity_time.lua
  30. 2 0
      server/src/data/ClientScript/Data/item.xlsx/item.lua
  31. 52 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NEWSERVER_MarketGift.lua
  32. 30 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityChallengeRankData.lua
  33. 40 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityChallengeRankItem.lua
  34. 38 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityData.lua
  35. 38 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityBaseData.lua
  36. 30 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityBossChallengeData.lua
  37. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityData.lua
  38. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityHeroGiftData.lua
  39. 34 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityInfo.lua
  40. 40 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivitySummonData.lua
  41. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest.lua
  42. 36 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse.lua
  43. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest.lua
  44. 32 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse.lua
  45. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest.lua
  46. 30 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse.lua
  47. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerActivityRequest.lua
  48. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerActivityResponse.lua
  49. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerClientRequest.lua
  50. 28 0
      server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerClientResponse.lua
  51. 20 0
      server/src/data/ClientScript/Protocol/generated/_codec.lua
  52. 462 0
      server/src/data/ClientScript/Protocol/generated/_enum.lua
  53. 25 0
      server/src/data/ClientScript/Protocol/generated/_response-code.lua
  54. 1 1
      server/src/data/ServerData/build_xls2lua.bat
  55. 9 0
      server/src/library/xlslang.runtimeconfig.json
  56. 1 1
      server/src/server/OpenCards.Server.Core/TableManager.cs
  57. 3 2
      server/src/server/OpenCards.Server.Logic/LogicService.cs
  58. 1 1
      server/src/server/OpenCards.Server.Main/_launch_server_local.xml
  59. 2 1
      server/src/server/OpenCards.Server.Main/_launch_server_local2.xml
  60. 1 0
      start/1_launch_name_server.bat
  61. 1 0
      start/2_launch_PublicNode.bat
  62. 2 0
      start/3_launch_game_r1s1.bat
  63. 2 0
      start/4_launch_account.bat
  64. 1 0
      start/_launch_account.bat
  65. 1 0
      start/_launch_game_r1s1.bat
  66. 1 0
      start/_launch_guild.bat
  67. 1 0
      start/_launch_name_server.bat
  68. 1 0
      start/_launch_pay.bat
  69. 176 0
      start/_launch_public.xml
  70. 352 0
      start/_launch_server.xml
  71. 387 0
      start/create_zone.sh
  72. 140 0
      start/public.sh
  73. 158 0
      start/start.sh
  74. 0 0
      start/state/GameNode1/exit.txt
  75. 0 0
      start/state/PublicNode/exit.txt
  76. 3 0
      静态服务启动.bat

+ 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"
   }
-
-]
+]

+ 5 - 0
data/ClientScript/Protocol/generated/_baseType.lua

@@ -429,4 +429,9 @@ basetype = {
 ["OpenCards.Core.Protocol.Client.ClientNewGuildBossSweepResponse"] = "ClientResponse",
 ["OpenCards.Core.Protocol.Client.ClientNewGuildBossReceiveRewardBoxResponse"] = "ClientNewGuildBossSweepResponse",
 ["OpenCards.Core.Protocol.Client.ClientGetBattleHistoryRecordsResponse"] = "ClientResponse",
+["OpenCards.Core.Protocol.Client.NewServerActivityResponse"] = "ClientResponse",
+["OpenCards.Core.Protocol.Client.NewServerClientResponse"] = "NewServerActivityResponse",
+["OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse"] = "NewServerActivityResponse",
+["OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse"] = "NewServerActivityResponse",
+["OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse"] = "NewServerActivityResponse",
 }

+ 6 - 0
data/ClientScript/Protocol/generated/_enum.lua

@@ -454,3 +454,9 @@ WishSummonActivityType = {
 	LimitedGift = 5,
 }
 
+NewServerActivityType = {
+	LoginDay = 1,
+	BossChallenge = 2,
+	LimitedGift = 3,
+}
+

+ 1 - 0
data/ClientScript/Protocol/generated/_errorCode.lua

@@ -641,3 +641,4 @@ ClientNewGuildBossReceiveRewardBoxResponse_506 奖励已经领取
 ClientGetBattleHistoryRecordsResponse_501 参数错误
 ClientGetBattleHistoryRecordsResponse_502 未找到中心服务
 ClientGetBattleHistoryRecordsResponse_503 未找到好友服务
+NewServerActivityResponse_501 回应  NewServerActivityResponse

+ 625 - 0
docs/GM系统API文档.md

@@ -0,0 +1,625 @@
+# GM系统API文档
+
+> 本文档梳理了游戏服务器中所有GM相关的API接口及用途,涵盖管理后台HTTP接口和游戏内GM命令两大部分。
+
+---
+
+## 目录
+
+- [一、GM系统架构概述](#一gm系统架构概述)
+- [二、管理后台 HTTP API](#二管理后台-http-api)
+  - [2.1 邮件管理](#21-邮件管理)
+  - [2.2 玩家管理](#22-玩家管理)
+  - [2.3 服务器管理](#23-服务器管理)
+  - [2.4 数据查询与修改](#24-数据查询与修改)
+  - [2.5 运营工具](#25-运营工具)
+  - [2.6 版本与配置管理](#26-版本与配置管理)
+- [三、游戏内GM命令](#三游戏内gm命令)
+  - [3.1 道具/背包命令](#31-道具背包命令)
+  - [3.2 英雄命令](#32-英雄命令)
+  - [3.3 召唤/抽卡命令](#33-召唤抽卡命令)
+  - [3.4 竞技场命令](#34-竞技场命令)
+  - [3.5 活动命令](#35-活动命令)
+  - [3.6 邮件/好友/公会命令](#36-邮件好友公会命令)
+  - [3.7 皮肤/图鉴/标记命令](#37-皮肤图鉴标记命令)
+  - [3.8 账号服务器命令](#38-账号服务器命令)
+  - [3.9 服务端调试命令](#39-服务端调试命令)
+- [四、GM权限管理](#四gm权限管理)
+- [五、GM命令路由流程](#五gm命令路由流程)
+
+---
+
+## 一、GM系统架构概述
+
+GM系统分为两层:
+
+| 层级 | 入口 | 说明 |
+|------|------|------|
+| **管理后台 (Admin Web)** | `OpenCards.Service.Admin` HTTP服务 | 面向运营/管理人员的Web后台,提供HTTP API进行玩家管理、服务器管理等操作 |
+| **游戏内控制台 (Client Console)** | 客户端发送 `ClientHandleGMRequest` 协议 | 面向测试/开发人员,在游戏内输入GM命令,由Logic服处理 |
+
+### 核心代码文件
+
+| 文件 | 作用 |
+|------|------|
+| `OpenCards.Server.Core/ConstantDefines/CmdDefines.cs` | GM命令字符串常量定义 |
+| `OpenCards.Server.Common/ServerUtils.cs` | 通用GM命令处理(数据查询、反射调用等) |
+| `OpenCards.Server.Logic/Module/GMCommandModule.cs` | Logic服GM命令注册与路由 |
+| `OpenCards.Server.Account/Modules/AccountServer.GMCommand.cs` | 账号服GM命令处理 |
+| `OpenCards.Service.Admin/Core/ModuleFactory.cs` | Admin后台命令路由工厂 |
+| `OpenCards.Service.Admin/Core/Modules/GmModule.cs` | Admin后台执行GM命令模块 |
+| `OpenCards.Service.Admin/Core/Modules/ServerCmdModule.cs` | Admin后台服务命令模块 |
+| `OpenCards.Core/Protocol/Client/0x35300.Logic.Role.cs` | 客户端GM协议定义 |
+
+---
+
+## 二、管理后台 HTTP API
+
+管理后台通过 `ModuleFactory` 根据 `key` 参数路由到不同的处理模块。所有接口均通过 HTTP POST 请求,参数为 JSON 格式。
+
+### 2.1 邮件管理
+
+#### `server_mail` — 发送邮件
+
+- **处理模块**: `SendMailModule`
+- **参数**:
+  - `usertype`: 用户类型(1=在线用户, 2=所有用户, 3=指定用户UUID, 4=指定用户编号)
+  - `mail`: 邮件数据对象(含MailID, Title, Content, Items等)
+  - `server_list`: 目标服务器ID列表(`|`分隔)
+  - `role_list`: 目标角色UUID列表(`|`分隔,指定用户时使用)
+- **用途**: 向指定范围的玩家发送系统邮件,可携带附件道具
+
+---
+
+### 2.2 玩家管理
+
+#### `query_server_role_info` — 查询玩家数据
+
+- **处理模块**: `QueryRoleInfoModule`
+- **用途**: 查询单个玩家的详细数据
+
+#### `query_server_role_info_List` — 批量获取玩家数据
+
+- **处理模块**: `QueryRoleInfoListModule`
+- **用途**: 批量查询多个玩家的数据
+
+#### `modify_server_role_info` — 修改玩家数据
+
+- **处理模块**: `ModifyRoleInfoModule`
+- **用途**: 直接修改玩家角色数据(如等级、货币等)
+
+#### `server_mute_role` — 禁言玩家
+
+- **处理模块**: `MuteRoleModule`
+- **用途**: 对指定玩家进行禁言处理
+
+#### `server_block_role` — 封禁玩家
+
+- **处理模块**: `BankRoleModule`
+- **用途**: 对指定玩家进行封号处理
+
+#### `modity_server_login_white_list` — 登录白名单管理
+
+- **处理模块**: `ModifyLoginWhiteListModule`
+- **操作类型**:
+  - `AddMulti`: 批量添加白名单
+  - `DeleteMulti`: 批量删除白名单
+  - `EmptyAll`: 清空白名单
+- **用途**: 管理服务器登录白名单,控制哪些账号可以登录
+
+---
+
+### 2.3 服务器管理
+
+#### `server_list_refresh` — 刷新服务器列表
+
+- **处理模块**: `RefreshServerListModule`
+- **用途**: 通知Admin服务刷新服务器列表数据
+
+#### `query_server_state_action` — 查询在线玩家数
+
+- **处理模块**: `QueryServerUserCount`
+- **用途**: 查询各服务器的在线玩家数量
+
+#### `notify_open_server` — 通知开服
+
+- **处理模块**: `NotifyOpenServerGMModule`
+- **参数**:
+  - `is_notify_game_server`: 是否通知游戏服开服
+  - `is_notify_public_server`: 是否通知公共服开服
+  - `operate_server_ids`: 目标服务器ID列表(`|`分隔)
+- **用途**: 通知指定服务器执行开服逻辑(发送 `ServerOpenNotify`)
+
+#### `notify_stop_server` — 通知停服
+
+- **处理模块**: `NotifyStopServerGMModule`
+- **参数**:
+  - `is_kick_game_player`: 是否踢出在线玩家
+  - `is_notify_game_server`: 是否通知游戏服停服
+  - `is_notify_public_server`: 是否通知公共服停服
+  - `operate_server_ids`: 目标服务器ID列表(`|`分隔)
+- **用途**: 通知指定服务器执行停服逻辑,可选踢出在线玩家(发送 `ServerShutdownNotify` / `StopServerKickRequest`)
+
+#### `stop_server_change_data` — 停服数据刷新
+
+- **处理模块**: `RefreshStopServerDataModule`
+- **用途**: 刷新停服相关数据
+
+#### `check_login_flow` — 检查登录流程
+
+- **处理模块**: `CheckLoginFlowModule`
+- **用途**: 获取登录流程未走通的服务器列表数据
+
+---
+
+### 2.4 数据查询与修改
+
+#### `server_gm` — 执行GM命令
+
+- **处理模块**: `GmModule`
+- **参数**:
+  - `gmType`: 用户类型(1=在线用户, 2=所有用户, 3=指定用户UUID)
+  - `server_list`: 目标服务器ID列表(`|`分隔)
+  - `role_list`: 目标角色UUID列表(`|`分隔)
+  - `content`: GM命令内容(与游戏内GM命令格式一致)
+- **用途**: 通过管理后台向指定玩家/服务器发送GM命令(底层发送 `HandleGMNotify` 协议)
+
+#### `server_cmd` — 服务命令
+
+- **处理模块**: `ServerCmdModule`
+- **参数**:
+  - `serviceAddr`: 目标服务地址
+  - `operationType`: 操作类型(`notify` 发送通知 / `request` 发送请求并等待响应)
+  - `notify` / `request`: 具体的协议数据(格式: `FullTypeName:{json}`)
+- **用途**: 向指定服务进程直接发送协议消息,用于底层调试
+
+#### `set_server_time` — 设置服务器时间
+
+- **处理模块**: `SetServerTimeModule`
+- **用途**: 修改服务器时间偏移(用于活动测试等场景)
+
+---
+
+### 2.5 运营工具
+
+#### `cdk_opt` — CDK操作
+
+- **处理模块**: `CdkModule`
+- **用途**: CDK(礼包兑换码)的生成、查询、管理等操作
+
+#### `send_pay_gift` — 发送充值礼包
+
+- **处理模块**: `SendPayGiftModule`
+- **用途**: 向玩家发送充值相关礼包
+
+#### `change_pay_order_state` — 修改支付订单状态
+
+- **处理模块**: `ChangePayOrderStateModule`
+- **用途**: 修改玩家的支付订单状态
+
+---
+
+### 2.6 版本与配置管理
+
+#### `operate_client_accept_version` — 客户端版本管理
+
+- **处理模块**: `ModifyOrQueryClientAcceptVersionModule`
+- **用途**: 修改或查询客户端可接受的版本号
+
+#### `operate_update_server_config` — 更新服务器配置
+
+- **处理模块**: `OperateUpdateServerConfigModule`
+- **用途**: 在线更新服务器配置
+
+#### `operate_client_version_zip_config` — 客户端版本包配置
+
+- **处理模块**: `OperateClientVersionAndZipConfigModule`
+- **用途**: 管理客户端版本更新包配置
+
+#### `server_protocol_switch` — 服务器协议开关
+
+- **处理模块**: `ServerProtocolModule`
+- **用途**: 控制服务器各类协议功能的开关状态
+
+---
+
+## 三、游戏内GM命令
+
+游戏内GM命令通过客户端发送 `ClientHandleGMRequest` 协议,命令格式为空格分隔的字符串,由 `LogicService` 分发给各模块处理。
+
+### 3.1 道具/背包命令
+
+> **处理模块**: `PackageModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `additem` | `<itemId> <count> [type]` | 添加指定ID的道具,可指定道具类型(默认Tool类型) |
+| `addallitem` | `<count> [type]` | 添加配置表中该类型的所有道具各count个 |
+| `addgold` | 无 | 添加1亿金币(CoinItemId) |
+| `adddiam` | 无 | 添加1亿钻石(DiamondItemId) |
+| `addexp` | 无 | 添加1亿英雄经验(HeroExpItemId) |
+| `listitems` | 无 | 列出背包中所有道具(uuid, itemId, count, type) |
+| `useitem` | `<itemId> <count> [selectedItemId]` | 使用指定ID的道具 |
+| `sellitem` | `<itemId> <count>` | 出售指定ID的道具 |
+| `removeitem` | `<itemId> <count>` | 删除指定ID的道具 |
+| `drop` | `<dropId>` | 按掉落表ID执行掉落 |
+| `clearpackage` | 无 | 清空整个背包(包括道具、金币、钻石、VIP经验) |
+
+---
+
+### 3.2 英雄命令
+
+> **处理模块**: `HeroModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `addhero` | `<heroId> <count> <level> <rank>` | 添加指定英雄,可指定数量、等级、品阶 |
+| `listhero` | `[level]` | 列出所有英雄,可选设置统一等级 |
+| `herouuid` | 无 | 列出所有英雄的UUID |
+| `addAllHero` | `<count>` | 添加配置表中所有启用的英雄(IsUsing=1)各count个 |
+| `addAllHero2` | `<count> <level> <quality>` | 添加所有可用英雄(IsUsing=1 或 IsAvailable=1),可指定等级和品阶 |
+| `setHeroPackCount` | `<count>` | 设置英雄背包容量(受 `BuyHeroBagMaxCount` 限制) |
+
+---
+
+### 3.3 召唤/抽卡命令
+
+> **处理模块**: `SummonModule`
+
+召唤类型(type)对应 `SyncClientSummonType` 枚举:
+- 钻石抽卡 (Diamond)
+- 友情抽卡 (Friend)
+- 占星抽卡 (Astrology)
+- 限时抽卡 (TimeLimited)
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `summonsingle` | `<type>` | 单次抽卡 |
+| `summonten` | `<type>` | 十连抽卡 |
+| `addsummon` | `<type> <count>` | 批量抽卡(count上限10000) |
+| `adddrawpoints` | `<count>` | 添加抽卡积分(DrawPoints) |
+| `testWishSummon` | `<count>` | 测试心愿召唤(上限10000次),在 `AtlantisActivityModule` 中处理 |
+
+---
+
+### 3.4 竞技场命令
+
+> **处理模块**: `ArenaModule`
+
+#### 斗技场 (Arena Valor) 相关
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `enterArenaValor` | 无 | 进入斗技场(自动执行进竞技场+获取数据) |
+| `enterArenaValor1` | 无 | 一键进入斗技场(自动解锁关卡5-1、添加所有英雄、设置随机分数2000-2900) |
+| `setArenaScore` | `<score>` | 设置斗技场积分 |
+| `fillarenavalorgroup` | 无 | 填充斗技场分组(转发到ArenaManagerService处理) |
+| `initarenavalorrobotrank` | 无 | 初始化斗技场机器人排名(转发到ArenaValorService处理) |
+
+#### 血战斗技场 (Arena Highend) 相关
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `enterArenaHighend` | 无 | 进入血战斗技场(自动执行进竞技场+获取数据) |
+| `setArenaHighendTier` | `<tier>` | 设置血战斗技场段位 |
+| `addRoleInArenaHighendScoreRank` | 无 | 将当前角色加入血战斗技场积分排行榜 |
+
+#### 巅峰竞技场 (Arena Pinnacle) 相关
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `nextArenaPinnacleStage` | 无 | 推进巅峰竞技场到下一阶段(修改时间偏移) |
+| `backArenaPinnacleStage` | 无 | 回退巅峰竞技场到上一阶段(修改时间偏移) |
+| `updateArenaPinnacleRegionConfig` | `<isAutoDistributeRegion> <...>` | 更新巅峰竞技场赛区配置 |
+| `preparePinnacleFakeData` | 无 | 准备巅峰竞技场假数据(代码已注释,暂不可用) |
+
+#### 竞技场通用调试命令
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `initarenarobotdatamapping` | 无 | 初始化竞技场机器人数据映射(转发到ArenaManagerService处理) |
+| `matchArenaRealPlayer` | `<state>` | 设置竞技场匹配真人开关(0=关闭/非0=开启,遍历所有Valor+Highend服务) |
+| `setNewArenaSeason` | `<flag> <count>` | 设置新竞技场赛季(flag=3为巅峰竞技场,代码已注释) |
+| `setTimeOffset` | `<cmd1> <cmd2>` | 设置服务器时间偏移(需 `IsGMTime` 开关开启) |
+| `printiostatistics` | 无 | 打印IO统计信息到桌面文件(仅Windows) |
+
+#### 账号相关
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `cleanUpAccount` | 无 | 清理账号数据(转发clearaccount到AccountService) |
+
+---
+
+### 3.5 活动命令
+
+> **处理模块**: `ActivityModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `targettask` | `<taskId> <count>` | 推进指定目标任务的进度(达到目标后自动设为可领取状态) |
+| `activitytask` | `<taskId> <count>` | 推进指定活动任务的进度(达到目标后自动设为可领取状态) |
+| `setthirtyperiod` | `<period>` | 设置30日签到活动周期(只能向后推进) |
+
+---
+
+### 3.6 邮件/好友/公会命令
+
+#### 邮件
+
+> **处理模块**: `MailModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `sendmail` | `<mailId> <param2> <param3>` | 根据邮件模板ID发送邮件给当前角色 |
+
+#### 好友
+
+> **处理模块**: `FriendModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `addmercenary` | `<heroId> <heroRank>` | 添加好友佣兵英雄 |
+| `resetmercenaryuse` | 无 | 重置佣兵使用次数记录 |
+
+#### 公会
+
+> **处理模块**: `GuildWarriorTreasureModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `addguildwarriortreasure` | `<configId> <args>` | 添加公会勇者宝藏(args为逗号分隔的参数) |
+| `addgwt` | `<configId> <args>` | `addguildwarriortreasure` 的缩写别名(通过GMCommandModule路由) |
+
+#### 新公会Boss
+
+> **处理模块**: `NewGuildBossModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `SetNewGuildBossStage` | `<stageNum>` | 设置新公会Boss的关卡阶段 |
+
+---
+
+### 3.7 皮肤/图鉴/标记命令
+
+#### 皮肤
+
+> **处理模块**: `SkinModule`
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `unlockAllSkin` | 无 | 解锁所有皮肤(遍历Item表中ItemType=Skin的所有道具添加) |
+
+#### 角色标记
+
+> **处理模块**: `TLRoleFlagModule`(通过 `GMCommandModule` 路由)
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `addflag` | `<key> <value> <type>` | 添加角色标记(累加模式),type=1表示1日标记,其他表示永久标记 |
+| `setflag` | `<key> <value> <type>` | 设置角色标记(覆盖模式),type=1表示1日标记,其他表示永久标记 |
+
+#### 新手引导
+
+> **处理模块**: `NewerGuideModule`(通过 `GMCommandModule` 路由)
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `guide` | `<id> <step>` | 设置新手引导进度到指定步骤 |
+
+---
+
+### 3.8 账号服务器命令
+
+> **处理模块**: `AccountServer`(通过 `HandleGMRequest` RPC调用)
+
+这些命令在AccountServer层直接拦截处理,不会转发到Logic服:
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `clearaccount` | `<accountID>` | 清除指定账号的数据(清理AccountDataMapping,踢出在线玩家) |
+| `resettimers` | 无 | 重置账号数据保存定时器 |
+| `relinkrole` | `<roleId> <account> <serverId>` | 重新绑定角色到指定账号(创建新AccountData并关联角色) |
+
+---
+
+### 3.9 服务端调试命令
+
+> **处理模块**: `ServerUtils.HandleGMRequest()` — 这些命令可在任何服务进程中执行
+
+#### 数据查询与修改
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `queryData` | `<prefix> <typeName> [fieldName]` | 查询ORM映射数据。prefix为数据前缀,typeName为ORM类型全名,可选fieldName查询指定字段 |
+| `saveData` | `<prefix> <typeName> <jsonData>` | 保存ORM映射数据。将JSON数据合并到现有数据中 |
+| `saveFieldData` | `<prefix> <typeName> <fieldName> <jsonData>` | 保存ORM数据的指定字段。当typeName为RoleData/RoleExtData时,路由到在线Logic服处理 |
+| `queryfield` | `<fieldName>` | 通过反射查询当前Service对象的字段值 |
+| `savefield` | `<fieldName> <jsonValue>` | 通过反射设置当前Service对象的字段值 |
+| `queryproperty` | `<propertyName>` | 通过反射查询当前Service对象的属性值 |
+| `saveproperty` | `<propertyName> <jsonValue>` | 通过反射设置当前Service对象的属性值 |
+| `InvokeMethod` | `<methodName> [params...]` | 通过反射调用当前Service对象的指定方法,参数以JSON格式传递 |
+
+#### Redis操作
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `redisexecute` | `<cmd> [args...]` | 直接执行Redis命令(不返回结果) |
+| `redisexecute1` | `<cmd> [args...]` | 执行Redis命令并返回字符串结果 |
+| `redisquery` | `<cmd> [args...]` | 查询Redis,返回数组格式结果 |
+| `redisquery2` | `<cmd> [args...]` | 查询Redis,返回字典格式结果 |
+
+#### 系统工具
+
+| 命令 | 参数 | 用途 |
+|------|------|------|
+| `ping` | 无 | 连通性测试,返回"success" |
+| `errorstatistic` | 无 | 打印错误统计信息到文件 |
+| `setconstantvalue` | `<key> <field> <value>` | 动态修改常量表(Table_ConstantManager)的值 |
+| `exesh` | `<command>` | 在服务器上执行Shell命令(仅Linux环境) |
+
+---
+
+## 四、GM权限管理
+
+### 数据库结构
+
+GM权限数据存储在 `afk_gm` 数据库中,包含以下表:
+
+#### `permissions` — 权限组表
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | INTEGER | 主键自增 |
+| Name | VARCHAR(255) | 权限组名称(唯一) |
+| Permissions | TEXT | 权限字符串(`|`和`-`分隔的层级权限编码) |
+| Status | BOOLEAN | 状态(0=未启用, 1=已启用) |
+
+默认数据:
+- **超级管理员**: Permissions=`1|1-1|1-2|2|2-1|2-2|2-3|3|3-1|4|4-1|4-2|4-3`,Status=启用
+
+#### `users` — 用户表
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | INTEGER | 主键自增 |
+| Account | VARCHAR(255) | 账号(唯一) |
+| Password | VARCHAR(255) | 密码(MD5加密) |
+| Name | VARCHAR(255) | 用户名称 |
+| Pid | INTEGER | 关联权限组ID(外键→permissions.Id) |
+| Status | BOOLEAN | 状态(0=未启用, 1=已启用) |
+
+默认数据:
+- **超管**: Account=`root`, Password=`4DCBE8484EA8AFBB1BB67450C5C08503`(MD5加密), Pid=1
+
+#### `server_group` — 服务器组表
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | INTEGER | 主键自增 |
+| GroupName | VARCHAR(255) | 组名 |
+| Address | VARCHAR(255) | 服务器地址 |
+| AccountPort | INTEGER | 账号服端口 |
+| AdminPort | INTEGER | 管理后台端口 |
+
+#### `logs` — 操作日志表
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | INTEGER | 主键自增 |
+| Type | VARCHAR(255) | 操作类型 |
+| Args | TEXT | 操作参数 |
+| Success | BOOLEAN | 是否成功 |
+| Reason | VARCHAR(255) | 失败原因 |
+| Operator | VARCHAR(255) | 操作者 |
+| CreateAt | DATETIME | 操作时间 |
+
+#### `mails` — 邮件记录表
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | INTEGER | 主键自增(起始值10000) |
+| Type | INTEGER | 邮件类型 |
+| ServerList | VARCHAR(255) | 目标服务器列表 |
+| RoleList | VARCHAR(255) | 目标角色列表 |
+| Title | VARCHAR(255) | 邮件标题 |
+| Content | TEXT | 邮件内容 |
+| Items | TEXT | 邮件附件 |
+| Success | BOOLEAN | 是否发送成功 |
+| CreateAt | INTEGER | 创建时间 |
+
+---
+
+## 五、GM命令路由流程
+
+### 游戏内GM命令执行流程
+
+```
+客户端输入GM命令
+    │
+    ▼
+ClientHandleGMRequest (协议: LOGIC_ROLE_START+1)
+    │
+    ▼
+RoleModule.HandleMsgClientHandleGMRequest()
+    │
+    ├─► 检查是否是AccountServer命令 (clearaccount/resettimers/relinkrole)
+    │     └─► 是 → 转发到 AccountServer.rpc_Handle()
+    │
+    └─► 否 → 触发 EventDefines.EventHandleCmd 事件
+          │
+          ├─► GMCommandModule.OnEventHandleCmd()
+          │     ├─ addflag → TLRoleFlagModule.OnGmAddFlag()
+          │     ├─ setflag → TLRoleFlagModule.OnGmSetFlag()
+          │     ├─ addgwt → GuildWarriorTreasureModule.OnGmAddGuildWarriorTreasure()
+          │     └─ guide → NewerGuideModule.OnGmGuide()
+          │
+          ├─► PackageModule.OnEventHandleCmd()
+          │     └─ additem/addgold/adddiam/... 等道具命令
+          │
+          ├─► HeroModule.OnEventHandleCmd()
+          │     └─ addhero/listhero/addAllHero/... 等英雄命令
+          │
+          ├─► SummonModule.OnEventHandleCmd()
+          │     └─ summonsingle/summonten/addsummon/... 等召唤命令
+          │
+          ├─► ArenaModule.OnEventHandleCmd()
+          │     └─ setArenaScore/enterArenaValor/... 等竞技场命令
+          │
+          ├─► ActivityModule.OnEventHandleCmd()
+          │     └─ targettask/activitytask/setthirtyperiod 等活动命令
+          │
+          ├─► MailModule.OnEventHandleCmd()
+          │     └─ sendmail
+          │
+          ├─► FriendModule.OnEventHandleCmd()
+          │     └─ addmercenary/resetmercenaryuse
+          │
+          ├─► SkinModule.OnEventHandleCmd()
+          │     └─ unlockAllSkin
+          │
+          ├─► NewGuildBossModule.OnEventHandleCmd()
+          │     └─ SetNewGuildBossStage
+          │
+          ├─► GuildWarriorTreasureModule.OnEventHandleCmd()
+          │     └─ addguildwarriortreasure
+          │
+          └─► 其他模块的 OnEventHandleCmd()...
+                └─ 未处理 → ServerUtils.HandleGMRequest() 兜底处理
+                      └─ queryData/saveData/redisquery/... 等通用命令
+```
+
+### 管理后台GM命令执行流程
+
+```
+Admin HTTP请求
+    │
+    ▼
+ModuleFactory.GetModuleByStr(key)
+    │
+    ├─► server_gm → GmModule.OnHandle()
+    │     └─► 根据 gmType 发送 HandleGMNotify 到指定服务器
+    │           ├─ OnlineUser → ConnectorService (ConnectorBroadcastNotify)
+    │           ├─ AllUser → CenterService (HandleGMNotify)
+    │           └─ SpecificUserUuids → CenterService (HandleGMNotify)
+    │
+    ├─► server_cmd → ServerCmdModule.OnHandle()
+    │     └─► 根据 operationType 发送协议到指定服务
+    │
+    ├─► server_mail → SendMailModule.OnHandle()
+    │     └─► 根据 usertype 发送 SendMailNotify
+    │
+    ├─► notify_open_server → NotifyOpenServerGMModule.OnHandle()
+    │     └─► 发送 ServerOpenNotify
+    │
+    ├─► notify_stop_server → NotifyStopServerGMModule.OnHandle()
+    │     └─► 发送 StopServerKickRequest / ServerShutdownNotify
+    │
+    └─► 其他模块...
+```
+
+---
+
+> 文档生成时间:2026年6月11日
+> 基于代码分支:dev

+ 260 - 0
docs/多区配置指南.md

@@ -0,0 +1,260 @@
+# 服务器多区配置指南
+
+> 本文档说明如何在本项目架构基础上新增游戏区服(多区)。
+
+---
+
+## 一、架构概览
+
+### 1.1 服务器节点类型
+
+| 节点名称 | 作用 | 部署数量 |
+|----------|------|----------|
+| **NameServer** | 全局命名/协调节点,管理所有ServiceNode | 全局1个 |
+| **PublicNode** | 公共服务节点(账号、公会、支付、好友、聊天、管理后台等) | 全局1个 |
+| **GameNode** | **游戏服节点**(每个区一个),包含Logic、Connector、Arena等 | 每区1个 |
+| **AccountNode** | 账号服务节点(可独立部署或在PublicNode中) | 1个 |
+
+### 1.2 关键概念
+
+- **区服 = GameNode**:一个 GameNode 对应一个游戏区。玩家在不同区之间数据完全隔离。
+- **serverID**:区的唯一数字标识,贯穿所有配置。
+- **Realm**:大区/领域概念,用于环境隔离(dev/qa/prod),与区服ID不同。
+- **Connector端口**:每个区的客户端连接端口不同(如19821、19822...),这是客户端区分不同区的入口。
+
+---
+
+## 二、现有配置
+
+### 2.1 测试服当前只有一个区
+
+`start/_launch_server.xml` 中 GameNode1 配置:
+
+| 配置项 | 当前值 |
+|--------|--------|
+| serverID | 1 |
+| Connector端口 | 19821 |
+| Redis DB | db=1 |
+| RPC端口 | 17020 |
+
+### 2.2 已有参考:config_dev_2 是第二个区的完整配置
+
+项目已有 `config_dev_2` 目录,展示了**独立部署第二个区**的完整方案(不同服务器IP、独立端口)。
+
+---
+
+## 三、开新区操作步骤
+
+在**同一台服务器**上增加新区(从1区扩展为2区),需要在 `_launch_server.xml` 中新增一个 `GameNode2` 配置。
+
+### 3.1 修改 `_launch_server.xml`
+
+在 `<ServiceNodes>` 内已有 `<GameNode1>` 之后,添加 `<GameNode2>`。
+
+以下是模板(参考 `start/_launch_server.xml` 中已有的 GameNode2 配置):
+
+```xml
+<!-- 游戏服节点 2区 -->
+<GameNode2>
+  <Redis>127.0.0.1,password=你的Redis密码,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=2</Redis>
+  <Mysql>server=127.0.0.1;User ID=root;Password=你的MySQL密码;database=orm</Mysql>
+  <Ip>127.0.0.1</Ip>
+  <RpcConfig>
+    <LocalNodeType>GameNode</LocalNodeType>
+    <LocalNodeName>GameNode2</LocalNodeName>
+    <LocalEndPoint>127.0.0.1:17021</LocalEndPoint>           <!-- RPC端口 +1 避免冲突 -->
+    <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+    <RequestTickTimeMS>5000</RequestTickTimeMS>
+    <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+    <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+    <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+    <AcceptTypeMappings>
+      <CenterService>OpenCards.Service.Center.CenterService</CenterService>
+      <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+      <ConnectorService>OpenCards.Server.Connector.ConnectorService</ConnectorService>
+      <ArenaManagerService>OpenCards.Server.Arena.ArenaManagerService</ArenaManagerService>
+      <ArenaValorService>OpenCards.Server.Arena.ArenaValorService</ArenaValorService>
+      <ArenaHighendService>OpenCards.Server.Arena.ArenaHighendService</ArenaHighendService>
+      <SessionService>OpenCards.Server.Connector.SessionService</SessionService>
+      <LogicService>OpenCards.Server.Logic.LogicService</LogicService>
+      <LogicManagerService>OpenCards.Server.Logic.LogicManagerService</LogicManagerService>
+    </AcceptTypeMappings>
+  </RpcConfig>
+  <StartService>
+    <!-- LogicManagerService -->
+    <LogicManagerService>
+      <ServiceName>LogicManagerService_2</ServiceName>       <!-- 名称改为 _2 -->
+      <ServiceType>LogicManagerService</ServiceType>
+      <Config>
+        <FightPostURL>http://127.0.0.1:8088/fight/reqstartbattle</FightPostURL>
+        <serverID>2</serverID>                                <!-- ⚠️ 区ID改为 2 -->
+      </Config>
+    </LogicManagerService>
+    <!-- Center -->
+    <CenterService>
+      <ServiceName>CenterService_2</ServiceName>              <!-- 名称改为 _2 -->
+      <ServiceType>CenterService</ServiceType>
+      <Config>
+        <serverID>2</serverID>                                <!-- ⚠️ 区ID改为 2 -->
+      </Config>
+    </CenterService>
+    <!-- ArenaManager -->
+    <ArenaManagerService>
+      <ServiceName>ArenaManagerService_2</ServiceName>        <!-- 名称改为 _2 -->
+      <ServiceType>ArenaManagerService</ServiceType>
+      <Config>
+        <ServerID>2</ServerID>                                <!-- ⚠️ 区ID改为 2 -->
+      </Config>
+    </ArenaManagerService>
+    <!-- ArenaHighend -->
+    <ArenaHighendService>
+      <ServiceName>ArenaHighendService_2</ServiceName>        <!-- 名称改为 _2 -->
+      <ServiceType>ArenaHighendService</ServiceType>
+      <Config></Config>
+    </ArenaHighendService>
+    <!-- Connector -->
+    <ConnectorService>
+      <ServiceName>ConnectorService_2</ServiceName>           <!-- 名称改为 _2 -->
+      <ServiceType>ConnectorService</ServiceType>
+      <Config>
+        <ServerId>2</ServerId>                                <!-- ⚠️ 区ID改为 2 -->
+        <Host>0.0.0.0</Host>
+        <Port>19822</Port>                                    <!-- ⚠️ 端口换一个,不能和1区冲突 -->
+        <NetCodec>OpenCards.Core.Serializer</NetCodec>
+        <KeepAlive>true</KeepAlive>
+        <KeepAliveInterval>30000</KeepAliveInterval>
+        <RecvBufferSize>16384</RecvBufferSize>
+        <SendBufferSize>16384</SendBufferSize>
+        <MaxConnections>300000</MaxConnections>
+      </Config>
+    </ConnectorService>
+  </StartService>
+</GameNode2>
+```
+
+### 3.2 关键配置变更清单
+
+新增一个区需要改以下值(**确保不与其他区冲突**):
+
+| 配置项 | 位置 | 1区值 | 2区值 | 说明 |
+|--------|------|-------|-------|------|
+| **Redis DB** | `GameNode/Redis` | `db=1` | `db=2` | 不同区用不同Redis DB隔离数据 |
+| **RPC端口** | `GameNode/RpcConfig/LocalEndPoint` | `17020` | `17021` | 节点间RPC通信端口 |
+| **Connector端口** | `ConnectorService/Config/Port` | `19821` | `19822` | **客户端连接端口**,每区唯一 |
+| **serverID** | `LogicManagerService`, `CenterService`, `ArenaManagerService`, `ConnectorService` | `1` | `2` | 区ID,必须全局唯一 |
+| **ServiceName** | 各Service的ServiceName | `xxx_1` | `xxx_2` | 服务实例名称后缀 |
+
+### 3.3 修改启动脚本
+
+在 `start/start.sh` 的 `cmd_start()` 中增加 GameNode2 的启动:
+
+```bash
+start_node "NameServer"
+start_node "PublicNode"
+start_node "GameNode1" "global.RealmID=1 global.ServerID=1"
+start_node "GameNode2" "global.RealmID=1 global.ServerID=2"    # 新增
+start_node "AccountNode1"
+```
+
+同时在 `cmd_stop()` 中增加停止(反序):
+
+```bash
+cmd_stop() {
+    stop_node "AccountNode1"
+    stop_node "GameNode2"      # 新增
+    stop_node "GameNode1"
+    stop_node "PublicNode"
+    stop_node "NameServer"
+    ...
+}
+```
+
+Windows 下则新建 `start/3_launch_game_r1s2.bat`:
+
+```bat
+title gameserver2
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml GameNode2 global.RealmID=1 global.ServerID=2
+```
+
+### 3.4 更新服务器列表
+
+客户端通过 `AccountServer` 从 OSS 下载 `serverlist.json` 来显示区服列表。需要在 OSS 上的 `serverlist.json` 中增加2区的条目:
+
+```json
+[
+  {
+    "id": 1,
+    "index": 0,
+    "name": "测试服1区",
+    "address": "47.109.111.123:19821",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": 1,
+    "groupid": 1,
+    "note": "测试服"
+  },
+  {
+    "id": 2,
+    "index": 1,
+    "name": "测试服2区",
+    "address": "47.109.111.123:19822",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": 2,
+    "groupid": 1,
+    "note": "测试服"
+  }
+]
+```
+
+> 注意 `address` 中的端口要对应 `ConnectorService` 的 `Port`(19822)。
+
+### 3.5 检查防火墙/安全组
+
+确保新增的端口(如 `19822`、`17021`)在防火墙和安全组中已放行。
+
+---
+
+## 四、注意事项
+
+### 4.1 数据隔离
+
+- **Redis**:每个区使用不同的 `db` 编号(db=1, db=2, ...),或者在配置中使用独立的 Redis 实例。
+- **MySQL**:当前配置中 GameNode 共用同一个 MySQL `database=orm`,内部通过 `serverID` 字段区分数据。如果需要物理隔离,可以为每个区创建独立数据库。
+
+### 4.2 公共服务是共享的
+
+`PublicNode` 中的服务(公会GuildService、好友FriendService、支付PayServer等)是**跨区共享**的,不需要为每个区单独部署。它们内部通过 `serverID` 来区分不同区的数据。
+
+### 4.3 战斗服
+
+战斗服(`server_battle` 目录)是独立部署的,多区可以共用同一个战斗服,或每个区部署独立战斗服。
+
+### 4.4 GM命令与多区
+
+管理后台(`AdminService`)的GM命令需要指定 `server_list`(目标serverID)来精确定位操作哪个区。
+
+### 4.5 独立物理机部署多区
+
+如果要在**不同服务器**上部署新区(如 `config_dev_2` 的方案),需要:
+- 修改 `_launch_server.xml` 中的IP地址为各服务器的实际IP
+- NameServer 的地址需要在所有节点的 `NameServerEndPoint` 中保持一致
+- 确保各服务器间网络互通
+
+---
+
+## 五、快速操作总结
+
+1. **复制 `GameNode1` 配置块** → 粘贴为 `GameNode2`
+2. **修改4个关键值**:serverID→2,Connector端口→19822,RPC端口→17021,Redis DB→2
+3. **添加启动脚本**:`start.sh` 增加 GameNode2 行 / Windows 新建 `.bat`
+4. **更新 serverlist.json**:添加2区信息到 OSS
+5. **放行端口**:防火墙开通 19822、17021
+6. **重启服务**:先停服,再按序启动
+
+---
+
+> 文档生成时间:2026年6月11日
+> 基于当前 `start/_launch_server.xml` 和 `config_dev_2` 配置分析

+ 18 - 0
docs/文档/协议修改.md

@@ -52,3 +52,21 @@
 
 
 
+## 新增协议
+
+**协议源文件地址:**
+
+D:\WorkSpace\project\chuanzhanServer\server\src\core\OpenCards.Core\
+
+**协议文件具体书写规范请参考: 协议.md**
+
+在/Data中新增协议
+
+在/ORM中定义结构体
+
+在Protocol中,定义协议请求
+
+协议定义完成后,需要打开visual studio,生成解决方案
+
+生成之后的.lua文件在../OpenCards.GenCodec中可以找到;生成之后发给客户端查看,没有问题再打包;打包完成后发布到测试服进行测试。
+

+ 77 - 0
docs/文档/打包发布起服.md

@@ -0,0 +1,77 @@
+# 打包&起服流程
+
+> 问题日期:2026-06-10
+
+服务器linux地址:
+
+43.226.57.217
+用户名:root
+密码:VOGevp67
+端口:22
+
+
+
+### 打包
+
+server.output文件打包,有对应命令:
+
+D:\WorkSpace\project\chuanzhanServer\server\src\server\OpenCards.Server.DotNetCore\server打包.bat
+
+```bash
+dotnet publish OpenCards.Server.DotNetCore.csproj -c Release -r linux-x64 --self-contained false -o ./_output.server
+pause
+```
+
+
+
+战斗服server_battle.output,在
+D:\WorkSpace\project\chuanzhanServer\server_battle\打包.bat中
+
+```bash
+@echo off
+set MSBUILD="%ProgramFiles%\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
+if not exist %MSBUILD% set MSBUILD="%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
+%MSBUILD% server_battle.sln /t:Rebuild /p:Configuration=Release /v:m
+if errorlevel 1 pause & exit /b 1
+echo.
+echo 打包完成: %~dp0_output.battle.server
+pause
+```
+
+
+
+
+
+### 发布并重启服务器
+
+接入linux之后,进入地址
+
+```shell
+cd /data/CzServer/develop
+```
+
+
+
+将旧的zip包删除,以上步骤生成的新zip放入进来,继续再执行:
+
+```shell
+#注意_output.server.zip 和 _output.server文件夹都需要删除
+
+#替换/删除完成后,进入对应目录
+cd /data/CzServer/_output.server/dev 
+# 执行重启命令
+./start.sh restart
+```
+
+
+
+战斗服:使用以下命令重启即可
+
+```shell
+#注意,战斗服的旧文件也需要删除
+#战斗服的文件存放路径不一样;同样完成操作后重启
+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 对话自动整理生成*

+ 407 - 0
docs/文档/配置表修改.md

@@ -0,0 +1,407 @@
+# 配置表体系总结
+
+> 项目路径:`D:\WorkSpace\project\chuanzhanServer`  
+> 配置表源文件目录:`server/src/data/ServerData/templates_xls/`  
+> 本文仅做说明,**未修改任何配置表源文件**。
+
+---
+
+## 1. 整体架构
+
+配置表采用 **Excel 源文件 → Lua 中间数据 → 客户端/服务端分别读取** 的三层结构:
+
+```mermaid
+flowchart LR
+    A[templates_xls/*.xlsx<br/>Excel 源文件] -->|xlslang 导表| B[templates_lua/<br/>服务端 Lua 数据]
+    A -->|xcopy 同步| C[ClientScript/Data/<br/>客户端 Lua 数据]
+    B --> D[服务端 C#<br/>TableManager + Table_XXX]
+    C --> E[客户端 Lua<br/>DataCenter + DataTag]
+```
+
+| 层级 | 路径 | 用途 |
+|------|------|------|
+| 源文件 | `server/src/data/ServerData/templates_xls/` | 策划编辑的 Excel |
+| 服务端数据 | `server/src/data/ServerData/templates_lua/` | 服务端运行时读取 |
+| 客户端数据 | `server/src/data/ClientScript/Data/` | Unity 客户端运行时读取 |
+| 分地区数据 | `templates_xls_area/` → `templates_lua_area/` → `ClientScript/DataArea/` | 按地区(cn/en 等)差异化配置 |
+| 多语言 | `lang/lang.csv` | 由 `build_xls2lang.bat` 从 Excel 导出 |
+
+**重要**:服务端**不会**读 `ClientScript/Data/`,两套 Lua 目录由导表脚本并行维护,内容应保持一致。
+
+---
+
+## 2. 命名规范
+
+### 2.1 Excel 文件名
+
+格式:**`中文描述#英文标识.xlsx`**
+
+| 示例源文件 | `#` 后英文标识 | 导出目录 |
+|-----------|---------------|---------|
+| `C常量配置#gameConfig.xlsx` | `gameConfig` | `templates_lua/gameConfig.xlsx/` |
+| `X新手任务#activity_new.xlsx` | `activity_new` | `templates_lua/activity_new.xlsx/` |
+| `D道具表#item.xlsx` | `item` | `templates_lua/item.xlsx/` |
+
+- `#` 前:中文说明,便于策划识别
+- `#` 后:英文标识,决定 Lua 输出目录名及代码中的文件引用
+- 代码中统一使用 **`#` 后的英文名 + `.xlsx`**,如 `"gameConfig.xlsx"`、`"activity_new.xlsx"`
+
+### 2.2 Sheet(页签)名
+
+- 每个 Sheet 导出一个同名 `.lua` 文件
+- 示例:`gameConfig.xlsx` 的 `gameConfig` Sheet → `gameConfig.xlsx/gameConfig.lua`
+- 一个 Excel 可含多个 Sheet,对应多个 Lua 文件
+
+### 2.3 目录分类(参考 `!!!表目录解释.txt`)
+
+| 目录/前缀 | 用途 |
+|----------|------|
+| `config/` | 全局配置(GM 权限、服务器配置等) |
+| `event/` | 事件库配置 |
+| `gameSystem/` | 核心通用配置(背包、装备、道具等) |
+| `localization/` | 多语言(导 lua 时过滤,走 `build_xls2lang.bat`) |
+| `logicData/` | UI 相关业务逻辑 |
+
+### 2.4 被导表工具忽略的 Sheet
+
+`build_xls2lua.bat` 中 `filter_text` 会排除:
+
+- 以 `~` 开头的 Sheet
+- `localization/` 下的 Sheet
+- `clx/battle/func/` 下的 Sheet
+
+---
+
+## 3. Excel 表结构约定
+
+详细规范见 `!!!数据表简单说明,建表必看.docx`(内含外部文档链接)。从现有导出结果可归纳:
+
+### 3.1 数据 Sheet 结构
+
+- **第 2 行(程序读表头)**:英文字段名(对应 Lua `_key_` 与 C# 字段名)
+- **第 4 行起**:数据行(`tool.py` 从第 4 行开始读,`xlslang` 遵循同类约定)
+
+导出 Lua 示例(`activity_task.lua`):
+
+```lua
+return {
+  ["_key_"] = {"Id","Type","StageName","Target","Desc","DropGroupId",},
+  [1] = {1, 2, "activity_task_1.StageName", 25, "activity_task_1.Desc", 1102001,},
+}
+```
+
+- `_key_`:字段名列表
+- 数字键 `[1]`、`[2]`…:数据行
+- 字符串值若为多语言 key,会按 `lang_format` 生成文档 ID
+
+### 3.2 配置规范 Sheet
+
+部分表含 `*配置规范` Sheet,描述字段元信息(中文名、字段名、类型、说明),供策划与工具校验,例如:
+
+```
+["_key_"] = {"编号","Id","NUMBER","主键",}
+```
+
+---
+
+## 4. 导表流程(Excel → Lua)
+
+### 4.1 全量导表
+
+在 `server/src/data/ServerData/` 下执行:
+
+```bat
+build_xls2lua.bat
+```
+
+主要步骤:
+
+1. 合并 `templates_xls_area/` 到临时目录
+2. `xlslang lua` 将 `templates_xls/` 转为 `templates_lua/`
+3. `xlslang md5` 生成 `_luaversion_.lua`(各文件 MD5,用于热更/version 对比)
+4. 将 `templates_lua/*.lua` 复制到 `../ClientScript/Data`
+5. 分地区 Lua 复制到 `../ClientScript/DataArea`
+
+核心命令:
+
+```bat
+xlslang lua -id:.\templates_xls -od:.\templates_lua -key:id -olang:1 ^
+  -filter_text:"-~;-localization/;-clx/battle/func/" ^
+  -lang_format:"<doc><PATH><FILE><SHEET_NAME/></FILE><DATA_TYPE/></PATH>_<ROW_ID/>.<COLUMN_NAME/></doc>"
+```
+
+### 4.2 增量导表
+
+为加快迭代,可按表名筛选,例如:
+
+| 脚本 | 范围 |
+|------|------|
+| `build_xls2lua_battle.bat` | `*#battle*` |
+| `build_xls2lua_ly.bat` | Stage、tower、hero、item 等 |
+| `build_xls2lua_gxy.bat` | `*#item.xlsx` |
+
+### 4.3 多语言导表
+
+```bat
+build_xls2lang.bat   # 或 build_xls2lang1.bat / build_xls2lang2.bat
+```
+
+输出到 `lang/lang.csv`,供客户端 Localization 使用。
+
+---
+
+## 5. 服务端:如何读取与使用
+
+### 5.1 初始化链路
+
+```csharp
+// Program.cs 启动顺序(不可打乱)
+new LuaTemplateLoader(true, ad);           // 必须为 true
+new LuaDataCenter(ad, ".../templates_lua");
+CardsServerTemplateManager.Instance.Init(); // → TableManager.LoadAllConfig
+```
+
+数据根目录由 `CardsServerTemplateManager.ResolveServerDataRoot()` 解析,通常为 `server/src/data/ServerData/`。
+
+### 5.2 C# 表定义
+
+在 `OpenCards.Server.Core/Table/` 下定义表类:
+
+```csharp
+[Table("activity_new.xlsx", "activity_task")]
+public class Table_ActivityTask : Table
+{
+    [TableMember(false, true)]  // key 主键
+    public int Id;
+    public int Type;
+    public int Target;
+    public int DropGroupId;
+}
+```
+
+`[TableMember(unionkey, key, index)]` 含义:
+
+| 参数 | 含义 |
+|------|------|
+| `key = true` | 唯一主键,生成 `XxxMap` 与 `GetByXxx()` |
+| `index = true` | 索引,一对多,生成 `GetListByXxx()` |
+| `unionkey = true` | 联合主键(多个 unionkey 组合) |
+
+### 5.3 自动生成 TableManager
+
+运行 `OpenCards.Server.Tools` 会扫描带 `[Table]` 的类,生成 `TableManager.cs`,包含:
+
+- `ListenLoader` 注册
+- `LoadTemplates<TKey, TTable>()`
+- `GetByXxx()` / `GetListByXxx()` 等访问方法
+
+**新增/删除服务端表后,需重新运行 Tools 生成 `TableManager.cs`。**
+
+### 5.4 业务代码用法
+
+```csharp
+// 按主键查
+var task = Table_ActivityTaskManager.GetById(1);
+
+// 常量表
+var val = Table_ConstantManager.GetByName("FormationMaxCount");
+
+// 按索引查列表
+var drops = Table_DropGroupManager.GetListByDropGroupID(dropGroupId);
+```
+
+常量类 `ConstantConfig` 等通过 `CustomTableManager.cs` 在 `OnReload` 时把表数据映射为静态字段。
+
+### 5.5 表校验
+
+可在 `CheckTable()` 中做跨表引用校验,服务启动时由 `CardsServerTemplateManager.CheckTables` 统一执行。
+
+---
+
+## 6. 客户端:如何读取与使用
+
+### 6.1 初始化
+
+`Startup.lua` 中:
+
+```lua
+DataTag = require "gameModel/DataTag"
+DataCenter.Init(require("gameModel/modelTag"), require("gameModel/DataTag"), helper.GetProductLineArea())
+```
+
+### 6.2 DataTag 映射
+
+`gameModel/DataTag.lua` 将逻辑名映射到 Lua 路径:
+
+```lua
+ActivityCrewGather = "activity_new.xlsx/activity_task",
+GameConfig = "gameConfig.xlsx/gameConfig",
+HeroConfig = "hero.xlsx/heroconfig",
+```
+
+**新增客户端可读表时,需在 `DataTag.lua` 增加条目。**
+
+### 6.3 查询 API
+
+```lua
+-- 条件查询(返回列表)
+local list = DataCenter.DB.Find(DataTag.ActivityCrewGather, {Type = 2})
+
+-- 查首条
+local hero = DataCenter.DB.FindFirst(DataTag.HeroConfig, {ID = heroId})
+
+-- 整表
+local all = DataCenter.DB.GetFullTable(DataTag.HeroConfig)
+
+-- 常量 gameConfig
+local maxCount = DataCenter.DB.GetGameConfig("FormationMaxCount")
+```
+
+底层通过 `Core/DataCenter.lua` 的 `require` 加载 Lua,`make_refs` 建索引,并支持只读保护。
+
+### 6.4 分地区配置
+
+`DataCenter.Init` 会加载 `DataArea/{area}/_luaversion_`,若表存在于地区目录,优先读 `DataArea/` 下的版本。
+
+---
+
+## 7. 配置表增删改操作指南
+
+### 7.1 新增配置表
+
+| 步骤 | 操作 |
+|------|------|
+| 1 | 在 `templates_xls/` 新建 `中文名#英文名.xlsx` |
+| 2 | 按规范建 Sheet,填字段名与数据 |
+| 3 | 执行 `build_xls2lua.bat`(或增量脚本) |
+| 4 | **服务端**:新增 `Table_XXX.cs`,标注 `[Table]`,运行 `OpenCards.Server.Tools` 生成 `TableManager.cs` |
+| 5 | **客户端**:在 `DataTag.lua` 增加映射 |
+| 6 | 可选:在 `CustomTableManager.cs` 增加 `Init()` 做二次加工 |
+
+### 7.2 修改配置表
+
+| 步骤 | 操作 |
+|------|------|
+| 1 | 修改 `templates_xls/` 中 Excel(**不要直接改 `.lua`**,文件头有 “do not edit” 警告) |
+| 2 | 重新执行导表脚本 |
+| 3 | 若新增/删除/重命名字段,同步更新 C# `Table_XXX` 与 `DataTag` |
+| 4 | 触发热更新(见第 8 节) |
+
+### 7.3 删除配置表
+
+| 步骤 | 操作 |
+|------|------|
+| 1 | 删除或禁用 Excel 中对应 Sheet/文件 |
+| 2 | 重新导表 |
+| 3 | 删除 C# `Table_XXX.cs`,重新生成 `TableManager.cs` |
+| 4 | 删除 `DataTag.lua` 中对应项 |
+| 5 | 清理业务代码中的引用 |
+
+---
+
+## 8. 变更后如何“实时”读取
+
+### 8.1 服务端热更新
+
+服务端通过 `TemplateDataCenter.ListenLoader` 监听 `templates_lua/` 下文件变化:
+
+```
+TemplateDataCenter - Reload : CacheData : File=templates_lua/activity_new.xlsx
+```
+
+**典型开发流程**:
+
+1. 改 Excel → 运行 `build_xls2lua.bat` → 更新 `templates_lua/`
+2. 若服务已启动,`ListenLoader` 检测到 Lua 变更后自动 Reload
+3. 每张表 Reload 时调用 `table.OnReload()`,并触发 `OnLoad` 回调(如 `ConstantConfig` 刷新)
+
+**手动 Reload**:
+
+| 方式 | 命令/接口 | 说明 |
+|------|----------|------|
+| GM | `reloadtable templates_lua/xxx.xlsx` | 重载指定表 |
+| GM | `reloadalltable` | 重载全部(`CardsServerTemplateManager.Instance.Init()`) |
+| 控制台 | `reloadtable <path>` | `OpenCardsRpcAppFactory.cs` 中 `CMD_RELOADTABLE` |
+| 代码 | `CardsServerTemplateManager.Instance.ReloadTable(path)` | 编程调用 |
+
+**注意**:仅改 Excel 不导表,或服务读的不是 `ServerData/templates_lua/`,则不会生效。
+
+### 8.2 客户端热更新
+
+客户端从 `ClientScript/Data/` 读 Lua,机制与服务端不同:
+
+| 机制 | 说明 |
+|------|------|
+| 导表同步 | `build_xls2lua.bat` 会把 Lua 复制到 `ClientScript/Data/` |
+| 内存缓存 | `DataCenter` / `__globalhooks_datacenter.cache` 缓存已加载表 |
+| 清缓存 | `__globalhooks_datacenter.clear_cache()` / `remove_cache(path)` |
+| 版本文件 | `_luaversion_.lua` 记录各文件 MD5 |
+| 在线同步 | `ClientInit.lua` 中 `SyncExcelData` **已注释**,当前主要靠重新导表 + 重启/重载资源 |
+
+**开发期客户端生效方式**:
+
+1. 改 Excel → 导表 → 确认 `ClientScript/Data/` 已更新
+2. Unity 中重启或触发资源/Lua 重载
+3. 或在运行时调用 `clear_cache` 后重新 `Find`
+
+Editor 下若配置了 Lua 热重载,改 `ClientScript` 下 Lua 可能即时生效,但**规范做法仍是改 Excel 再导表**,避免手改 Lua 被覆盖。
+
+---
+
+## 9. 客户端 vs 服务端差异
+
+| 维度 | 服务端 | 客户端 |
+|------|--------|--------|
+| 数据目录 | `ServerData/templates_lua/` | `ClientScript/Data/` |
+| 访问方式 | C# `Table_XXXManager` | Lua `DataCenter.DB.Find(DataTag.xxx)` |
+| 类型定义 | `Table/Table_XXX.cs` | 无强类型,按 `_key_` 动态解析 |
+| 字段差异 | 可只定义服务端需要的字段 | 可读 Excel 中全部字段(含 `StageName`、`Desc` 等展示字段) |
+| 热更新 | `ListenLoader` + GM/控制台 Reload | 需清缓存或重启;在线 Sync 暂未启用 |
+| 常量 | `ConstantConfig` 静态字段 | `DataCenter.DB.GetGameConfig()` |
+
+服务端日志中 `Field not found ... StageName/Desc` 属于正常 WARN:Lua 有字段,C# 类未声明,会被忽略。
+
+---
+
+## 10. 常用文件与脚本索引
+
+| 文件 | 作用 |
+|------|------|
+| `templates_xls/` | Excel 源文件 |
+| `build_xls2lua.bat` | 全量 Excel → Lua |
+| `build_xls2lang.bat` | 多语言导出 |
+| `templates_lua/_luaversion_.lua` | 文件 MD5 版本 |
+| `TableManager.cs` | 服务端加载入口(自动生成) |
+| `Table/Table_*.cs` | 服务端表结构定义 |
+| `CustomTableManager.cs` | 常量/开关等二次映射 |
+| `CardsServerTemplateManager.cs` | 模板管理器 |
+| `gameModel/DataTag.lua` | 客户端表名映射 |
+| `Core/DataCenter.lua` | 客户端查表核心 |
+| `OpenCards.Server.Tools/Program.cs` | 生成 `TableManager.cs` |
+| `!!!表目录解释.txt` | 目录分类说明 |
+| `!!!数据表简单说明,建表必看.docx` | 建表规范(含外部文档链接) |
+
+---
+
+## 11. 开发检查清单
+
+**改表后:**
+
+- [ ] 修改的是 `templates_xls/` 下的 Excel,而非 `.lua`
+- [ ] 已执行对应导表脚本
+- [ ] `templates_lua/` 与 `ClientScript/Data/` 均已更新
+- [ ] 新增/删字段已同步 C# `Table_XXX` 与 `DataTag.lua`
+- [ ] 新表已运行 `OpenCards.Server.Tools` 生成 `TableManager.cs`
+- [ ] 服务端:确认 `LuaTemplateLoader(true, ad)`,必要时 `reloadtable` 或 `reloadalltable`
+- [ ] 客户端:清缓存或重启 Unity 使新数据生效
+
+**启动服务端前:**
+
+- [ ] `server/src/data/ServerData/templates_lua/` 存在且完整
+- [ ] 工作目录能正确解析 `ServerData`(见 `ResolveServerDataRoot`)
+
+---
+
+## 12. 总结
+
+本项目配置表以 **`templates_xls/` 为唯一权威源**,经 **`xlslang` 导表** 生成 Lua,服务端通过 **C# Table + TableManager** 读取,客户端通过 **DataTag + DataCenter** 读取。命名上 Excel 使用 **`中文#英文.xlsx`**,Sheet 名即 Lua 文件名。变更后需 **先导表再触发热更新**:服务端支持 **文件监听 + GM/控制台 Reload**;客户端主要依赖 **重新导表 + 重启/清缓存**,在线增量同步能力尚未启用。新增表时,服务端需补 **C# 表类并重新生成 TableManager**,客户端需补 **DataTag 映射**。

+ 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)"
+    }
+}

+ 158 - 0
server/src/core/OpenCards.Core/Data/0x40600.NewServerActivity.cs

@@ -0,0 +1,158 @@
+using DeepCore;
+using DeepCore.IO;
+using OpenCards.Core.ORM;
+using System.Collections.Generic;
+
+namespace OpenCards.Core.Data
+{
+    /// <summary>
+    /// 新服狂欢活动 (协议测试)
+    /// </summary>
+    [SerializeEnum]
+    public enum NewServerActivityType
+    {
+        //登录天数
+        LoginDay = 1,
+        //Boss挑战
+        BossChallenge = 2,
+        //直购礼包
+        LimitedGift = 3,
+    }
+
+    /// <summary>
+    /// 新服狂欢 Boss挑战服务端数据
+    /// </summary>
+    public class NewServerActivityChallengeRankData : ISerializable
+    {
+        public string RoleUuid;
+        public double DamageValue;
+
+        public NewServerActivityChallengeRankData() { }
+
+        public NewServerActivityChallengeRankData(string roleuuid, double damage)
+        {
+            this.RoleUuid = roleuuid;
+            this.DamageValue = damage;
+        }
+    }
+    /// <summary>
+    /// 活动数据
+    /// </summary>
+    [MessageType(Constants.NEWSERVER_ACTIVITY + 1)]
+    public class NewServerActivityData : ISerializable
+    {
+        public int ActivityId;
+        public int ActivityGroupId;
+        public bool OpenState;
+        public long EndTime;
+        public int loginDay;
+        public List<int> buyGifts;
+    }
+
+    /// <summary>
+    /// 心愿召唤Boss挑战排行数据
+    /// </summary>
+    [MessageType(Constants.NEWSERVER_ACTIVITY + 2)]
+    public class NewServerActivityChallengeRankItem : ISerializable
+    {
+        /// <summary>
+        /// 玩家UUID
+        /// </summary>
+        public string RoleUUID;
+
+        /// <summary>
+        /// 服务器id
+        /// </summary>
+        public string ServerID;
+
+        /// <summary>
+        /// 排名
+        /// </summary>
+        public int Rank;
+
+        /// <summary>
+        /// 头像
+        /// </summary>
+        public string Icon;
+
+        /// <summary>
+        /// 头像框
+        /// </summary>
+        public string IconBox;
+
+        /// <summary>
+        /// 昵称
+        /// </summary>
+        public string Name;
+
+        /// <summary>
+        /// 等级
+        /// </summary>
+        public int Level;
+    }
+
+    #region 配置
+
+    /// <summary>
+    /// Market.xlsx/market_gift_total配置
+    /// </summary>
+    [MessageType(Constants.NEWSERVER_ACTIVITY + 10100)]
+    public class NEWSERVER_MarketGift : ISerializable
+    {
+        /// <summary>
+        /// 礼包编号
+        /// </summary>
+        public int ID;
+        /// <summary>
+        /// 礼包组
+        /// </summary>
+        public int GiftGroup;
+        /// <summary>
+        /// 礼包位置
+        /// </summary>
+        public int GiftPos;
+        /// <summary>
+        /// 礼包原价
+        /// </summary>
+        public int OriginalPrice;
+        /// <summary>
+        /// 礼包编号
+        /// </summary>
+        public int No;
+        /// <summary>
+        /// 限购次数
+        /// </summary>
+        public int PurchaseCount;
+        /// <summary>
+        /// 限购处理
+        /// </summary>
+        public int Deal;
+        /// <summary>
+        /// 礼包名称
+        /// </summary>
+        public string GiftName;
+        /// <summary>
+        /// 礼包描述
+        /// </summary>
+        public string GiftDes;
+        /// <summary>
+        /// 礼包价格
+        /// </summary>
+        public int GiftPrice;
+        /// <summary>
+        /// 奖励实例ID列表
+        /// </summary>
+        public List<int> RewardIdList = new List<int>();
+        /// <summary>
+        /// 奖励数量列表
+        /// </summary>
+        public List<int> RewardNumList = new List<int>();
+        /// <summary>
+        /// 返利比
+        /// </summary>
+        public string Discount;
+    }
+
+    #endregion
+
+}

+ 1 - 0
server/src/core/OpenCards.Core/Data/Constants.cs

@@ -33,5 +33,6 @@ namespace OpenCards.Core.Data
         public const int ADMIN_DATA = 0x40300;
         public const int DIG_DATA = 0x40400;
         public const int ACTIVITY_WISH_SUMMON_ACTIVITY = 0x40500;
+        public const int NEWSERVER_ACTIVITY = 0x40600;
     }
 }

+ 157 - 0
server/src/core/OpenCards.Core/ORM/NewServerActivityData.cs

@@ -0,0 +1,157 @@
+using DeepCore;
+using DeepCore.IO;
+using DeepCore.ORM;
+using System;
+
+namespace OpenCards.Core.ORM
+{
+    /// <summary>
+    ///  新服狂欢  活动数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivityData : IObjectMapping, ISerializable
+    {
+        /// <summary>
+        /// 活动集合 key:活动唯一id
+        /// </summary>
+        [PersistField]
+        public HashMap<int, NewServerActivityInfo> ActivityMap = new HashMap<int, NewServerActivityInfo>();
+    }
+
+    /// <summary>
+    /// 心愿召唤活动总数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivityInfo : IObjectMapping, ISerializable
+    {
+        [PersistField]
+        public NewServerActivityBaseData BaseData = new NewServerActivityBaseData();
+
+        [PersistField]
+        public NewServerActivitySummonData SummonData = new NewServerActivitySummonData();
+
+        [PersistField]
+        public NewServerActivityBossChallengeData BossChallengeData = new NewServerActivityBossChallengeData();
+
+        [PersistField]
+        public NewServerActivityHeroGiftData HeroGiftData = new NewServerActivityHeroGiftData();
+
+    }
+
+    /// <summary>
+    /// 心愿召唤活动基础数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivityBaseData : IObjectMapping, ISerializable
+    {
+        /// <summary>
+        /// 活动唯一id
+        /// </summary>
+        [PersistField]
+        public int ActivityUniqueId;
+
+        /// <summary>
+        /// 活动开始时间
+        /// </summary>
+        [PersistField]
+        public long ActivityStartTimeStamp;
+
+        /// <summary>
+        /// 活动结束时间
+        /// </summary>
+        [PersistField]
+        public long ActivityEndTimeStamp;
+
+        /// <summary>
+        /// 活动类型
+        /// </summary>
+        [PersistField]
+        public int ActivityType;
+
+        /// <summary>
+        /// 活动开启状态
+        /// </summary>
+        [PersistField]
+        public bool ActivityOpenState;
+
+        /// <summary>
+        /// 活动组id
+        /// </summary>
+        [PersistField]
+        public int ActivityGroupId;
+    }
+
+    /// <summary>
+    /// 心愿召唤活动召唤数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivitySummonData : IObjectMapping, ISerializable
+    {
+        /// <summary>
+        /// 英雄捆Id
+        /// </summary>
+        [PersistField]
+        public int SelectHeroInstanceId;
+
+        /// <summary>
+        /// 计数
+        /// </summary>
+        [PersistField]
+        public int HeroCounter;
+
+        // 每日召唤次数
+        [PersistField]
+        public int DailyCount;
+
+        // 总召唤次数
+        [PersistField]
+        public int TotalCount;
+
+        // 召唤时间戳
+        [PersistField]
+        public long Timestamp;
+
+        // 掉落信息,用于动态权重计算,key:掉落库id,value:<捆id, 掉落次数>
+        [PersistField]
+        public HashMap<int, HashMap<int, int>> DropedInfo = new HashMap<int, HashMap<int, int>>();
+
+        /// <summary>
+        /// 任务埋点记录
+        /// </summary>
+        [PersistField]
+        public HashMap<int, bool> TaskDigRecordMap = new HashMap<int, bool>();
+    }
+
+    /// <summary>
+    /// 心愿召唤Boss挑战活动数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivityBossChallengeData : IObjectMapping, ISerializable
+    {
+        /// <summary>
+        /// 挑战次数
+        /// </summary>
+        [PersistField]
+        public int FightTimes;
+
+        /// <summary>
+        /// 历史最高伤害
+        /// </summary>
+        [PersistField]
+        public double MaxDamage;
+    }
+
+    /// <summary>
+    /// 心愿召唤活动英雄礼包数据
+    /// </summary>
+    [PersistType]
+    public class NewServerActivityHeroGiftData : IObjectMapping, ISerializable
+    {
+        /// <summary>
+        /// 锁定的英雄id
+        /// </summary>
+        [PersistField]
+        public int LockHeroId;
+    }
+
+}

+ 152 - 0
server/src/core/OpenCards.Core/Protocol/Client/0x56000.Logic.NewServerActivity.cs

@@ -0,0 +1,152 @@
+using DeepCore;
+using DeepCore.IO;
+using DeepCore.Protocol;
+using OpenCards.Core.Data;
+using System;
+using System.Collections.Generic;
+
+namespace OpenCards.Core.Protocol.Client
+{
+    #region 通用
+
+    [RequestMsg(typeof(NewServerActivityResponse), false)]
+    public class NewServerActivityRequest : ClientRequest, ILogicProtocol
+    {
+        [MessageCode("调用 NewServerActivityRequest, 默认id为1")]
+        public int id = 1;
+    }
+    public class NewServerActivityResponse : ClientResponse, ILogicProtocol
+    {
+        [MessageCode("回应  NewServerActivityResponse")]
+        public const int CODE_NOT_IN_ACTIVITY_PERIOD = 501;
+    }
+
+    /// <summary>
+    /// 客户端请求活动状态信息
+    /// </summary>
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 1000)]
+    [RequestMsg(typeof(NewServerClientResponse), true, true)]
+    public class NewServerClientRequest : NewServerActivityRequest
+    {
+        [MessageCode("调用 NewServerClientRequest, 默认id为1")]
+        public int id = 1;
+    }
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 1001)]
+    public class NewServerClientResponse : NewServerActivityResponse
+    {
+        [MessageCode("NewServerClientResponse")]
+        public List<NewServerActivityData> s2c_ActivityStateList = new List<NewServerActivityData>();
+    }
+
+    #endregion
+
+
+    #region Boss挑战
+
+    /// <summary>
+    /// Boss挑战基础数据
+    /// </summary>
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 2000)]
+    [RequestMsg(typeof(ClientNewServerBossChallengeBaseInfoResponse), true, true)]
+    public class ClientNewServerBossChallengeBaseInfoRequest : NewServerActivityRequest
+    {
+        /// <summary>
+        /// 活动唯一key
+        /// </summary>
+       [MessageCode("调用 ClientNewServerBossChallengeBaseInfoRequest")]
+        public int c2s_ActivityUniqueId;
+    }
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 2001)]
+    public class ClientNewServerBossChallengeBaseInfoResponse : NewServerActivityResponse
+    {
+        /// <summary>
+        /// 活动结束时间戳
+        /// </summary>
+        public long s2c_ActivityEndTimeStamp;
+
+        /// <summary>
+        /// 排名
+        /// </summary>
+        public int s2c_Rank;
+
+        /// <summary>
+        /// 伤害值
+        /// </summary>
+        public double s2c_DamageValue;
+
+        /// <summary>
+        /// 前三名玩家名称列表
+        /// </summary>
+        public string[] s2c_RankList;
+
+        /// <summary>
+        /// Boss英雄id
+        /// </summary>
+        public int s2c_BossId;
+    }
+
+    /// <summary>
+    /// 心愿召唤Boss挑战排行榜
+    /// </summary>
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 3002)]
+    [RequestMsg(typeof(ClientNewServerBossChallengeRankListResponse), true, true)]
+    public class ClientNewServerBossChallengeRankListRequest : NewServerActivityRequest
+    {
+        /// <summary>
+        /// 活动唯一key
+        /// </summary>
+        [MessageCode("调用 ClientNewServerBossChallengeRankListRequest")]
+        public int c2s_ActivityUniqueId;
+    }
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 3003)]
+    public class ClientNewServerBossChallengeRankListResponse : NewServerActivityResponse
+    {
+        /// <summary>
+        /// 排名
+        /// </summary>
+        public int s2c_Rank;
+
+        /// <summary>
+        /// 伤害值
+        /// </summary>
+        public double s2c_DamageValue;
+
+        /// <summary>
+        /// 排行榜列表
+        /// </summary>
+        public List<NewServerActivityChallengeRankItem> s2c_RankList = new List<NewServerActivityChallengeRankItem>();
+    }
+
+    #endregion
+
+    #region 限购礼包
+
+    /// <summary>
+    /// 获取限购礼包数据
+    /// </summary>
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 3000)]
+    [RequestMsg(typeof(ClientNewServerLimitedGiftBaseInfoResponse), true, true)]
+    public class ClientNewServerLimitedGiftBaseInfoRequest : NewServerActivityRequest
+    {
+        /// <summary>
+        /// 活动唯一key
+        /// </summary>
+        [MessageCode("调用 ClientNewServerLimitedGiftBaseInfoRequest")]
+        public int c2s_ActivityUniqueId;
+    }
+    [MessageType(Constants.LOGIC_NEWSERVER_ACTIVITY_START + 3001)]
+    public class ClientNewServerLimitedGiftBaseInfoResponse : NewServerActivityResponse
+    {
+        /// <summary>
+        /// 活动结束时间戳
+        /// </summary>
+        public long s2c_ActivityEndTimeStamp;
+
+        /// <summary>
+        /// 礼包购买次数集合
+        /// </summary>
+        public HashMap<int, int> s2c_GiftPurchaseCountMap = new HashMap<int, int>();
+    }
+
+    #endregion
+}

+ 2 - 0
server/src/core/OpenCards.Core/Protocol/Constants.cs

@@ -71,6 +71,8 @@ namespace OpenCards.Core.Protocol
         public const int LOGIC_LACK_OF_RESOURCE_STRAT = 0x53000;
         public const int LOGIC_NEW_GUILD_BOSS = 0x54000;
         public const int LOGIC_ACCUMULATIVE_LOGIN_DAYS = 0x55000;
+        public const int LOGIC_NEWSERVER_ACTIVITY_START = 0x56000;
+
         
     }
     public class MODULESTATUS

+ 28 - 28
server/src/data/ClientScript/Data/Market.xlsx/push_gift_depot_limit.lua

@@ -26,33 +26,33 @@ return {
 [21] = {122,0,0,-1,-1,-1,},
 [22] = {123,0,0,-1,-1,-1,},
 [23] = {124,0,0,-1,-1,-1,},
-[24] = {201,1,1,1,20,2,},
-[25] = {202,1,1,1,20,2,},
-[26] = {203,1,1,1,20,2,},
-[27] = {204,1,1,1,20,2,},
-[28] = {205,1,1,1,20,2,},
-[29] = {206,1,1,1,20,2,},
-[30] = {207,1,1,1,20,2,},
-[31] = {208,1,1,1,20,2,},
-[32] = {209,1,1,1,20,2,},
-[33] = {210,1,1,1,20,2,},
-[34] = {211,1,1,1,20,2,},
-[35] = {212,1,1,1,20,2,},
-[36] = {213,1,1,1,20,2,},
-[37] = {214,1,1,1,20,2,},
-[38] = {215,1,1,1,20,2,},
-[39] = {216,1,1,1,20,2,},
-[40] = {217,1,1,1,20,2,},
-[41] = {218,1,1,1,20,2,},
-[42] = {219,1,1,1,20,2,},
-[43] = {220,1,1,1,20,2,},
-[44] = {221,1,1,1,20,2,},
-[45] = {222,1,1,1,20,2,},
-[46] = {223,1,1,1,20,2,},
-[47] = {224,1,1,1,20,2,},
-[48] = {225,1,1,1,20,2,},
-[49] = {226,1,1,1,20,2,},
-[50] = {227,1,1,1,20,2,},
-[51] = {228,1,1,1,20,2,},
+[24] = {201,1,1,1,3,1,},
+[25] = {202,1,1,1,3,1,},
+[26] = {203,1,1,1,3,1,},
+[27] = {204,1,1,1,3,1,},
+[28] = {205,1,1,1,3,1,},
+[29] = {206,1,1,1,3,1,},
+[30] = {207,1,1,1,3,1,},
+[31] = {208,1,1,1,3,1,},
+[32] = {209,1,1,1,3,1,},
+[33] = {210,1,1,1,3,1,},
+[34] = {211,1,1,1,3,1,},
+[35] = {212,1,1,1,3,1,},
+[36] = {213,1,1,1,3,1,},
+[37] = {214,1,1,1,3,1,},
+[38] = {215,1,1,1,3,1,},
+[39] = {216,1,1,1,3,1,},
+[40] = {217,1,1,1,3,1,},
+[41] = {218,1,1,1,3,1,},
+[42] = {219,1,1,1,3,1,},
+[43] = {220,1,1,1,3,1,},
+[44] = {221,1,1,1,3,1,},
+[45] = {222,1,1,1,3,1,},
+[46] = {223,1,1,1,3,1,},
+[47] = {224,1,1,1,3,1,},
+[48] = {225,1,1,1,3,1,},
+[49] = {226,1,1,1,3,1,},
+[50] = {227,1,1,1,3,1,},
+[51] = {228,1,1,1,3,1,},
 
 }

+ 2 - 567
server/src/data/ClientScript/Data/_luaversion_.lua

@@ -1,344 +1,9 @@
 return {
-["version"] = "c3269d3caf73d40fedb3e69e63d37ac0",
-["/actionidlereward.xlsx/actionidlereward.lua"] = "606de01da68f2503f54b3b3683ff7480",
-["/actitonidlereward.xlsx/actitonidlereward.lua"] = "3a02dcbcce29f237b6c61043bff565d1",
-["/activity_new - 副本.xlsx/activity_task.lua"] = "e7af163d7fd680e11b8af339ea2f8b2b",
-["/activity_new - 副本.xlsx/activity_type.lua"] = "59307415ab5833eb57eb17cc1dca5cc6",
-["/activity_new - 副本.xlsx/checkin.lua"] = "7d57acb6216039444b058c6712d357d8",
-["/activity_new - 副本.xlsx/stage_reward.lua"] = "dc9213e53aafd4c1a458a27b72d603d8",
-["/activity_new - 副本.xlsx/target_task.lua"] = "c8a205bc07d735dd63105ebccfc0b953",
-["/activity_new.xlsx/7Daysstage_reward.lua"] = "99b35ced0a2f24483da97e1563d76f10",
-["/activity_new.xlsx/7DaysTask.lua"] = "d6c775d7f70d8febef6e363357b8aeec",
-["/activity_new.xlsx/activity_task.lua"] = "e7af163d7fd680e11b8af339ea2f8b2b",
-["/activity_new.xlsx/activity_time.lua"] = "ef827552c33d6ba78d6bc5e75824793f",
-["/activity_new.xlsx/activity_type.lua"] = "59307415ab5833eb57eb17cc1dca5cc6",
-["/activity_new.xlsx/checkin.lua"] = "7d57acb6216039444b058c6712d357d8",
-["/activity_new.xlsx/login_reward.lua"] = "9d080bb1548eaa9e6a5b56bf07a807d7",
-["/activity_new.xlsx/stage_reward.lua"] = "57e11c1c24e11d2b9f3f99a2bedf1317",
-["/activity_new.xlsx/summon_task.lua"] = "4f95e144d6c4beae6f1e1fe7eb93f0b6",
-["/activity_new.xlsx/target_task.lua"] = "96a8e37ca4b7762981adc6b28fcce8b1",
-["/activity_time.xlsx/activity_time_control.lua"] = "07830bd56cf93579d5e5fe24e1b1f07f",
-["/activity_time.xlsx/activity_time.lua"] = "d0f161f1948b632f84e43510ec0782fb",
-["/activity_time.xlsx/ItemRecycle.lua"] = "1a585db9b47b6d4b1fa1a2b3768dcb50",
-["/ActivityBoss.xlsx/ActivityBossChallenge.lua"] = "20e400f8f53d9f60a387c8251cf94587",
-["/ActivityBoss.xlsx/BossActivitySkill.lua"] = "6e60a1a8e95945b9634e988771efaf7e",
-["/ActivityBoss.xlsx/BossAttr.lua"] = "8b9ff7a2762dd94dffbb1be408a882d1",
-["/ActivityBoss.xlsx/BossChallengeConfig.lua"] = "601294af1d53e23c75c138175157afe3",
-["/ActivityBoss.xlsx/BossGuildRankList.lua"] = "e22da796ca56feb4c5b9ddac5087f9f4",
-["/ActivityBoss.xlsx/BossRankList.lua"] = "ecfadc7af7b49cef21c84930df5aab2d",
-["/ActivityDailyDrop.xlsx/ActivityDailyDrop.lua"] = "a62a2625b2a93620ab0fb72d9007dada",
-["/activityDraw.xlsx/activitiesExchange.lua"] = "0b95e159aaad60684ca41090b09cd4d0",
-["/activityDraw.xlsx/activityDraw.lua"] = "dd24d4ef75544432b0b0b9acefa58329",
-["/activityDraw.xlsx/activityGroup.lua"] = "8c0849047c7f4fe4426f9de2a2a3b4c6",
-["/ActivityIconFly.xlsx/ActivityIconFly.lua"] = "b0aced2d814dc0f16786467a59fe2288",
-["/ActivityOpenCondition.xlsx/ActivityOpenCondition.lua"] = "2849a8e996584d5f60f38d2a5fd33c80",
-["/Ad.xlsx/AdsManager.lua"] = "b5648e572c0f8f3b4083ae70d8fe60c8",
-["/Arena.xlsx/arenaglobalconfig.lua"] = "fb9311773cf46aea2a3f979414e067d0",
-["/Arena.xlsx/J竞技场#Arena配置规范.lua"] = "c93263b9738c6842ecd467e5a013459c",
-["/arenarankconfig.xlsx/ArenaActivityReward.lua"] = "995ef8786890d3c98232d51e7af7c188",
-["/arenarankconfig.xlsx/ArenaIntegralSubsection.lua"] = "00eeb22d5f63978363a182358da009a8",
-["/arenarankconfig.xlsx/ArenaRankReward.lua"] = "9a961e94a6a18d94aac9136d4f4b98c1",
-["/arenarankconfig.xlsx/ArenaSegmentReward.lua"] = "fadb9231131d88515ab79c6a22641dde",
-["/arenarankconfig.xlsx/Arenasort.lua"] = "9530b8354ecdb5627dbd7ab900b26a5d",
-["/arenarankconfig.xlsx/Arenatreasurechest.lua"] = "5aada08f02a3a1012c4155ea860f6845",
-["/arenarankconfig.xlsx/Rankadjustment.lua"] = "22085eb8413976e5b8e2853fe5132aed",
-["/arenarankconfig.xlsx/Robotpositionweigh.lua"] = "02cf4102e49186c849ed6674bfebffba",
-["/arenarankconfig.xlsx/section.lua"] = "a816a6946957ddb1a4c74a434e1fbc16",
-["/arenarankconfig.xlsx/TicketPrice.lua"] = "eaadb2d1eb8f1ed149321e2af80e6ece",
-["/arenarankconfig.xlsx/winbattle.lua"] = "887c382bfa62bad565a61ff622ab3fee",
-["/ArenaRobot.xlsx/arenarobotartifact.lua"] = "e2c5a9f785b5409031ad8aa3b127e639",
-["/ArenaRobot.xlsx/arenarobotequip.lua"] = "7d6ef7c4250b14cb0156b34871f3e501",
-["/ArenaRobot.xlsx/arenarobothero.lua"] = "92524fddd2f61f1a191db33a4d615b6a",
-["/ArenaRobot.xlsx/arenavalorrobot.lua"] = "dbf004030f678e9053904975dc39403a",
-["/ArenaRobot.xlsx/J竞技场机器人#ArenaRobot配置规范.lua"] = "be2a5e7c475bdc184bac8340f2b46a73",
-["/ArenaRobot.xlsx/Sheet1.lua"] = "da3049d72613fa355c452c0aca9a2651",
-["/artifact.xlsx/artifact_enhance.lua"] = "905ca97bfcb7e22dc5896a6594f112db",
-["/artifact.xlsx/artifact_property.lua"] = "ed8c1dd8e05a004ffe9f3a186ad25478",
-["/artifact.xlsx/artifact.lua"] = "676131f6faaac4edf3d43890b613c697",
-["/battleartifactskill.xlsx/battleartifactskill.lua"] = "d595196eca660432e489c3db0c4a8320",
-["/battleAttrs.xlsx/battleAttrs.lua"] = "5f9148eff8653033442493b319bc9a35",
-["/battleBuff.xlsx/battleBuff.lua"] = "de4efcc1b47626b7b32e9236a74466ea",
-["/battlebullet.xlsx/battlebullet.lua"] = "b5d6c6b6107527ba7bf5014c8309b641",
-["/battleBulletframe.xlsx/battleBulletframe.lua"] = "e5e24daaef12008b007b1faba318d00c",
-["/battledifficulty.xlsx/battledifficulty.lua"] = "f1f88eb064e3ab17639897da2a962cc2",
-["/battleDmgLvPer.xlsx/battleDmgLvPer.lua"] = "a6ecea4bacabc644cd1b6ee975057077",
-["/battleDmgLvPer.xlsx/property.lua"] = "245777876af67840fe9cf5d3e0891a38",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS.lua"] = "ec3c1a18e5adfb6abed3aa4d4885feca",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001101.lua"] = "42e52432afcfac058f2515d4dac05fea",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001103.lua"] = "ec9d188b4a0dc63e85b8dd362e0d86bd",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001104.lua"] = "de21d4b87c29acb350a76ff8bdc4c7f1",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001201.lua"] = "af4d2b6200cce2a844360dbea9a866d3",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001202.lua"] = "009cc4c978443c7b1420f45db9d52c87",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001203.lua"] = "eabccfd2a225c1618b2b7e5da90315e4",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001301.lua"] = "a955e10995076e1940da679ba07ab12a",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001304.lua"] = "f6e100b9475e8dbefe8e7c7362ae1605",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001306.lua"] = "e02c9d86a18fb41a7d7ba6d690a922af",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001307.lua"] = "a3167c7fcf9c24a87fccc8b80007df1a",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001308.lua"] = "7334995cab6b0d570809c03882bb847c",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001309.lua"] = "21365279e055fc2fec3ada9b94207559",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001311.lua"] = "1a070a54ea725e5b30309cd0b3ee6a18",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001312.lua"] = "bd5a8aeea1789143af30b570d8f90440",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001313.lua"] = "3b5a05119000f9f264c6749f3c8b8b4e",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1001314.lua"] = "6082dc9de2f483e145551ca95a1a84c8",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002101.lua"] = "b5abb1a59b983de364f6c39b226decc8",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002102.lua"] = "807d70d491592ef74d1132e6fbae64d5",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002201.lua"] = "5b96c8dda5a0efefad6e294ee9b1ad22",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002202.lua"] = "7ffbea4eadd02659c9e5de21f26218cc",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002203.lua"] = "29f2edd58bf6c37f109190d7f654f53a",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002302.lua"] = "85bce53587194738d7e582215fdc766f",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002303.lua"] = "b6dd0b0998ef30608a48ec24676fed39",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002304.lua"] = "702e613d36d736eaedf5cca934cc3912",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002305.lua"] = "4c9d5b5b05c81d39c6d0c4a1deb1b580",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002307.lua"] = "8e158a0a7a11b840b24c68db4261a787",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002309.lua"] = "1405d31fd321e163356f197beffa258b",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1002310.lua"] = "7ab7aa237b5a40fcb62fa05f02c11ec0",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003101.lua"] = "2ca1f070ff6526e2e2bec45bf032b975",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003102.lua"] = "1facd22ab7471ac36d169b0f18778333",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003201.lua"] = "145acf3f71a9eb5444ff2afa0fb97dfc",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003202.lua"] = "e9780b1f84d865e915b135e6ebc2dd05",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003203.lua"] = "37818291d0931cb83cca256f7210b489",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003301.lua"] = "356ba97bd80a4bd4d020b1e78f4be3aa",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003302.lua"] = "87c21acee4469996dc61b1d61ed6b6c3",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003304.lua"] = "5d0d0ed6a2067d5502798fc9b17d0007",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003305.lua"] = "e83c105c065d59177255618a663891fd",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003306.lua"] = "17ada6c1c3df3110c9fc59e21119307a",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003308.lua"] = "2c49c46679c49f5892ad48cf63368586",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1003309.lua"] = "d805554eeb1c485b877ddfb03c51d0a8",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004101.lua"] = "18dd96f0703952ab3c6992ded624232d",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004102.lua"] = "0997bb2a379893bf36679440134e2533",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004201.lua"] = "4f8023db54452ccacff82d562cd9ccea",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004202.lua"] = "4eb6187f0de56d907c95c291938e372b",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004203.lua"] = "f29b28669eb9dad46cdbacd7c6b894b1",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004301.lua"] = "6ddcdfc46df5f736578901283ebf8e2f",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004303.lua"] = "85f707441782ce2afe7b9ae77a6229f1",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004304.lua"] = "f0953ca35e0611343c7c06625af94d3f",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004305.lua"] = "5c7cae0b5055876f004bd2d7a2602e8a",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004307.lua"] = "d4f6312dcdca673415a1772bfdcd07ea",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004308.lua"] = "74c3020b0ac49f666b92ffeb0a44514d",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1004309.lua"] = "9bada7ae9ea41b0f0068104f298dc2d3",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1005304.lua"] = "06fd3b9210dcb12151e454984cc15bc4",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1006301.lua"] = "982a92c7bfccfcd2cb21e614e8af271d",
-["/battleEffectivenessGS.xlsx/battleEffectivenessGS/1006303.lua"] = "68c092e6cee3b204130938caf86223f4",
-["/battlehero.xlsx/battlehero.lua"] = "e05333b9ca0d59b45f72732379966be6",
-["/battleRelicBuff.xlsx/battleRelicBuff.lua"] = "417ae9eea83ff2217aeb96e10a6f6a11",
-["/battleRelicSkill.xlsx/battleRelicSkill.lua"] = "20e6a94a07770a356ad5be32482cda80",
-["/battleroguelikeskill.xlsx/battleroguelikeskill.lua"] = "0bdf8e4a2de74c87d7d6fdb9c514d1bc",
-["/battleSimulate.xlsx/simulate_attacker.lua"] = "cb6e946f7c79c1c80c9bc68ceb51deab",
-["/battleSimulate.xlsx/simulate_attribute.lua"] = "cefbcae6e65a716c2e95ceb02901779e",
-["/battleSimulate.xlsx/simulate_defender.lua"] = "25881179dbc4e2a6724b07a66dd0c7b3",
-["/battleSimulate.xlsx/simulate_setting.lua"] = "21881b2bf157536ef54cb32878d453dd",
-["/battleskill.xlsx/battleskill.lua"] = "94584052cb3958cf0cdab6f0d9d03789",
-["/battleskillaction.xlsx/battleskillframe.lua"] = "4aceeb1e52c370ae34f36b222bdca93d",
-["/battleskillframe.xlsx/battleskillframe.lua"] = "ca2608e994ce2cb7716e1f6e254feabd",
-["/battleskilllabel.xlsx/battleskilllabel.lua"] = "58b31ad2cccb9ea5fda984bde59c5f71",
-["/battleSpEquipskill.xlsx/battleSpEquipskill.lua"] = "fe5849991091430ed4c734493630fff3",
-["/battlesummon.xlsx/battlesummon.lua"] = "fcd8daec70aeb40ab55febafdba33418",
-["/battletalentskill.xlsx/battletalentskill.lua"] = "edc18fe440a94b704dacb30f5463db12",
-["/battletesthero.xlsx/battletesthero.lua"] = "c0380e97be9e8595cc3a93b845612b5b",
-["/battletesthero.xlsx/battletesthero121.lua"] = "ba2502e5e734476baa78e85ff4fff8ce",
-["/battletesthero.xlsx/battletesthero161.lua"] = "82573580cafe9a55c775bd3495ee3e7b",
-["/battletesthero.xlsx/battletesthero201.lua"] = "ed0a115c4fb42e21a02ddecbc3c40c3f",
-["/battleWord.xlsx/battleWord.lua"] = "b24601720ad2e1c654dee28c3647001f",
-["/blackword.xlsx/blackWord.lua"] = "d7ae6d90e123eca965b86ad5f9841c5f",
-["/bless.xlsx/bless.lua"] = "8c4c0e60f893d00793bc0c8c122be5b0",
-["/bless.xlsx/blessmage.lua"] = "e0fd1d57cd1c6d3497c1f023ee321534",
-["/bless.xlsx/blessranger.lua"] = "1b2ded71178bea0fc7ea839fc026e616",
-["/bless.xlsx/blesssupport.lua"] = "d6ef49593dec410ff1590f9264dc3a84",
-["/bless.xlsx/blesstank.lua"] = "da5df6813cbceded60e913a1f271578c",
-["/bless.xlsx/blesswarrior.lua"] = "4e17f6ee9b1cf7c332cdce7a40eefa76",
-["/bounty.xlsx/bountylevel.lua"] = "0afc6b6d03946b03b967fde12a972821",
-["/bounty.xlsx/bountyquestion.lua"] = "1337faf790e1fac48eac9fa24df6790c",
-["/carriage.xlsx/配置说明.lua"] = "308d08deb0524591054c5d57a3574d1a",
-["/carriage.xlsx/carriage_disband.lua"] = "c9d834db4bf2f1563ceade6320065371",
-["/carriage.xlsx/carriage_herocard.lua"] = "52d6f2218cfb3dd4bb02d5cb675438cf",
-["/carriage.xlsx/carriage_lang.lua"] = "91a8eb4cf0ec92f0a954f95c3058e725",
-["/carriage.xlsx/carriage_price.lua"] = "fd5f91c3ab7398820282335a2387e1bb",
-["/carriage.xlsx/carriage_rollback.lua"] = "da18b298ffd63d5d097beec5afe52119",
-["/CDKConfig.xlsx/CDKconfig.lua"] = "fdbca842d52ca6e4b7002f70a12e127e",
-["/chapter.xlsx/chapter.lua"] = "4841ac7d6042f0e3f894018dc769ecc4",
-["/characterAvatar.xlsx/characterAvatar.lua"] = "8e98f3783d9c6935a8fdcde4d7df6086",
-["/characterAvatar.xlsx/ChatBox.lua"] = "d990cbec4fb24fe0b92950e31e8a1dd9",
-["/characterAvatar.xlsx/HeadFrame.lua"] = "dbb236c20c663b1df50bd32caf3c3012",
-["/characterAvatar.xlsx/RoleFrame.lua"] = "ac2bcfe2346f47541c189acc1146b7ba",
-["/characterAvatar.xlsx/RoleHeadIcon.lua"] = "bc29e080f809f327db27eaf816c5051e",
-["/characterAvatar.xlsx/SkinIcon.lua"] = "205417169e5875d026f20b4d037c8521",
-["/chat_new.xlsx/blackWord.lua"] = "2b735f9637ee6004a1d520ad11c9eee6",
-["/chat_new.xlsx/chat_emo.lua"] = "8f27dae0fd774fa6231e9b63cc9e1867",
-["/color.xlsx/color.lua"] = "fefb3655ce15a029355efb47415e7976",
-["/color.xlsx/colorLink.lua"] = "5357c6f4a09261fd7c195fc8df8c7651",
-["/copy_config.xlsx/battle.lua"] = "d05d8af18c988910378c0594f1653274",
-["/copy_config.xlsx/battleGS.lua"] = "31acb5c366fc2fbcf8eb818d45cff894",
-["/copy_config.xlsx/copy_reward.lua"] = "b16186f0e637297016c36b01ed6bad57",
-["/copy_config.xlsx/copy.lua"] = "d8e0118757d64ecc3535223419d24337",
-["/copy_config.xlsx/itemArrow.lua"] = "a39d75cdaa15544f82a4ac45e72645fc",
-["/copy_config.xlsx/mapInfo.lua"] = "53d45e66a53aab3d12808238bcc07d51",
-["/copy_config.xlsx/relic.lua"] = "d6eb69dbff73c4965565d2746fdd2cff",
-["/copy_config.xlsx/reward.lua"] = "c942bd696b22c55ef66bc17e4d0a2072",
-["/copy_config.xlsx/spInfo.lua"] = "3f14862db190df05c5e8aa299e643ba3",
-["/copy_config.xlsx/tips.lua"] = "7088cbd638f3b92ab39b9278effd20f7",
-["/Crystal.xlsx/CrystalConstant.lua"] = "4f1913ac5ba08406812abbb548e63051",
-["/Crystal.xlsx/CrystalHeroLevelLimit.lua"] = "db0180f4d48440a86b11212d76cb1914",
-["/Crystal.xlsx/CrystalLevel.lua"] = "5bffe881ba423c2b779fa612e80cdadc",
-["/Crystal.xlsx/CrystalSlots.lua"] = "ec3d87da457f81d3804f67d0a5885a7b",
-["/Crystal.xlsx/CrystalSlotsDiamonds.lua"] = "3684d6a6d6d0e867a700148a21835a86",
-["/D订阅特权subscribe.xlsx/desc.lua"] = "45c145da37208cb52c971172b2935f0e",
-["/D订阅特权subscribe.xlsx/privilege.lua"] = "6cda07ca5705240516e0891fe8dc5b70",
-["/Dialog.xlsx/cfg.lua"] = "daa4b5c37e6d0ba74c41b0147fc51cdd",
-["/dropconfig.xlsx/dropgroup.lua"] = "8ef105ef43b77a6fb6d5dc4d932e8808",
-["/dropconfig.xlsx/dropshow.lua"] = "36a4ee18bebdc3d550169de29fbc3e1c",
-["/dropconfig.xlsx/dropteam.lua"] = "2003e10d1fc2c23c0058cb997be4e95a",
-["/DungeonStone.xlsx/dungeonstage.lua"] = "c1b4d388667140f5813fea53eae00579",
-["/DungeonStone.xlsx/dungeonstonebattle.lua"] = "2fdfa80b55f990bf8ff51cdd334aed69",
-["/DungeonStone.xlsx/dungeonstonebuy.lua"] = "25aba36b60a25c0cbff8f607f094579f",
-["/DungeonStone.xlsx/dungeonstonedrop.lua"] = "ceea54a7a2495f5932cd983b380bf8c9",
-["/DungeonStone.xlsx/dungeonstonegloabal.lua"] = "169fd5782cb2541ef52a2c6582f5d8ae",
-["/DungeonStone.xlsx/dungeonstonelist.lua"] = "5586a30b87f2983563848c7da641acfe",
-["/DungeonStone.xlsx/dungeonstoneopen.lua"] = "86ca41effc18b8f14475b228479d9bbe",
-["/DynamicEvent.xlsx/DynamicEvent.lua"] = "d4aba74af3bf3876f7e6430711c7ada0",
-["/equipconfig.xlsx/Equalityconfig.lua"] = "4e90d7dc4f258bde48b906ab7b630fa7",
-["/equipconfig.xlsx/equip.lua"] = "b9896a03425b7788c82cefd4bf8295ba",
-["/equipconfig.xlsx/EquipLevel.lua"] = "e15ee0fbc38205e08e458b80e3028f79",
-["/equipconfig.xlsx/equiprace.lua"] = "c0e452fb4a40c484595fec7e659b8326",
-["/equipconfig.xlsx/EquipRank.lua"] = "7d7962b09a129a63a17aa5a283acfe96",
-["/equipconfig.xlsx/qualityconfig.lua"] = "4193e747409267fe51c139766ebf3ea9",
-["/equipconfig.xlsx/SpEquip.lua"] = "c843dfef81f792cae30650eb0f8b6fda",
-["/equipconfig.xlsx/SpEquipGS.lua"] = "d78277af5f78bb4f2f55bef525354209",
-["/equipconfig.xlsx/SpEquipLevel.lua"] = "dbad6ceb1610d23c7a0060eeff679272",
-["/exchangeconfig.xlsx/exchangeconfig.lua"] = "a2a486dcb89cf48bb485d26a6625ed09",
-["/exchangeconfig.xlsx/exchangegroup.lua"] = "1c2240c949a4f88163d85d085a7a7b29",
-["/exchangeconfig.xlsx/exchangevip.lua"] = "f81040923aeaf403131deed8b504d678",
-["/formationInfo.xlsx/Info.lua"] = "47e1789c758be61356a9756a9068cd65",
-["/Friends.xlsx/DimensionalsStone.lua"] = "535e58ba676e34caf8a9a6c42b22b77e",
-["/function_switch.xlsx/function_switch.lua"] = "f5978d0ac19feff5d17641d756cdc983",
-["/functions.xlsx/activitiesAccess.lua"] = "68b181b01eec5e91a9cf770526cda094",
-["/functions.xlsx/functions.lua"] = "d5d0ce551b9ed907c9c52c1e28c371e9",
-["/G英雄说话表herowords.xlsx/words.lua"] = "58c8c2b9ac4ed8613677a8e7db803e26",
-["/gameConfig.xlsx/gameConfig.lua"] = "5d84fcb40f19c8e556d069f73f57dd41",
-["/general_free_reward.xlsx/GeneralFreeReward.lua"] = "105428546eddaf0acdeae557d2d8e9a4",
-["/generalControl.xlsx/MailControl.lua"] = "3494ef2176a5fb730c60d92173f4000c",
-["/generalpopup.xlsx/general_popup_list.lua"] = "9d27f2d49dee126ffd69c7559561dc59",
-["/generalpopup.xlsx/general_popup.lua"] = "b8802185795b0c5d30099476f35e7a77",
-["/Gift.xlsx/GiftPack_base.lua"] = "c70b9e3907deaec98ef37a0302d6bfe5",
-["/GiftDrop.xlsx/GiftDrop.lua"] = "9ab29dbf1c8bad14d0695a2b7b107058",
-["/GiftDrop.xlsx/GiftTeam.lua"] = "54c83860454015d38a4591435ee614f8",
-["/guild.xlsx/guild_level.lua"] = "eac0ba044300beb7d580aab2c1b1c172",
-["/guild.xlsx/guild_member_privilege.lua"] = "fef35ea7c57b817588ac2ade05e1f3a7",
-["/guildhuntlevel.xlsx/goldcoinratio.lua"] = "9c6c5710ab63ec6c6f3ba880b32ed562",
-["/guildhuntlevel.xlsx/guildhunt.lua"] = "87845aa662987c87e730758e6fb02182",
-["/guildhuntlevel.xlsx/guildhuntaward.lua"] = "ffbd26c3bffbbf58fa844322615bf9f2",
-["/guildhuntlevel.xlsx/guildhuntlevel.lua"] = "30c68c0eecd242fd75bd3c266c08866c",
-["/guildhuntlevelnew.xlsx/guildhuntawardbox.lua"] = "6cf6f9969d6989847c35a5fc906da284",
-["/guildhuntlevelnew.xlsx/guildhuntnew.lua"] = "5a02c84f8c886540cccacf3b4173eac7",
-["/guildhuntlevelnew.xlsx/guildhuntnewconstant.lua"] = "4eeabdf02fde17d5c9e36ff773123f30",
-["/guildsecretcave.xlsx/boss.lua"] = "23ef463282581d9fdd96aab29db94806",
-["/guildsecretcave.xlsx/config.lua"] = "943eb261712f06826053cd93bb59bb18",
-["/guildsecretcave.xlsx/deepreward.lua"] = "f9eb7c1f1e3e6e81a1db3786a921ae8a",
-["/guildsecretcave.xlsx/legendreward.lua"] = "ab8afae12f5767d465a4275275d1f9bc",
-["/guildsecretcave.xlsx/shallowlayer.lua"] = "c77eee7a577f45e1841cec8264fd6c04",
-["/guildsecretcave.xlsx/shallowrank.lua"] = "dbf9dd8d158d1230ca9c3956994228c9",
-["/guildsecretcave.xlsx/shallowreward.lua"] = "c5ad3d830b5db832440921362ac5fcca",
-["/guildsecretcave.xlsx/step.lua"] = "f116d177c324eddfb10d3b02e83b9382",
-["/guildsecretcave.xlsx/steppoint.lua"] = "f70c9f90215453e2f4d0bc33dd9cf367",
-["/guildsecretcave.xlsx/warriortreasures.lua"] = "8102cc193a9313afb5cb26239d6ff1dd",
-["/guildwarrior.xlsx/warriortreasure.lua"] = "7eb577f1ebbc201bda657883cecf1937",
-["/hallows.xlsx/hallow.lua"] = "f0904c719bbd8da86a91bd9d01575d85",
-["/hallows.xlsx/hallowlevelup.lua"] = "4d15e1ea1d3b8c3995c78254c3349fbf",
-["/hallows.xlsx/hallowpart.lua"] = "e4b3b797eec60d9eb25564fddf850837",
-["/hallows.xlsx/hallowskill.lua"] = "03cceaece1d3f1da64bae9420efcb579",
-["/hallows.xlsx/hallowskillbuff.lua"] = "ceec98d00fa2c19687288d43d9cbfd0e",
-["/hallows.xlsx/hallowskilllevelup.lua"] = "1c7410462e770a14a4f873302d0bd9ca",
-["/hallows.xlsx/hallowskilllock.lua"] = "8fb0cef0da46664f9d34a276ddfccabc",
-["/hallows.xlsx/hallowstarup.lua"] = "570fdabd0d3011e18199e452ef2b01ac",
-["/heatBillboard.xlsx/配置说明.lua"] = "abf3ae1442b665f6af6fd5c201610153",
-["/heatBillboard.xlsx/heatBillboardDetail.lua"] = "d200fdf0c00529c69dbc56590393b13c",
-["/heatBillboard.xlsx/heatBillboardMain.lua"] = "617c340b8b2c2b59512199b0674dee40",
-["/heatBillboard.xlsx/heatBillboardTitle.lua"] = "17614ba77ead104e405bd5a9f6c323a3",
-["/hero.xlsx/herobasetypeconfig.lua"] = "b9a6ae41afb20cd527d1141337074e64",
-["/hero.xlsx/heroconfig.lua"] = "18140630cebd4919a21ff5fcb610e1bb",
-["/hero.xlsx/heroglobal.lua"] = "bd08055e74dd5c6e7ba252d126ec036a",
-["/hero.xlsx/herolevelup.lua"] = "ba7335bda7b41adb57d09a5ab738dd33",
-["/hero.xlsx/herolevelupn.lua"] = "f7b6dec68ab90d9811d38c555a99d18f",
-["/hero.xlsx/heropackageup.lua"] = "ee7ca1abd0f651a78fc1249fcc1db6e3",
-["/hero.xlsx/herorankup.lua"] = "1c3074967d560e3ab05fe3a15a505514",
-["/hero.xlsx/heroskill.lua"] = "ccb89a346153d80e9c3f7ec02174ec82",
-["/hero.xlsx/herostep.lua"] = "03b6f5e33bd68a6c4e3872cf07d7bb49",
-["/hero.xlsx/qualityconfig.lua"] = "a154e81883897c03a4291ee7cdc9aa2b",
-["/hero.xlsx/raceconfig.lua"] = "fb18fa09612eb8f9db87aa020b743cbc",
-["/HeroActivity_time.xlsx/ActivityCopy.lua"] = "896c471936bb029a3a72e2160becd510",
-["/HeroActivity_time.xlsx/ActivityCopyRewards.lua"] = "477812632427fb2bf62c42af150e56f3",
-["/HeroActivity_time.xlsx/ActivityExpGift.lua"] = "9ec4cfdcb47671461388815a136fb3d3",
-["/HeroActivity_time.xlsx/ActivityGoods.lua"] = "56a32d4d1409bc519c0ffd45a168b98c",
-["/HeroActivity_time.xlsx/ActivityHeroShow.lua"] = "801d031ec60c056c4ff1559207a1161e",
-["/HeroActivity_time.xlsx/ActivityOpenCondition.lua"] = "78b9d8c99bf2548c2b6c68e778b52391",
-["/HeroActivity_time.xlsx/ActivitySummonRewards.lua"] = "48d91aacd8e5b978ba94986bd09a62bd",
-["/HeroActivity_time.xlsx/ActivityTask.lua"] = "5b785d8a47f55e19785e746053309123",
-["/herolevel_GS.xlsx/herolevel_GS.lua"] = "bcc65e97d8479e442cfe3cf4c6e4ca2d",
-["/HeroMap.xlsx/heromap_race.lua"] = "5bec4767281e659a70709c8118267bd0",
-["/HeroMap.xlsx/heromap_title.lua"] = "5e66272f8b9e276d4bf444ab0908081d",
-["/HeroMap.xlsx/special_order.lua"] = "ba8fe5940359bca5c61da5df30943fd8",
-["/HeroSelect.xlsx/heroselect_hero.lua"] = "31d1ad5728d8259b66735a15652755ea",
-["/HeroSelect.xlsx/heroselect_stage.lua"] = "bd8dfd21dfbcd24ae07976801d29d441",
-["/heroskin.xlsx/heroskin.lua"] = "95a52b77eff158899f889fd5b568d96f",
-["/herostory.xlsx/story_hero.lua"] = "9b2afcd8fc7965af158530a12fbd1969",
-["/HeroTower.xlsx/HeroTowerConfig.lua"] = "4111ab0dc547753d90686a124c9b079c",
-["/HeroTower.xlsx/HeroTowerEffect.lua"] = "2b2040ed824e660b887bb6000178507f",
-["/HeroTower.xlsx/HeroTowerMonster.lua"] = "8e2073009883fda7b1eb99ea5d27b41c",
-["/heroTrial.xlsx/heroTrial.lua"] = "62df3feff95fb9c8bdebdde9943e2587",
-["/HeroWay.xlsx/HeroWay_Reward.lua"] = "986c4ce5c56050c985f5b4e5437fa738",
-["/HeroWay.xlsx/HeroWay_TaskGroup.lua"] = "15a188634ddf15134ac4d3ec21616c5d",
-["/HeroWay.xlsx/HeroWay_TaskList.lua"] = "66eafa1932733c927abf6ee11b24290d",
-["/herowords.xlsx/words.lua"] = "3eb073c0ae9c7ac8075561aff8390285",
-["/higharenarankconfig.xlsx/G高阶竞技场表#higharenarankconfig配置规范.lua"] = "39481b6f39a1666d02e510bdf713a797",
-["/higharenarankconfig.xlsx/HighArenaRankConfig.lua"] = "312a502e3fef3afe61ddf60c980f9716",
-["/HistoricalArchives.xlsx/fetter.lua"] = "d2919b5ea930432a38a3a44fa543fc8d",
-["/HistoricalArchives.xlsx/historical_archives_conds_rewar.lua"] = "f700a3c6014aa9080934a9ac2a16eb52",
-["/HistoricalArchives.xlsx/historical_archives_id_conds.lua"] = "9c6ddb0f8e749d7ca1e57dbb32f09df5",
-["/HistoricalArchives.xlsx/historical_archives_id_heros.lua"] = "a599056939cc6027a24f11f7545df42b",
-["/HistoricalArchives.xlsx/historicalArchivesLanguage.lua"] = "8eae3779a46429e2eeefdec6edf72dc8",
-["/HistoricalArchives.xlsx/libraryItem.lua"] = "a699477a5a975ae916e8f37be786d1f4",
-["/IAP.xlsx/AccumulateRechargeConfig.lua"] = "96bdf93dfcf547680f198014c0b0e578",
-["/IAP.xlsx/ChargeConfig.lua"] = "79e47b685ec8ad9f264c5bcb99f1c834",
-["/IAP.xlsx/productConfig.lua"] = "6e68ed71f9c9872bb38e034c57628ede",
-["/IAP.xlsx/Sheet1.lua"] = "6bf0353875d9613fb4ad70da5c7d38ef",
-["/idlereward.xlsx/idleConstant.lua"] = "c32d359edf04a582b35736acdc4b6177",
-["/idlereward.xlsx/idlereward.lua"] = "3b255c3369d2c0ccbcda636561d1b438",
-["/idlereward.xlsx/idlerewardOpen.lua"] = "29a3dfe16e07d47eb7242a7c279ebad7",
-["/idlereward.xlsx/idlerewardTip.lua"] = "98aef236a8bb609feb5c9821fef51a79",
-["/idlereward.xlsx/quickIdleReward.lua"] = "172d761a5dbbf33c61faeb8b0648fd07",
-["/IIAP商品表.xlsx/Sheet1.lua"] = "6bf0353875d9613fb4ad70da5c7d38ef",
-["/Instructions.xlsx/instructions.lua"] = "9c20a91ed72252b2a2f7c2c033b32ca8",
-["/item.xlsx/Item_rare.lua"] = "35c0e6d9211d38dc9d62b08109cd643d",
-["/item.xlsx/item_type.lua"] = "63e3acff9380108e46b9d71e27592c3c",
-["/item.xlsx/item.lua"] = "85d2d92b2d59be613be17c4c6b97bb80",
-["/item.xlsx/ItemRare_type.lua"] = "c5ebcdb6ba22c3143ee2cb37b831fe1a",
-["/iteminstance.xlsx/item_instance.lua"] = "6c4cc565d645afc5bad765f566477423",
-["/LackOfResources.xlsx/LackOfResources.lua"] = "6c266d9d13fc8a07f0f99146cded0575",
-["/LackOfResources.xlsx/LackOfResourcesEvents.lua"] = "c2b323e7f167f8d1ae835b93b6c30c6b",
-["/LackOfResources.xlsx/LackOfResourcesPlan.lua"] = "50db5d90af34c7d02a54e852184a7cf2",
-["/legendarenarankconfig.xlsx/legendarenarankconfig.lua"] = "6f2cdb2de5bc947a0db23f870d6397a0",
-["/legendarenarankconfig.xlsx/legendreward.lua"] = "5e83a2221e241801a156a2bb7dde8230",
-["/login_reward.xlsx/login_reward.lua"] = "f8e5f1e45e024f508c34321f4f45b133",
-["/loginpopup.xlsx/login_popup.lua"] = "f2eee4cba7f4fb12af0dce5e23335027",
-["/loginReward.xlsx/loginReward.lua"] = "63d9e540f01d11177ef410b3324620c4",
-["/loginReward.xlsx/LoginRewardInfo.lua"] = "12305c72ff3d7fc9c583a4a2c386d6ab",
-["/loginReward.xlsx/PlanInfo.lua"] = "f58615f9814e3b79ac09bd2b3008403c",
-["/LoginTips.xlsx/LoginTips.lua"] = "74a35a24a57470fdaefa266220e8da48",
-["/mail.xlsx/配置说明.lua"] = "6da5931b4a3bb22c775cb912458487f9",
-["/mail.xlsx/mail.lua"] = "778168d6f74d7b26433d71af85a3f0de",
-["/mail.xlsx/mailcontent.lua"] = "258104977affeaded7eb0d22192ffed9",
-["/mapconfig.xlsx/mapconfig.lua"] = "b3942086cbb7995b957e5255cfd2cee3",
-["/Mappingoffset.xlsx/BattleCard.lua"] = "36688a7cb4104f867b6fd592f3fc1de0",
-["/Mappingoffset.xlsx/HeroMapPic.lua"] = "fd3e533754b4647b61f7273075ca7752",
-["/Mappingoffset.xlsx/HeroPigPic.lua"] = "6e3a0564afe76a59fa10d38d1b1deb2c",
-["/Mappingoffset.xlsx/Mappingoffset.lua"] = "63f643fad0b4d14de0cc38d0ebd0eea2",
-["/Mappingoffset.xlsx/TavernCard.lua"] = "1a3285e6ee625c6c18180ce7bc9f16f1",
+["version"] = "e3e0af13d353bf9d937d20775d537871",
 ["/Market.xlsx/accumulate_Constant.lua"] = "fa5f37ba518b624464fb43328010c585",
 ["/Market.xlsx/accumulate_daily_recharge.lua"] = "8f8ef348602a13ba149c34f5cb80393a",
 ["/Market.xlsx/accumulate_recharge.lua"] = "e826794b25d229f459da998bea170779",
 ["/Market.xlsx/activity_gift.lua"] = "4303b5f613b2f0a96087ddcd58847799",
-["/Market.xlsx/daily_gift.lua"] = "fdea2f7e7e4da2c039a422f55fd95556",
-["/Market.xlsx/dream_reward.lua"] = "1062dcaf9e23cb8715360a0dee33b8d2",
-["/Market.xlsx/gift_battlepass.lua"] = "23944e6d5c03f7064c915a3e42f6111f",
 ["/Market.xlsx/gift_custompack.lua"] = "85f96ea5e1cb8e00a18962cc70375b5f",
 ["/Market.xlsx/gift_growth.lua"] = "173daa72af22cb72197ee69e78cc6676",
 ["/Market.xlsx/gift_monthcard_recommendgift.lua"] = "eb1e52f29417b617a40692bc1e3003b3",
@@ -354,238 +19,8 @@ return {
 ["/Market.xlsx/progress_Plan.lua"] = "b174fe6266260cc6f5ecc1522efd43a2",
 ["/Market.xlsx/progress_reward_module.lua"] = "3e9a10379b6f747b9f06753f7429436a",
 ["/Market.xlsx/progress_reward.lua"] = "798f21140aca3dab4f161df37f1bcbb3",
-["/Market.xlsx/push_gift_depot_limit.lua"] = "ac7e30487dc08f4a25eeeed636f1d5a2",
+["/Market.xlsx/push_gift_depot_limit.lua"] = "1158e23ee73f0cb2ab538c7a34e0025e",
 ["/Market.xlsx/push_gift_depot.lua"] = "16fd87f2f7ae1371acdb5f42a1d9c1f2",
 ["/Market.xlsx/push_gift_total_condition.lua"] = "a2ed61516a3af3d692272d94be8fb23a",
 ["/Market.xlsx/PushPaymentConfig.lua"] = "e19b744928653c40d1cb3ad743048802",
-["/Market.xlsx/royal_reward.lua"] = "7fd1e9e5872b7206c12a64e086c34e1c",
-["/MarketCN.xlsx/accumulate_ConstantCN.lua"] = "2949d27ef437d3e1caaaf49ce8368858",
-["/MarketCN.xlsx/accumulate_daily_rechargeCN.lua"] = "143a5b61f87e0bb3b841920a7ac46083",
-["/MarketCN.xlsx/accumulate_rechargeCN.lua"] = "7e99621e3428b2dafb1255f008caa80a",
-["/MarketCN.xlsx/gift_custompackCN.lua"] = "85f96ea5e1cb8e00a18962cc70375b5f",
-["/MarketCN.xlsx/gift_growthCN.lua"] = "2f14f018919181e7d81d00647aab0c5b",
-["/MarketCN.xlsx/gift_monthcard_recommendgiftCN.lua"] = "eb1e52f29417b617a40692bc1e3003b3",
-["/MarketCN.xlsx/gift_monthcardCN.lua"] = "874d6014c182e00207aa13e872483f63",
-["/MarketCN.xlsx/gift_subscribeCN.lua"] = "2cbe2b98427ea554b2e5ecab2e0a7bf7",
-["/MarketCN.xlsx/gift_summonCN.lua"] = "843582735effff13a2533e0d255e87f2",
-["/MarketCN.xlsx/hero_growthCN.lua"] = "9560c8256889bd3679ccbf49cfe1d49e",
-["/MarketCN.xlsx/market_clotheCN.lua"] = "576289868c0cea940a709e5b36ecd6ec",
-["/MarketCN.xlsx/market_gift_pkgCN.lua"] = "25950ef88388e1f0807117757ba0bc1b",
-["/MarketCN.xlsx/market_gift_total_conditionCN.lua"] = "5121b11958f96e5fc18ffde45d765e58",
-["/MarketCN.xlsx/market_gift_totalCN.lua"] = "08c4e44a35ef0080c92bc3a935a37627",
-["/MarketCN.xlsx/marketCN.lua"] = "0ac07acf8d2d0095f9b359cfed0c3a83",
-["/MarketCN.xlsx/progress_PlanCN.lua"] = "7de384f7edf09018709a86d14eb861cb",
-["/MarketCN.xlsx/progress_reward_moduleCN.lua"] = "2bc8459bbb97506cf6451e9f45ab3688",
-["/MarketCN.xlsx/progress_rewardCN.lua"] = "a5a10fa9465b8322a8f65e3d84678bdd",
-["/MarketCN.xlsx/push_gift_total_conditionCN.lua"] = "5c28e7a67503d3bf9d342b24526c63e9",
-["/maze.xlsx/FirstMaze_monster.lua"] = "66c06506ede1815ad2b6ca1818064404",
-["/maze.xlsx/FirstMaze_reward.lua"] = "0823a93de508d53984b93c538810af4c",
-["/maze.xlsx/herolevel_GS.lua"] = "b26312305451929db94556f0e7d8a50c",
-["/maze.xlsx/maze_battleGS.lua"] = "eb4852a9048a33167156dfa54333d269",
-["/maze.xlsx/maze_bossbox_drop.lua"] = "1db83e63089faea7ba05b8155eca127a",
-["/maze.xlsx/maze_carriage.lua"] = "890e3527c44c684349adbac602e81d4b",
-["/maze.xlsx/maze_carriagestage.lua"] = "11032b42736f8bd6a451202f50f88223",
-["/maze.xlsx/maze_doom.lua"] = "93f5e18cd3f0a1d015f395cf28457d04",
-["/maze.xlsx/maze_drop.lua"] = "b3d5743cc2a9227ca1d2e18a59feb90c",
-["/maze.xlsx/maze_events.lua"] = "9270ca0b9c09046e9f888613d1075259",
-["/maze.xlsx/maze_grid.lua"] = "d98cad9ca6715c06ed330b162472d39c",
-["/maze.xlsx/maze_map.lua"] = "24a8d15d9a00a0c7dd106675d721d3c9",
-["/maze.xlsx/maze_model.lua"] = "ea81ab94b3af40624f9cf48e13178ed2",
-["/maze.xlsx/maze_monster_bank.lua"] = "65834c94b2007d896214b60e816efdf4",
-["/maze.xlsx/maze_monster_drop.lua"] = "1b3865688c3b11b4df3e598f5a231b5c",
-["/maze.xlsx/maze_monster_group.lua"] = "1e274c1db16e5bd1d6de6665919003dd",
-["/maze.xlsx/maze_monster.lua"] = "da1efe8a773000712d729e4b10cb1a80",
-["/maze.xlsx/maze_monstergroupnew.lua"] = "994c576f11dada79985e1c771f6f9789",
-["/maze.xlsx/maze_monsternew.lua"] = "275f15ca5ab64239381aa2580df164c1",
-["/maze.xlsx/maze_randommonster.lua"] = "15897d14836d02135bc0922b651b15d4",
-["/maze.xlsx/maze_relics.lua"] = "a0d6001202259369773dc8a69afb7461",
-["/maze.xlsx/maze_shop.lua"] = "ce726eb403127ff93b4bb4ce38b1d368",
-["/MercenaryScore.xlsx/equipscore.lua"] = "c1b47fee5872064d8d8b83e78248a08e",
-["/MercenaryScore.xlsx/mercenary_equip.lua"] = "6758aafb25e00cb3dbf8e11a6699e8bf",
-["/MercenaryScore.xlsx/mercenary_quality.lua"] = "5227cba8ea438b5ee3d7cc661f9a156c",
-["/MercenaryScore.xlsx/mercenay_level.lua"] = "01861cb7f4f9c18c5ab23b2d24b21782",
-["/minigame_giantRush.xlsx/bossproperty.lua"] = "d08f8cfb67b5a0ef0dc83fa2228f39ff",
-["/minigame_giantRush.xlsx/gameConfig.lua"] = "34fdcb83cb259a3e3f2abad906b476a7",
-["/minigame_giantRush.xlsx/manproperty.lua"] = "d5e527d70d20dde8f8caf1886e615747",
-["/minigame_giantRush.xlsx/model.lua"] = "2e0d550b5d51350aaa75dd61fcbb7398",
-["/minigame_giantRush.xlsx/stage.lua"] = "7e70d1cd7b380b67be309c3363bff093",
-["/minigame_mafiaRule.xlsx/card.lua"] = "f1050eab614e26ab8c62cebbc2eea7e1",
-["/minigame_mafiaRule.xlsx/model.lua"] = "4e82e0540ae626675b8aec2c8cdd7801",
-["/minigame_mafiaRule.xlsx/stage.lua"] = "370e1c0a5c9b63be8772ad27a3a56ec2",
-["/minigame_monsterMerge.xlsx/camera.lua"] = "dd983eef46306e9ae4bb89855511e269",
-["/minigame_monsterMerge.xlsx/model.lua"] = "14b33e34971d511d5d19b497c04d28dd",
-["/minigame_monsterMerge.xlsx/monstercard.lua"] = "900a079163ca8cc92b2bb8f8dd3bdbf1",
-["/minigame_monsterMerge.xlsx/SpecialStage.lua"] = "92a73292e9df7be757f8fc3c62141b79",
-["/minigame_monsterMerge.xlsx/stage.lua"] = "0012ffa888067707e40a17a130230a4e",
-["/minigame_tinyFighter.xlsx/character.lua"] = "d3160067207418b5cdc0efecbb730e40",
-["/minigame_tinyFighter.xlsx/enemy.lua"] = "32d1dfbe3d56dd6cbc1f7ed895b2a242",
-["/minigame_tinyFighter.xlsx/model.lua"] = "a4520611c4baa5e7576fa6c4d7175de6",
-["/minigame_tinyFighter.xlsx/stage.lua"] = "574e7444e79dc93a5af4a494459a476d",
-["/miniGameStage.xlsx/boss.lua"] = "04e8fb1ebb1ec24434e35471bb8e73db",
-["/miniGameStage.xlsx/bossposition.lua"] = "0a7abfcb4350aeec10562becac4a5529",
-["/miniGameStage.xlsx/gameturn.lua"] = "424f4c2e4da423f2bc06983e0d75d266",
-["/miniGameStage.xlsx/gametype.lua"] = "ca58aab3623cca341eb7fd159d843f36",
-["/miniGameStage.xlsx/minigametype.lua"] = "5047b450e96254c41d2d5935c93b090b",
-["/miniGameStage.xlsx/object.lua"] = "bcc73cfd46c478e76460f8e0c9a57b30",
-["/miniGameStage.xlsx/SpecialStage.lua"] = "c07e952e3e36b26f5326444febeacc97",
-["/miniGameStage.xlsx/stage.lua"] = "770bf2d939d8a204be858d1b8a7285d1",
-["/miniGameStage.xlsx/usertype.lua"] = "a2038a920d8a94bb53511ca438c229d5",
-["/Model.xlsx/model.lua"] = "b197cf1fb48fb5e58cd594b798ab45b1",
-["/ModelScale.xlsx/modelPosition.lua"] = "11a656bdf5b97d9b399fcb0b3e263dee",
-["/ModelScale.xlsx/modelscale.lua"] = "a2bd4fe55a37682810499b6c43b570bc",
-["/ModelScale.xlsx/picInfo.lua"] = "d3bd026a666a985054ec2d3fed766ce4",
-["/ModelScale.xlsx/storyInfo.lua"] = "f4ef749f5d7d458c753d47755264b2fc",
-["/moduleEntrance.xlsx/moduleEntrance.lua"] = "c96b3943c3b09d5c2422a71f02049339",
-["/moduleEntrance.xlsx/moduleOpen.lua"] = "ba740f667698adb32963e2bbb72eab78",
-["/NotAlert.xlsx/notAlert.lua"] = "1d76617a945a380888f0d7c79392932e",
-["/NoviceGuide.xlsx/FailGuideTimes.lua"] = "5d24a8b465de2e44d812d8757f596ce7",
-["/NoviceGuide.xlsx/GuideCondition.lua"] = "9192bdfbe3432249c6cb03504b9be053",
-["/NoviceGuide.xlsx/GuideConditionHero.lua"] = "22bf7c8f8b95bba5d1d26cddce2a66aa",
-["/NoviceGuide.xlsx/GuideTower.lua"] = "cc1eb5b17432c0e8c73385a3363730c0",
-["/NoviceGuide.xlsx/NoviceGuide.lua"] = "b8742df1d5268e199884b942451366ba",
-["/Npc.xlsx/npc.lua"] = "7a46b20ad948bdbfb4e4382d26111f35",
-["/NpcAttr.xlsx/npcAttributes.lua"] = "a0b45e556f6ec8b341fa608034cf94be",
-["/Npcinstance.xlsx/Npcinstance.lua"] = "1646c2a19da6b0f4924838cde8d513ba",
-["/Npcinstance.xlsx/Npcinstance配置.lua"] = "98fd51af33d13f8049529a1c67cddb54",
-["/Npcinstance.xlsx/Sheet1.lua"] = "3a87370f8ddb2148f93cdbeb3ed09080",
-["/Npcinstance.xlsx/Sheet2.lua"] = "587e02113e85e55a6fd1faa4eb9a0a65",
-["/openTime.xlsx/openTime.lua"] = "62f94a2b25f729d62e6f471b52dfb80f",
-["/other.xlsx/laiwan_account.lua"] = "ab08513b59513a7f99f2e8e6029319bf",
-["/pinnaclearenarankconfig.xlsx/pinnaballtewin.lua"] = "8589fabcace43233bdcd374422578161",
-["/pinnaclearenarankconfig.xlsx/pinnacleGloryRoadReward.lua"] = "252bc9b3774e95e1e54b7ffc858cc7e0",
-["/pinnaclearenarankconfig.xlsx/pinnacleRankReward.lua"] = "eb03f61b54c86e31ec3b32472206b871",
-["/pinnaclearenarankconfig.xlsx/pinnacleTurn.lua"] = "66d4511df93ac2a747de648cadd32182",
-["/pinnaclearenarankconfig.xlsx/pinnacleWarriorTreasure.lua"] = "7954d7f0d3fc959c1a6ff2a5299b5e97",
-["/Planetarium .xlsx/Planet_Info.lua"] = "c50f33c06e10667727b7f358be49491d",
-["/Planetarium .xlsx/Star_Info.lua"] = "1e7b8e4a2f3be35ef38d2aa4e505f926",
-["/PlayerInfo.xlsx/ViewInit.lua"] = "a450bb49b2aff8055003fd134b81d724",
-["/PlayerLevel.xlsx/PlayerLevelTable.lua"] = "bc9f712eb3ec5a1015a349eb04a6965a",
-["/PlayerQuestionnaire.xlsx/PlayerQuestionnaireConstant.lua"] = "bb5da6864755419457335209e5f41226",
-["/PlayerQuestionnaire.xlsx/PlayerQuestionnaireDetail.lua"] = "be3a8e6a48843d39d35f4e94c42c41e2",
-["/PlayerQuestionnaire.xlsx/PlayerQuestionnaireInfo.lua"] = "1cdd1287450fd154f48cd64c7d85d524",
-["/plotDialog.xlsx/mainStory.lua"] = "549ad6e3683d642d607ac85cada20a4a",
-["/plotDialog.xlsx/plotDialog.lua"] = "986b961c67b71ce38536eb36330866ed",
-["/PopupCondition.xlsx/popup_condition.lua"] = "0afce2b37e2a14d72b7e7ba767061080",
-["/PopupPriority.xlsx/PopupGroup_Sundry.lua"] = "245e17d94d3345431c071e7e24429173",
-["/PopupPriority.xlsx/PopupPriority_Group.lua"] = "9e4624b4e467138512a77c40a4cf91ec",
-["/property.xlsx/property.lua"] = "1e9e7d8406d3731a37667d375d1082b1",
-["/RaceAction.xlsx/chapter.lua"] = "103afbaa19ee739b28f8f1ec290cc35e",
-["/RaceAction.xlsx/raceaction.lua"] = "c3209aabe495a3ffa2bfc54d0e57d372",
-["/RandomName.xlsx/竞技场名字.lua"] = "18a81eeff0c88f25ee4e639203bc1560",
-["/RandomName.xlsx/DATA.lua"] = "d3337de04a6ad0a6f5e7e29475ca7326",
-["/RandomName.xlsx/jjcname.lua"] = "ba1ad53b033ddb84823ecd61ee73ce00",
-["/RandomName.xlsx/randomname.lua"] = "f2db17621db6e6f6f78bc51e5ec31e02",
-["/rank.xlsx/hero_score.lua"] = "ac9698d35fc85eb236541eee3cdd26b5",
-["/rank.xlsx/rank_reward.lua"] = "66c7cf93f2e44bd1ba7319490c074451",
-["/rank.xlsx/ranklist.lua"] = "6e7224ccd29cdc0589dad6668338ddb2",
-["/recommendation.xlsx/recommendation.lua"] = "0998fe134a73ecbbadb2a2cf6931e5af",
-["/RecommendGift.xlsx/RecommendGift.lua"] = "af6d15e42c8f7ad6545da200188b248d",
-["/Relic.xlsx/relic.lua"] = "40115325017785063fd7c878f9083a10",
-["/Relic.xlsx/relicpackage.lua"] = "3dc9545f0c7eb6028dfc67fad7bc75c4",
-["/require.xlsx/require.lua"] = "430cb48a01ad7cc32d1e94d6f2138eed",
-["/Res.xlsx/Res.lua"] = "1eabf510cafe58180fdd87a8c11a3bb9",
-["/RewardTrial.xlsx/battle.lua"] = "d30ef70e3879330c71e24cf61e687922",
-["/RewardTrial.xlsx/config.lua"] = "05f19359e7c7efdea7c5d808d40728d6",
-["/RewardTrial.xlsx/heroconfig.lua"] = "d1e84023c6c025e571a56d8d31a219e8",
-["/RewardTrial.xlsx/heroteam.lua"] = "1258c4a6b1d4d370acb5687f1e48f8fe",
-["/RewardTrial.xlsx/task.lua"] = "53bcf38987b446b569b8f958f835f7a5",
-["/RobotStageRanking.xlsx/RankRewards.lua"] = "7094c7a20c2406e50547c8fbcf538c6d",
-["/RobotStageRanking.xlsx/RobotActivityConstant.lua"] = "aeb4a13c4a402dd74a70cb179314c190",
-["/RobotStageRanking.xlsx/RobotInitialStage.lua"] = "3ea01cb110061b7e694acfbd3700a065",
-["/RobotStageRanking.xlsx/RobotName.lua"] = "271b442fff94bb34963c95863938638b",
-["/RobotStageRanking.xlsx/RobotStageChange.lua"] = "2e3b24d2b7fe8c76f851fb40ee04c93b",
-["/rogueModel.xlsx/RogueEventConfig.lua"] = "1822301f6223312c91275d580c3a606a",
-["/rogueModel.xlsx/RoguePlaneConfig.lua"] = "215da5002f1ba9b1af6eeb6be97d5bcd",
-["/rouge.xlsx/battle.lua"] = "0c14a3e64f3330fbb60f57dc42e02a7b",
-["/rouge.xlsx/reward.lua"] = "aa0bcd7cb23b8b146252e2f143abefc1",
-["/rouge.xlsx/tips.lua"] = "627a7dbdeb4aee1c6ef74509f77748db",
-["/shop.xlsx/配置说明.lua"] = "51dfd67960b9626e1f956de0bac66e75",
-["/shop.xlsx/goods_list.lua"] = "ce43cb9fda3e08b6be14f836b978eb1c",
-["/shop.xlsx/maze_goods.lua"] = "0b1be00ca696c3e6871c5f83265cef71",
-["/shop.xlsx/shop_info.lua"] = "b47750169a7722b98b442a9da07ba4df",
-["/shop.xlsx/shop_oprtips.lua"] = "f60b41ca1895f9e2bad047fe6ebfa8d1",
-["/shop.xlsx/slot_list.lua"] = "3b6364ecab26d7813fbce445d8d973fa",
-["/skillTmp.xlsx/skilltmp.lua"] = "83c98e7fdfb000cb13700fd12cd7837f",
-["/Stage.xlsx/Sheet1.lua"] = "8957178807b56902d5ec0b8a883b6d34",
-["/Stage.xlsx/Sheet2.lua"] = "6d8c7a55d60eaa741d5eda87a8846d05",
-["/Stage.xlsx/Sheet3.lua"] = "541f02bec5c72f39508d482dd0198228",
-["/Stage.xlsx/stage_bossmodelshow.lua"] = "21104bde2a2e9d0cc295e4c1487544de",
-["/Stage.xlsx/stage_bossshow.lua"] = "a197b3edf521d1bad89bbd24f761c474",
-["/Stage.xlsx/stage.lua"] = "e9dbe750349597e4de2bd6e87f4c24f7",
-["/StageDifficultyDecreases.xlsx/StageDynamicDifficulty.lua"] = "df9b0e59ee341b6f2366f1d65fde7462",
-["/StageDifficultyDecreases.xlsx/StageDynamicDifficultyConfig.lua"] = "144768cdc49f55572ac99d4a639e48d1",
-["/StageDynamicDifficulty.xlsx/PayDynamicDifficulty.lua"] = "c454af8266593f3797f2fd88e25df56c",
-["/StageDynamicDifficulty.xlsx/StageDynamicDifficulty.lua"] = "5ba7070e819501e85b8c8092d1b78f05",
-["/StageRewardChest.xlsx/G关卡章节奖励表#StageRewardChest配置规范.lua"] = "d90ac78d1c00592466d4ba797ad17f70",
-["/StageRewardChest.xlsx/StageRewardChest.lua"] = "79d1e9d7ea2f71822fc5ae1c765d94a1",
-["/subscribe.xlsx/desc.lua"] = "45c145da37208cb52c971172b2935f0e",
-["/subscribe.xlsx/privilege.lua"] = "7c6fa771e01669be834b97e09c68f7ba",
-["/summon_task.xlsx/summon_task.lua"] = "4f95e144d6c4beae6f1e1fe7eb93f0b6",
-["/summon.xlsx/doublePurpleCounter.lua"] = "5195733c3012a47b523e6c614fbed5c4",
-["/summon.xlsx/npcConfig.lua"] = "86037bc4cb95348b16995a7f635ee127",
-["/summon.xlsx/npcDialogueConfig.lua"] = "2c4d7be5bce26317f40027779d9f4369",
-["/summon.xlsx/RaceExchangeShop.lua"] = "2cbd6f4ded1cc6189d395e6a26449758",
-["/summon.xlsx/RaceOptionalCard.lua"] = "96930bea85052a49e499bee1f0241977",
-["/summon.xlsx/RaceTavernRecommendGift.lua"] = "dfb50abb9b01d8019287d13d3f452031",
-["/summon.xlsx/summonBonus.lua"] = "4fa89427cf3a0f138005378e73825e96",
-["/summon.xlsx/summonProgressReward.lua"] = "877052e13ab6cb531554e78fc328b4fc",
-["/summon.xlsx/TavernRecommendGift.lua"] = "3f24d9665af4b542ff025a0774181acc",
-["/summon.xlsx/tipsShow.lua"] = "c4049d0e141ab2f1bf2d7d295e0529a6",
-["/summon.xlsx/WishListHero.lua"] = "74b2a46f0a3508f28daea12c01b86729",
-["/summon.xlsx/WishListRecommend.lua"] = "7d90337817a8a5827a2ff1b38376d87d",
-["/summon.xlsx/WishPointHero.lua"] = "bd857cb900e6778be7c284a40e956648",
-["/summon.xlsx/WishValueExchangeTime.lua"] = "52def71e5575fb5088e57c90533355c5",
-["/T弹出条件表PopupCondition.xlsx/popup_condition.lua"] = "0c0b6504f9a8458351ae969c01c9bd97",
-["/T通用免费奖励表general_free_reward.xlsx/GeneralFreeReward.lua"] = "105428546eddaf0acdeae557d2d8e9a4",
-["/task_boxData.xlsx/boxData_dropgroup.lua"] = "5c166973617cda055415c7252a39d20e",
-["/task_boxData.xlsx/boxData_dropteam.lua"] = "9a9eb254aa14a099a68732296988717d",
-["/task_boxData.xlsx/task_boxData.lua"] = "e97967736537b1d2b14128788287b54c",
-["/task_mainData.xlsx/maintask_dropteam.lua"] = "5a4522aa50ead48861051253cb6c2b48",
-["/task_mainData.xlsx/miantask_dropgroup.lua"] = "b3fff68003d06a182592ca5756022b21",
-["/task_mainData.xlsx/task_mainData.lua"] = "8b40028edb9e86f0b40a37f892a26293",
-["/Task.xlsx/StageChallenge.lua"] = "14595b77a8c09945e3bfb183d5277abd",
-["/Task.xlsx/taskgroup.lua"] = "d3a6089c19309cb9aa60b448ff25cf6d",
-["/Task.xlsx/tasklist.lua"] = "d1812a500fc6ccdc31d06a657bfc1261",
-["/Task.xlsx/taskstage.lua"] = "8069c0be989b69de0845efd4e7f30171",
-["/test/test.xlsx/test_sheet.lua"] = "2541cc00ea8dc24dc12c50b44feecd0d",
-["/test/testconfig.xlsx/testConfig.lua"] = "0b424f3763593f89093a40badb2b3fd5",
-["/TheElderTree.xlsx/TheElderTree_Droplets.lua"] = "a0dcb34177a60d62b7ed7ae2507633d7",
-["/TheElderTree.xlsx/TheElderTree.lua"] = "65bc5fda5804f78cb2374565a6250181",
-["/thirty_days_reward.xlsx/ShowHero.lua"] = "99a65b7221b6235d03974462874a06d3",
-["/thirty_days_reward.xlsx/ThirtyDaysReward.lua"] = "0b3ecbb5eb2e84d6a8f171497cc4908b",
-["/timer_cmd.xlsx/cmd.lua"] = "3d5e9bbf359473657b034b86a6635525",
-["/tower.xlsx/Sheet2.lua"] = "257e0711fbdbb41daf7c4e13739bfd6e",
-["/tower.xlsx/towerbatch.lua"] = "0d7424df57d97cd87991df4e36a471b2",
-["/tower.xlsx/towerclient.lua"] = "416d899f6c654fbcf839c4b9ca411751",
-["/tower.xlsx/towerconfig.lua"] = "ef86fc28dc43ec2cf449698e75008d35",
-["/tower.xlsx/towersweep.lua"] = "85a17def3c120cc7338dc08cc988c389",
-["/tower.xlsx/TowerSweepRewards.lua"] = "babdf3469618fc97cd22fe31080d3b9f",
-["/trench_maze.xlsx/配置说明.lua"] = "8f5ac66a3a2f9484353a53662c5fecc9",
-["/trench_maze.xlsx/normal_reward.lua"] = "d7a6a5ff815cd6e7c8e799415ca5ffe9",
-["/trench_maze.xlsx/target_reward.lua"] = "72194f05b4e28ccbe0c545b73b5a3c60",
-["/Trialground.xlsx/Trialground.lua"] = "f8a27d5f557479340548216c3fdbaa34",
-["/TTTConfig.xlsx/TTTconfig.lua"] = "e6508f97c49b849eb8b870cbb934f268",
-["/UserNameDefaultConfig.xlsx/LanguageConfig.lua"] = "ef70b990729995aa607a18cf779e351f",
-["/UserNameDefaultConfig.xlsx/UserheadIconChange.lua"] = "451707b33f2ad75d9c8cf6c1725b2fa6",
-["/UserNameDefaultConfig.xlsx/UserNameDefaultName.lua"] = "1423ed2cb75f1f8b20257f7414fb266b",
-["/VipPrivilege.xlsx/vipLevel.lua"] = "534f13920f66ed336f29991a692ad3c1",
-["/VipPrivilege.xlsx/vipPrivileges.lua"] = "dd59cf7c5d936737e8b8ab8855ed1d0d",
-["/VoidGuest.xlsx/VoidGuest_Base.lua"] = "b7dc71a03271058aaf73002afc3cfe45",
-["/VoidGuest.xlsx/VoidGuest_Exchange.lua"] = "b7c4ec8d64ae6eb91359f4a6ad2bc5b3",
-["/warriortreasures.xlsx/warriortreasures.lua"] = "85d9e68b30b671d1d49fb6e635d769dc",
-["/warriortreasures.xlsx/warriortreasuresconfig.lua"] = "a9f89c329184c9330d922c7ab93721dc",
-["/wish_star.xlsx/AstrologyDropConfig.lua"] = "a196982752e272ed9d9f145902f31a29",
-["/wish_star.xlsx/wishStarDropConfig.lua"] = "e12b78f1d442f644b6b055669cf83531",
-["/wish_star.xlsx/WishStarRewardShowConfig.lua"] = "29f51f9fd926c6af6fbbc74db4656e4e",
-["/WishActivity.xlsx/配置说明.lua"] = "8386b36f53638c3077d30fb23b04f306",
-["/WishActivity.xlsx/BossChallengeRankReward.lua"] = "e50b39b920fbb0ffc785b2a039ad69ec",
-["/WishActivity.xlsx/HeroGift.lua"] = "e4405d289efef9695318b9b9944dcbaf",
-["/WishActivity.xlsx/WeekCard.lua"] = "5d6fe5ba343c51268cd322860d6b7be9",
-["/WishActivity.xlsx/WishSummonDropConfig.lua"] = "66a95d466cf504b563e4f1257b761642",
-["/WishActivity.xlsx/WishSummonDropShowConfig.lua"] = "29887929f7c08ae7c22c57f6b81f2fb4",
-["/WishActivity.xlsx/WishSummonGameConfig.lua"] = "85d00e3f15fd1fd8ba0435b9fc38c19d",
-["/WishActivity.xlsx/WishSummonHeroList.lua"] = "32ca308af583473c47a2bc0f7a9ecb73",
-["/WishActivity.xlsx/WishSummonRewardShowConfig.lua"] = "62222bd55312682c3f422fd0878d7ccb",
-["/worldmap.xlsx/worldmap.lua"] = "3c4aca2aa1962ddf780dfbbc1e781d43",
-["/Y英雄说话表herowords.xlsx/words.lua"] = "58c8c2b9ac4ed8613677a8e7db803e26",
 }

+ 6 - 6
server/src/data/ClientScript/Data/activity_time.xlsx/activity_time.lua

@@ -53,12 +53,12 @@ return {
 [48] = {48,10,2,0,0,"",0,0,"2025/06/27 04:00",1209600,0,"activity_time_48.Name",0,"activityBossChallenge",10,{key={"fstageclear","",},minval={10601,0,},maxval={-1,0,},},"activity_time_48.activity_desc","","YYHD_banner_01",},
 [49] = {49,10,2,0,0,"",0,0,"2026/06/27 04:00",1209600,0,"activity_time_49.Name",0,"activityBossChallenge",10,{key={"fstageclear","",},minval={10601,0,},maxval={-1,0,},},"activity_time_49.activity_desc","","YYHD_banner_01",},
 [50] = {50,10,2,0,0,"",0,0,"2027/06/27 04:00",1209600,0,"activity_time_50.Name",0,"activityBossChallenge",10,{key={"fstageclear","",},minval={10601,0,},maxval={-1,0,},},"activity_time_50.activity_desc","","YYHD_banner_01",},
-[51] = {51,11,-1,0,0,"",0,0,"2023/06/27 04:00",1209600,0,"activity_time_51.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_51.activity_desc","","",},
-[52] = {52,11,-1,0,0,"",0,0,"2024/06/27 04:00",1209600,0,"activity_time_52.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_52.activity_desc","","",},
-[53] = {53,11,-1,0,0,"",0,0,"2025/06/27 04:00",1209600,0,"activity_time_53.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_53.activity_desc","","",},
-[54] = {54,11,-1,0,0,"",0,0,"2026/06/27 04:00",1209600,0,"activity_time_54.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_54.activity_desc","","",},
-[55] = {55,11,-1,0,0,"",0,0,"2027/06/27 04:00",1209600,0,"activity_time_55.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_55.activity_desc","","",},
-[56] = {56,11,-1,0,0,"",0,0,"2028/06/27 04:00",1209600,0,"activity_time_56.Name",2,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_56.activity_desc","","",},
+[51] = {51,11,-1,0,0,"",0,0,"2023/06/27 04:00",1209600,0,"activity_time_51.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_51.activity_desc","","",},
+[52] = {52,11,-1,0,0,"",0,0,"2024/06/27 04:00",1209600,0,"activity_time_52.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_52.activity_desc","","",},
+[53] = {53,11,-1,0,0,"",0,0,"2025/06/27 04:00",1209600,0,"activity_time_53.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_53.activity_desc","","",},
+[54] = {54,11,-1,0,0,"",0,0,"2026/06/27 04:00",1209600,0,"activity_time_54.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_54.activity_desc","","",},
+[55] = {55,11,-1,0,0,"",0,0,"2027/06/27 04:00",1209600,0,"activity_time_55.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_55.activity_desc","","",},
+[56] = {56,11,-1,0,0,"",0,0,"2028/06/27 04:00",1209600,0,"activity_time_56.Name",1,"activitySignIn",11,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_56.activity_desc","","",},
 [57] = {57,15,3,0,0,"",0,0,"2022/07/14 04:00",1209600,0,"activity_time_57.Name",1001,"heroMapShow",12,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_57.activity_desc","","",},
 [58] = {58,15,3,0,0,"",0,0,"2023/07/14 04:00",1209600,0,"activity_time_58.Name",1001,"heroMapShow",12,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_58.activity_desc","","",},
 [59] = {59,15,3,0,0,"",0,0,"2024/07/14 04:00",1209600,0,"activity_time_59.Name",1001,"heroMapShow",12,{key={"fstageclear","",},minval={10204,0,},maxval={-1,0,},},"activity_time_59.activity_desc","","",},

+ 2 - 0
server/src/data/ClientScript/Data/item.xlsx/item.lua

@@ -415,6 +415,8 @@ return {
 [300027] = {300027,"item_300027.ItemName","item_300027.ItemDesc","item_300027.DescValue1","item_300027.DescValue2","item_300027.DescValue3","item_300027.ItemTips","item_300027.ItemTypeName",3,0,0,1,0,0,0,{},0,2020381,9900,7,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",9999,-1,-1,{0,0,0,},0,0,0,"",0,0,"心愿召唤券","代币","1",},
 [300028] = {300028,"item_300028.ItemName","item_300028.ItemDesc","item_300028.DescValue1","item_300028.DescValue2","item_300028.DescValue3","item_300028.ItemTips","item_300028.ItemTypeName",2,0,0,1,0,0,0,{},0,2020408,8300,7,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",99999,100,-1,{0,0,0,},0,0,0,"",0,0,"1元异常补偿","消耗品","1",},
 [300029] = {300029,"item_300029.ItemName","item_300029.ItemDesc","item_300029.DescValue1","item_300029.DescValue2","item_300029.DescValue3","item_300029.ItemTips","item_300029.ItemTypeName",2,0,0,1,0,0,0,{},0,2020452,8300,5,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",9999,-1,-1,{0,0,0,},0,0,0,"",0,0,"扫荡券","消耗品","1",},
+[300030] = {300030,"item_300030.ItemName","item_300030.ItemDesc","item_300030.DescValue1","item_300030.DescValue2","item_300030.DescValue3","item_300030.ItemTips","item_300030.ItemTypeName",2,0,0,1,0,0,0,{},0,2020408,8300,7,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",9999999,-1,-1,{0,0,0,},0,0,0,"",0,0,"代币","消耗品","1",},
+[300031] = {300031,"item_300031.ItemName","item_300031.ItemDesc","item_300031.DescValue1","item_300031.DescValue2","item_300031.DescValue3","item_300031.ItemTips","item_300031.ItemTypeName",2,0,0,1,0,0,0,{},0,2020408,8300,7,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",9999999,100000,-1,{0,0,0,},0,0,0,"",0,0,"绑定代币","消耗品","1",},
 [401001] = {401001,"item_401001.ItemName","item_401001.ItemDesc","item_401001.DescValue1","item_401001.DescValue2","item_401001.DescValue3","item_401001.ItemTips","item_401001.ItemTypeName",2,0,0,1,0,0,0,{},0,2020380,8300,5,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",99999,-1,-1,{0,0,0,},0,0,0,"",35000,0,"能量晶石","消耗品","1",},
 [401002] = {401002,"item_401002.ItemName","item_401002.ItemDesc","item_401002.DescValue1","item_401002.DescValue2","item_401002.DescValue3","item_401002.ItemTips","item_401002.ItemTypeName",2,0,0,1,0,0,0,{},0,2020300,8300,5,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",999,-1,-1,{0,0,0,},0,0,0,"2022-5-06 00:00:00",50000,0,"限时道具(T)","消耗品","1",},
 [402001] = {402001,"item_402001.ItemName","item_402001.ItemDesc","item_402001.DescValue1","item_402001.DescValue2","item_402001.DescValue3","item_402001.ItemTips","item_402001.ItemTypeName",2,0,0,1,0,0,0,{},0,1030403,8300,5,{key={"","",},minval={0,0,},text={"","",},},0,0,0,"",99999,-1,-1,{0,0,0,},0,0,0,"2022-5-06 00:00:00",50000,0,"筛盅","消耗品","1",},

+ 52 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NEWSERVER_MarketGift.lua

@@ -0,0 +1,52 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Data.NEWSERVER_MarketGift
+
+
+local _M = {MessageID = 0x00042D74,Name = 'OpenCards.Core.Data.NEWSERVER_MarketGift'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00042D74] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Data.NEWSERVER_MarketGift'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.ID)
+	output:PutS32(data.GiftGroup)
+	output:PutS32(data.GiftPos)
+	output:PutS32(data.OriginalPrice)
+	output:PutS32(data.No)
+	output:PutS32(data.PurchaseCount)
+	output:PutS32(data.Deal)
+	output:PutUTF(data.GiftName)
+	output:PutUTF(data.GiftDes)
+	output:PutS32(data.GiftPrice)
+	output:PutList(data.RewardIdList, output.PutS32,'int')
+	output:PutList(data.RewardNumList, output.PutS32,'int')
+	output:PutUTF(data.Discount)
+end
+
+
+function _M.Read(input,data)
+		
+	data.ID = input:GetS32()
+	data.GiftGroup = input:GetS32()
+	data.GiftPos = input:GetS32()
+	data.OriginalPrice = input:GetS32()
+	data.No = input:GetS32()
+	data.PurchaseCount = input:GetS32()
+	data.Deal = input:GetS32()
+	data.GiftName = input:GetUTF()
+	data.GiftDes = input:GetUTF()
+	data.GiftPrice = input:GetS32()
+	data.RewardIdList = input:GetList(input.GetS32,'int')
+	data.RewardNumList = input:GetList(input.GetS32,'int')
+	data.Discount = input:GetUTF()
+end
+
+

+ 30 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityChallengeRankData.lua

@@ -0,0 +1,30 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Data.NewServerActivityChallengeRankData
+
+
+local _M = {MessageID = 0x313ED15D,Name = 'OpenCards.Core.Data.NewServerActivityChallengeRankData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x313ED15D] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Data.NewServerActivityChallengeRankData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutUTF(data.RoleUuid)
+	output:PutF64(data.DamageValue)
+end
+
+
+function _M.Read(input,data)
+		
+	data.RoleUuid = input:GetUTF()
+	data.DamageValue = input:GetF64()
+end
+
+

+ 40 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityChallengeRankItem.lua

@@ -0,0 +1,40 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Data.NewServerActivityChallengeRankItem
+
+
+local _M = {MessageID = 0x00040602,Name = 'OpenCards.Core.Data.NewServerActivityChallengeRankItem'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00040602] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Data.NewServerActivityChallengeRankItem'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutUTF(data.RoleUUID)
+	output:PutUTF(data.ServerID)
+	output:PutS32(data.Rank)
+	output:PutUTF(data.Icon)
+	output:PutUTF(data.IconBox)
+	output:PutUTF(data.Name)
+	output:PutS32(data.Level)
+end
+
+
+function _M.Read(input,data)
+		
+	data.RoleUUID = input:GetUTF()
+	data.ServerID = input:GetUTF()
+	data.Rank = input:GetS32()
+	data.Icon = input:GetUTF()
+	data.IconBox = input:GetUTF()
+	data.Name = input:GetUTF()
+	data.Level = input:GetS32()
+end
+
+

+ 38 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Data.NewServerActivityData.lua

@@ -0,0 +1,38 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Data.NewServerActivityData
+
+
+local _M = {MessageID = 0x00040601,Name = 'OpenCards.Core.Data.NewServerActivityData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00040601] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Data.NewServerActivityData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.ActivityId)
+	output:PutS32(data.ActivityGroupId)
+	output:PutBool(data.OpenState)
+	output:PutS64(data.EndTime)
+	output:PutS32(data.loginDay)
+	output:PutList(data.buyGifts, output.PutS32,'int')
+end
+
+
+function _M.Read(input,data)
+		
+	data.ActivityId = input:GetS32()
+	data.ActivityGroupId = input:GetS32()
+	data.OpenState = input:GetBool()
+	data.EndTime = input:GetS64()
+	data.loginDay = input:GetS32()
+	data.buyGifts = input:GetList(input.GetS32,'int')
+end
+
+

+ 38 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityBaseData.lua

@@ -0,0 +1,38 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivityBaseData
+
+
+local _M = {MessageID = 0x61E3F6EF,Name = 'OpenCards.Core.ORM.NewServerActivityBaseData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x61E3F6EF] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivityBaseData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.ActivityUniqueId)
+	output:PutS64(data.ActivityStartTimeStamp)
+	output:PutS64(data.ActivityEndTimeStamp)
+	output:PutS32(data.ActivityType)
+	output:PutBool(data.ActivityOpenState)
+	output:PutS32(data.ActivityGroupId)
+end
+
+
+function _M.Read(input,data)
+		
+	data.ActivityUniqueId = input:GetS32()
+	data.ActivityStartTimeStamp = input:GetS64()
+	data.ActivityEndTimeStamp = input:GetS64()
+	data.ActivityType = input:GetS32()
+	data.ActivityOpenState = input:GetBool()
+	data.ActivityGroupId = input:GetS32()
+end
+
+

+ 30 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityBossChallengeData.lua

@@ -0,0 +1,30 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivityBossChallengeData
+
+
+local _M = {MessageID = 0x10418100,Name = 'OpenCards.Core.ORM.NewServerActivityBossChallengeData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x10418100] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivityBossChallengeData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.FightTimes)
+	output:PutF64(data.MaxDamage)
+end
+
+
+function _M.Read(input,data)
+		
+	data.FightTimes = input:GetS32()
+	data.MaxDamage = input:GetF64()
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityData.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivityData
+
+
+local _M = {MessageID = 0x47C3D942,Name = 'OpenCards.Core.ORM.NewServerActivityData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x47C3D942] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivityData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutMap(data.ActivityMap, output.PutS32, output.PutOBJ,'int', 'OpenCards.Core.ORM.NewServerActivityInfo')
+end
+
+
+function _M.Read(input,data)
+		
+	data.ActivityMap = input:GetMap(input.GetS32, input.GetOBJ,'int', 'OpenCards.Core.ORM.NewServerActivityInfo')
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityHeroGiftData.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivityHeroGiftData
+
+
+local _M = {MessageID = 0x0772C000,Name = 'OpenCards.Core.ORM.NewServerActivityHeroGiftData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x0772C000] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivityHeroGiftData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.LockHeroId)
+end
+
+
+function _M.Read(input,data)
+		
+	data.LockHeroId = input:GetS32()
+end
+
+

+ 34 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivityInfo.lua

@@ -0,0 +1,34 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivityInfo
+
+
+local _M = {MessageID = 0x4872BDA2,Name = 'OpenCards.Core.ORM.NewServerActivityInfo'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x4872BDA2] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivityInfo'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutOBJ(data.BaseData,'OpenCards.Core.ORM.NewServerActivityBaseData')
+	output:PutOBJ(data.SummonData,'OpenCards.Core.ORM.NewServerActivitySummonData')
+	output:PutOBJ(data.BossChallengeData,'OpenCards.Core.ORM.NewServerActivityBossChallengeData')
+	output:PutOBJ(data.HeroGiftData,'OpenCards.Core.ORM.NewServerActivityHeroGiftData')
+end
+
+
+function _M.Read(input,data)
+		
+	data.BaseData = input:GetOBJ('OpenCards.Core.ORM.NewServerActivityBaseData')
+	data.SummonData = input:GetOBJ('OpenCards.Core.ORM.NewServerActivitySummonData')
+	data.BossChallengeData = input:GetOBJ('OpenCards.Core.ORM.NewServerActivityBossChallengeData')
+	data.HeroGiftData = input:GetOBJ('OpenCards.Core.ORM.NewServerActivityHeroGiftData')
+end
+
+

+ 40 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.ORM.NewServerActivitySummonData.lua

@@ -0,0 +1,40 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.ORM.NewServerActivitySummonData
+
+
+local _M = {MessageID = 0x176D5F2F,Name = 'OpenCards.Core.ORM.NewServerActivitySummonData'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x176D5F2F] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.ORM.NewServerActivitySummonData'] = _M
+
+function _M.Write(output,data)
+		
+	output:PutS32(data.SelectHeroInstanceId)
+	output:PutS32(data.HeroCounter)
+	output:PutS32(data.DailyCount)
+	output:PutS32(data.TotalCount)
+	output:PutS64(data.Timestamp)
+	output:PutMap(data.DropedInfo, output.PutS32, function(_,v1) output:PutMap(v1, output.PutS32, output.PutS32,'int', 'int') end,'int', 'DeepCore.HashMap<int, int>')
+	output:PutMap(data.TaskDigRecordMap, output.PutS32, output.PutBool,'int', 'bool')
+end
+
+
+function _M.Read(input,data)
+		
+	data.SelectHeroInstanceId = input:GetS32()
+	data.HeroCounter = input:GetS32()
+	data.DailyCount = input:GetS32()
+	data.TotalCount = input:GetS32()
+	data.Timestamp = input:GetS64()
+	data.DropedInfo = input:GetMap(input.GetS32, function(_) return input:GetMap(input.GetS32, input.GetS32,'int', 'int') end,'int', 'DeepCore.HashMap<int, int>')
+	data.TaskDigRecordMap = input:GetMap(input.GetS32, input.GetBool,'int', 'bool')
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest
+
+
+local _M = {MessageID = 0x000567D0,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x000567D0] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Write(output, data)
+	output:PutS32(data.c2s_ActivityUniqueId)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Read(input, data)
+	data.c2s_ActivityUniqueId = input:GetS32()
+end
+
+

+ 36 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse.lua

@@ -0,0 +1,36 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse
+
+
+local _M = {MessageID = 0x000567D1,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x000567D1] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Write(output, data)
+	output:PutS64(data.s2c_ActivityEndTimeStamp)
+	output:PutS32(data.s2c_Rank)
+	output:PutF64(data.s2c_DamageValue)
+	output:PutArray(data.s2c_RankList, output.PutUTF,'string')
+	output:PutS32(data.s2c_BossId)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Read(input, data)
+	data.s2c_ActivityEndTimeStamp = input:GetS64()
+	data.s2c_Rank = input:GetS32()
+	data.s2c_DamageValue = input:GetF64()
+	data.s2c_RankList = input:GetArray(input.GetUTF,'string')
+	data.s2c_BossId = input:GetS32()
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest
+
+
+local _M = {MessageID = 0x00056BBA,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00056BBA] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Write(output, data)
+	output:PutS32(data.c2s_ActivityUniqueId)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Read(input, data)
+	data.c2s_ActivityUniqueId = input:GetS32()
+end
+
+

+ 32 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse.lua

@@ -0,0 +1,32 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse
+
+
+local _M = {MessageID = 0x00056BBB,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00056BBB] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Write(output, data)
+	output:PutS32(data.s2c_Rank)
+	output:PutF64(data.s2c_DamageValue)
+	output:PutList(data.s2c_RankList, output.PutOBJ,'OpenCards.Core.Data.NewServerActivityChallengeRankItem')
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Read(input, data)
+	data.s2c_Rank = input:GetS32()
+	data.s2c_DamageValue = input:GetF64()
+	data.s2c_RankList = input:GetList(input.GetOBJ,'OpenCards.Core.Data.NewServerActivityChallengeRankItem')
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest
+
+
+local _M = {MessageID = 0x00056BB8,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00056BB8] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Write(output, data)
+	output:PutS32(data.c2s_ActivityUniqueId)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Read(input, data)
+	data.c2s_ActivityUniqueId = input:GetS32()
+end
+
+

+ 30 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse.lua

@@ -0,0 +1,30 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse
+
+
+local _M = {MessageID = 0x00056BB9,Name = 'OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x00056BB9] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Write(output, data)
+	output:PutS64(data.s2c_ActivityEndTimeStamp)
+	output:PutMap(data.s2c_GiftPurchaseCountMap, output.PutS32, output.PutS32,'int', 'int')
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Read(input, data)
+	data.s2c_ActivityEndTimeStamp = input:GetS64()
+	data.s2c_GiftPurchaseCountMap = input:GetMap(input.GetS32, input.GetS32,'int', 'int')
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerActivityRequest.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.NewServerActivityRequest
+
+
+local _M = {MessageID = 0x32D33D74,Name = 'OpenCards.Core.Protocol.Client.NewServerActivityRequest'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x32D33D74] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.ClientRequest'].Write(output, data)
+	output:PutS32(data.id)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.ClientRequest'].Read(input, data)
+	data.id = input:GetS32()
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerActivityResponse.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.NewServerActivityResponse
+
+
+local _M = {MessageID = 0x22B23270,Name = 'OpenCards.Core.Protocol.Client.NewServerActivityResponse'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x22B23270] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.ClientResponse'].Write(output, data)
+	
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.ClientResponse'].Read(input, data)
+	
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerClientRequest.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.NewServerClientRequest
+
+
+local _M = {MessageID = 0x000563E8,Name = 'OpenCards.Core.Protocol.Client.NewServerClientRequest'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x000563E8] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerClientRequest'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Write(output, data)
+	output:PutS32(data.id)
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityRequest'].Read(input, data)
+	data.id = input:GetS32()
+end
+
+

+ 28 - 0
server/src/data/ClientScript/Protocol/generated/OpenCards.Core.Protocol.Client.NewServerClientResponse.lua

@@ -0,0 +1,28 @@
+
+-- Warning: do not edit this file.
+-- 警告: 不要编辑此文件
+
+-- OpenCards.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+-- OpenCards.Core.Protocol.Client.NewServerClientResponse
+
+
+local _M = {MessageID = 0x000563E9,Name = 'OpenCards.Core.Protocol.Client.NewServerClientResponse'}
+_M.__index = _M
+function _M.IsSuccess(self)
+   return self.s2c_code ~= nil and self.s2c_code >= 200 and self.s2c_code <= 299
+end
+Protocol.Serializer[0x000563E9] = _M
+Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerClientResponse'] = _M
+
+function _M.Write(output,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Write(output, data)
+	output:PutList(data.s2c_ActivityStateList, output.PutOBJ,'OpenCards.Core.Data.NewServerActivityData')
+end
+
+
+function _M.Read(input,data)
+	Protocol.Serializer.StringDefined['OpenCards.Core.Protocol.Client.NewServerActivityResponse'].Read(input, data)
+	data.s2c_ActivityStateList = input:GetList(input.GetOBJ,'OpenCards.Core.Data.NewServerActivityData')
+end
+
+

+ 20 - 0
server/src/data/ClientScript/Protocol/generated/_codec.lua

@@ -97,6 +97,10 @@ function Protocol.Serializer.Config(rootdir)
 	require(rootdir..'OpenCards.Core.Data.MarketTab')
 	require(rootdir..'OpenCards.Core.Data.MercenaryAppointPlayerData')
 	require(rootdir..'OpenCards.Core.Data.MercenaryData')
+	require(rootdir..'OpenCards.Core.Data.NEWSERVER_MarketGift')
+	require(rootdir..'OpenCards.Core.Data.NewServerActivityChallengeRankData')
+	require(rootdir..'OpenCards.Core.Data.NewServerActivityChallengeRankItem')
+	require(rootdir..'OpenCards.Core.Data.NewServerActivityData')
 	require(rootdir..'OpenCards.Core.Data.PlayerAppointMercenaryData')
 	require(rootdir..'OpenCards.Core.Data.PlayerScoreRankData')
 	require(rootdir..'OpenCards.Core.Data.PlayerTempMercenaryData')
@@ -240,6 +244,12 @@ function Protocol.Serializer.Config(rootdir)
 	require(rootdir..'OpenCards.Core.ORM.NewerGuideData')
 	require(rootdir..'OpenCards.Core.ORM.NewerGuideValueData')
 	require(rootdir..'OpenCards.Core.ORM.NewGuildBossData')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivityBaseData')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivityBossChallengeData')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivityData')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivityHeroGiftData')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivityInfo')
+	require(rootdir..'OpenCards.Core.ORM.NewServerActivitySummonData')
 	require(rootdir..'OpenCards.Core.ORM.PayDynamicDifficultyInfo')
 	require(rootdir..'OpenCards.Core.ORM.PlayerData')
 	require(rootdir..'OpenCards.Core.ORM.PlayerExtData')
@@ -961,6 +971,12 @@ function Protocol.Serializer.Config(rootdir)
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewGuildBossReceiveRewardBoxResponse')
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewGuildBossSweepRequest')
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewGuildBossSweepResponse')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoRequest')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListRequest')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoRequest')
+	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse')
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNotHeroLevelUpRequest')
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientNotHeroLevelUpResponse')
 	require(rootdir..'OpenCards.Core.Protocol.Client.ClientOperateMailRequest')
@@ -1203,6 +1219,10 @@ function Protocol.Serializer.Config(rootdir)
 	require(rootdir..'OpenCards.Core.Protocol.Client.ItemResponse')
 	require(rootdir..'OpenCards.Core.Protocol.Client.KickPlayerNotify')
 	require(rootdir..'OpenCards.Core.Protocol.Client.LackOfResourceUpdateNotify')
+	require(rootdir..'OpenCards.Core.Protocol.Client.NewServerActivityRequest')
+	require(rootdir..'OpenCards.Core.Protocol.Client.NewServerActivityResponse')
+	require(rootdir..'OpenCards.Core.Protocol.Client.NewServerClientRequest')
+	require(rootdir..'OpenCards.Core.Protocol.Client.NewServerClientResponse')
 	require(rootdir..'OpenCards.Core.Protocol.Client.NotifyBagHero')
 	require(rootdir..'OpenCards.Core.Protocol.Client.NotifyOpenAds')
 	require(rootdir..'OpenCards.Core.Protocol.Client.Operation')

+ 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,
+}
+

+ 25 - 0
server/src/data/ClientScript/Protocol/generated/_response-code.lua

@@ -4237,6 +4237,21 @@
     [504] = "VIP等级不满足",
     [505] = "该功能未开启,不能扫荡",
   }
+  MessageCodeAttribute["OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeBaseInfoResponse"] = {
+    [200] = "成功",
+    [500] = "未知错误",
+    [501] = "回应  NewServerActivityResponse",
+  }
+  MessageCodeAttribute["OpenCards.Core.Protocol.Client.ClientNewServerBossChallengeRankListResponse"] = {
+    [200] = "成功",
+    [500] = "未知错误",
+    [501] = "回应  NewServerActivityResponse",
+  }
+  MessageCodeAttribute["OpenCards.Core.Protocol.Client.ClientNewServerLimitedGiftBaseInfoResponse"] = {
+    [200] = "成功",
+    [500] = "未知错误",
+    [501] = "回应  NewServerActivityResponse",
+  }
   MessageCodeAttribute["OpenCards.Core.Protocol.Client.ClientNotHeroLevelUpResponse"] = {
     [200] = "成功",
     [500] = "未知错误",
@@ -5637,6 +5652,16 @@
     [503] = "错误的物品数量!",
     [504] = "不满足使用条件!",
   }
+  MessageCodeAttribute["OpenCards.Core.Protocol.Client.NewServerActivityResponse"] = {
+    [200] = "成功",
+    [500] = "未知错误",
+    [501] = "回应  NewServerActivityResponse",
+  }
+  MessageCodeAttribute["OpenCards.Core.Protocol.Client.NewServerClientResponse"] = {
+    [200] = "成功",
+    [500] = "未知错误",
+    [501] = "回应  NewServerActivityResponse",
+  }
   MessageCodeAttribute["OpenCards.Core.Protocol.Client.PayResponse"] = {
     [200] = "成功",
     [500] = "未知错误",

+ 1 - 1
server/src/data/ServerData/build_xls2lua.bat

@@ -1,4 +1,4 @@
-SET Path=..\lib\;%Path%
+SET Path=..\..\library\;%Path%
 
 set areaInputFolder=.\templates_xls_area\
 set areaOutputFolder=.\templates_lua_area\

+ 9 - 0
server/src/library/xlslang.runtimeconfig.json

@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "tfm": "net5.0",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "5.0.0"
+    }
+  }
+}

+ 1 - 1
server/src/server/OpenCards.Server.Core/TableManager.cs

@@ -18,7 +18,7 @@ namespace OpenCards.Server.Core
 				try
 				{
 				_IdMap = loader.LoadTemplates<int, Table_ActivityTask>(nameof(Table_ActivityTask.Id), "activity_task");
-                foreach (var table in _IdMap.Values)
+				foreach (var table in _IdMap.Values)
 				{
 					table.OnReload();
 				}

+ 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>

+ 1 - 0
start/1_launch_name_server.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml NameServer

+ 1 - 0
start/2_launch_PublicNode.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml PublicNode

+ 2 - 0
start/3_launch_game_r1s1.bat

@@ -0,0 +1,2 @@
+title gameserver
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml GameNode1 global.RealmID=1 global.ServerID=1

+ 2 - 0
start/4_launch_account.bat

@@ -0,0 +1,2 @@
+title AccountNode1
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml AccountNode1

+ 1 - 0
start/_launch_account.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml AccountNode1

+ 1 - 0
start/_launch_game_r1s1.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml GameNode1 global.RealmID=1 global.ServerID=1

+ 1 - 0
start/_launch_guild.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml GuildNode global.RealmID=1

+ 1 - 0
start/_launch_name_server.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml NameServer

+ 1 - 0
start/_launch_pay.bat

@@ -0,0 +1 @@
+dotnet ..\OpenCards.Server.DotNetCore.dll .\_launch_server.xml PayNode

+ 176 - 0
start/_launch_public.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<doc>
+
+  <!-- ================================================================ -->
+  <!--  公共服配置:NameServer + PublicNode + AccountNode               -->
+  <!--  此文件由手动从 _launch_server.xml 提取生成                       -->
+  <!-- ================================================================ -->
+
+  <define name="GameNodeDefine" param1="" param2=""/>
+
+  <!-- IService全局配置 -->
+  <GlobalConfig>
+    <Env>dev</Env>
+    <Realm>1</Realm>
+    <Mysql></Mysql>
+    <AcceptClientVersion>0.0.0</AcceptClientVersion>
+    <TemplateRoot>../../data/ServerData/</TemplateRoot>
+    <NoticeErrorUrl>https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=d9d262b8-17c8-4297-8b9f-bb1b7f72ac89</NoticeErrorUrl>
+    <DebugPay>true</DebugPay>
+    <BattleRecordURLPrefix>https://zqtfcn.oss-cn-shanghai.aliyuncs.com/apollo_dev/server/playback/</BattleRecordURLPrefix>
+  </GlobalConfig>
+
+  <!-- 根节点,管理所有ServiceNode,全局唯一 -->
+  <NameServer>
+    <RpcConfig>
+      <LocalEndPoint>127.0.0.1:17000</LocalEndPoint>
+      <NetworkTimeoutMS>15000</NetworkTimeoutMS>
+      <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+    </RpcConfig>
+  </NameServer>
+
+  <ServiceNodes>
+
+    <!-- 账号服务节点 -->
+    <AccountNode1>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=1</Redis>
+      <RpcConfig>
+        <LocalNodeType>AccountNode</LocalNodeType>
+        <LocalNodeName>AccountNode1</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17010</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <AccountServer>
+          <ServiceName>AccountServer</ServiceName>
+          <ServiceType>AccountServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18081/account/</HttpListen>
+            <SecretKey>3dbf6b137a80d10953507929a0216d8b</SecretKey>
+            <ServerListUrl>http://43.226.57.217:8007/apollo_60000/serverlist.json</ServerListUrl>
+            <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
+            <client_storage_url>http://43.226.57.217:8007/apollo_60000/</client_storage_url>
+            <apply_app_verison>0.0.0</apply_app_verison>
+            <apply_server_id>2</apply_server_id>
+            <StopServerDataURL>http://43.226.57.217:8007/apollo_60000/stop_server_list.json</StopServerDataURL>
+            <UpdateServerConfig>http://43.226.57.217:8007/apollo_60000/update_server_config.json</UpdateServerConfig>
+          </Config>
+        </AccountServer>
+      </StartService>
+    </AccountNode1>
+
+    <!-- 公共服务节点:公会/支付/好友/聊天/管理后台/竞技场巅峰/账单 -->
+    <PublicNode>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=1</Redis>
+      <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=orm</Mysql>
+      <RpcConfig>
+        <LocalNodeType>PublicNode</LocalNodeType>
+        <LocalNodeName>PublicNode</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17060</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <GuildService>OpenCards.Service.Guild.GuildService</GuildService>
+          <PublicService>OpenCards.Service.Public.PublicService</PublicService>
+          <PayServer>OpenCards.Service.Pay.PayServer</PayServer>
+          <FriendService>OpenCards.Service.Friend.FriendService</FriendService>
+          <ChatService>OpenCards.Service.Chat.ChatService</ChatService>
+          <ArenaPinnacleService>OpenCards.Server.Arena.ArenaPinnacleService</ArenaPinnacleService>
+          <AdminService>OpenCards.Service.Admin.AdminService</AdminService>
+          <BillService>OpenCards.Service.Bill.BillService</BillService>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <AccountServer>
+          <ServiceName>AccountServer</ServiceName>
+          <ServiceType>AccountServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18081/account/</HttpListen>
+            <SecretKey>3dbf6b137a80d10953507929a0216d8b</SecretKey>
+            <ServerListUrl>http://43.226.57.217:8007/apollo_60000/serverlist.json</ServerListUrl>
+            <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
+            <client_storage_url>http://43.226.57.217:8007/apollo_60000/</client_storage_url>
+            <apply_app_verison>0.0.0</apply_app_verison>
+            <apply_server_id>2</apply_server_id>
+            <StopServerDataURL>http://43.226.57.217:8007/apollo_60000/stop_server_list.json</StopServerDataURL>
+            <UpdateServerConfig>http://43.226.57.217:8007/apollo_60000/update_server_config.json</UpdateServerConfig>
+          </Config>
+        </AccountServer>
+        <BillService>
+          <ServiceName>BillService</ServiceName>
+          <ServiceType>BillService</ServiceType>
+          <Config>
+            <platform>oss</platform>
+            <accessKeyId>LTAI4GF8sN2RpWMyfqRy1swY</accessKeyId>
+            <accessKeySecret>2vuPQ4eBoWYAZLsCNCbfJmVNP1EIxv</accessKeySecret>
+            <endpoint>https://oss-cn-shanghai.aliyuncs.com/</endpoint>
+            <path>apollo_60000/server/playback/{0}/{1}</path>
+            <bucketName>zqtfcn</bucketName>
+          </Config>
+        </BillService>
+        <GuildService>
+          <ServiceName>GuildService</ServiceName>
+          <ServiceType>GuildService</ServiceType>
+          <Config></Config>
+        </GuildService>
+        <PublicService>
+          <ServiceName>PublicService</ServiceName>
+          <ServiceType>PublicService</ServiceType>
+          <Config></Config>
+        </PublicService>
+        <PayServer>
+          <ServiceName>PayServer</ServiceName>
+          <ServiceType>PayServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18082/pay/</HttpListen>
+            <SecretKey>643752757fde484d03adc694b2462322</SecretKey>
+            <NotifyUrl>http://127.0.0.1:18082/pay/deliver</NotifyUrl>
+            <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=dbpay;</Mysql>
+          </Config>
+        </PayServer>
+        <FriendService>
+          <ServiceName>FriendService</ServiceName>
+          <ServiceType>FriendService</ServiceType>
+          <Config></Config>
+        </FriendService>
+        <ChatService>
+          <ServiceName>ChatService</ServiceName>
+          <ServiceType>ChatService</ServiceType>
+          <Config>
+            <HttpListen>http://+:18089/chat/</HttpListen>
+            <AppKey>YOUME77489D86AE5330CCFFB62E3BB8B4C6B4F48AA54A</AppKey>
+            <AppSecret>rItImoJh1R593aBuzrVzzq4yDSFAxHwEDH2EXp40nX8ISeb2Tn/xVAjGreDuFILst50JIlpFRCStbOHk8h9XyLZ5Pcd992f8L0D6GUg60gQyxr9gCvrR/HF0QQHdWN2KxAOTYhVP6G/htOY/bxmtJbQw0Yn/+Yd3T9n69cCQS+0BAAE=</AppSecret>
+          </Config>
+        </ChatService>
+        <ArenaPinnacleService>
+          <ServiceName>ArenaPinnacleService</ServiceName>
+          <ServiceType>ArenaPinnacleService</ServiceType>
+          <Config></Config>
+        </ArenaPinnacleService>
+        <AdminService>
+          <ServiceName>AdminService</ServiceName>
+          <ServiceType>AdminService</ServiceType>
+          <Config>
+            <HttpListen>http://+:18088/api/</HttpListen>
+            <APIKey>SeaOfVanGuard</APIKey>
+            <GMTBaseUrl>http://127.0.0.1:7001</GMTBaseUrl>
+            <AccountUrl>http://127.0.0.1:18081/account/</AccountUrl>
+            <PayUrl>http://127.0.0.1:18082/pay/</PayUrl>
+          </Config>
+        </AdminService>
+      </StartService>
+    </PublicNode>
+
+  </ServiceNodes>
+</doc>

+ 352 - 0
start/_launch_server.xml

@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="utf-8"?>
+<doc>
+
+  <!-- #################################################################################### -->
+  <define name="GameNodeDefine" param1="" param2="">
+
+  </define>
+
+  <!-- #################################################################################### -->
+  <!-- IService全局配置 -->
+  <GlobalConfig>
+    <Env>dev</Env>
+    <Realm>1</Realm>
+    <Mysql></Mysql>
+    <AcceptClientVersion>0.0.0</AcceptClientVersion>
+    <TemplateRoot>../../data/ServerData/</TemplateRoot>
+    <NoticeErrorUrl>https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=d9d262b8-17c8-4297-8b9f-bb1b7f72ac89</NoticeErrorUrl>
+	<DebugPay>true</DebugPay>
+	  <BattleRecordURLPrefix>https://zqtfcn.oss-cn-shanghai.aliyuncs.com/apollo_dev/server/playback/</BattleRecordURLPrefix>
+  </GlobalConfig>
+
+  <!-- #################################################################################### -->
+  <!-- 根节点配置,负责管理所有的ServiceNode,全局唯一节点 -->
+  <NameServer>
+    <RpcConfig>
+      <LocalEndPoint>127.0.0.1:17000</LocalEndPoint>
+      <NetworkTimeoutMS>15000</NetworkTimeoutMS>
+      <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+    </RpcConfig>
+  </NameServer>
+
+  <!-- #################################################################################### -->
+  <!-- 所有服务节点配置,服务节点为具体服务的容器 -->
+  <ServiceNodes>
+  
+    <!-- 账号服务节点 -->
+    <AccountNode1>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=1</Redis>
+      <RpcConfig>
+        <LocalNodeType>AccountNode</LocalNodeType>
+        <LocalNodeName>AccountNode1</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17010</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <AccountServer>
+          <ServiceName>AccountServer</ServiceName>
+          <ServiceType>AccountServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18081/account/</HttpListen>
+            <SecretKey>3dbf6b137a80d10953507929a0216d8b</SecretKey>
+            <ServerListUrl>http://43.226.57.217:8007/apollo_60000/serverlist.json</ServerListUrl>
+            <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
+            <client_storage_url>http://43.226.57.217:8007/apollo_60000/</client_storage_url>
+            <apply_app_verison>0.0.0</apply_app_verison>
+            <apply_server_id>2</apply_server_id>
+            <StopServerDataURL>http://43.226.57.217:8007/apollo_60000/stop_server_list.json</StopServerDataURL>
+			<UpdateServerConfig>http://43.226.57.217:8007/apollo_60000/update_server_config.json</UpdateServerConfig>
+          </Config>
+        </AccountServer>
+      </StartService>
+    </AccountNode1>
+	
+    <!-- 公共服务节点 -->
+    <PublicNode>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=1</Redis>
+      <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=orm</Mysql>
+      <RpcConfig>
+        <LocalNodeType>PublicNode</LocalNodeType>
+        <LocalNodeName>PublicNode</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17060</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <GuildService>OpenCards.Service.Guild.GuildService</GuildService>
+          <!--           <CenterService>OpenCards.Service.Center.CenterService</CenterService> -->
+          <PublicService>OpenCards.Service.Public.PublicService</PublicService>
+          <PayServer>OpenCards.Service.Pay.PayServer</PayServer>
+          <FriendService>OpenCards.Service.Friend.FriendService</FriendService>
+          <ChatService>OpenCards.Service.Chat.ChatService</ChatService>
+          <ArenaPinnacleService>OpenCards.Server.Arena.ArenaPinnacleService</ArenaPinnacleService>
+          <AdminService>OpenCards.Service.Admin.AdminService</AdminService>
+          <BillService>OpenCards.Service.Bill.BillService</BillService>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <AccountServer>
+          <ServiceName>AccountServer</ServiceName>
+          <ServiceType>AccountServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18081/account/</HttpListen>
+            <SecretKey>3dbf6b137a80d10953507929a0216d8b</SecretKey>
+            <ServerListUrl>http://43.226.57.217:8007/apollo_60000/serverlist.json</ServerListUrl>
+            <YmnCheckUrl>https://heimdall.vgplay.vn/check</YmnCheckUrl>
+            <client_storage_url>http://43.226.57.217:8007/apollo_60000/</client_storage_url>
+            <apply_app_verison>0.0.0</apply_app_verison>
+            <apply_server_id>2</apply_server_id>
+            <!-- 			<Apply_Server_ID_URL>47.250.46.43:19821</Apply_Server_ID_URL>
+			<Apply_Bind_Verison>0.1.9</Apply_Bind_Verison> -->
+            <StopServerDataURL>http://43.226.57.217:8007/apollo_60000/stop_server_list.json</StopServerDataURL>
+			<UpdateServerConfig>http://43.226.57.217:8007/apollo_60000/update_server_config.json</UpdateServerConfig>
+          </Config>
+        </AccountServer>
+        <BillService>
+          <ServiceName>BillService</ServiceName>
+          <ServiceType>BillService</ServiceType>
+          <Config>
+			<platform>oss</platform>
+            <accessKeyId>LTAI4GF8sN2RpWMyfqRy1swY</accessKeyId>
+            <accessKeySecret>2vuPQ4eBoWYAZLsCNCbfJmVNP1EIxv</accessKeySecret>
+            <endpoint>https://oss-cn-shanghai.aliyuncs.com/</endpoint>
+            <path>apollo_60000/server/playback/{0}/{1}</path>
+            <bucketName>zqtfcn</bucketName>
+          </Config>
+        </BillService>
+        <GuildService>
+          <ServiceName>GuildService</ServiceName>
+          <ServiceType>GuildService</ServiceType>
+          <Config></Config>
+        </GuildService>
+        <PublicService>
+          <ServiceName>PublicService</ServiceName>
+          <ServiceType>PublicService</ServiceType>
+          <Config></Config>
+        </PublicService>
+        <PayServer>
+          <ServiceName>PayServer</ServiceName>
+          <ServiceType>PayServer</ServiceType>
+          <Config>
+            <HttpListen>http://+:18082/pay/</HttpListen>
+            <SecretKey>643752757fde484d03adc694b2462322</SecretKey>
+            <NotifyUrl>http://127.0.0.1:18082/pay/deliver</NotifyUrl>
+            <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=dbpay;</Mysql>
+          </Config>
+        </PayServer>
+        <FriendService>
+          <ServiceName>FriendService</ServiceName>
+          <ServiceType>FriendService</ServiceType>
+          <Config></Config>
+        </FriendService>
+        <ChatService>
+          <ServiceName>ChatService</ServiceName>
+          <ServiceType>ChatService</ServiceType>
+          <Config>
+            <HttpListen>http://+:18089/chat/</HttpListen>
+            <AppKey>YOUME77489D86AE5330CCFFB62E3BB8B4C6B4F48AA54A</AppKey>
+            <AppSecret>rItImoJh1R593aBuzrVzzq4yDSFAxHwEDH2EXp40nX8ISeb2Tn/xVAjGreDuFILst50JIlpFRCStbOHk8h9XyLZ5Pcd992f8L0D6GUg60gQyxr9gCvrR/HF0QQHdWN2KxAOTYhVP6G/htOY/bxmtJbQw0Yn/+Yd3T9n69cCQS+0BAAE=</AppSecret>
+          </Config>
+        </ChatService>
+        <ArenaPinnacleService>
+          <ServiceName>ArenaPinnacleService</ServiceName>
+          <ServiceType>ArenaPinnacleService</ServiceType>
+          <Config></Config>
+        </ArenaPinnacleService>
+        <AdminService>
+          <ServiceName>AdminService</ServiceName>
+          <ServiceType>AdminService</ServiceType>
+          <Config>
+            <HttpListen>http://+:18088/api/</HttpListen>
+            <APIKey>SeaOfVanGuard</APIKey>
+            <GMTBaseUrl>http://127.0.0.1:7001</GMTBaseUrl>
+            <AccountUrl>http://127.0.0.1:18081/account/</AccountUrl>
+            <PayUrl>http://127.0.0.1:18082/pay/</PayUrl>
+          </Config>
+        </AdminService>
+      </StartService>
+    </PublicNode>
+
+    <!-- 游戏服节点 -->
+    <GameNode1>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=1</Redis>
+      <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=orm</Mysql>
+      <Ip>127.0.0.1</Ip>
+      <RpcConfig>
+        <LocalNodeType>GameNode</LocalNodeType>
+        <LocalNodeName>GameNode1</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17020</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <CenterService>OpenCards.Service.Center.CenterService</CenterService>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+          <ConnectorService>OpenCards.Server.Connector.ConnectorService</ConnectorService>
+          <ArenaPinnacleGameService>OpenCards.Server.Arena.ArenaPinnacleGameService</ArenaPinnacleGameService>
+          <ArenaManagerService>OpenCards.Server.Arena.ArenaManagerService</ArenaManagerService>
+          <ArenaValorService>OpenCards.Server.Arena.ArenaValorService</ArenaValorService>
+          <ArenaHighendService>OpenCards.Server.Arena.ArenaHighendService</ArenaHighendService>
+          <SessionService>OpenCards.Server.Connector.SessionService</SessionService>
+          <LogicService>OpenCards.Server.Logic.LogicService</LogicService>
+          <LogicManagerService>OpenCards.Server.Logic.LogicManagerService</LogicManagerService>
+	      <StageRankService>OpenCards.Service.StageRank.StageRankService</StageRankService>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <!-- LogicManagerService -->
+        <LogicManagerService>
+          <ServiceName>LogicManagerService_1</ServiceName>
+          <ServiceType>LogicManagerService</ServiceType>
+          <Config>
+            <FightPostURL>http://127.0.0.1:8088/fight/reqstartbattle</FightPostURL>
+            <serverID>1</serverID>
+          </Config>
+        </LogicManagerService>
+        <!-- Center -->
+        <CenterService>
+          <ServiceName>CenterService_1</ServiceName>
+          <ServiceType>CenterService</ServiceType>
+          <Config>
+            <serverID>1</serverID>
+          </Config>
+        </CenterService>
+		<StageRankService>
+			<ServiceName>StageRankService</ServiceName>
+			<ServiceType>StageRankService</ServiceType>
+			<Config>
+				<serverID>1</serverID>
+			</Config>
+		  </StageRankService>
+		  
+        <!-- ArenaManager -->
+        <ArenaManagerService>
+          <ServiceName>ArenaPinnacleGameService_1</ServiceName>
+          <ServiceType>ArenaPinnacleGameService</ServiceType>
+          <Config>
+            <ServerID>1</ServerID>
+          </Config>
+        </ArenaManagerService>
+        <!-- ArenaManager -->
+        <ArenaManagerService>
+          <ServiceName>ArenaManagerService_1</ServiceName>
+          <ServiceType>ArenaManagerService</ServiceType>
+          <Config>
+            <ServerID>1</ServerID>
+          </Config>
+        </ArenaManagerService>
+        <!-- ArenaHighend -->
+        <ArenaHighendService>
+          <ServiceName>ArenaHighendService_1</ServiceName>
+          <ServiceType>ArenaHighendService</ServiceType>
+          <Config></Config>
+        </ArenaHighendService>
+        <!-- Connector -->
+        <ConnectorService>
+          <ServiceName>ConnectorService_1</ServiceName>
+          <ServiceType>ConnectorService</ServiceType>
+          <Config>
+            <ServerId>1</ServerId>
+            <Host>0.0.0.0</Host>
+            <Port>19821</Port>
+            <NetCodec>OpenCards.Core.Serializer</NetCodec>
+            <KeepAlive>true</KeepAlive>
+            <KeepAliveInterval>30000</KeepAliveInterval>
+            <RecvBufferSize>16384</RecvBufferSize>
+            <SendBufferSize>16384</SendBufferSize>
+            <MaxConnections>300000</MaxConnections>
+          </Config>
+        </ConnectorService>
+      </StartService>
+    </GameNode1>
+
+    <!-- 游戏服节点 -->
+    <GameNode2>
+      <Redis>127.0.0.1,password=tmKjD1ENs3HfZ7adzLJO!,allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=2</Redis>
+      <Mysql>server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=orm</Mysql>
+      <Ip>127.0.0.1</Ip>
+      <RpcConfig>
+        <LocalNodeType>GameNode</LocalNodeType>
+        <LocalNodeName>GameNode2</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:17021</LocalEndPoint>
+        <NameServerEndPoint>127.0.0.1:17000</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <CenterService>OpenCards.Service.Center.CenterService</CenterService>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+          <ConnectorService>OpenCards.Server.Connector.ConnectorService</ConnectorService>
+          <ArenaManagerService>OpenCards.Server.Arena.ArenaManagerService</ArenaManagerService>
+          <ArenaValorService>OpenCards.Server.Arena.ArenaValorService</ArenaValorService>
+          <ArenaHighendService>OpenCards.Server.Arena.ArenaHighendService</ArenaHighendService>
+          <SessionService>OpenCards.Server.Connector.SessionService</SessionService>
+          <LogicService>OpenCards.Server.Logic.LogicService</LogicService>
+          <LogicManagerService>OpenCards.Server.Logic.LogicManagerService</LogicManagerService>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <!-- LogicManagerService -->
+        <LogicManagerService>
+          <ServiceName>LogicManagerService_2</ServiceName>
+          <ServiceType>LogicManagerService</ServiceType>
+          <Config>
+            <FightPostURL>http://127.0.0.1:8088/fight/reqstartbattle</FightPostURL>
+            <serverID>2</serverID>
+          </Config>
+        </LogicManagerService>
+        <!-- Center -->
+        <CenterService>
+          <ServiceName>CenterService_2</ServiceName>
+          <ServiceType>CenterService</ServiceType>
+          <Config>
+            <serverID>2</serverID>
+          </Config>
+        </CenterService>
+        <!-- ArenaManager -->
+        <ArenaManagerService>
+          <ServiceName>ArenaManagerService_2</ServiceName>
+          <ServiceType>ArenaManagerService</ServiceType>
+          <Config>
+            <ServerID>2</ServerID>
+          </Config>
+        </ArenaManagerService>
+        <!-- ArenaHighend -->
+        <ArenaHighendService>
+          <ServiceName>ArenaHighendService_2</ServiceName>
+          <ServiceType>ArenaHighendService</ServiceType>
+          <Config></Config>
+        </ArenaHighendService>
+        <!-- Connector -->
+        <ConnectorService>
+          <ServiceName>ConnectorService_2</ServiceName>
+          <ServiceType>ConnectorService</ServiceType>
+          <Config>
+            <ServerId>2</ServerId>
+            <Host>0.0.0.0</Host>
+            <Port>19822</Port>
+            <NetCodec>OpenCards.Core.Serializer</NetCodec>
+            <KeepAlive>true</KeepAlive>
+            <KeepAliveInterval>30000</KeepAliveInterval>
+            <RecvBufferSize>16384</RecvBufferSize>
+            <SendBufferSize>16384</SendBufferSize>
+            <MaxConnections>300000</MaxConnections>
+          </Config>
+        </ConnectorService>
+      </StartService>
+    </GameNode2>
+  </ServiceNodes>
+</doc>

+ 387 - 0
start/create_zone.sh

@@ -0,0 +1,387 @@
+#!/bin/bash
+# =====================================================
+# 一键开新区脚本 — 生成独立区服目录
+# 用法: ./create_zone.sh <区号> [选项]
+#
+# 生成目录结构:
+#   dev/server<N>/
+#     ├── _launch_server.xml   # 该区独立配置
+#     ├── start.sh             # 启动
+#     ├── stop.sh              # 停止
+#     ├── status.sh            # 状态
+#     └── restart.sh           # 重启
+# =====================================================
+
+set -e
+
+# ======================== 默认配置 ========================
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+BASE_OUTPUT="/data/CzServer/_output.server"
+DLL="$BASE_OUTPUT/OpenCards.Server.DotNetCore.dll"
+
+# 数据库密码(从现有配置读取)
+REDIS_PASSWORD="tmKjD1ENs3HfZ7adzLJO!"
+MYSQL_CONN="server=127.0.0.1;User ID=root;Password=CmASfW98lOKbFieqEQox;database=orm"
+NAMESERVER_ENDPOINT="127.0.0.1:17000"
+FIGHT_POST_URL="http://127.0.0.1:8088/fight/reqstartbattle"
+
+# 服务器公网IP
+SERVER_PUBLIC_IP="${SERVER_PUBLIC_IP:-127.0.0.1}"
+
+# ======================== 颜色 ========================
+RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
+log_info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
+log_warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
+log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
+log_step()  { echo -e "${CYAN}[STEP]${NC} $1"; }
+
+# ======================== 参数 ========================
+ZONE_ID=""
+ZONE_NAME=""
+CONNECTOR_PORT=""
+RPC_PORT=""
+REDIS_DB=""
+SERVER_ID=""
+REALM_ID="1"
+
+while [[ $# -gt 0 ]]; do
+    case "$1" in
+        --port)       CONNECTOR_PORT="$2"; shift 2 ;;
+        --rpc-port)   RPC_PORT="$2"; shift 2 ;;
+        --name)       ZONE_NAME="$2"; shift 2 ;;
+        --ip)         SERVER_PUBLIC_IP="$2"; shift 2 ;;
+        --redis-db)   REDIS_DB="$2"; shift 2 ;;
+        --realm)      REALM_ID="$2"; shift 2 ;;
+        --nameserver) NAMESERVER_ENDPOINT="$2"; shift 2 ;;
+        -h|--help)
+            echo "用法: $0 <区号> [选项]"
+            echo ""
+            echo "参数:"
+            echo "  区号              第几区 (1, 2, 3...)"
+            echo ""
+            echo "选项:"
+            echo "  --port <端口>      客户端连接端口 (默认: 19820+区号)"
+            echo "  --rpc-port <端口>  RPC端口 (默认: rpc=17019+区号)"
+            echo "  --name <名称>      区服显示名称 (默认: 测试服N区)"
+            echo "  --ip <IP地址>      服务器公网IP (用于serverlist)"
+            echo "  --redis-db <编号>  Redis DB (默认: 同区号)"
+            echo "  --realm <ID>       大区ID (默认: 1)"
+            echo "  --nameserver <地址> NameServer地址 (默认: 127.0.0.1:17000)"
+            echo ""
+            echo "示例:"
+            echo "  $0 1                    # 创建1区 (端口19821)"
+            echo "  $0 2                    # 创建2区 (端口19822)"
+            echo "  $0 3 --port 19823 --name 正式3区"
+            exit 0
+            ;;
+        *) ZONE_ID="$1"; shift ;;
+    esac
+done
+
+if [ -z "$ZONE_ID" ]; then
+    log_error "请指定区号,如: $0 2"
+    exit 1
+fi
+
+# 自动计算默认值
+SERVER_ID="${ZONE_ID}"
+REDIS_DB="${REDIS_DB:-${ZONE_ID}}"
+CONNECTOR_PORT="${CONNECTOR_PORT:-$((19820 + ZONE_ID))}"
+RPC_PORT="${RPC_PORT:-$((17019 + ZONE_ID))}"
+ZONE_NAME="${ZONE_NAME:-测试服${ZONE_ID}区}"
+
+# ======================== 预检查 ========================
+log_step "检查环境..."
+
+ZONE_DIR="${SCRIPT_DIR}/server${ZONE_ID}"
+GAME_NODE="GameNode${ZONE_ID}"
+
+if [ -d "$ZONE_DIR" ]; then
+    log_warn "目录 ${ZONE_DIR} 已存在"
+    read -p "是否覆盖? (y/N): " confirm
+    if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
+        log_info "已取消"
+        exit 0
+    fi
+fi
+
+check_port() {
+    local port=$1
+    (ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null) | grep -q ":${port} " && return 0
+    return 1
+}
+
+if check_port "$CONNECTOR_PORT"; then
+    log_warn "端口 ${CONNECTOR_PORT} 已被占用,请检查"
+fi
+if check_port "$RPC_PORT"; then
+    log_warn "RPC端口 ${RPC_PORT} 已被占用,请检查"
+fi
+
+# ======================== 创建目录 ========================
+log_step "创建目录: ${ZONE_DIR}"
+mkdir -p "${ZONE_DIR}"
+
+# ======================== 生成 _launch_server.xml ========================
+log_step "生成 _launch_server.xml ..."
+
+cat > "${ZONE_DIR}/_launch_server.xml" << XEOF
+<?xml version="1.0" encoding="utf-8"?>
+<doc>
+  <!-- ================================================================ -->
+  <!--  ${ZONE_NAME} 配置 (由 create_zone.sh 生成)                     -->
+  <!--  区号: ${ZONE_ID}  端口: ${CONNECTOR_PORT}  RPC: ${RPC_PORT}    -->
+  <!--  Redis: db=${REDIS_DB}    生成时间: $(date '+%Y-%m-%d %H:%M:%S')       -->
+  <!-- ================================================================ -->
+
+  <define name="GameNodeDefine" param1="" param2=""/>
+
+  <GlobalConfig>
+    <Env>dev</Env>
+    <Realm>${REALM_ID}</Realm>
+    <Mysql></Mysql>
+    <AcceptClientVersion>0.0.0</AcceptClientVersion>
+    <TemplateRoot>../../../data/ServerData/</TemplateRoot>
+    <NoticeErrorUrl>https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=d9d262b8-17c8-4297-8b9f-bb1b7f72ac89</NoticeErrorUrl>
+    <DebugPay>true</DebugPay>
+    <BattleRecordURLPrefix>https://zqtfcn.oss-cn-shanghai.aliyuncs.com/apollo_dev/server/playback/</BattleRecordURLPrefix>
+  </GlobalConfig>
+
+  <NameServer>
+    <RpcConfig>
+      <LocalEndPoint>${NAMESERVER_ENDPOINT}</LocalEndPoint>
+      <NetworkTimeoutMS>15000</NetworkTimeoutMS>
+      <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+    </RpcConfig>
+  </NameServer>
+
+  <ServiceNodes>
+    <${GAME_NODE}>
+      <Redis>127.0.0.1,password=${REDIS_PASSWORD},allowAdmin=true,syncTimeout=30000,responseTimeout=30000,connectRetry=1000,connectTimeout=10000;db=${REDIS_DB}</Redis>
+      <Mysql>${MYSQL_CONN}</Mysql>
+      <Ip>127.0.0.1</Ip>
+      <RpcConfig>
+        <LocalNodeType>GameNode</LocalNodeType>
+        <LocalNodeName>${GAME_NODE}</LocalNodeName>
+        <LocalEndPoint>127.0.0.1:${RPC_PORT}</LocalEndPoint>
+        <NameServerEndPoint>${NAMESERVER_ENDPOINT}</NameServerEndPoint>
+        <RequestTickTimeMS>5000</RequestTickTimeMS>
+        <NetworkTimeoutMS>30000</NetworkTimeoutMS>
+        <DefaultTaskExecuteTimeout>60000</DefaultTaskExecuteTimeout>
+        <RpcCodec>OpenCards.Server.Core.Serializer</RpcCodec>
+        <AcceptTypeMappings>
+          <CenterService>OpenCards.Service.Center.CenterService</CenterService>
+          <AccountServer>OpenCards.Server.Account.AccountServer</AccountServer>
+          <ConnectorService>OpenCards.Server.Connector.ConnectorService</ConnectorService>
+          <ArenaManagerService>OpenCards.Server.Arena.ArenaManagerService</ArenaManagerService>
+          <ArenaValorService>OpenCards.Server.Arena.ArenaValorService</ArenaValorService>
+          <ArenaHighendService>OpenCards.Server.Arena.ArenaHighendService</ArenaHighendService>
+          <SessionService>OpenCards.Server.Connector.SessionService</SessionService>
+          <LogicService>OpenCards.Server.Logic.LogicService</LogicService>
+          <LogicManagerService>OpenCards.Server.Logic.LogicManagerService</LogicManagerService>
+          <StageRankService>OpenCards.Service.StageRank.StageRankService</StageRankService>
+          <ArenaPinnacleGameService>OpenCards.Server.Arena.ArenaPinnacleGameService</ArenaPinnacleGameService>
+        </AcceptTypeMappings>
+      </RpcConfig>
+      <StartService>
+        <LogicManagerService>
+          <ServiceName>LogicManagerService_${ZONE_ID}</ServiceName>
+          <ServiceType>LogicManagerService</ServiceType>
+          <Config>
+            <FightPostURL>${FIGHT_POST_URL}</FightPostURL>
+            <serverID>${SERVER_ID}</serverID>
+          </Config>
+        </LogicManagerService>
+        <CenterService>
+          <ServiceName>CenterService_${ZONE_ID}</ServiceName>
+          <ServiceType>CenterService</ServiceType>
+          <Config>
+            <serverID>${SERVER_ID}</serverID>
+          </Config>
+        </CenterService>
+        <StageRankService>
+          <ServiceName>StageRankService_${ZONE_ID}</ServiceName>
+          <ServiceType>StageRankService</ServiceType>
+          <Config>
+            <serverID>${SERVER_ID}</serverID>
+          </Config>
+        </StageRankService>
+        <ArenaPinnacleGameService>
+          <ServiceName>ArenaPinnacleGameService_${ZONE_ID}</ServiceName>
+          <ServiceType>ArenaPinnacleGameService</ServiceType>
+          <Config>
+            <ServerID>${SERVER_ID}</ServerID>
+          </Config>
+        </ArenaPinnacleGameService>
+        <ArenaManagerService>
+          <ServiceName>ArenaManagerService_${ZONE_ID}</ServiceName>
+          <ServiceType>ArenaManagerService</ServiceType>
+          <Config>
+            <ServerID>${SERVER_ID}</ServerID>
+          </Config>
+        </ArenaManagerService>
+        <ArenaHighendService>
+          <ServiceName>ArenaHighendService_${ZONE_ID}</ServiceName>
+          <ServiceType>ArenaHighendService</ServiceType>
+          <Config></Config>
+        </ArenaHighendService>
+        <ConnectorService>
+          <ServiceName>ConnectorService_${ZONE_ID}</ServiceName>
+          <ServiceType>ConnectorService</ServiceType>
+          <Config>
+            <ServerId>${SERVER_ID}</ServerId>
+            <Host>0.0.0.0</Host>
+            <Port>${CONNECTOR_PORT}</Port>
+            <NetCodec>OpenCards.Core.Serializer</NetCodec>
+            <KeepAlive>true</KeepAlive>
+            <KeepAliveInterval>30000</KeepAliveInterval>
+            <RecvBufferSize>16384</RecvBufferSize>
+            <SendBufferSize>16384</SendBufferSize>
+            <MaxConnections>300000</MaxConnections>
+          </Config>
+        </ConnectorService>
+      </StartService>
+    </${GAME_NODE}>
+  </ServiceNodes>
+</doc>
+XEOF
+
+# ======================== 生成管理脚本 ========================
+log_step "生成管理脚本..."
+
+# --- 公共工具函数 ---
+write_script_header() {
+    local file=$1
+    cat > "$file" << 'SHEOF'
+#!/bin/bash
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+BASE_OUTPUT="/data/CzServer/_output.server"
+DLL="$BASE_OUTPUT/OpenCards.Server.DotNetCore.dll"
+LOG_DIR="$BASE_OUTPUT/logfile"
+mkdir -p "$LOG_DIR"
+
+GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
+SHEOF
+}
+
+# --- start.sh ---
+write_script_header "${ZONE_DIR}/start.sh"
+cat >> "${ZONE_DIR}/start.sh" << XEOF
+# ${ZONE_NAME} 启动脚本
+
+PID=\$(pgrep -f "server${ZONE_ID}/_launch_server.xml ${GAME_NODE}" 2>/dev/null)
+if [ -n "\$PID" ]; then
+    echo -e "\${YELLOW}[SKIP] ${ZONE_NAME} 已在运行 (PID: \$PID)\${NC}"
+    exit 0
+fi
+
+echo -e "\${GREEN}[START] ${ZONE_NAME} (端口:${CONNECTOR_PORT}, RPC:${RPC_PORT}, Redis:db=${REDIS_DB}) ...\${NC}"
+
+nohup dotnet "\$DLL" "\$SCRIPT_DIR/_launch_server.xml" ${GAME_NODE} global.RealmID=${REALM_ID} global.ServerID=${SERVER_ID} \
+    >> "\$LOG_DIR/server${ZONE_ID}.log" 2>&1 &
+
+sleep 3
+
+PID=\$(pgrep -f "server${ZONE_ID}/_launch_server.xml ${GAME_NODE}" 2>/dev/null)
+if [ -n "\$PID" ]; then
+    echo -e "\${GREEN}[OK]    ${ZONE_NAME} 启动成功 (PID: \$PID)\${NC}"
+else
+    echo -e "\${RED}[FAIL]  ${ZONE_NAME} 启动失败,查看日志:\${NC}"
+    tail -20 "\$LOG_DIR/server${ZONE_ID}.log"
+    exit 1
+fi
+XEOF
+
+# --- stop.sh ---
+write_script_header "${ZONE_DIR}/stop.sh"
+cat >> "${ZONE_DIR}/stop.sh" << XEOF
+# ${ZONE_NAME} 停止脚本
+
+PID=\$(pgrep -f "server${ZONE_ID}/_launch_server.xml ${GAME_NODE}" 2>/dev/null)
+if [ -n "\$PID" ]; then
+    echo -e "\${YELLOW}[STOP] ${ZONE_NAME} (PID: \$PID)\${NC}"
+    kill \$PID
+    sleep 2
+    if pgrep -f "server${ZONE_ID}/_launch_server.xml ${GAME_NODE}" > /dev/null 2>&1; then
+        echo -e "\${RED}[KILL] 强制终止...\${NC}"
+        kill -9 \$PID 2>/dev/null
+    fi
+    echo -e "\${GREEN}[OK]    ${ZONE_NAME} 已停止\${NC}"
+else
+    echo -e "\${YELLOW}[SKIP] ${ZONE_NAME} 未在运行\${NC}"
+fi
+XEOF
+
+# --- status.sh ---
+write_script_header "${ZONE_DIR}/status.sh"
+cat >> "${ZONE_DIR}/status.sh" << XEOF
+# ${ZONE_NAME} 状态查看
+
+PID=\$(pgrep -f "server${ZONE_ID}/_launch_server.xml ${GAME_NODE}" 2>/dev/null)
+if [ -n "\$PID" ]; then
+    echo -e "\${GREEN}[UP]   ${ZONE_NAME} 运行中"
+    echo "        PID: \$PID"
+    echo "        端口: ${CONNECTOR_PORT}"
+    echo "        RPC:  ${RPC_PORT}"
+    echo "        日志: \$LOG_DIR/server${ZONE_ID}.log\${NC}"
+else
+    echo -e "\${RED}[DOWN] ${ZONE_NAME} 未运行 (端口:${CONNECTOR_PORT})\${NC}"
+fi
+XEOF
+
+# --- restart.sh ---
+write_script_header "${ZONE_DIR}/restart.sh"
+cat >> "${ZONE_DIR}/restart.sh" << XEOF
+# ${ZONE_NAME} 重启脚本
+bash "\$SCRIPT_DIR/stop.sh"
+sleep 2
+bash "\$SCRIPT_DIR/start.sh"
+XEOF
+
+chmod +x "${ZONE_DIR}/start.sh" "${ZONE_DIR}/stop.sh" "${ZONE_DIR}/status.sh" "${ZONE_DIR}/restart.sh"
+
+# ======================== 输出 serverlist 条目 ========================
+cat << XEOF
+
+${GREEN}============================================
+  请将以下条目添加到 OSS serverlist.json:
+============================================${NC}
+  {
+    "id": ${ZONE_ID},
+    "index": $((ZONE_ID - 1)),
+    "name": "${ZONE_NAME}",
+    "address": "${SERVER_PUBLIC_IP}:${CONNECTOR_PORT}",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": ${SERVER_ID},
+    "groupid": ${REALM_ID},
+    "note": "测试服"
+  }
+${GREEN}============================================${NC}
+
+XEOF
+
+# ======================== 完成 ========================
+echo ""
+echo -e "${GREEN}============================================${NC}"
+echo -e "${GREEN}  ${ZONE_NAME} 创建完成!${NC}"
+echo -e "${GREEN}============================================${NC}"
+echo ""
+echo -e "  目录:    ${CYAN}${ZONE_DIR}${NC}"
+echo -e "  区号:    ${CYAN}${SERVER_ID}${NC}"
+echo -e "  端口:    ${CYAN}${CONNECTOR_PORT}${NC}"
+echo -e "  RPC端口: ${CYAN}${RPC_PORT}${NC}"
+echo -e "  Redis:   ${CYAN}db=${REDIS_DB}${NC}"
+echo ""
+echo -e "  管理:"
+echo -e "    ${CYAN}bash ${ZONE_DIR}/start.sh${NC}     启动"
+echo -e "    ${CYAN}bash ${ZONE_DIR}/stop.sh${NC}      停止"
+echo -e "    ${CYAN}bash ${ZONE_DIR}/status.sh${NC}    状态"
+echo -e "    ${CYAN}bash ${ZONE_DIR}/restart.sh${NC}   重启"
+echo -e "    ${CYAN}tail -f ${BASE_OUTPUT}/logfile/server${ZONE_ID}.log${NC}  日志"
+echo ""
+echo -e "  ${YELLOW}⚠ 别忘了:${NC}"
+echo -e "    1. 更新 OSS serverlist.json(见上方)"
+echo -e "    2. 防火墙放行端口 ${CONNECTOR_PORT} 和 ${RPC_PORT}"
+echo ""

+ 140 - 0
start/public.sh

@@ -0,0 +1,140 @@
+#!/bin/bash
+# =====================================================
+# 公共服管理脚本(NameServer + PublicNode + AccountNode)
+# =====================================================
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+CFG="$SCRIPT_DIR/_launch_public.xml"
+BASE_DIR="/data/CzServer/_output.server"
+DLL="$BASE_DIR/OpenCards.Server.DotNetCore.dll"
+LOG_DIR="$BASE_DIR/logfile"
+
+GREEN='\033[0;32m'
+RED='\033[0;31m'
+YELLOW='\033[1;33m'
+NC='\033[0m'
+
+mkdir -p "$LOG_DIR"
+
+is_running() {
+    pgrep -f "$CFG $1" > /dev/null 2>&1
+}
+
+start_node() {
+    local name=$1
+    local extra=$2
+    local log_file="$LOG_DIR/${name,,}.log"
+
+    if is_running "$name"; then
+        echo -e "${YELLOW}[SKIP] $name 已在运行${NC}"
+        return 0
+    fi
+
+    echo -e "${GREEN}[START] $name ...${NC}"
+    nohup dotnet "$DLL" "$CFG" $name $extra >> "$log_file" 2>&1 &
+    sleep 3
+
+    if is_running "$name"; then
+        echo -e "${GREEN}[OK]    $name 启动成功 (PID: $(pgrep -f "$CFG $name"))${NC}"
+    else
+        echo -e "${RED}[FAIL]  $name 启动失败,查看日志:$log_file${NC}"
+        tail -20 "$log_file"
+        return 1
+    fi
+}
+
+stop_node() {
+    local name=$1
+    local pid=$(pgrep -f "$CFG $name" 2>/dev/null)
+    if [ -n "$pid" ]; then
+        echo -e "${YELLOW}[STOP] $name (PID: $pid)${NC}"
+        kill $pid
+        sleep 1
+        if pgrep -f "$CFG $name" > /dev/null 2>&1; then
+            kill -9 $pid 2>/dev/null
+        fi
+    else
+        echo -e "${YELLOW}[SKIP] $name 未在运行${NC}"
+    fi
+}
+
+status_node() {
+    local name=$1
+    if is_running "$name"; then
+        echo -e "${GREEN}[UP]    $name (PID: $(pgrep -f "$CFG $name"))${NC}"
+    else
+        echo -e "${RED}[DOWN]  $name${NC}"
+    fi
+}
+
+case "${1:-start}" in
+    start)
+        echo "========================================"
+        echo " 启动公共服 (NameServer → PublicNode → AccountNode)"
+        echo "========================================"
+        start_node "NameServer"
+        start_node "PublicNode"
+        start_node "AccountNode1"
+        echo "========================================"
+        echo " 公共服启动完成"
+        echo "========================================"
+        ;;
+    stop)
+    stop)
+        echo "========================================"
+        echo " 停止公共服"
+        echo "========================================"
+        stop_node "AccountNode1"
+        stop_node "PublicNode"
+        stop_node "NameServer"
+        echo "========================================"
+        echo " 公共服已停止"
+        echo "========================================"
+        ;;
+    restart)
+        bash "$0" stop
+        sleep 3
+        bash "$0" start
+        ;;
+    status)
+        echo "========================================"
+        echo " 公共服状态"
+        echo "========================================"
+        status_node "NameServer"
+        status_node "PublicNode"
+        status_node "AccountNode1"
+        echo "========================================"
+        ;;
+    log)
+        local name=${2:-NameServer}
+        local log_file="$LOG_DIR/${name,,}.log"
+        if [ -f "$log_file" ]; then
+            tail -f "$log_file"
+        else
+            echo -e "${RED}日志文件不存在:$log_file${NC}"
+        fi
+        ;;
+    refresh-serverlist)
+        echo -e "${GREEN}[REFRESH] 通知 AccountServer 重新拉取 serverlist.json ...${NC}"
+        ADMIN_URL="http://127.0.0.1:18088/api/"
+        BODY='{"callBackInfo":"{\"type\":\"server_list_refresh\"}"}'
+        RSP=$(curl -s -X POST "$ADMIN_URL" -d "$BODY" -H "Content-Type: application/json" 2>&1)
+        if echo "$RSP" | grep -q '"state":true'; then
+            echo -e "${GREEN}[OK]    serverlist.json 刷新成功${NC}"
+        else
+            echo -e "${RED}[FAIL]  刷新失败: $RSP${NC}"
+            echo -e "${YELLOW}[TIP]   确保公共服已启动 (bash public.sh status)${NC}"
+        fi
+        ;;
+    *)
+        echo "用法: $0 {start|stop|restart|status|log [节点名]|refresh-serverlist}"
+        echo ""
+        echo "  start              启动公共服 (NameServer → PublicNode → AccountNode1)"
+        echo "  stop               停止公共服 (AccountNode1 → PublicNode → NameServer)"
+        echo "  restart            重启公共服"
+        echo "  status             查看公共服状态"
+        echo "  log                查看日志 (默认NameServer)"
+        echo "  refresh-serverlist 通知AccountServer重新拉取serverlist.json(更新区服列表后执行)"
+        exit 1
+        ;;
+esac

+ 158 - 0
start/start.sh

@@ -0,0 +1,158 @@
+#!/bin/bash
+
+BASE_DIR="/data/CzServer/_output.server"
+DEV_DIR="$BASE_DIR/dev"
+DLL="$BASE_DIR/OpenCards.Server.DotNetCore.dll"
+CFG="$DEV_DIR/_launch_server.xml"
+LOG_DIR="$BASE_DIR/logfile"
+
+GREEN='\033[0;32m'
+RED='\033[0;31m'
+YELLOW='\033[1;33m'
+NC='\033[0m'
+
+mkdir -p "$LOG_DIR"
+
+check_dotnet() {
+    if ! command -v dotnet &> /dev/null; then
+        echo -e "${RED}[ERROR] dotnet 未找到,请先安装 .NET 5.0${NC}"
+        echo "  mkdir -p \$HOME/dotnet && tar zxf dotnet-sdk-5.0.100-linux-x64.tar.gz -C \$HOME/dotnet"
+        echo "  export DOTNET_ROOT=\$HOME/dotnet && export PATH=\$PATH:\$HOME/dotnet"
+        exit 1
+    fi
+}
+
+is_running() {
+    local name=$1
+    pgrep -f "_launch_server.xml $name" > /dev/null 2>&1
+}
+
+start_node() {
+    local name=$1
+    local extra_args=$2
+    local log_file="$LOG_DIR/${name,,}.log"
+
+    if is_running "$name"; then
+        echo -e "${YELLOW}[SKIP]  $name 已在运行${NC}"
+        return 0
+    fi
+
+    echo -e "${GREEN}[START] $name ...${NC}"
+    cd "$DEV_DIR" || exit 1
+    nohup dotnet "$DLL" "$CFG" $name $extra_args >> "$log_file" 2>&1 &
+
+    sleep 3
+
+    if is_running "$name"; then
+        echo -e "${GREEN}[OK]    $name 启动成功 (PID: $(pgrep -f "_launch_server.xml $name"))${NC}"
+    else
+        echo -e "${RED}[FAIL]  $name 启动失败,查看日志:$log_file${NC}"
+        tail -20 "$log_file"
+        exit 1
+    fi
+}
+
+stop_node() {
+    local name=$1
+    local pid
+    pid=$(pgrep -f "_launch_server.xml $name")
+    if [ -n "$pid" ]; then
+        echo -e "${YELLOW}[STOP]  $name (PID: $pid)${NC}"
+        kill "$pid"
+    else
+        echo -e "${YELLOW}[SKIP]  $name 未在运行${NC}"
+    fi
+}
+
+status_node() {
+    local name=$1
+    if is_running "$name"; then
+        local pid
+        pid=$(pgrep -f "_launch_server.xml $name")
+        echo -e "${GREEN}[UP]    $name (PID: $pid)${NC}"
+    else
+        echo -e "${RED}[DOWN]  $name${NC}"
+    fi
+}
+
+cmd_start() {
+    echo "========================================"
+    echo " 启动游戏服务端"
+    echo "========================================"
+    check_dotnet
+
+    start_node "NameServer"
+    start_node "PublicNode"
+    start_node "GameNode1" "global.RealmID=1 global.ServerID=1"
+    start_node "AccountNode1"
+
+    echo ""
+    echo "========================================"
+    echo " 全部节点启动完成"
+    echo "========================================"
+}
+
+cmd_stop() {
+    echo "========================================"
+    echo " 停止游戏服务端"
+    echo "========================================"
+
+    # 反序停止
+    stop_node "AccountNode1"
+    stop_node "GameNode1"
+    stop_node "PublicNode"
+    stop_node "NameServer"
+
+    sleep 2
+    echo "========================================"
+    echo " 全部节点已停止"
+    echo "========================================"
+}
+
+cmd_restart() {
+    cmd_stop
+    sleep 3
+    cmd_start
+}
+
+cmd_status() {
+    echo "========================================"
+    echo " 节点状态"
+    echo "========================================"
+    status_node "NameServer"
+    status_node "PublicNode"
+    status_node "GameNode1"
+    status_node "AccountNode1"
+    echo "========================================"
+}
+
+cmd_log() {
+    local name=${1:-NameServer}
+    local log_file="$LOG_DIR/${name,,}.log"
+    if [ -f "$log_file" ]; then
+        tail -f "$log_file"
+    else
+        echo -e "${RED}日志文件不存在:$log_file${NC}"
+    fi
+}
+
+case "$1" in
+    start)   cmd_start ;;
+    stop)    cmd_stop ;;
+    restart) cmd_restart ;;
+    status)  cmd_status ;;
+    log)     cmd_log "$2" ;;
+    *)
+        echo "用法: $0 {start|stop|restart|status|log [节点名]}"
+        echo ""
+        echo "  start              启动所有节点"
+        echo "  stop               停止所有节点"
+        echo "  restart            重启所有节点"
+        echo "  status             查看各节点状态"
+        echo "  log NameServer     实时查看指定节点日志"
+        echo "  log PublicNode"
+        echo "  log GameNode1"
+        echo "  log AccountNode1"
+        exit 1
+        ;;
+esac

+ 0 - 0
start/state/GameNode1/exit.txt


+ 0 - 0
start/state/PublicNode/exit.txt


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

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