乐安麻将二人场

错误码

错误码 描述
9045 房间不在游戏中
9046 无权不出
9047 不出token错误
9048 必须出牌
9049 出牌token错误
9050 出牌错误
9051 无权出牌
9052 操作被取消

事件定义

从9000到9099 事件流向:

  • c->s 客户端发送到服务器端
  • s->c 服务器端发送到客户端
事件编号 事件名称 事件流向 描述 备注
9001 登录 c->s 进入游戏要进行登录验证
9002 服务器返回 s->c 服务器通用返回
9003 心跳包 c->s 客户端每5秒向服务端发起心跳包
9004 房间列表 c->s 房间列表
9005 大厅内有房间变化 s->c 大厅内有房间内变化,广播所有大厅里不在房间内玩家
9006 加入房间 c->s 房间ID,不填房间号,就是系统选房间即快速开始
9007 房间信息 c->s 房间信息
9008 准备 c->s 准备
9009 广播房间变化 s->c 房间内有玩家变化,广播给房间内玩家
9010 游戏信息 s->c 游戏信息
9011 申请解散 c->s 申请解散
9012 提示玩家投票及广播解散意见 s->c 提示玩家投票及广播解散意见
9013 玩家是否同意解散 c->s 玩家是否同意解散
9014 解散房间的结果 s->c 解散房间的结果
9015 玩家间距离请求 c->s 玩家间距离请求
9016 玩家间距离回包 s->c 玩家间距离回包
9017 用户请求退出房间 c->s 用户请求退出房间
9018 同个用户新登陆踢出旧登陆 s->c 同个用户新登陆踢出旧登陆
9019 请求历史积分 c->s 请求历史积分
9020 历史积分回包 s->c 历史积分回包
9021 玩家间距离太近提示 s->c 玩家间距离太近提示
9022 聊天 客户端和服务器广播同一个命令字,同一个PB结构;服务器纯广播,不做任何处理
9023 游戏信息 s->c 刷新游戏信息
9031 广播骰子结果 s->c 广播骰子结果,暂时没有用到
9032 系统发牌 s->c 系统发牌
9033 提示出牌 s->c 提示出牌,发给可以出牌的玩家
9034 提示等待出牌 s->c 提示等待出牌,发给等待别人出牌的玩家
9035 请求出牌 c->s 请求出牌
9036 广播出牌结果 s->c 广播出牌结果
9037 广播多个出牌结果 s->c 广播多个出牌结果,如果多个抢杠胡,则一起发
9038 摊牌 s->c 摊牌
9039 小局结算 s->c 小局结算
9040 回放游戏信息 s->c 回放游戏信息
9055 回放 c->s 回放,客户端要求
9059 创建VIP房间 c->s 创建VIP房间
9060 加入VIP房间 c->s 加入VIP房间

登录

syntax = "proto3";
package event;

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

心跳包

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

房间列表

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

大厅内有房间变化

syntax = "proto3";
package event;
message EventUseRoomChange {  // IResponse 9005
    //变化原因 (0-创建,1-更新资料,2-开始游戏,3-解散)
    int32 reason = 1;
    //变化后房间信息
    EventRoomInfo roomInfo = 2;
    // 开始房间数
    int32 StartedRoomNum = 3;
}

加入房间

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

房间信息

syntax = "proto3";
package event;
message EventRoomInfo { // IResponse 9007
    // 房间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 9008
    //true-准备 false--取消准备
    bool isReady = 1;
}

广播房间变化

