斗地主

错误码

从8800到8889

错误码 描述
8801 success
8802 数据反序化失败
8803 地区玩法错误
8804 未知事件
8805 没有该用户
8806 用户未登录
8807 用户验证失败
8808 用户重复登录
8809 已加入其他游戏
8810 已登陆其他服务器
8812 加入房间失败
8813 房间不存在
8814 房间已经满人
8815 用户已在房间中
8816 该用户没有在任何房间
8820 重复申请解散
8821 房间不在解散中
8822 获取距离失败
8823 退出房间失败
8824 房间不在准备中
8827 重复解散投票
8828 用户不在当前房间
8829 房间已开始游戏
8830 坐下失败,游戏币不足
8831 没有空房间
8832 重复准备
8833 用户已在其他设备登陆
8834 用户信息读取失败
8835 准备失败,游戏币不足
8836 创建VIP房间失败,游戏币不足
8837 VIP房间, 加入失败
8838 加入VIP房间失败, 密码错误
8839 非VIP房间
8840 无权抢地主
8841 房间不在选择抢地主中
8845 房间不在游戏中
8846 无权不出
8847 不出token错误
8848 必须出牌
8849 出牌token错误
8850 出牌不符合规则
8851 无权出牌
8852 你没有处于托管中
8853 数据库操作失败
8854 取消托管的次数已经用光
8855 你处于托管中
8862 房间不在选择明牌中
8863 房间不在选择加倍中
8864 房间不在选择反加倍中
8865 无权明牌
8866 无权加倍
8867 无权反加倍

事件定义

从8800到8899 事件流向:

  • c->s 客户端发送到服务器端
  • s->c 服务器端发送到客户端
  • s->m 服务器端广播到客户端
事件编号 事件名称 事件流向 是否返回 描述
8801 登录 c->s true
8802 服务器返回 s->c 服务器返回,包括成功和异常
8803 心跳包 c->s true 服务器回空包
8804 房间列表 s->m 广播给大厅内但不在房间的玩家
8805 房间变化 s->m 广播给大厅内但不在房间的玩家
8806 加入房间 c->s true 快速开始-不用填房间号
8807 房间信息 s->c 加入房间推送或在房间内掉线回来推送
8808 准备 c->s 玩家准备及取消准备
8809 玩家变化 s->m 加入,离开,上线,掉线,准备,取消准备都广播房间内玩家
8810 游戏信息 s->c 开始游戏推送或游戏内掉线回来推送
8811 申请解散 c->s 如果房间未开始,当作退出房间处理
8812 提示玩家投票 s->m 广播给房间内玩家
8813 玩家投票 c->s 玩家是否同意解散
8814 广播解散结果 s->m 广播给房间内玩家
8815 请求LBS c->s
8816 回复LBS s->c
8817 请求退出房间 c->s true 服务器返回
8818 顶号 s->c 同个用户只能一个连接,新的顶替旧的
8819 请求历史积分 c->s
8820 回复历史积分 s->c
8821 近距离提示 s->m
8822 聊天 s->m 客户端和服务器广播同一个命令字/PB结构,服务器不做任何处理
8823 游戏信息 s->c 刷新游戏信息
8831 系统发牌 s->m 广播给房间内玩家,每个人信息不同
8832 提示抢地主 s->m 让玩家选择是否抢地主
8833 玩家是否抢地主 c->s 玩家是否抢地主,出错回包,成功不回
8834 广播是否抢地主 s->m 通知抢地主
8836 提示出牌 s->m 通知玩家出牌
8837 玩家出牌 c->s 玩家出牌,出错时回包,成功不回
8838 广播出牌 s->m 广播给房间内玩家,玩家出牌
8839 广播清桌 s->m 广播给房间内玩家,通知清桌
8840 摊牌 s->m 广播给房间内玩家
8841 小局结算 s->m 广播给房间内玩家
8842 回放游戏信息
8855 回放
8856 广播用户进入托管模式 s->m
8857 取消托管模式 c->s true
8858 广播托管模式 s->m
8859 创建VIP房间 c->s true
8860 加入VIP房间 c->s true
8861 提示反加倍 s->c
8862 回复反加倍 c->s
8863 广播反加倍 s->m
8864 广播底牌 s->m
8865 提示明牌 s->c
8866 回复明牌 c->s
8867 广播明牌 s->m
8868 提示加倍 s->c
8869 回复加倍 c->s
8870 广播加倍 s->m

