跑得快

错误码

从8900到8999

错误码 描述
8901 success
8902 数据反序化失败
8903 地区玩法错误
8904 未知事件
8905 没有该用户
8906 用户未登录
8907 用户验证失败
8908 用户重复登录
8909 已加入其他游戏
8910 已登陆其他服务器
8912 加入房间失败
8913 房间不存在
8914 房间已经满人
8915 用户已在房间中
8916 该用户没有在任何房间
8920 重复申请解散
8921 房间不在解散中
8922 获取距离失败
8923 退出房间失败
8924 房间不在准备中
8927 重复解散投票
8928 用户不在当前房间
8929 房间已开始游戏
8930 坐下失败,游戏币不足
8931 没有空房间
8932 重复准备
8933 用户已在其他设备登陆
8934 用户信息读取失败
8935 准备失败,游戏币不足
8936 创建VIP房间失败,游戏币不足
8937 VIP房间, 加入失败
8938 加入VIP房间失败, 密码错误
8939 非VIP房间
8940 无权包庄
8941 房间不在选择包庄中
8945 房间不在游戏中
8946 无权不出
8947 不出token错误
8948 必须出牌
8949 出牌token错误
8950 出牌不符合规则
8951 无权出牌
8952 你没有处于托管中
8953 数据库操作失败
8954 取消托管的次数已经用光
8955 你处于托管中
8961 包庄游戏币数最低为当前底分60倍

事件定义

从8900到8999 事件流向:

c->s 客户端发送到服务器端 s->c 服务器端发送到客户端 s->m 服务器端广播到客户端

事件编号 事件名称 事件流向 是否返回 描述
8901 登录 c->s true
8902 服务器返回 s->c 服务器返回,包括成功和异常
8903 心跳包 c->s true 服务器回空包
8904 房间列表 s->m 广播给大厅内但不在房间的玩家
8905 房间变化 s->m 广播给大厅内但不在房间的玩家
8906 加入房间 c->s true 快速开始-不用填房间号
8907 房间信息 s->c 加入房间推送或在房间内掉线回来推送
8908 准备 c->s 玩家准备及取消准备
8909 玩家变化 s->m 加入,离开,上线,掉线,准备,取消准备都广播房间内玩家
8910 游戏信息 s->c 开始游戏推送或游戏内掉线回来推送
8911 申请解散 c->s 如果房间未开始,当作退出房间处理
8912 提示玩家投票 s->m 广播给房间内玩家
8913 玩家投票 c->s 玩家是否同意解散
8914 广播解散结果 s->m 广播给房间内玩家
8915 请求LBS c->s
8916 回复LBS s->c
8917 请求退出房间 c->s true 服务器返回
8918 顶号 s->c 同个用户只能一个连接,新的顶替旧的
8919 请求历史积分 c->s
8920 回复历史积分 s->c
8921 近距离提示 m
8922 聊天 m 客户端和服务器广播同一个命令字/PB结构,服务器不做任何处理
8923 游戏信息 s->c 刷新游戏信息
8931 系统发牌 s->m 广播给房间内玩家,每个人信息不同
8932 提示包庄 s->m 让玩家选择是否包庄
8933 玩家是否包庄 c->s 玩家是否包庄,出错回包,成功不回
8934 广播是否包庄 s->m 通知包庄
8936 提示出牌 s->m 通知玩家出牌
8937 玩家出牌 c->s 玩家出牌,出错时回包,成功不回
8938 广播出牌 s->m 广播给房间内玩家,玩家出牌
8939 广播清桌 s->m 广播给房间内玩家,通知清桌
8940 摊牌 s->m 广播给房间内玩家
8941 小局结算 s->m 广播给房间内玩家
8942 回放游戏信息
8955 回放
8956 广播用户进入托管模式 s->m
8957 取消托管模式 c->s true
8958 广播托管模式 s->m
8959 创建VIP房间 c->s true
8960 加入VIP房间 c->s true

协议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;
}

创建VIP房间

message EventCreateVIPRoom { // IRequest 8959

}

加入VIP房间

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

广播托管模式

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

取消托管模式

// 取消托管
message EventCancelEntrust { // IRequest 8957
 
}

广播用户进入托管模式

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

登录

syntax = "proto3";
package event;
message EventLogin { // IRequest 8901
    //用户登录标识
    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 8902
 //事件ID
 int32     eventId         = 1; 
 //返回码 0--表示成功  其它的为错误
 int32     code            = 2;
 //描述
 string    message         = 3; 
}