syntax = "proto3";
package event;
// 房间内有玩家变化,广播给房间内玩家
message EventUsePlayerChange { // IResponse 9009
    //变化原因, 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;
// 游戏信息
message PBGameInfo { // IResponse 9010
 // 骰子结果
    PBUseDice dice = 1;
    // 当前手牌及提示/等待出牌
    PBAssignPai assignPai = 2;
    // 当前出牌池(按出牌顺序)
    repeated int32 outPaiPool = 3[packed = false];
    // 剩下的牌张数
    int32   restPaiPoolNum    = 4;
    // 每个玩家信息列表,按座位号为下标
    repeated PBHistoryInfo playerInfoList = 5[packed = false];
    // 庄家座位号
    int32 zhuangSeat = 6;
}

申请解散

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

提示玩家投票及广播解散意见

syntax = "proto3";
package event;
message EventQueryDismassRoom { // IResponse 9012
    //申请的玩家ID
    int32 applyUserId = 1;
    //申请的玩家昵称
    string applyNickName = 2;
    //各个玩家投票情况
    repeated EventPlayerVote playerVote = 3 [packed = false];
    //解散还剩的秒数 如:89
    int32 remainderTime = 5;
}

玩家是否同意解散

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

解散房间的结果

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

玩家间距离请求

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

玩家间距离回包

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

用户请求退出房间

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

同个用户新登陆踢出旧登陆

syntax = "proto3";
package event;
message EventKickOut { // IResponse 9018
    //用户ID
    int32 userId = 1;
}

请求历史积分

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

历史积分回包

syntax = "proto3";
package event;
// 历史积分回包
message EventUseHistoryScore { // IResponse 9020
    repeated EventHistoryScoreItem items = 1 [packed = false];
}

玩家间距离太近提示

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

聊天

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

刷新游戏信息

syntax = "proto3";

package event;

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

广播骰子结果

// 广播骰子结果
message PBUseDice { // IResponse 9031
    // 小的点数
    int32 smaller = 1;
    // 大的点数
    int32 larger = 2;
    // 庄家座位号
    int32 seatId = 3;
    // 总共麻将牌数
    int32 allPaiNum = 4;
}

系统发牌


syntax = "proto3";
package event;
// 系统发牌
message PBAssignPai { // IResponse 9032
 // 手牌,庄/闲家13张
 repeated int32 paiList  = 1[packed = false];
    // 提示出牌,
    // 如果本字段为空,说明自已不能出牌
    PBHintOut hint = 2;
    // 提示等待出牌
    // 如果本字段为空,说明自已要出牌
    PBWaitOut wait = 3;
    // 庄家风位牌墙起点到到骰子起点
    // 即起点摸牌左边余下多少牌数
    int32 leftPaiNum = 4;
    // 摸牌后右边余下多少牌数
    int32 rightPaiNum = 5;
    // 同步牌数量
    repeated PBSyncNum syncNumList = 6[packed = false];
    // 庄家座位号
    int32 zhuangSeat = 7;
}

提示出牌

syntax = "proto3";
package event;
// 提示出牌,发给可以出牌的玩家
message PBHintOut { // IResponse 9033
    // 是否必须出牌(玩家必须选[出牌|碰|杠|胡]其中一个)
    bool isForce = 1;
 // 出牌token
 string token =2;
    // 是否能胡
    bool canHu = 3;
    // 是否能杠
    bool canGang = 4;
    // 是否能碰
    bool canPeng = 5;
    // 是否能出牌
    bool canOut = 6;
    // 系统是否派牌
    bool hasAddPai = 7;
    // 系统派给玩家牌
    int32 addPai = 8;
    // 风向光标指向座位号
    int32 cursorSeatId  = 9;
    // 手牌中有多张杠牌
    repeated PBHintGang gangList = 10[packed = false];
    // 胡牌类型,41-自摸,42-抢杠胡,43-杠上花,44-点炮胡
    int32 huMask = 11;
    // 碰的牌
    int32 pengpai = 12;
    // 牌墙剩余数
    int32 qiangNum = 13;
    // 客户端回放可能用到
    int32 seatId = 14;
    // 胡牌番型,平胡,十三烂等
    int32 HuTypeNum = 15;
    // 胡牌的牌
    int32 HuPai = 16;
}

提示等待出牌

syntax = "proto3";
package event;
// 提示等待出牌,发给等待别人出牌的玩家
message PBWaitOut { // IResponse 9034
    // 风向光标指向座位号
    int32 cursorSeatId  = 1;
    // 系统是否派牌
    bool hasAddPai = 2;
    // 系统派给玩家座位号
    int32 addPaiSeatId = 3;
    // 牌墙剩余数
    int32 qiangNum = 4;
    // 是否继续等待,如果自已出过牌,但仍然后等待其他玩家操作,则此字段为true,否则为false
    bool isKeep = 5;
}

请求出牌

syntax = "proto3";
package event;
message PBAskOut { // IRequest 9035
 // 出牌token
 string token=1;
    // 0-出牌(需要填充pai字段),1-碰,2-杠(需要填充pai字段,手牌可能有多杠),3-胡,4-过
     // 5-取消杠胡(玩家主动/强制出牌,可杠可胡可出牌时,取消杠胡只要出牌)
    int32 action = 2;
 // 此次出的牌
    int32 pai  = 3;
}

广播出牌结果

syntax = "proto3";
package event;
// 广播出牌结果
message PBUseOut { // IResponse 9036
 // 出牌玩家座位号
 int32 seatId =1;
    // 出牌类型
    // 0-出牌,1-碰,2-杠,3-胡,4-过(仅回放才有),5-取消杠/胡(仅回放才有)
    int32 outType = 2;
    // 出牌掩码
    // 0-出牌
    // 1-碰
    // 20-暗杠,21-直杠(明杠),22-补杠(转角杠)
    // 41-自摸,42-抢杠胡,43-杠上花,44-点炮胡
    // 40-过(仅回放才有)
    // 50-取消碰/杠/胡(仅回放才有)
    int32 outMask = 3;
 // 出/碰/杠的牌
    int32 pai  = 5[packed = false];
    // 是否有被操作玩家,自模/暗杠等没有被操作玩家
    bool hasWithSeatId = 6;
    // 被碰/杠/胡玩家的座位号
    int32 withSeatId = 7;
    // 出牌类型为杠才有,出牌玩家的杠列表(从开局到现在,包括这次), 按发生顺序
    repeated PBHistoryOut gangList = 8[packed = false];
    // 出牌类型为碰才有,出牌玩家的碰列表(从开局到现在,包括这次), 按发生顺序
    repeated PBHistoryOut pengList = 9[packed = false];
    // 只有出牌类型为杠才有, 杠完每个玩家的游戏币(精确到分), 按座位号顺序
    repeated int64 totalCoins = 10[packed = false];
    // 只有出牌类型为杠才有, 此次杠出牌, 每个玩家的得失分, 得分为正,失分为负, 按座位号顺序
    repeated int32 oddScore = 11[packed = false];
    // 只有出牌类型为胡才有, 胡牌番型,平胡,十三烂等
    int32 HuTypeNum = 12;
    // 只有出牌类型为胡才有,胡牌的牌
    int32 HuPai = 13;
}

广播多个出牌结果

syntax = "proto3";
package event;
// 广播多个出牌结果,如果多个抢杠胡,则一起发
message PBMultiUseOut { // IResponse 9037
    repeated PBUseOut outList = 1[packed = false];
}

摊牌

syntax = "proto3";
package event;
// 摊牌
message PBTanPai { // IResponse 9038
    repeated PBTanPaiItem items = 1[packed = false];
    // 是否流局
    bool isFlow = 2;
}

小局结算

syntax = "proto3";
package event;
// 小局结算
message PBSmallSettlement { // IResponse 9039
    // 房间号
    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;
    // 房间底分
    int32 baseScore = 9;
    // 结束原因, 0-玩家发起解散, 1-房间超过最低局数,有玩家退出, 2-房间达到最高局数
    // 3-有玩家游戏币为负数
    int32 overReason = 10;
    // 结束文字说明
    string overDoc = 11;
    // 数据是否有效(奖马,胡牌,流局,放炮,各种分等)
    bool dataValid = 12;
    // 是否流局
    bool isFlow = 13;
    // 奖马
    repeated PBPrizeHorse prizeHorseList = 14 [packed = false];
    // 各玩家的情况,座位号为下标
    repeated PBSmallMeta players = 15 [packed = false];
}

message PBSmallMeta {
    // 玩家ID
    int32 userId = 1;
    // 玩家昵称
    string nickName = 2;
    // 当前总游戏币(精确到分)
    int64 totalCoins = 3;
    // 此局输赢分,赢分为正数,输分为负数
    int32 winScore = 4;
    // 是否为庄家
    bool isBanker = 5;
    // 是否胡牌
    bool isHu = 6;
    // 最后胡的牌
    int32 huPai = 7;
    // 胡牌类型,41-自摸,42-抢杠胡,43-杠上花,44-点炮胡
    int32 huType = 8;
    // 是否放炮
    bool isPao = 9;
    // 胡分,赢分为正数,输分为负数
    int32 huScore = 10;
    // 杠分,赢分为正数,输分为负数
    int32 gangScore = 11;
    // 跟庄分,赢分为正数,输分为负数
    int32 followBankerScore = 12;
    // 中马分,赢分为正数,输分为负数
    int32 prizeHorseScore = 13;
    // 手牌(如果胡牌/流局/解散,则不包括最后胡/派的牌)
    repeated int32 handPaiList = 14 [packed = false];
    // 玩家的杠列表, 按发生顺序
    repeated PBHistoryOut gangList = 15 [packed = false];
    // 玩家的碰列表, 按发生顺序
    repeated PBHistoryOut pengList = 16 [packed = false];
    // 胡牌番型,平胡,十三烂等
    int32 HuTypeNum = 17;
    // 此局输赢游戏币数(精确到分),赢为正数,输为负数
    int64 WinCoins = 18;
    // 是否有派牌(如果流局/解散,系统最后给玩家派牌)
    bool hasAddPai = 19;
    // 系统的派牌
    int32 addPai = 20;
}

// 奖马
message PBPrizeHorse {
    // 麻将牌
    int32 pai = 1;
    // 是否中奖
    bool isPrize = 2;
}

回放游戏信息

syntax = "proto3";
package event;
// 回放游戏信息
message PBReplayGame { // IResponse 9040
 // 系统发的手牌,按座位号为下标
 repeated PBAssignPai assignPaiList = 1[packed = false];
}

回放

syntax = "proto3";
package event;
//回放,客户端要求
message PBReplay { // IResponse 9055
    repeated PBReplayCell cells = 1[packed = false];
}

创建VIP房间

syntax = "proto3";
package event;

message EventCreateVIPRoom { // IRequest 9059

}

加入VIP房间

syntax = "proto3";
package event;
message EventJoinVIPRoom { // IRequest 9060
    string pwd = 2;
}