协议PB结构

玩家结构

syntax = "proto3";
package event;
 
//玩家信息
message EventPlayerInfo {
 //用户ID
 int32   userId       = 1;
 //在线状态  true -- 在线   false -- 离线
 bool    onlineStatus = 2;
 //准备状态  true --准备 false --未准备
 bool    readyStatus  = 3;
    //游戏币数,(精确到分)
 int64 coins = 4;
 //座位ID 0,1,2,3
 int32   seatId       = 5;
 //昵称
 string  nickName     = 6;
 //头像url  
 string  headUrl      = 7;
 //用户IP
 string  ip          = 8; 
 // 性别 0-没有设置,1--男 2--女   
 int32   sex          = 9;
 //总积分
 int32   totalJiFen   = 10;
 //登录地址
 string  loginAddress = 11;
}

登录

syntax = "proto3";
package event;
message EventLogin { // IRequest 8801
    //用户登录标识
    string token     = 1;
    //客户端校验 md5(token + secret_key) 服务端和客户端约定secret_key
    string secretString    = 2;
    // 登录地址
    string loginAddress    = 3;
    // 登录经度
    string loginLng        = 4;
    // 登录纬度
    string loginLat        = 5;
}

服务器返回

syntax = "proto3";
package event;
message EventReturn { // IResponse 8802
 //事件ID
 int32     eventId         = 1; 
 //返回码 0--表示成功  其它的为错误
 int32     code            = 2;
 //描述
 string    message         = 3; 
}

心跳包

syntax = "proto3";
package event;
//心跳包
message EventHeartBeat { // IResponse IRequest 8803
}

房间列表

syntax = "proto3";
package event;
import "room_info.proto";
//房间列表
message EventRoomList { // IResponse 8804
    // 房间列表
    repeated EventRoomInfo items = 1[packed = false];
    // 开始房间数
    int32 StartedRoomNum = 2;
}

房间变化

syntax = "proto3";
package event;
import "room_info.proto";
// 大厅内有房间内变化,广播所有大厅里不在房间内玩家
message EventUseRoomChange { // IResponse 8805
    //变化原因 (0-创建,1-更新资料,2-开始游戏,3-解散)
    int32  reason = 1;
    //变化后房间信息
    EventRoomInfo roomInfo = 2;
    // 开始房间数
    int32 StartedRoomNum = 3;
}

加入房间

快速开始-不用填房间号

syntax = "proto3";
package event;
message EventJoinRoom { //IRequest 8806
  //房间ID,不填房间号,就是系统选房间即快速开始
 int32   roomId         = 1;
}

房间信息

syntax = "proto3";
package event;
import "player_info.proto";
//房间信息
message EventRoomInfo { //IResponse 8807
 // 房间id
 int32 roomId = 1;
 // 房间状态,0-没开始,1-游戏中,2-小局结束,3-所有已结束,4-房间解散中,5-选择打独中
 int32 status = 2;
 //当前局数
 int32   curGameNum  = 3;
 // 总局数
 int32   totalGameNum    = 4;
 // 底分
 int32   baseScore    = 5;
 // 玩法描述
 string  playDes         = 6;
 // 玩家信息(以座位号为顺序)
 repeated EventPlayerInfo playerInfo = 7[packed = false];
    // 最低局数
    int32 minGameNum = 8;
 // 密码
 string pwd = 9;
}

准备

syntax = "proto3";
package event;
message EventAskReady { // IRequest 8808
 //true-准备 false--取消准备
 bool  isReady  = 1;
}

玩家变化

syntax = "proto3";
package event;
import "player_info.proto";
// 房间内有玩家变化,广播给房间内玩家 
message EventUsePlayerChange { // IResponse 8809
    //变化原因, 0-加入 1-离开,2-准备 3-取消准备,4-上线 5-离线
    int32  reason = 1;
    //变化玩家座位号
    int32  seatId = 2;
    //变化玩家id
    int32  userId = 3;
    // 变化后,房间内所有玩家信息(以座位号为顺序)
    repeated EventPlayerInfo playerInfo = 4[packed = false];
}

游戏信息

import "use_out.proto";
import "multiple.proto";

