@@ -1,411 +1,411 @@
# 02 · 平台层协议 — agent 路由(大厅服务器)
> 信封:`{ app:"youle", route:"agent", rpc:"<下列名称>", data:{...} }`
> 本篇覆盖 **route=agent 的全部平台层数据包**(双向)。每个 rpc 给出 C→S 请求字段与 S→C 响应/推送字段。子游戏对局包(route=room)不在此篇。
> 通用身份字段:`agentid`(代理ID)、`gameid`(游戏ID)、`playerid`(玩家ID)。多数请求由各调用点手工拼装,未必三者齐全,下文逐条标注实际字段。
> 统一条目格式:
> > `rpc名` · route=agent · <方向>
> > 场景 / 请求字段(C→S) / 响应或推送字段(S→C) / 源码 发送·接收 / 备注(⚠️待后端确认,🐛源码 bug)
---
## 登录 / 账号
### `player_login` · route=agent · C→S 请求 + S→C 响应
- 接收路由补充(2026-09-06 实包核对):C→S 仍为 `agent/player_login` ; S→C 可以是 `agent` 、`room` 或 `platform` 下的 `player_login` 。原工程 `12_Logic.js:238-260` 按 rpc 解除登录等待,再把这三类平台路由交给 `Net[rpc]` 。已实测短信验证码失败为 `room/player_login` , data 为 `{msg:"短信验证码不正确",state:-1,time:0}` ;必须解除等待并交给登录失败处理,不能因响应 route 与发包 route 不同而忽略。
- 场景:连接建立后 `onopen` 自动发送;断线重连、切服后重发(12_Logic.js:35、:61 构造,09_Net.js:122 `Send_login` 注入)。
- 请求字段(C→S):
| 字段 | 类型 | 说明 |
|------|------|------|
| agentid | string/int | 代理ID |
| gameid | string/int | 游戏ID |
| openid | string | 微信 openid(游客可为空/特殊值) |
| nickname | string | 昵称 |
| avatar | string | 头像 URL |
| sex | int | 性别 0未知/1男/2女 |
| province | string | 省份 |
| city | string | 城市 |
| unionid | string/int | 微信开放平台 unionid |
| version | string | 客户端版本号(GameData.versionCode) |
| channelid | string/int | 渠道ID |
| marketid | string/int | 市场ID |
| ip | string | 客户端IP, `Send_login` 注入 `returnCitySN.ip` ( 09_Net.js:125,仅 returnCitySN 存在时) |
| location | object | 定位对象,`Send_login` 注入 `C_Player.addr` ( 09_Net.js:132,可为 null) |
| machineid | string | 机器标识 `Logic.getMachineId()` ( 09_Net.js:139) |
| machineroom | string | 机房标识 `Utl.getRoomcode()` ( 09_Net.js:140) |
| telphone | string | 绑定手机号,仅 `GameData.sysConfig.deviceLogin` 开启时随 `telphoneAuto:true` 一起携带(12_Logic.js:48-50) |
| telphoneAuto | bool | 设备号自动登录标记,同上条件下=true |
| playerid | int | 可选,本地缓存 playerid( `GameData.loginPlayerid` 开启时由 `Logic.readPlayerId()` 注入,09_Net.js:143-148,用于复用账号) |
- 响应字段(S→C): `state` (int 0成功/非0失败) + 大量字段,分两组:
- **A 组 账号资产**: `roomcard` 、`bean` 、`bank` (仓库星星)、`bankpower` 、`bankpwd` 、`charm` 、`sign` 、`tel` 、`invitecode` 等(06_Player.js:88 `SetMyInfo` 读取,详见 [04-数据结构.md → 登录响应 ](./04-数据结构.md#登录响应-deskloginplayer_login ))。
- **B 组 房间恢复**:在房时附带房间快照(roomcode/seat/players/deskinfo 等),由 `Desk.login` 处理,详见 doc04。
- 源码:发送 `09_Net.js:236` (`Net.Send_login` →`Net._SendData` );接收 `09_Net.js:240` (`Net.player_login` →`Desk.login` )。
- 备注:— (请求侧字段以本表为准;响应数据结构引用 doc04)
### `query_player2` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库转账前查询目标玩家信息。
- 请求字段(C→S): `agentid` 、`playerid` (目标玩家ID)。
- 响应字段(S→C): `avatar` (string)、`nickname` (string)、`playerid` (int);昵称/头像均空时提示"未找到对应玩家"。
- 源码:发送 `09_Net.js:870` ;接收 `09_Net.js:873` →`Desk.query_player2` (`07_Desk.js:1368` )。
- 备注:—
### `binding_phone` · route=agent · C→S 请求 + S→C 响应
- 场景:绑定手机号。
- 请求字段(C→S): `agentid` 、`playerid` 、`phonenum` 、`smmcode` (短信验证码)。
- 响应字段(S→C): `phonenum` (string,回写 `C_Player.tel` )。
- 源码:发送 `09_Net.js:830` ;接收 `09_Net.js:834` →`Desk.binding_phone` (`07_Desk.js:1337` )。
- 备注:—
### `send_phone_checkcode` · route=agent · C→S 请求 + S→C 响应
- 场景:发送手机短信验证码。
- 请求字段(C→S): `agentid` 、`phonenum` (构造点未集中定位,至少含手机号)。
- 响应字段(S→C):无业务字段(`Desk.send_phone_checkcode` 为空实现,07_Desk.js:1342)。
- 源码:发送 `09_Net.js:838` ;接收 `09_Net.js:842` 。
- 备注:⚠️ 请求字段以后端实现为准。
### `send_phone_code_wechat` · route=agent · C→S 请求 + S→C 响应
- 场景:微信渠道发送手机验证码(绑定手机流程的另一入口)。
- 请求字段(C→S): `agentid` 、`phonenum` (唯一调用点 11_GameUI.js:2620-2623 当前被注释,按注释代码为 agentid+phonenum)。
- 响应字段(S→C):无业务字段(`Desk.send_phone_code_wechat` 为空实现,07_Desk.js:1345)。
- 源码:RpcList 定义 `02_Const.js:81` ;发送 `09_Net.js:846` (`Send_send_phone_code_wechat` );接收 `09_Net.js:850` →`Desk.send_phone_code_wechat` (`07_Desk.js:1345` )。
- 备注:⚠️ 框架完整定义并接线,但**当前前端唯一调用点(11_GameUI.js:2623)被注释,实际不发送**;字段以后端实现为准。
### `setSign` · route=agent · C→S 请求 + S→C 响应
- 场景:设置个性签名。
- 请求字段(C→S): `agentid` 、`playerid` 、`sign` 。
- 响应字段(S→C): `sign` (string,回显写入 `C_Player.sign` )。
- 源码:发送 `09_Net.js:736` ;接收 `09_Net.js:740` →`C_Player.setSign` (`06_Player.js:525` )。
- 备注:—
---
## 房间创建 / 进入(大厅侧)
### `create_room` · route=agent · C→S 请求 + S→C 响应
- 场景:玩家创建房间。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`roomtype` (房间类型配置数组,见 doc04); `Send_create_room` 自动注入 `ip` =`C_Player.ip` 、`location` =`C_Player.addr` ( 09_Net.js:106-107)。
- 响应字段(S→C): `state` (0成功)、`roomcode` 、`seat` 、`roomtype` 、`makewar` 、`asetcount` 、`shortcode` 、`infinite` ;失败 `showerror` /`error` 。详见 [04 → 房间响应公共字段 ](./04-数据结构.md#房间创建--进入响应公共字段 )。
- 源码:发送 `09_Net.js:104` ;接收 `09_Net.js:111` →`Desk.create_room` + `Game_Modify.createRoom` 。
- 备注:—
### `self_join_room` · route=agent · C→S 请求 + S→C 响应
- 场景:输入房号 / 快速加入 / H5 唤起 / 进 VIP 配置房。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`roomcode` (房号); `Send_self_join_room` 自动注入 `location` =`C_Player.addr` 、`ip` =`C_Player.ip` ( 09_Net.js:254-255);进 VIP 配置房入口额外带 `vipMatch:1` ( 12_Logic.js:2171);比赛进房入口可带 `match_id` 。
- 响应字段(S→C): `state` 、`roomcode` 、`seat` 、`isowner` 、`players[]` 、`roomtype` 、`makewar` 、`asetcount` 、`deskwar` 、`deskinfo` (重连快照)。详见 [04 → 房间响应公共字段 ](./04-数据结构.md#房间创建--进入响应公共字段 )。
- 源码:发送 `09_Net.js:251` ;接收 `09_Net.js:259` →`Desk.self_join_room` 。
- 备注:—
### `quick_enter_share_room` · route=agent · C→S 请求 + S→C 响应
- 场景:快速进入分享/星星场房间。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`type` (房间类型)、`roomtype` (可选)。
- 响应字段(S→C):走 self_join_room 进房流程(无独立 `Net.quick_enter_share_room` 接收函数,结果通过 self_join_room/show_message 等回包)。
- 源码:发送 `09_Net.js:652` 。
- 备注:⚠️ 无对应接收处理函数,进房结果依赖其它推送。
### `advanced_roomlist` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取 VIP/高级房间列表。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C):房间列表对象,整包写入 `GameData.snrRoomList` 并渲染(07_Desk.js:1176)。
- 源码:发送 `09_Net.js:660` ;接收 `09_Net.js:665` →`Desk.advanced_roomlist` 。
- 备注:—
### `advanced_createroom` · route=agent · C→S 请求 + S→C 响应
- 场景:创建 VIP/高级房间。
- 请求字段(C→S): `agentid` 、`gameid` 、`playerid` 、`tea` (茶水费)、`infinite` (0/1无限局)、`roomtype` 、`videoConfig` (可选)、`rebateLimit` (可选)、`rebateType` (可选)。
- 响应字段(S→C): `tea` 、`rebateLimit` 及房间配置(整包写入 `GameData.snrRoomList` ,并回拉 advanced_roomlist, 07_Desk.js:1180)。
- 源码:发送 `09_Net.js:669` ;接收 `09_Net.js:674` →`Desk.advanced_createroom` 。
- 备注:—
### `get_share_room` · route=agent · C→S 请求 + S→C 响应
- 场景:获取分享/星星场房间列表(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C):房间数组(`Desk.get_share_room` / `Game_Modify.getShareRoom` 处理)。
- 源码:发送 `09_Net.js:641` ( `ConstVal.isGameHall` 为 true 时不发);接收 `09_Net.js:648` 。
- 备注:—
### `getInfoByShortCode` · route=agent · C→S 请求 + S→C 响应
- 场景:按短码批量查询房间信息(VIP 房列表)。
- 请求字段(C→S): `agentid` 、`gameid` 、`shortcodeList` (短码列表)。
- 响应字段(S→C): `roomInfo` (短号房间信息) → `GameUI.setVipRoomListData` ( 07_Desk.js:1284)。
- 源码:发送 `09_Net.js:754` ;接收 `09_Net.js:758` →`Desk.getInfoByShortCode` 。
- 备注:—
### `switchRoomList` · route=agent · C→S 请求 + S→C 响应
- 场景:开关房间在列表中的可见/可进入状态。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`isClose` (0开/1关)。
- 响应字段(S→C): `state` (0成功)、`isClose` ;失败 `error` ( 07_Desk.js:1267)。
- 源码:发送 `09_Net.js:744` ;接收 `09_Net.js:748` →`Desk.switchRoomList` 。
- 备注:—
---
## 战绩 / 排行 / 财富
### `get_player_grade1` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取战绩(类型1)。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`type` (可选)、`direction` (可选,翻页)、`gradeidx` (可选,分页索引)。
- 响应字段(S→C):战绩数据(`gameCombat.get_player_grade1` 渲染)。
- 源码:发送 `09_Net.js:359` ;接收 `09_Net.js:364` 。
- 备注:—
### `get_player_grade2` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取战绩(类型2)。
- 请求字段(C→S):透传调用方 `_data` ,构造点未集中定位;至少含 `agentid` /`playerid` /`gameid` 。
- 响应字段(S→C):战绩数据(`gameCombat.get_player_grade2` 渲染)。
- 源码:发送 `09_Net.js:372` ;接收 `09_Net.js:377` 。
- 备注:⚠️ 请求字段构造点未定位,待核对。
### `get_treasurelist` · route=agent · C→S 请求 + S→C 响应
- 场景:财富榜。
- 请求字段(C→S): `agentid` 、`gameid` 。
- 响应字段(S→C): `list` (排行数组) → `Desk.get_treasurelist` 。
- 源码:发送 `09_Net.js:686` ;接收 `09_Net.js:691` 。
- 备注:—
### `getShortCodeRankList` · route=agent · C→S 请求 + S→C 响应
- 场景:短号场排行榜。
- 请求字段(C→S): `agentid` 、`playerid` 、`shortcode` 。
- 响应字段(S→C):成功为排行数据(整包写入 `GameData.vipRank.data` );失败 `error:true` + `message` ( 07_Desk.js:1311)。
- 源码:发送 `09_Net.js:770` ;接收 `09_Net.js:774` →`Desk.getShortCodeRankList` 。
- 备注:—
### `getVipRankList` · route=agent · C→S 请求 + S→C 响应
- 场景:VIP 排行榜。
- 请求字段(C→S): `agentid` 、`limit` (条数)。
- 响应字段(S→C): `list` (VIP排行数组) → `GameData.rankList` ( 07_Desk.js:1328)。
- 源码:发送 `09_Net.js:788` ;接收 `09_Net.js:792` →`Desk.getVipRankList` 。
- 备注:—
---
## 任务系统
### `get_player_task` · route=agent · C→S 请求 + S→C 响应
- 场景:获取任务列表。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C): `tasks` (任务数组) → `Desk.get_player_task` 。
- 数值兼容:实际回包的 `tasks[].award` 可为数字字符串;原 UI 对 `finish/total` 做算术、对 `state` 用宽松数值比较。新前端在任务列表入库时将这四个字段的数字/十进制数字字符串统一为 number;空值、非数字、非有限值仍报错,state 必须为整数。
- 源码:发送 `09_Net.js:409` ;接收 `09_Net.js:414` 。
- 备注:—
### `player_finish_task` · route=agent · C→S 请求 + S→C 响应
- 场景:上报任务完成(如分享成功触发,06_Player.js:414)。
- 请求字段(C→S): `agentid` 、`playerid` 、`taskid` 。
- 响应字段(S→C): `state` (int)——`state==1` 且当前 `taskstate==0` 时把 `C_Player.taskstate` 置 1( 06_Player.js:476)。
- 源码:发送 `09_Net.js:421` ;接收 `09_Net.js:425` →`C_Player.player_finish_task` (`06_Player.js:474` )。
- 备注:原文档"响应含 `taskstate` "无源码依据,已删除——接收函数仅读 `_msg.data.state` 。
### `get_task_award` · route=agent · C→S 请求 + S→C 响应
- 场景:领取任务奖励。
- 请求字段(C→S): `agentid` 、`playerid` 、`taskid` 。`11_GameUI.js` 的任务领取点击只构造这三个字段,`Net.Send_get_task_award` / `_SendData` 原样发送,不补 `gameid` ( 2026-09-06 源码复核修正)。
- 响应字段(S→C): `taskid` (对应任务 state 置 2=已领取)、`taskstate` (写入 `C_Player.taskstate` )( 06_Player.js:482)。
- 源码:发送 `09_Net.js:429` ;接收 `09_Net.js:435` →`C_Player.get_task_award` 。
- 备注:—
### `refresh_task_state` · route=agent · C→S 请求(发送侧 `Send_can_award`)
- 场景:刷新任务可领取状态。
- 请求字段(C→S):透传 `_data` (构造点未集中定位,至少含 `agentid` /`playerid` )。
- 响应字段(S→C):服务器推送 `can_award` (见下条)。
- 源码:发送 `09_Net.js:440` (`Net.Send_can_award` )。
- 备注:⚠️ 发送函数名为 `Send_can_award` ,但**实际发出的 rpc 是 `"refresh_task_state"` **(硬编码字面量,**不在 RpcList**)。文档以实际 rpc 名为准。
### `can_award` · route=agent · S→C 推送
- 场景:服务器通知有任务可领取。
- 请求字段:无(纯推送)。
- 推送字段(S→C):任务可领取标记(载荷字段待后端确认)。
- 源码:接收 `09_Net.js:444` (`Net.can_award` )→ 调 `C_Player.can_award(_msg)` (`09_Net.js:445` )。
- 备注:🐛 `06_Player.js` **未定义 ** `Player.prototype.can_award` (全文无此方法)。推送一旦到达,`C_Player.can_award` 为 undefined,调用即抛 TypeError。当前为 bug,不可当正常协议使用。
---
## 支付 / 充值 / 资产
### `get_paylist` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取支付项列表。
- 请求字段(C→S): `agentid` 。
- 响应字段(S→C): `paylist` (支付项数组) → `GameData.payList` ,并打开支付界面(09_Net.js:567)。
- 源码:发送 `09_Net.js:562` ;接收 `09_Net.js:567` 。
- 备注:—
### `pay_succ` · route=agent · C→S 请求(经 HTTP)
- 场景:支付成功后通知服务器入账。
- 请求字段(C→S): `agentid` 、`playerid` 、`channelid` 、`productid` 、`payid` 、`amount` 、`money` 、`paytype` ( 05_Func.js:2240-2254 构造)。
- 响应字段(S→C):无显式 WS 回包;资产变化通过 `update_bean` /`update_roomcard` 推送(充房卡场景前端还会本地 `UpdateRoomcard` , 05_Func.js:2263)。
- 源码:WS 发送函数 `Net.Send_pay_succ` (`09_Net.js:573` ) **被注释 ** ( 05_Func.js:2249、:3199);实际改用 `Func.AjaxHttp` 以同样的 `{app,route:agent,rpc:pay_succ,data}` 信封走 **HTTP ** 提交(05_Func.js:2250-2255、:3200-3205)。
- 备注:⚠️ WebSocket 通道当前不发;该包以 HTTP POST 形式上行,rpc 名仍为 `pay_succ` ,待后端确认接收端一致。
### `topup_card` · route=agent · C→S 请求 + S→C 响应
- 场景:充值卡兑换。
- 请求字段(C→S): `agentid` 、`playerid` 、`cardno` (卡号)。
- 响应字段(S→C): `Desk.topup_card` 为空实现(07_Desk.js:1365),资产变化经 update_bean/update_roomcard 推送。
- 源码:发送 `09_Net.js:863` ;接收 `09_Net.js:867` 。
- 备注:—
### `giveCoin` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库面板向他人转账豆豆/金币。
- 请求字段(C→S): `agentid` 、`playerid` (转出)、`toPlayerid` (转入目标ID)、`gameid` 、`count` (数量)、`password` (仓库密码)( 11_GameUI.js:2132-2139)。
- 响应字段(S→C): `state` (0成功)、`star2` (转出后**仓库星星**数 → `setWareHouseStarCOunt` , **非豆豆**);失败 `showerror` /`error` ( 07_Desk.js:1381)。
- 源码:发送 `09_Net.js:876` ;接收 `09_Net.js:879` →`Desk.giveCoin` 。
- 备注:响应 `star2` 为仓库星星数,注意区别于豆豆余额。
---
## 仓库 / 星星 / 魅力
### `set_bankpwd` · route=agent · C→S 请求 + S→C 响应
- 场景:设置仓库密码。
- 请求字段(C→S): `agentid` 、`playerid` 、`unionid` 、`password` 。
- 响应字段(S→C): `state` (0成功)、`password` ;失败 `showerror` /`error` ( 07_Desk.js:1228)。
- 源码:发送 `09_Net.js:697` ;接收 `09_Net.js:701` →`Desk.set_bankpwd` 。
- 备注:—
### `change_star` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库存/取(豆豆 ↔ 仓库星星)。
- 请求字段(C→S): `agentid` 、`playerid` 、`mode` (0存入/1取出,源码 `safeInputType-1` )、`password` (仓库密码,字符串)、`count` (数量)( 11_GameUI.js:2065-2069 调用点齐全携带此 5 字段)。
- 响应字段(S→C): `state` (0成功)、`star1` (更新后豆豆余额 → `update_bean2` )、`star2` (更新后仓库星星数 → `setWareHouseStarCOunt` )、`msg` (可选提示)、`count` (可选,回填安全输入);失败 `showerror` /`error` ( 07_Desk.js:1238)。
- 源码:发送 `09_Net.js:707` ;接收 `09_Net.js:711` →`Desk.change_star` 。
- 备注:原审计疑虑"`mode` /`password` 未见"——经核对仓库存/取调用点(11_GameUI.js:2068-2069) **确含** `mode` 与 `password` ,文档正确,疑虑解除。审计提到的"agentid/playerid/toPlayerid/gameid/count"实为相邻的 `giveCoin` 转账包(11_GameUI.js:2132-2139),并非本 rpc。
### `update_charm` · route=agent · S→C 推送
- 场景:座位魅力值更新。
- 请求字段:`Net.Send_update_charm` (`09_Net.js:727` ) 已定义但**无任何调用点**;实际只作服务器→客户端推送。
- 推送字段(S→C): `seatlist` :[ {`seat` (int), `charm` (number)} ]( 07_Desk.js:1260 遍历 setCharm)。
- 源码:接收 `09_Net.js:731` →`Desk.update_charm` (`07_Desk.js:1260` )。
- 备注:—
### `setAllCharm` · route=agent · C→S 请求 + S→C 响应
- 场景:批量设置总魅力。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`value` (11_GameUI.js:1269-1275)。
- 响应字段(S→C):无显式业务字段,`Desk.setAllCharm` 仅本地存储并提示成功(07_Desk.js:1321)。
- 源码:发送 `09_Net.js:779` ;接收 `09_Net.js:783` →`Desk.setAllCharm` 。
- 备注:—
---
## 邀请码 / 绑定
### `binding_invitecode` · route=agent · C→S 请求 + S→C 响应
- 场景:绑定邀请码。
- 请求字段(C→S): `agentid` 、`playerid` 、`invitecode` ( 11_GameUI.js:1367-1369)。
- 响应字段(S→C): `state` (0 成功时写入 `invitecode` ) 、`invitecode` 、`error` (提示文案)( 06_Player.js:251) 。
- 源码:发送 `09_Net.js:587` ;接收 `09_Net.js:592` →`C_Player.binding_invitecode` 。
- 备注:—
### `get_player_invitecode` · route=agent · C→S 请求 + S→C 响应
- 场景:获取自己的邀请码(打开绑定界面)。
- 请求字段(C→S): `agentid` 、`playerid` 、`unionid` 、`openid` ( 11_GameUI.js:1378-1382)。
- 响应字段(S→C): `invitecode` (string) → `C_Player.setInvitecod` 并打开绑定界面(09_Net.js:607)。
- 源码:发送 `09_Net.js:603` ;接收 `09_Net.js:607` →`Net.get_player_invitecode` 。
- 备注:修正原文档——请求字段为 `agentid/playerid/unionid/openid` , **无 `gameid` **,新增 `unionid` /`openid` ( 11_GameUI.js:1378)。
---
## VIP 管理 / 黑白名单
### `optBanList` · route=agent · C→S 请求 + S→C 响应
- 场景:黑名单查看/添加/移除(多入口)。
- 请求字段(C→S):随入口不同,公共字段 `agentid` 、`playerid` 、`type` :
- `type=1` 查看黑名单列表(agentid/playerid/type, 11_GameUI.js:2401-2405)
- `type=3` 按 ID 添加(agentid/playerid/optId/type, 11_GameUI.js:2376-2381)
- `type=4` 按 ID 移除(agentid/playerid/optId/type, 11_GameUI.js:2389-2394 及列表项删除 2453-2458)
- `type=6` 一键全部添加(agentid/playerid/type, 11_GameUI.js:1262-1267)
- 另有带 `breakRoom` (0/1) 与 `gameid` 的 `type=3` 添加入口(agentid/gameid/playerid/optId/breakRoom/type, 11_GameUI.js:2417-2428; breakRoom 由 `GameData.blackList.breakRoom` 决定,开关在 case 3260)
- 服务器响应中亦见 `type=5` (另一种列表返回,07_Desk.js:1299)
- 响应字段(S→C): `type` (1/3/4/5/6)、`banList` (黑名单数组)、`message` (可选提示)( 07_Desk.js:1289)。
- 源码:发送 `09_Net.js:762` ;接收 `09_Net.js:766` →`Desk.optBanList` 。
- 备注:—
### `getPlayerWhiteList` · route=agent · C→S 请求 + S→C 响应
- 场景:获取白名单。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C): `whiteList` (数组) → `GameData.whiteList.data` ( 07_Desk.js:1412)。
- 源码:发送 `09_Net.js:882` ;接收 `09_Net.js:886` →`Desk.getPlayerWhiteList` 。
- 备注:—
### `optWhiteList` · route=agent · C→S 请求 + S→C 响应
- 场景:白名单添加/修改/删除。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`shortcode` 、`mode` 、`userid` (目标ID):
- `mode=1` 添加/修改,并带 `value` (设置的魅力值)
- `mode=2` 删除(仅 `userid` )
- 响应字段(S→C): `whiteList` (更新后数组)、`mode` (可选)、`message` (可选提示)( 07_Desk.js:1398)。
- 源码:发送 `09_Net.js:890` ;接收 `09_Net.js:894` →`Desk.optWhiteList` 。
- 备注:—
### `setVipForbidSelect` · route=agent · C→S 请求 + S→C 响应
- 场景:VIP 房禁止玩家选桌开关。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`forbidSelect` (1开/0关,11_GameUI.js:2631-2639)。
- 响应字段(S→C): `state` (0成功)、`forbidSelect` (1开/0关);失败 `error` ( 07_Desk.js:1348)。
- 源码:发送 `09_Net.js:855` ;接收 `09_Net.js:859` →`Desk.setVipForbidSelect` 。
- 备注:—
---
## 其它 agent 协议
### `submit_opinion` · route=agent · C→S 请求 + S→C 响应
- 场景:提交反馈/意见。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`content` 。
- 响应字段(S→C): `state` (0成功)( 07_Desk.js:1100)。
- 源码:发送 `09_Net.js:547` ;接收 `09_Net.js:551` →`Desk.submit_opinion` 。
- 备注:—
### `submit_location` · route=agent · C→S 请求 + S→C 响应
- 场景:提交定位信息(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`info` (定位对象)。
- 响应字段(S→C):经 `Game.submit_location` 处理(09_Net.js:583)。
- 源码:发送 `09_Net.js:577` ( `ConstVal.isGameHall` 为 true 时不发);接收 `09_Net.js:583` 。
- 备注:—
### `submit_phoneinfo` · route=agent · C→S 请求(无响应处理)
- 场景:提交手机/通讯录信息(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`info` { `phoneInfo` (手机信息), `addrBook` (通讯录) }。
- 响应字段(S→C): `Net.submit_phoneinfo` 接收函数为空实现(09_Net.js:722)。
- 源码:发送 `09_Net.js:717` ;接收 `09_Net.js:722` 。
- 备注:—
### `submit_error` / `submit_log` · route=agent · C→S 上行(硬编码包)
- 场景:上报前端异常/日志。异常捕获时(12_Logic.js:270)、获取 HTML 失败(12_Logic.js:1990/2009/2014)、收到踢下线包(07_Desk.js:963)等处调用。
- 请求字段(C→S): `packet` (出错数据包字符串)、`msg` (错误/堆栈信息)、`playerid` 、`agentid` 、`gameid` ( 09_Net.js:66-72)。
- 响应字段(S→C):服务器若回 rpc `"submit_error"` ,前端在分发处直接 `return` 忽略(12_Logic.js:235)。
- 源码:发送 `Net.submit_error` (`09_Net.js:55` ) / `Net.submit_log` (`09_Net.js:81` )。
- 备注:均为**硬编码** `route:"agent", rpc:"submit_error"` ,不经 `Send_*` /RpcList。注意 `Net.submit_log` (`09_Net.js:81` ) 实际发出的 rpc 同样是 `"submit_error"` (与 submit_error 同包结构)。两者带去重:`submit_error` 对相同 `msg` 只发一次(09_Net.js:57-61),`submit_log` 不去重。
### `kick_server` · route=agent · C→S 请求 + S→C 推送
- 场景:管理端踢出玩家 / 被踢下线弹窗。
- 请求字段(C→S): `agentid` 等(构造点未集中定位)。
- 推送字段(S→C): `msg` (踢出提示) → `GameUI.OpenKick` ( 07_Desk.js:1108)。
- 源码:发送 `09_Net.js:555` ;接收 `09_Net.js:558` →`Desk.kick_server` 。
- 备注:⚠️ 请求字段待补。
### `broadcast` · route=agent · C→S 请求 + S→C 推送
- 场景:广播消息/滚动公告(主要为服务器推送)。
- 请求字段(C→S): `agentid` 等(`Send_broadcast` 存在,09_Net.js:530)。
- 推送字段(S→C): `msgtype` (0消息框/1滚动公告,可选,缺省 0)、`msgcontent` (内容)( 07_Desk.js:1112)。
- 源码:发送 `09_Net.js:530` ;接收 `09_Net.js:534` →`Desk.broadcast` 。
- 备注:—
### `connect_agentserver` · route=agent · 双向(切服)
- 场景:切换到大厅服务器。
- 请求字段(C→S): `Send_connect_agentserver` (`09_Net.js:515` ) 透传 `_data` (切服时使用)。
- 推送字段(S→C): `agentserver` (新大厅服地址)、`opt` (切换原因,如 `other_break_room` /`free_room` )( 09_Net.js:518)。
- 源码:发送 `09_Net.js:515` ;接收 `09_Net.js:518` →`Net.connect_agentserver` (关闭当前连接并重连新地址)。
- 备注:—
### `playerBehavior` · route=agent(实际走 HTTP GET)
- 场景:玩家行为埋点。
- 请求字段:原 WS 路径(agentid/gameid/playerid/tag) **被注释**( 09_Net.js:799-806),实际改走独立 HTTP GET 上报 `http://test3.1888day.com/api/gamedo/gamedo?agentid=&gameid=&playerid=&tag=` ( 09_Net.js:807-815)。
- 响应字段(S→C): HTTP 回调 `playerBehavior_Succ` /`_Fail` ( 09_Net.js:818/822);WS 接收函数 `Net.playerBehavior` (`09_Net.js:826` ) 当前无触发。
- 源码:发送 `09_Net.js:797` (`Send_playerBehavior` )。
- 备注:**非 WebSocket 协议**, RpcList 中虽有定义,实际不走 agent 路由。
---
## 仅接收的 agent 推送(无对应主动请求)
| rpc | 推送 data 字段 | 说明 | 接收源码 |
|-----|---------------|------|---------|
| `update_roomcard` | `roomcard` 、`text` (可选) | 房卡变化(仅 `change` 未定义时更新,09_Net.js:383→06_Player.js:141) | 09_Net.js:383 |
| `update_bean` | `bean` 、`change` (可选)、`seat` (可选)、`type` (可选)、`text` | 豆豆变化(09_Net.js:598→Desk.update_bean, 07_Desk.js:1201) | 09_Net.js:598 |
| `can_award` | 任务可领取标记 | 🐛 接收即抛异常,见上文 任务系统 章 | 09_Net.js:444 |
| `kick_offline` | `fromOther` (可选)、`gameid` (可选) | 被踢下线,弹 OpenKick;同时本地 `Net.submit_error` 上报"收到踢下线包"( 07_Desk.js:945-963) | 09_Net.js:448 |
| `show_message` | `msg` 、`time` | 通用消息提示 → `GameUI.OpenTips` ( 07_Desk.js:1173) | 09_Net.js:656 |
# 02 · 平台层协议 — agent 路由(大厅服务器)
> 信封:`{ app:"youle", route:"agent", rpc:"<下列名称>", data:{...} }`
> 本篇覆盖 **route=agent 的全部平台层数据包**(双向)。每个 rpc 给出 C→S 请求字段与 S→C 响应/推送字段。子游戏对局包(route=room)不在此篇。
> 通用身份字段:`agentid`(代理ID)、`gameid`(游戏ID)、`playerid`(玩家ID)。多数请求由各调用点手工拼装,未必三者齐全,下文逐条标注实际字段。
> 统一条目格式:
> > `rpc名` · route=agent · <方向>
> > 场景 / 请求字段(C→S) / 响应或推送字段(S→C) / 源码 发送·接收 / 备注(⚠️待后端确认,🐛源码 bug)
---
## 登录 / 账号
### `player_login` · route=agent · C→S 请求 + S→C 响应
- 接收路由补充(2026-09-06 实包核对):C→S 仍为 `agent/player_login` ; S→C 可以是 `agent` 、`room` 或 `platform` 下的 `player_login` 。原工程 `12_Logic.js:238-260` 按 rpc 解除登录等待,再把这三类平台路由交给 `Net[rpc]` 。已实测短信验证码失败为 `room/player_login` , data 为 `{msg:"短信验证码不正确",state:-1,time:0}` ;必须解除等待并交给登录失败处理,不能因响应 route 与发包 route 不同而忽略。
- 场景:连接建立后 `onopen` 自动发送;断线重连、切服后重发(12_Logic.js:35、:61 构造,09_Net.js:122 `Send_login` 注入)。
- 请求字段(C→S):
| 字段 | 类型 | 说明 |
|------|------|------|
| agentid | string/int | 代理ID |
| gameid | string/int | 游戏ID |
| openid | string | 微信 openid(游客可为空/特殊值) |
| nickname | string | 昵称 |
| avatar | string | 头像 URL |
| sex | int | 性别 0未知/1男/2女 |
| province | string | 省份 |
| city | string | 城市 |
| unionid | string/int | 微信开放平台 unionid |
| version | string | 客户端版本号(GameData.versionCode) |
| channelid | string/int | 渠道ID |
| marketid | string/int | 市场ID |
| ip | string | 客户端IP, `Send_login` 注入 `returnCitySN.ip` ( 09_Net.js:125,仅 returnCitySN 存在时) |
| location | object | 定位对象,`Send_login` 注入 `C_Player.addr` ( 09_Net.js:132,可为 null) |
| machineid | string | 机器标识 `Logic.getMachineId()` ( 09_Net.js:139) |
| machineroom | string | 机房标识 `Utl.getRoomcode()` ( 09_Net.js:140) |
| telphone | string | 绑定手机号,仅 `GameData.sysConfig.deviceLogin` 开启时随 `telphoneAuto:true` 一起携带(12_Logic.js:48-50) |
| telphoneAuto | bool | 设备号自动登录标记,同上条件下=true |
| playerid | int | 可选,本地缓存 playerid( `GameData.loginPlayerid` 开启时由 `Logic.readPlayerId()` 注入,09_Net.js:143-148,用于复用账号) |
- 响应字段(S→C): `state` (int 0成功/非0失败) + 大量字段,分两组:
- **A 组 账号资产**: `roomcard` 、`bean` 、`bank` (仓库星星)、`bankpower` 、`bankpwd` 、`charm` 、`sign` 、`tel` 、`invitecode` 等(06_Player.js:88 `SetMyInfo` 读取,详见 [04-数据结构.md → 登录响应 ](./04-数据结构.md#登录响应-deskloginplayer_login ))。
- **B 组 房间恢复**:在房时附带房间快照(roomcode/seat/players/deskinfo 等),由 `Desk.login` 处理,详见 doc04。
- 源码:发送 `09_Net.js:236` (`Net.Send_login` →`Net._SendData` );接收 `09_Net.js:240` (`Net.player_login` →`Desk.login` )。
- 备注:— (请求侧字段以本表为准;响应数据结构引用 doc04)
### `query_player2` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库转账前查询目标玩家信息。
- 请求字段(C→S): `agentid` 、`playerid` (目标玩家ID)。
- 响应字段(S→C): `avatar` (string)、`nickname` (string)、`playerid` (int);昵称/头像均空时提示"未找到对应玩家"。
- 源码:发送 `09_Net.js:870` ;接收 `09_Net.js:873` →`Desk.query_player2` (`07_Desk.js:1368` )。
- 备注:—
### `binding_phone` · route=agent · C→S 请求 + S→C 响应
- 场景:绑定手机号。
- 请求字段(C→S): `agentid` 、`playerid` 、`phonenum` 、`smmcode` (短信验证码)。
- 响应字段(S→C): `phonenum` (string,回写 `C_Player.tel` )。
- 源码:发送 `09_Net.js:830` ;接收 `09_Net.js:834` →`Desk.binding_phone` (`07_Desk.js:1337` )。
- 备注:—
### `send_phone_checkcode` · route=agent · C→S 请求 + S→C 响应
- 场景:发送手机短信验证码。
- 请求字段(C→S): `agentid` 、`phonenum` (构造点未集中定位,至少含手机号)。
- 响应字段(S→C):无业务字段(`Desk.send_phone_checkcode` 为空实现,07_Desk.js:1342)。
- 源码:发送 `09_Net.js:838` ;接收 `09_Net.js:842` 。
- 备注:⚠️ 请求字段以后端实现为准。
### `send_phone_code_wechat` · route=agent · C→S 请求 + S→C 响应
- 场景:微信渠道发送手机验证码(绑定手机流程的另一入口)。
- 请求字段(C→S): `agentid` 、`phonenum` (唯一调用点 11_GameUI.js:2620-2623 当前被注释,按注释代码为 agentid+phonenum)。
- 响应字段(S→C):无业务字段(`Desk.send_phone_code_wechat` 为空实现,07_Desk.js:1345)。
- 源码:RpcList 定义 `02_Const.js:81` ;发送 `09_Net.js:846` (`Send_send_phone_code_wechat` );接收 `09_Net.js:850` →`Desk.send_phone_code_wechat` (`07_Desk.js:1345` )。
- 备注:⚠️ 框架完整定义并接线,但**当前前端唯一调用点(11_GameUI.js:2623)被注释,实际不发送**;字段以后端实现为准。
### `setSign` · route=agent · C→S 请求 + S→C 响应
- 场景:设置个性签名。
- 请求字段(C→S): `agentid` 、`playerid` 、`sign` 。
- 响应字段(S→C): `sign` (string,回显写入 `C_Player.sign` )。
- 源码:发送 `09_Net.js:736` ;接收 `09_Net.js:740` →`C_Player.setSign` (`06_Player.js:525` )。
- 备注:—
---
## 房间创建 / 进入(大厅侧)
### `create_room` · route=agent · C→S 请求 + S→C 响应
- 场景:玩家创建房间。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`roomtype` (房间类型配置数组,见 doc04); `Send_create_room` 自动注入 `ip` =`C_Player.ip` 、`location` =`C_Player.addr` ( 09_Net.js:106-107)。
- 响应字段(S→C): `state` (0成功)、`roomcode` 、`seat` 、`roomtype` 、`makewar` 、`asetcount` 、`shortcode` 、`infinite` ;失败 `showerror` /`error` 。详见 [04 → 房间响应公共字段 ](./04-数据结构.md#房间创建--进入响应公共字段 )。
- 源码:发送 `09_Net.js:104` ;接收 `09_Net.js:111` →`Desk.create_room` + `Game_Modify.createRoom` 。
- 备注:—
### `self_join_room` · route=agent · C→S 请求 + S→C 响应
- 场景:输入房号 / 快速加入 / H5 唤起 / 进 VIP 配置房。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`roomcode` (房号); `Send_self_join_room` 自动注入 `location` =`C_Player.addr` 、`ip` =`C_Player.ip` ( 09_Net.js:254-255);进 VIP 配置房入口额外带 `vipMatch:1` ( 12_Logic.js:2171);比赛进房入口可带 `match_id` 。
- 响应字段(S→C): `state` 、`roomcode` 、`seat` 、`isowner` 、`players[]` 、`roomtype` 、`makewar` 、`asetcount` 、`deskwar` 、`deskinfo` (重连快照)。详见 [04 → 房间响应公共字段 ](./04-数据结构.md#房间创建--进入响应公共字段 )。
- 源码:发送 `09_Net.js:251` ;接收 `09_Net.js:259` →`Desk.self_join_room` 。
- 备注:—
### `quick_enter_share_room` · route=agent · C→S 请求 + S→C 响应
- 场景:快速进入分享/星星场房间。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`type` (房间类型)、`roomtype` (可选)。
- 响应字段(S→C):走 self_join_room 进房流程(无独立 `Net.quick_enter_share_room` 接收函数,结果通过 self_join_room/show_message 等回包)。
- 源码:发送 `09_Net.js:652` 。
- 备注:⚠️ 无对应接收处理函数,进房结果依赖其它推送。
### `advanced_roomlist` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取 VIP/高级房间列表。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C):房间列表对象,整包写入 `GameData.snrRoomList` 并渲染(07_Desk.js:1176)。
- 源码:发送 `09_Net.js:660` ;接收 `09_Net.js:665` →`Desk.advanced_roomlist` 。
- 备注:—
### `advanced_createroom` · route=agent · C→S 请求 + S→C 响应
- 场景:创建 VIP/高级房间。
- 请求字段(C→S): `agentid` 、`gameid` 、`playerid` 、`tea` (茶水费)、`infinite` (0/1无限局)、`roomtype` 、`videoConfig` (可选)、`rebateLimit` (可选)、`rebateType` (可选)。
- 响应字段(S→C): `tea` 、`rebateLimit` 及房间配置(整包写入 `GameData.snrRoomList` ,并回拉 advanced_roomlist, 07_Desk.js:1180)。
- 源码:发送 `09_Net.js:669` ;接收 `09_Net.js:674` →`Desk.advanced_createroom` 。
- 备注:—
### `get_share_room` · route=agent · C→S 请求 + S→C 响应
- 场景:获取分享/星星场房间列表(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C):房间数组(`Desk.get_share_room` / `Game_Modify.getShareRoom` 处理)。
- 源码:发送 `09_Net.js:641` ( `ConstVal.isGameHall` 为 true 时不发);接收 `09_Net.js:648` 。
- 备注:—
### `getInfoByShortCode` · route=agent · C→S 请求 + S→C 响应
- 场景:按短码批量查询房间信息(VIP 房列表)。
- 请求字段(C→S): `agentid` 、`gameid` 、`shortcodeList` (短码列表)。
- 响应字段(S→C): `roomInfo` (短号房间信息) → `GameUI.setVipRoomListData` ( 07_Desk.js:1284)。
- 源码:发送 `09_Net.js:754` ;接收 `09_Net.js:758` →`Desk.getInfoByShortCode` 。
- 备注:—
### `switchRoomList` · route=agent · C→S 请求 + S→C 响应
- 场景:开关房间在列表中的可见/可进入状态。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`isClose` (0开/1关)。
- 响应字段(S→C): `state` (0成功)、`isClose` ;失败 `error` ( 07_Desk.js:1267)。
- 源码:发送 `09_Net.js:744` ;接收 `09_Net.js:748` →`Desk.switchRoomList` 。
- 备注:—
---
## 战绩 / 排行 / 财富
### `get_player_grade1` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取战绩(类型1)。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`type` (可选)、`direction` (可选,翻页)、`gradeidx` (可选,分页索引)。
- 响应字段(S→C):战绩数据(`gameCombat.get_player_grade1` 渲染)。
- 源码:发送 `09_Net.js:359` ;接收 `09_Net.js:364` 。
- 备注:—
### `get_player_grade2` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取战绩(类型2)。
- 请求字段(C→S):透传调用方 `_data` ,构造点未集中定位;至少含 `agentid` /`playerid` /`gameid` 。
- 响应字段(S→C):战绩数据(`gameCombat.get_player_grade2` 渲染)。
- 源码:发送 `09_Net.js:372` ;接收 `09_Net.js:377` 。
- 备注:⚠️ 请求字段构造点未定位,待核对。
### `get_treasurelist` · route=agent · C→S 请求 + S→C 响应
- 场景:财富榜。
- 请求字段(C→S): `agentid` 、`gameid` 。
- 响应字段(S→C): `list` (排行数组) → `Desk.get_treasurelist` 。
- 源码:发送 `09_Net.js:686` ;接收 `09_Net.js:691` 。
- 备注:—
### `getShortCodeRankList` · route=agent · C→S 请求 + S→C 响应
- 场景:短号场排行榜。
- 请求字段(C→S): `agentid` 、`playerid` 、`shortcode` 。
- 响应字段(S→C):成功为排行数据(整包写入 `GameData.vipRank.data` );失败 `error:true` + `message` ( 07_Desk.js:1311)。
- 源码:发送 `09_Net.js:770` ;接收 `09_Net.js:774` →`Desk.getShortCodeRankList` 。
- 备注:—
### `getVipRankList` · route=agent · C→S 请求 + S→C 响应
- 场景:VIP 排行榜。
- 请求字段(C→S): `agentid` 、`limit` (条数)。
- 响应字段(S→C): `list` (VIP排行数组) → `GameData.rankList` ( 07_Desk.js:1328)。
- 源码:发送 `09_Net.js:788` ;接收 `09_Net.js:792` →`Desk.getVipRankList` 。
- 备注:—
---
## 任务系统
### `get_player_task` · route=agent · C→S 请求 + S→C 响应
- 场景:获取任务列表。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C): `tasks` (任务数组) → `Desk.get_player_task` 。
- 数值兼容:实际回包的 `tasks[].award` 可为数字字符串;原 UI 对 `finish/total` 做算术、对 `state` 用宽松数值比较。新前端在任务列表入库时将这四个字段的数字/十进制数字字符串统一为 number;空值、非数字、非有限值仍报错,state 必须为整数。
- 源码:发送 `09_Net.js:409` ;接收 `09_Net.js:414` 。
- 备注:—
### `player_finish_task` · route=agent · C→S 请求 + S→C 响应
- 场景:上报任务完成(如分享成功触发,06_Player.js:414)。
- 请求字段(C→S): `agentid` 、`playerid` 、`taskid` 。
- 响应字段(S→C): `state` (int)——`state==1` 且当前 `taskstate==0` 时把 `C_Player.taskstate` 置 1( 06_Player.js:476)。
- 源码:发送 `09_Net.js:421` ;接收 `09_Net.js:425` →`C_Player.player_finish_task` (`06_Player.js:474` )。
- 备注:原文档"响应含 `taskstate` "无源码依据,已删除——接收函数仅读 `_msg.data.state` 。
### `get_task_award` · route=agent · C→S 请求 + S→C 响应
- 场景:领取任务奖励。
- 请求字段(C→S): `agentid` 、`playerid` 、`taskid` 。`11_GameUI.js` 的任务领取点击只构造这三个字段,`Net.Send_get_task_award` / `_SendData` 原样发送,不补 `gameid` ( 2026-09-06 源码复核修正)。
- 响应字段(S→C): `taskid` (对应任务 state 置 2=已领取)、`taskstate` (写入 `C_Player.taskstate` )( 06_Player.js:482)。
- 源码:发送 `09_Net.js:429` ;接收 `09_Net.js:435` →`C_Player.get_task_award` 。
- 备注:—
### `refresh_task_state` · route=agent · C→S 请求(发送侧 `Send_can_award`)
- 场景:刷新任务可领取状态。
- 请求字段(C→S):透传 `_data` (构造点未集中定位,至少含 `agentid` /`playerid` )。
- 响应字段(S→C):服务器推送 `can_award` (见下条)。
- 源码:发送 `09_Net.js:440` (`Net.Send_can_award` )。
- 备注:⚠️ 发送函数名为 `Send_can_award` ,但**实际发出的 rpc 是 `"refresh_task_state"` **(硬编码字面量,**不在 RpcList**)。文档以实际 rpc 名为准。
### `can_award` · route=agent · S→C 推送
- 场景:服务器通知有任务可领取。
- 请求字段:无(纯推送)。
- 推送字段(S→C):任务可领取标记(载荷字段待后端确认)。
- 源码:接收 `09_Net.js:444` (`Net.can_award` )→ 调 `C_Player.can_award(_msg)` (`09_Net.js:445` )。
- 备注:🐛 `06_Player.js` **未定义 ** `Player.prototype.can_award` (全文无此方法)。推送一旦到达,`C_Player.can_award` 为 undefined,调用即抛 TypeError。当前为 bug,不可当正常协议使用。
---
## 支付 / 充值 / 资产
### `get_paylist` · route=agent · C→S 请求 + S→C 响应
- 场景:拉取支付项列表。
- 请求字段(C→S): `agentid` 。
- 响应字段(S→C): `paylist` (支付项数组) → `GameData.payList` ,并打开支付界面(09_Net.js:567)。
- 源码:发送 `09_Net.js:562` ;接收 `09_Net.js:567` 。
- 备注:—
### `pay_succ` · route=agent · C→S 请求(经 HTTP)
- 场景:支付成功后通知服务器入账。
- 请求字段(C→S): `agentid` 、`playerid` 、`channelid` 、`productid` 、`payid` 、`amount` 、`money` 、`paytype` ( 05_Func.js:2240-2254 构造)。
- 响应字段(S→C):无显式 WS 回包;资产变化通过 `update_bean` /`update_roomcard` 推送(充房卡场景前端还会本地 `UpdateRoomcard` , 05_Func.js:2263)。
- 源码:WS 发送函数 `Net.Send_pay_succ` (`09_Net.js:573` ) **被注释 ** ( 05_Func.js:2249、:3199);实际改用 `Func.AjaxHttp` 以同样的 `{app,route:agent,rpc:pay_succ,data}` 信封走 **HTTP ** 提交(05_Func.js:2250-2255、:3200-3205)。
- 备注:⚠️ WebSocket 通道当前不发;该包以 HTTP POST 形式上行,rpc 名仍为 `pay_succ` ,待后端确认接收端一致。
### `topup_card` · route=agent · C→S 请求 + S→C 响应
- 场景:充值卡兑换。
- 请求字段(C→S): `agentid` 、`playerid` 、`cardno` (卡号)。
- 响应字段(S→C): `Desk.topup_card` 为空实现(07_Desk.js:1365),资产变化经 update_bean/update_roomcard 推送。
- 源码:发送 `09_Net.js:863` ;接收 `09_Net.js:867` 。
- 备注:—
### `giveCoin` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库面板向他人转账豆豆/金币。
- 请求字段(C→S): `agentid` 、`playerid` (转出)、`toPlayerid` (转入目标ID)、`gameid` 、`count` (数量)、`password` (仓库密码)( 11_GameUI.js:2132-2139)。
- 响应字段(S→C): `state` (0成功)、`star2` (转出后**仓库星星**数 → `setWareHouseStarCOunt` , **非豆豆**);失败 `showerror` /`error` ( 07_Desk.js:1381)。
- 源码:发送 `09_Net.js:876` ;接收 `09_Net.js:879` →`Desk.giveCoin` 。
- 备注:响应 `star2` 为仓库星星数,注意区别于豆豆余额。
---
## 仓库 / 星星 / 魅力
### `set_bankpwd` · route=agent · C→S 请求 + S→C 响应
- 场景:设置仓库密码。
- 请求字段(C→S): `agentid` 、`playerid` 、`unionid` 、`password` 。
- 响应字段(S→C): `state` (0成功)、`password` ;失败 `showerror` /`error` ( 07_Desk.js:1228)。
- 源码:发送 `09_Net.js:697` ;接收 `09_Net.js:701` →`Desk.set_bankpwd` 。
- 备注:—
### `change_star` · route=agent · C→S 请求 + S→C 响应
- 场景:仓库存/取(豆豆 ↔ 仓库星星)。
- 请求字段(C→S): `agentid` 、`playerid` 、`mode` (0存入/1取出,源码 `safeInputType-1` )、`password` (仓库密码,字符串)、`count` (数量)( 11_GameUI.js:2065-2069 调用点齐全携带此 5 字段)。
- 响应字段(S→C): `state` (0成功)、`star1` (更新后豆豆余额 → `update_bean2` )、`star2` (更新后仓库星星数 → `setWareHouseStarCOunt` )、`msg` (可选提示)、`count` (可选,回填安全输入);失败 `showerror` /`error` ( 07_Desk.js:1238)。
- 源码:发送 `09_Net.js:707` ;接收 `09_Net.js:711` →`Desk.change_star` 。
- 备注:原审计疑虑"`mode` /`password` 未见"——经核对仓库存/取调用点(11_GameUI.js:2068-2069) **确含** `mode` 与 `password` ,文档正确,疑虑解除。审计提到的"agentid/playerid/toPlayerid/gameid/count"实为相邻的 `giveCoin` 转账包(11_GameUI.js:2132-2139),并非本 rpc。
### `update_charm` · route=agent · S→C 推送
- 场景:座位魅力值更新。
- 请求字段:`Net.Send_update_charm` (`09_Net.js:727` ) 已定义但**无任何调用点**;实际只作服务器→客户端推送。
- 推送字段(S→C): `seatlist` :[ {`seat` (int), `charm` (number)} ]( 07_Desk.js:1260 遍历 setCharm)。
- 源码:接收 `09_Net.js:731` →`Desk.update_charm` (`07_Desk.js:1260` )。
- 备注:—
### `setAllCharm` · route=agent · C→S 请求 + S→C 响应
- 场景:批量设置总魅力。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`value` (11_GameUI.js:1269-1275)。
- 响应字段(S→C):无显式业务字段,`Desk.setAllCharm` 仅本地存储并提示成功(07_Desk.js:1321)。
- 源码:发送 `09_Net.js:779` ;接收 `09_Net.js:783` →`Desk.setAllCharm` 。
- 备注:—
---
## 邀请码 / 绑定
### `binding_invitecode` · route=agent · C→S 请求 + S→C 响应
- 场景:绑定邀请码。
- 请求字段(C→S): `agentid` 、`playerid` 、`invitecode` ( 11_GameUI.js:1367-1369)。
- 响应字段(S→C): `state` (整数或整数型字符串, `0` / `"0"` 成功时写入 `invitecode` ) 、`invitecode` 、`error` (提示文案)。原工程 ` 06_Player.js:270` 使用 `state == 0` ; 2026-09-06 联调确认服务器也返回字符串状态,前端在绑定响应入口归一化,不能用仅接受 number 的校验直接拒绝 。
- 源码:发送 `09_Net.js:587` ;接收 `09_Net.js:592` →`C_Player.binding_invitecode` 。
- 备注:—
### `get_player_invitecode` · route=agent · C→S 请求 + S→C 响应
- 场景:获取自己的邀请码(打开绑定界面)。
- 请求字段(C→S): `agentid` 、`playerid` 、`unionid` 、`openid` ( 11_GameUI.js:1378-1382)。
- 响应字段(S→C): `invitecode` (string) → `C_Player.setInvitecod` 并打开绑定界面(09_Net.js:607)。
- 源码:发送 `09_Net.js:603` ;接收 `09_Net.js:607` →`Net.get_player_invitecode` 。
- 备注:修正原文档——请求字段为 `agentid/playerid/unionid/openid` , **无 `gameid` **,新增 `unionid` /`openid` ( 11_GameUI.js:1378)。
---
## VIP 管理 / 黑白名单
### `optBanList` · route=agent · C→S 请求 + S→C 响应
- 场景:黑名单查看/添加/移除(多入口)。
- 请求字段(C→S):随入口不同,公共字段 `agentid` 、`playerid` 、`type` :
- `type=1` 查看黑名单列表(agentid/playerid/type, 11_GameUI.js:2401-2405)
- `type=3` 按 ID 添加(agentid/playerid/optId/type, 11_GameUI.js:2376-2381)
- `type=4` 按 ID 移除(agentid/playerid/optId/type, 11_GameUI.js:2389-2394 及列表项删除 2453-2458)
- `type=6` 一键全部添加(agentid/playerid/type, 11_GameUI.js:1262-1267)
- 另有带 `breakRoom` (0/1) 与 `gameid` 的 `type=3` 添加入口(agentid/gameid/playerid/optId/breakRoom/type, 11_GameUI.js:2417-2428; breakRoom 由 `GameData.blackList.breakRoom` 决定,开关在 case 3260)
- 服务器响应中亦见 `type=5` (另一种列表返回,07_Desk.js:1299)
- 响应字段(S→C): `type` (1/3/4/5/6)、`banList` (黑名单数组)、`message` (可选提示)( 07_Desk.js:1289)。
- 源码:发送 `09_Net.js:762` ;接收 `09_Net.js:766` →`Desk.optBanList` 。
- 备注:—
### `getPlayerWhiteList` · route=agent · C→S 请求 + S→C 响应
- 场景:获取白名单。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 。
- 响应字段(S→C): `whiteList` (数组) → `GameData.whiteList.data` ( 07_Desk.js:1412)。
- 源码:发送 `09_Net.js:882` ;接收 `09_Net.js:886` →`Desk.getPlayerWhiteList` 。
- 备注:—
### `optWhiteList` · route=agent · C→S 请求 + S→C 响应
- 场景:白名单添加/修改/删除。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`shortcode` 、`mode` 、`userid` (目标ID):
- `mode=1` 添加/修改,并带 `value` (设置的魅力值)
- `mode=2` 删除(仅 `userid` )
- 响应字段(S→C): `whiteList` (更新后数组)、`mode` (可选)、`message` (可选提示)( 07_Desk.js:1398)。
- 源码:发送 `09_Net.js:890` ;接收 `09_Net.js:894` →`Desk.optWhiteList` 。
- 备注:—
### `setVipForbidSelect` · route=agent · C→S 请求 + S→C 响应
- 场景:VIP 房禁止玩家选桌开关。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`forbidSelect` (1开/0关,11_GameUI.js:2631-2639)。
- 响应字段(S→C): `state` (0成功)、`forbidSelect` (1开/0关);失败 `error` ( 07_Desk.js:1348)。
- 源码:发送 `09_Net.js:855` ;接收 `09_Net.js:859` →`Desk.setVipForbidSelect` 。
- 备注:—
---
## 其它 agent 协议
### `submit_opinion` · route=agent · C→S 请求 + S→C 响应
- 场景:提交反馈/意见。
- 请求字段(C→S): `agentid` 、`playerid` 、`gameid` 、`content` 。
- 响应字段(S→C): `state` (0成功)( 07_Desk.js:1100)。
- 源码:发送 `09_Net.js:547` ;接收 `09_Net.js:551` →`Desk.submit_opinion` 。
- 备注:—
### `submit_location` · route=agent · C→S 请求 + S→C 响应
- 场景:提交定位信息(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`info` (定位对象)。
- 响应字段(S→C):经 `Game.submit_location` 处理(09_Net.js:583)。
- 源码:发送 `09_Net.js:577` ( `ConstVal.isGameHall` 为 true 时不发);接收 `09_Net.js:583` 。
- 备注:—
### `submit_phoneinfo` · route=agent · C→S 请求(无响应处理)
- 场景:提交手机/通讯录信息(仅非大厅环境发送)。
- 请求字段(C→S): `agentid` 、`playerid` 、`info` { `phoneInfo` (手机信息), `addrBook` (通讯录) }。
- 响应字段(S→C): `Net.submit_phoneinfo` 接收函数为空实现(09_Net.js:722)。
- 源码:发送 `09_Net.js:717` ;接收 `09_Net.js:722` 。
- 备注:—
### `submit_error` / `submit_log` · route=agent · C→S 上行(硬编码包)
- 场景:上报前端异常/日志。异常捕获时(12_Logic.js:270)、获取 HTML 失败(12_Logic.js:1990/2009/2014)、收到踢下线包(07_Desk.js:963)等处调用。
- 请求字段(C→S): `packet` (出错数据包字符串)、`msg` (错误/堆栈信息)、`playerid` 、`agentid` 、`gameid` ( 09_Net.js:66-72)。
- 响应字段(S→C):服务器若回 rpc `"submit_error"` ,前端在分发处直接 `return` 忽略(12_Logic.js:235)。
- 源码:发送 `Net.submit_error` (`09_Net.js:55` ) / `Net.submit_log` (`09_Net.js:81` )。
- 备注:均为**硬编码** `route:"agent", rpc:"submit_error"` ,不经 `Send_*` /RpcList。注意 `Net.submit_log` (`09_Net.js:81` ) 实际发出的 rpc 同样是 `"submit_error"` (与 submit_error 同包结构)。两者带去重:`submit_error` 对相同 `msg` 只发一次(09_Net.js:57-61),`submit_log` 不去重。
### `kick_server` · route=agent · C→S 请求 + S→C 推送
- 场景:管理端踢出玩家 / 被踢下线弹窗。
- 请求字段(C→S): `agentid` 等(构造点未集中定位)。
- 推送字段(S→C): `msg` (踢出提示) → `GameUI.OpenKick` ( 07_Desk.js:1108)。
- 源码:发送 `09_Net.js:555` ;接收 `09_Net.js:558` →`Desk.kick_server` 。
- 备注:⚠️ 请求字段待补。
### `broadcast` · route=agent · C→S 请求 + S→C 推送
- 场景:广播消息/滚动公告(主要为服务器推送)。
- 请求字段(C→S): `agentid` 等(`Send_broadcast` 存在,09_Net.js:530)。
- 推送字段(S→C): `msgtype` (0消息框/1滚动公告,可选,缺省 0)、`msgcontent` (内容)( 07_Desk.js:1112)。
- 源码:发送 `09_Net.js:530` ;接收 `09_Net.js:534` →`Desk.broadcast` 。
- 备注:—
### `connect_agentserver` · route=agent · 双向(切服)
- 场景:切换到大厅服务器。
- 请求字段(C→S): `Send_connect_agentserver` (`09_Net.js:515` ) 透传 `_data` (切服时使用)。
- 推送字段(S→C): `agentserver` (新大厅服地址)、`opt` (切换原因,如 `other_break_room` /`free_room` )( 09_Net.js:518)。
- 源码:发送 `09_Net.js:515` ;接收 `09_Net.js:518` →`Net.connect_agentserver` (关闭当前连接并重连新地址)。
- 备注:—
### `playerBehavior` · route=agent(实际走 HTTP GET)
- 场景:玩家行为埋点。
- 请求字段:原 WS 路径(agentid/gameid/playerid/tag) **被注释**( 09_Net.js:799-806),实际改走独立 HTTP GET 上报 `http://test3.1888day.com/api/gamedo/gamedo?agentid=&gameid=&playerid=&tag=` ( 09_Net.js:807-815)。
- 响应字段(S→C): HTTP 回调 `playerBehavior_Succ` /`_Fail` ( 09_Net.js:818/822);WS 接收函数 `Net.playerBehavior` (`09_Net.js:826` ) 当前无触发。
- 源码:发送 `09_Net.js:797` (`Send_playerBehavior` )。
- 备注:**非 WebSocket 协议**, RpcList 中虽有定义,实际不走 agent 路由。
---
## 仅接收的 agent 推送(无对应主动请求)
| rpc | 推送 data 字段 | 说明 | 接收源码 |
|-----|---------------|------|---------|
| `update_roomcard` | `roomcard` 、`text` (可选) | 房卡变化(仅 `change` 未定义时更新,09_Net.js:383→06_Player.js:141) | 09_Net.js:383 |
| `update_bean` | `bean` 、`change` (可选)、`seat` (可选)、`type` (可选)、`text` | 豆豆变化(09_Net.js:598→Desk.update_bean, 07_Desk.js:1201) | 09_Net.js:598 |
| `can_award` | 任务可领取标记 | 🐛 接收即抛异常,见上文 任务系统 章 | 09_Net.js:444 |
| `kick_offline` | `fromOther` (可选)、`gameid` (可选) | 被踢下线,弹 OpenKick;同时本地 `Net.submit_error` 上报"收到踢下线包"( 07_Desk.js:945-963) | 09_Net.js:448 |
| `show_message` | `msg` 、`time` | 通用消息提示 → `GameUI.OpenTips` ( 07_Desk.js:1173) | 09_Net.js:656 |