心跳包

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

房间列表

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

房间变化

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

加入房间

快速开始-不用填房间号

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

房间信息

syntax = "proto3";
package event;
import "player_info.proto";
//房间信息
message EventRoomInfo { //IResponse 8907
 // 房间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 8908
 //true-准备 false--取消准备
 bool  isReady  = 1;
}

玩家变化

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

游戏信息

syntax = "proto3";
package event;

import "use_out.proto";
import "assign_pai.proto";

message PBBombType {
 repeated int32 bts = 1[packed = false];
}
message PBGameInfo { // IResponse 8910
    // 当前是否包庄
    bool isBaoZhuang = 1;
    // 是否选择包庄中
    bool isChoiceBaoZhuang = 2;
    // 选择包庄剩余时间,还剩余多少秒考虑时间
    int32 remainBaoZhuangTime = 3;
    // 当前选择包庄座位号
    int32 choiceSeatId = 4;
    // 对家用户id,包庄才有效
    int32 oppositeUserId = 5;
    // 出牌token
    string outPaiToken = 6;
    // 庄家用户id
    int32 bankerUserId = 7;
    // 庄家座位id
    int32 bankerSeatId = 8;
    // 当前桌牌(按出牌顺序)
    repeated PBUseOut desktopPai = 9 [packed = false];
    // 当前出牌座位号
    int32 curOutPaiSeat = 10;
    // 当前出牌玩家的牌是否大的起上家
    bool  isCanPlayLast =11;
    // 当前手牌
    repeated int32 handPai = 12 [packed = false];
    // 每个玩家剩余张数(座位号为下标),小于等于5张才有效
    repeated int32 restNum = 13 [packed = false];
    // 每个玩家炸弹输赢分(座位号为下标)
    repeated int32 bombScore = 14 [packed = false];
    // 能否出牌
    bool canOutPai = 15;
    // 是否必须出牌
    bool mustOutPai = 16;
    // 出牌时的剩余时间
    int32 remainOutTime = 17;
    // 是否处于托管中
    repeated bool isEntrust = 18 [packed = false];
    // 还有几次取消托管的机会
    int32 cancelEntrustCount = 19;
    // 每个玩家出完顺序(座位号为下标),0-没出完,1-出完
    repeated int32 overOrder = 20 [packed = false];
}

申请解散

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 8912
 //申请的玩家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 8914
    //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 8915
}

回复LBS

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

//玩家间距离回包
message EventUseGeo { // IResponse 8916
    // 用户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 8918
 //用户ID
 int32   userId          = 1;
}

请求历史积分

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

回复历史积分

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

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

近距离提示

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

聊天

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

刷新游戏信息

syntax = "proto3";

package event;

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

系统发牌

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

提示包庄

syntax = "proto3";
package event;
message PBHintBaoZhuang { // IResponse 8932
    // 是否能选择包庄
    bool canBaoZhuang = 1;
    // 剩余多少秒的考虑时间
    int32 countdown = 2;
    // 当前庄家座位号
    int32 seatId = 3;
    // 当前庄家用户id
    int32 userId = 4;
    // 黑桃三先叫牌是否有效
    bool isSpade3Valid = 5;
    // 首局有黑桃三玩家座位号
    int32 seatIdBySpade3 = 6;
}

玩家是否包庄

syntax = "proto3";
package event;
message PBAskBaoZhuang { // IRequest 8933
    // 是否包庄
    bool isBaoZhuang = 1;
}

广播是否包庄

syntax = "proto3";
package event;
import "assign_pai.proto";
//包庄回复
message PBUseBaoZhuang { // IResponse 8934
    //座位号
    int32 seatId = 1;
    //玩家ID
    int32 userId = 2;
    // 是否包庄
    bool isBaoZhuang = 3;
}

提示出牌

syntax = "proto3";
package event;
message PBHintOut { // IResponse 8936
    // 出牌token
    string token = 1;
    // 当前出牌者座位号
    int32 seatId = 2;
    // 是否必须出牌
    bool isForce = 3;
    // 倒计时
    int32 countdown = 4;
    // 黑桃三先出牌是否有效
    bool isSpade3Valid = 5;
    // 首局有黑桃三玩家座位号
    int32 seatIdBySpade3 = 6;
    // 是否有打得起上家的牌 true-打得起 false-打不起
    bool isCanPlay = 7;
    // 下家是否报单
    bool nextReplySingle = 8;
    // 是否赢家出
    bool isWinnerFirstOut =9;
    // 是否包庄
    bool isBaoZhuang =10;
}