message PBGameInfo { // IResponse 8810
    // 是否应该抢地主
    bool isLandlord = 1;
    // 可选抢地主底分(isLandlord为true才有效)
    repeated int32 landlordScore = 2 [packed = false];
    // 是否强制抢地主
    bool isForceLandLord = 3;
    // 地主用户id(有地主之后才有效)
    int32 bankerUserId = 4;
    // 地主座位id(有地主之后才有效)
    int32 bankerSeatId = 5;
    // 当前加倍玩家的座位号
    int32 choiceSeatId = 6;
    // 底牌(有地主之后才有效)
    repeated int32 wildCards = 7 [packed = false];
    // 是否应该选择加倍
    bool isPlus = 8;
    // 地主是否明牌
    bool LandlordIsOpen = 9;
    // 地主手牌(地主明牌才有效)
    repeated int32 LandlordPai = 10 [packed = false];
    // 是否应该选择明牌
    bool isOpen = 11;
    // 是否应该选择反加倍
    bool isBack = 13;
    // 已加倍的玩家座位号 0-表示没有轮到加倍,1-加倍,2-不加倍
    repeated int32 plusSeatId = 14 [packed = false];
    // 地主是否反加倍
    bool LandlordIsBack = 15;
    // 当前桌牌(按出牌顺序)
    repeated PBUseOut desktopPai = 16 [packed = false];
    // 当前手牌
    repeated int32 handPai = 17 [packed = false];
    // 能否出牌
    bool canOutPai = 18;
    // 是否必须出牌
    bool mustOutPai = 19;
    // 出牌token
    string outPaiToken = 20;
    // 当前出牌座位号
    int32 curOutPaiSeat = 21;
    // 每个玩家剩余张数(座位号为下标),小于等于5张才有效
    repeated int32 restNum = 22 [packed = false];
    // 选择抢地主时,还剩余多少秒考虑时间
    int32 remainLandlordTime = 23;
    // 出牌时的剩余时间
    int32 remainOutTime = 24;
    // 每个玩家历史抢地主分数(座位号为下标)
    // 0-表示没有轮到抢,1-1分,2-2分,3-3分,4-不抢
    repeated int32 historyLandlord = 25 [packed = false];
    // 是否处于托管中
    repeated bool isEntrust = 26 [packed = false];
    // 还有几次取消托管的机会
    int32 cancelEntrustCount = 27;
    // 倍数描述
    PBMultiple multiple = 28;
}

申请解散

syntax = "proto3";
package event;
// 申请解散
message EventAskDismassRoom {
}

提示玩家投票

syntax = "proto3";
package event;
//玩家的投票情况 
message EventPlayerVote {
    int32 userId = 1;
    string nickName = 2;
    //投票结果 0--未投票 1--同意 2--拒绝
    int32 vote = 3;
}

// 提示玩家投票及广播解散意见,玩家如果没有投票,则提示投票,否则仅显示
message EventQueryDismassRoom { // IResponse 8812
 //申请的玩家ID
 int32 applyUserId = 1;
 //申请的玩家昵称
 string applyNickName = 2;
 //各个玩家投票情况
    repeated EventPlayerVote playerVote = 3[packed = false];
    //解散还剩的秒数 如:89
    int32 remainderTime = 5;
}

玩家投票

syntax = "proto3";
package event;
// 玩家上传是否同意解散
message EventReportDismassRoom {
 //true--同意  false--拒绝
 bool    isAgree    = 1;
}

广播解散结果

syntax = "proto3";
package event;
//解散房间的结果
message EventNoticeDismassRoom { // IResponse 8814
    //true -- 解散 false --不解散
    bool isAgree = 1;
    //解散原因, 0-玩家发起解散, 1-房间超过最低局数,有玩家退出, 2-房间达到最高局数
    // 3-有玩家游戏币为负数, 4-长时间没开始,自动解散
    int32 reason = 2;
    //解散文字说明
    string doc = 3;
    // 房间ID
    int32 roomId = 4;
}

请求LBS

syntax = "proto3";
package event;
//玩家间距离请求
message EventAskGeo { // IRequest 8815
}

回复LBS

syntax = "proto3";
package event;
message EventUseGeoItem {
    //起始用户ID
    int32 srcUid = 1;
    //结束用户ID
    int32 destUid = 2;
    //用户之间距离
    string distance = 3;
    //用户之间距离,数值表示,单位(米)
    int32 gap = 4;
}

