Files
youle_cocos/docs/protocol/02-协议-agent路由.md
T
joywayerandClaude Opus 4.8 08640ca89a docs(protocol): 交叉源码审计后重修全 8 篇协议文档
基于 00_Surface 平台层源码逐条交叉核对,修订 docs/protocol:
- 补全前后端双向数据包(请求+响应/推送字段),覆盖框架模板全部平台层 rpc
- 修正错误:重连触发条件(deskinfo 而非 isbattle)、小程序桥接(openminigamedata 而非 miniProData)、
  get_player_invitecode 字段、setGameServer/GameData.Server 来源、route 分发守卫等
- 补遗漏 rpc:send_phone_code_wechat、submit_error/submit_log、refresh_task_state、
  update_bean/update_charm/broadcast、connect_agentserver 字段、5 个成对推送常量
- 补 Desk 约 11 个字段、登录响应账号字段、10 个子游戏钩子
- 标注源码 bug(🐛 can_award 接收函数未定义、小程序 checkType=8 误接白名单)
- 校准全篇 file:line 引用;待后端确认项标 ⚠️
- 明确范围:仅框架模板协议,不含子游戏对局包

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 11:35:47 +08:00

410 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 响应
- 场景:连接建立后 `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`。
- 源码:发送 `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`、`gameid`、`taskid`。
- 响应字段(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 |