玩家出牌

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

广播出牌

扑克牌型掩码文档

syntax = "proto3";
package event;
message PBUseOut { // IResponse 8938
    // 出牌玩家座位号
    int32 seatId = 1;
    // 出牌玩家用户id
    int32 userId = 2;
    // 出的牌
    repeated int32 pai = 3 [packed = false];
    // 牌分类,1-单张,2-对子,3-3张,4-3带1,5-3带2,
    // 6-顺子,7-连对,8-飞机,10--4炸,1019--4带3,
    int32 paiClass = 4;
    // 牌掩码,例如单张3,3张3带2,见文档 http://192.168.2.160:1313/%E6%B8%B8%E6%88%8F%E5%8D%8F%E8%AE%AE/poker-mask.zh/
    int32 paiMask = 5;
    // 出完位置,0-没出完,1-出完
    int32 overOrder = 6;
    // 按座位号记录每个玩家此次炸弹输赢分,赢分为正数,输分为负数
    repeated int32 bombScore = 7 [packed = false];
    // 第几轮
    int32 roundIndex = 8;
    // 同一轮第几次
    int32 roundSerial = 9;
    // 是否不出
    bool isSkip = 10;
    // 剩余张数,等于1张才报单
    int32 restNum = 11;
}

广播清桌

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

摊牌

syntax = "proto3";
package event;
//用户的手牌
message PBTanPaiItem {
    repeated PBTanPaiItem items = 1 [packed = false];
    // 是否是解散
    bool isNormalOver = 2;
    // 是否包庄
    bool isBaoZhuagn = 3;
    // 是否是庄家赢
    bool isBankerWin = 4;
}

//摊牌
message PBTanPai { // IResponse 8940
    repeated PBTanPaiItem items = 1 [packed = false];
}

小局结算

syntax = "proto3";
package event;
message PBSmallMeta {
    //玩家ID
    int32 userId = 1;
    //玩家昵称
    string nickName = 2;
    //是否包庄
    bool isBaoZhuang = 3;
    //当前总游戏币(精确到分)
    int64 totalCoins = 4;
    //此局输赢分(牌局结束输赢+炸弹),赢分为正数,输分为负数
    int32 winScore = 5;
    //此局炸弹输赢分,赢分为正数,输分为负数
    int32 bombScore = 6;
    // 余牌分数
    int32 paiScore =7;
    //出完顺序,0-没出完,1-出完
    int32 overOrder = 8;
    //是否庄家(此局第一个出牌人)
    bool isBanker = 9;
    //牌局结束输赢分,赢分为正数,输分为负数
    int32 cardScore = 10;
    //此局输赢游戏币数,单位:分,赢为正数,输为负数
    int32 winCoins = 11;
    // 是否报单
    bool isVocalizeOdd = 12;
    // 玩家结束时的状态 0-正常结束 5-破庄  6-关门  8-包庄成功
    int32 overStatus =13;
    // 结束时余牌数量
    int32 paiNum = 14;
}

message PBSmallSettlement { // IResponse 8941
    //房间号
    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];
    //是否包庄
    bool isBaoZhuang = 10;
    //为true表示数据(是否包庄,是否庄家,出完顺序)有效,否则无效
    bool dataValid = 11;
    //房间底分
    int32 baseScore = 12;
    //结束原因, 0-玩家发起解散, 1-房间超过最低局数,有玩家退出, 2-房间达到最高局数
    // 3-有玩家游戏币为负数 5-解散成功
    int32 overReason = 13;
    //结束文字说明
    string overDoc = 14;
}

回放游戏信息

syntax = "proto3";
package event;

// 回放游戏信息
message PBReplayGame { // IResponse 8942
    // 是否包庄
    bool isBaoZhuang = 1;
    //庄家座位ID
    int32 BankerSeatId = 2;
    //庄家用户ID
    int32 BankerUserId = 3;
    // 系统发的手牌,按座位号为下标
    repeated PBAssignPai handPai = 4 [packed = false];
}

回放

syntax = "proto3";
package event;

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

}

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