//玩家间距离回包
message EventUseGeo { // IResponse 8816
    // 用户ID列表
    repeated int32 uids = 1[packed = false];
    // 结果列表
    repeated EventUseGeoItem Items = 2[packed = false];
}

请求退出房间

syntax = "proto3";
package event;
//用户请求退出房间
message EventAskExit {
}

顶号

syntax = "proto3";
package event;
//同个用户新登陆踢出旧登陆 
message EventKickOut { // IResponse 8818
 //用户ID
 int32   userId          = 1;
}

请求历史积分

syntax = "proto3";
package event;
// 请求历史积分
message EventAskHistoryScore { // IRequest 8819
}

回复历史积分

syntax = "proto3";
package event; 
message EventHistoryScoreItem {
 // 用户ID
 int32 userId = 1;
 // 下标-局数,值-积分
 repeated int32 scores = 2[packed = false];
}

// 历史积分回包
message EventUseHistoryScore { // IResponse 8820
 repeated EventHistoryScoreItem items = 1[packed = false];
}

近距离提示

syntax = "proto3";
package event;
//玩家间距离太近提示
message EventDistanceAlert { // IResponse 8821
    //提示内容
    string alertStr = 1;
}

聊天

syntax = "proto3";
package event;
// 客户端和服务器广播同一个命令字,同一个PB结构
// 服务器纯广播,不做任何处理
message EventChat { // IResponse IRequest 8822
 // 聊天类型
 int32 Type = 1;
 // 聊天内容
 string Content = 2;
    // 聊天扩展
    string Extend = 3;
    // 聊天发起人id
    int32 authorId = 4;
}

系统发牌

syntax = "proto3";
package event;
message PBAssignPai { // IResponse 8831
 // 系统开始发的手牌
 repeated int32 pai  = 1[packed = false];
}

广播底牌

syntax = "proto3";

package event;

// 广播底牌
message PBWildCards { // IResponse 8864
    // 地主用户id
    int32 bankerUserId = 1;
    // 地主座位id
    int32 bankerSeatId = 2;
    // 底分
    int32 baseScore = 3;
    // 底牌
    repeated int32 pai = 4 [packed = false];
    // 每个玩家倍数描述(座位号为下标)
    repeated PBMultiple multiples = 5 [packed = false];
}

提示明牌

syntax = "proto3";

package event;

// 提示地主明牌
message PBHintOpen { // IResponse 8865
    // 地主座位号
    int32 seatId =1;
    // 倒计时
    int32 countdown = 2;
}

刷新游戏信息

syntax = "proto3";

package event;

// 客户端刷新房间信息,不推送给其他人,
message EventRefreshRoom { // IResponse 8823
}

系统发牌

syntax = "proto3";

package event;

message PBAssignPai { // IResponse 8831
 // 系统开始发的手牌
 repeated int32 pai  = 1[packed = false];
}

提示抢地主

syntax = "proto3";

package event;

message PBHintLandlord { // IResponse 8832
    // 是否能选择叫地主
    bool canLandlord = 1;
    // 当前叫牌者座位号
    int32 seatId = 2;
    // 当前叫牌者用户id
    int32 userId = 3;
    // 剩余多少秒的考虑时间
    int32 countdown = 4;
    // 是否必须叫3分
    bool mustBigScore = 5;
    // 允许的底分
    repeated int32 score = 6 [packed = false];
}

玩家是否抢地主

syntax = "proto3";

package event;

message PBAskLandlord { // IRequest 8833
    // 是否抢地主
    bool isLandlord = 1;
    //  底分
    int32 score = 2;
}

广播抢地主

syntax = "proto3";

package event;

import "multiple.proto";

// 广播玩家抢地主
message PBUseLandlord { // IResponse 8834
    // 玩家座位号
    int32 seatId = 1;
    // 玩家ID
    int32 userId = 2;
    // 是否抢地主
    bool isLandlord = 3;
    // 底分
    int32 score = 4;
    // 每个玩家倍数描述(座位号为下标)
    repeated PBMultiple multiples = 5 [packed = false];
}

提示出牌

syntax = "proto3";

package event;

message PBHintOut { // IResponse 8836
 // 出牌token
 string token =1;
 // 当前出牌者座位号
 int32 seatId =2;
 // 是否必须出牌
 bool isForce = 3;
 // 倒计时
 int32 countdown = 4;
 //是否要的起
 bool canPlay = 5;
}

玩家出牌

syntax = "proto3";

package event;

message PBAskOut { // IRequest 8837
 // 出牌token,处理重复出牌
 string token=1;
 // 此次出的牌
 repeated int32 pai  = 2[packed = false];
 // 是否不出
 bool isSkip = 3;
}

倍数结构

syntax = "proto3";

package event;

message PBMultiple{
 // 底分
 int32 base = 1;
 // 明牌
 int32 open = 2;
 // 春天
 int32 spring = 3;
 // 反春
 int32 antiSpring = 4;
 // 炸弹(所有玩家出的炸弹之和)
 int32 bomb = 5;
 // 是否达到炸弹上限
 bool isBombLimit = 6;
 // 公共倍数
 int32 common = 7;
 // 农民加倍
 int32 plus = 8;
 // 地主反加倍
 int32 back = 9;
 // 总倍数
 int32 sum = 10;
}

广播出牌

syntax = "proto3";

package event;
import "multiple.proto";

message PBUseOut { // IResponse 8838
    // 出牌玩家座位号
    int32 seatId = 1;
    // 出牌玩家用户id
    int32 userId = 2;
    // 出的牌
    repeated int32 pai = 3 [packed = false];
    // 牌分类,1-单张,2-对子,3-3张,4-3带1,6-顺子,7-连对,
    // 10-4炸,30-3带一对,31-飞机不带牌,32-飞机带单,33-飞机带对
    // 34-火箭,36-4带2,38-4带两对
    int32 paiClass = 4;
    // 牌掩码,例如单张3,见文档
    int32 paiMask = 5;
    // 第几轮
    int32 roundIndex = 6;
    // 同一轮第几次
    int32 roundSerial = 7;
    // 是否不出
    bool isSkip = 8;
    // 剩余张数(出牌玩家的)
    int32 restNum = 9;
    // 每个玩家炸弹数量(座位号为下标)
    repeated int32 bombNum = 10 [packed = false];
    // 每个玩家倍数描述(座位号为下标)
    repeated PBMultiple multiples = 11 [packed = false];
    // 出完顺序 0--没出完  1--出完
    int32 overOrder = 12;
}

广播清桌

syntax = "proto3";

package event;

message PBClearDesktop { // IResponse 8839
 // 大牌的玩家座位号
 int32 seatId =1;
 // 大牌的玩家用户id
 int32 userId =2;
 // 第几轮
 int32 roundIndex = 3;
}

摊牌

syntax = "proto3";

package event;

//用户的手牌
message PBTanPaiItem {
    //玩家ID
    int32 userId = 1;
    //玩家ID
    int32 seatId = 2;
    //手牌
    repeated int32 normalPai = 3 [packed = false];
}

//摊牌
message PBTanPai { // IResponse 8840
    repeated PBTanPaiItem items = 1 [packed = false];
    //结算状态 // 0-流局,1-解散,2-地主胜,3-农民胜,4-春天,5-反春
    int32 overStatus = 2;
    //地主座位
    int32 landlordSeat = 3;
}

小局结算

syntax = "proto3";

package event;

import "multiple.proto";

message PBSmallMeta {
    //玩家ID
    int32 userId = 1;
    //玩家昵称
    string nickName = 2;
    //当前总游戏币(精确到分)
    int64 totalCoins = 3;
    //此局输赢分(牌局结束输赢+炸弹),赢分为正数,输分为负数
    int32 winScore = 4;
    //出完顺序,0-没出完,1-出完
    int32 overOrder = 5;
    //是否地主(此局第一个出牌人)
    bool isLandlord = 6;
    //自已是否加倍(农民有效)
    bool isPlus = 7;
    //是否明牌(地主有效)
    bool isOpen = 8;
    //自已是否反加倍(地主有效)
    bool isBack = 9;
    // 倍数描述
    PBMultiple multiple = 10;
    //炸弹输赢分,赢分为正数,输分为负数
    int32 bombScore = 11;
    //此局输赢游戏币数,单位:分,赢为正数,输为负数
    int32 winCoins = 12;
}

message PBSmallSettlement { // IResponse 8841
    // IResponse 8841
    //房间号
    int32 id = 1;
    //房间状态 0-未开始 1-小局结束 2-游戏中 3-已结束
    int32 status = 2;
    //当前局数
    int32 now = 3;
    //下局局数, 如果房间状态为:3, 这里为:0
    int32 next = 4;
    //总局数
    int32 total = 5;
    //玩法名称
    string name = 6;
    //玩法描述
    string doc = 7;
    //时间
    string time = 8;
    //各玩家的情况,座位号为下标
    repeated PBSmallMeta players = 9 [packed = false];
    //房间底分
    int32 baseScore = 10;
    //结束原因, 0-玩家发起解散, 1-房间超过最低局数,有玩家退出, 2-房间达到最高局数
    // 3-有玩家游戏币为负数
    int32 overReason = 11;
    // 底牌
    repeated int32 wildCards = 12 [packed = false];
    //结束文字说明
    string overDoc = 13;
}

回放游戏信息

syntax = "proto3";

package event;

import "assign_pai.proto";

// 回放游戏信息
message PBReplayGame { // IResponse 8842
    // 地主用户id
    int32 bankerUserId = 1;
    // 地主座位id
    int32 bankerSeatId = 2;
    // 系统发的手牌,按座位号为下标
    repeated PBAssignPai handPai = 3 [packed = false];
    // 底牌
    repeated int32 wildCards = 4 [packed = false];
    // 底分
    int32 baseScore = 5;
}

回放

syntax = "proto3";

package event;

message PBReplayCell {
 //对应的事件ID
    int32 eventId           = 1;
 //事件对应序列化后的proto内容
    bytes eventData     = 2;

}

//回放,客户端要求
message PBReplay { // IResponse 8855
    repeated PBReplayCell cells = 1[packed = false];
}

取消托管模式


// 取消托管
message EventCancelEntrust { // IRequest 8857

}

广播用户进入托管模式

// 广播用户进入托管
message EventInEntrust { // IResponse 8856
 // 进入托管用户的座位号
 int32 seat = 1;
 // 还有多少次可以取消托管
 int32 count = 2;
}

广播托管模式

// 取消托管成功
message EventCancelEntrustDone { // IResponse 8858
 // 取消托管用户座位号
 int32 seat = 1;
}

创建VIP房间

message EventCreateVIPRoom { // IRequest 8859

}

加入VIP房间

message EventJoinVIPRoom { // IRequest 8860
 string pwd = 2;
}

提示反加倍

syntax = "proto3";

package event;

// 提示地主反加倍
message PBHintBack { // IResponse 61
    // 地主座位号
    int32 seatId =1;
    // 已加倍的玩家座位号
    repeated int32 plusSeatId  = 2[packed = false];
}

回复反加倍

syntax = "proto3";

package event;

// 地主反加倍
message PBAskBack { // IRequest 8862
    // 是否反加倍
    bool isBack = 1;
}

广播反加倍

syntax = "proto3";

package event;

import "multiple.proto";

// 提示地主反加倍
message PBHintBack { // IResponse 8861
    // 地主座位号
    int32 seatId =1;
    // 已加倍的玩家座位号
    repeated int32 plusSeatId  = 2[packed = false];
    // 倒计时
    int32 countdown = 3;
}

回复明牌

syntax = "proto3";

package event;

// 地主明牌
message PBAskOpen { // IRequest 8866
 // 是否明牌
 bool isOpen =1;
}

广播明牌

syntax = "proto3";

package event;

import "multiple.proto";

// 广播地主明牌
message PBUseOpen { // IResponse 8867
 // 地主座位号
 int32 seatId =1;
 // 是否明牌
 bool isOpen =2;
 // 手牌(必须明牌才有效)
 repeated int32 pai = 3[packed = false];
 // 每个玩家倍数描述(座位号为下标)
 repeated PBMultiple multiples = 4[packed = false];
}

提示加倍

syntax = "proto3";

package event;

// 提示玩家加倍
message PBHintPlus { // IResponse 8868
    // 加倍玩家座位号
    int32 seatId =1;
    // 倒计时
    int32 countdown = 2;
}

回复加倍

syntax = "proto3";

package event;

// 玩家请求加倍
message PBAskPlus { // IRequest 8869
 // 是否加倍
 bool isPlus =1;
}

广播加倍

syntax = "proto3";

package event;

import "multiple.proto";

// 广播玩家加倍
message PBUsePlus { // IResponse 8870 
 // 玩家座位号
 int32 seatId =1;
 // 是否加倍
 bool isPlus =2;
 // 每个玩家倍数描述(座位号为下标)
 repeated PBMultiple multiples = 3[packed = false];
}