This commit is contained in:
liwei1dao 2023-11-08 21:41:58 +08:00
commit 4032624aa0
12 changed files with 130 additions and 62 deletions

View File

@ -145,6 +145,7 @@ func (this *apiComp) Train(session comm.IUserSession, req *pb.DragonTrainReq) (e
dragon.Property["sprint"] = c.Sprint dragon.Property["sprint"] = c.Sprint
dragon.Property["acceleration"] = c.Acceleration dragon.Property["acceleration"] = c.Acceleration
dragon.Property["deceleration"] = c.Deceleration dragon.Property["deceleration"] = c.Deceleration
dragon.Property["energyrecover"] = c.Energyrecover
dragon.Property["caddtime"] = c.Caddtime dragon.Property["caddtime"] = c.Caddtime
dragon.Property["csubtime"] = c.Csubtime dragon.Property["csubtime"] = c.Csubtime
update["property"] = dragon.Property // 更新属性 update["property"] = dragon.Property // 更新属性

View File

@ -115,6 +115,7 @@ func (this *ModelDragon) CreateDragon(session comm.IUserSession, dragons map[str
dragon.Property["sprint"] = c.Sprint dragon.Property["sprint"] = c.Sprint
dragon.Property["acceleration"] = c.Acceleration dragon.Property["acceleration"] = c.Acceleration
dragon.Property["deceleration"] = c.Deceleration dragon.Property["deceleration"] = c.Deceleration
dragon.Property["energyrecover"] = c.Energyrecover
dragon.Property["caddtime"] = c.Caddtime dragon.Property["caddtime"] = c.Caddtime
dragon.Property["csubtime"] = c.Csubtime dragon.Property["csubtime"] = c.Csubtime
} }

View File

@ -94,6 +94,7 @@ func (this *Dragon) CreateRobotDragon(dragonid string, lv int32) (dragon *pb.DBD
dragon.Property["sprint"] = c.Sprint dragon.Property["sprint"] = c.Sprint
dragon.Property["acceleration"] = c.Acceleration dragon.Property["acceleration"] = c.Acceleration
dragon.Property["deceleration"] = c.Deceleration dragon.Property["deceleration"] = c.Deceleration
dragon.Property["energyrecover"] = c.Energyrecover
// dragon.Property["itemsprint"] = c.Itemsprint // dragon.Property["itemsprint"] = c.Itemsprint
dragon.Property["caddtime"] = c.Caddtime dragon.Property["caddtime"] = c.Caddtime
dragon.Property["csubtime"] = c.Csubtime dragon.Property["csubtime"] = c.Csubtime
@ -186,6 +187,7 @@ func (this *Dragon) GMModifyDragonLv(uid string, cid string, lv int32) (dragon *
dragon.Property["sprint"] = c.Sprint dragon.Property["sprint"] = c.Sprint
dragon.Property["acceleration"] = c.Acceleration dragon.Property["acceleration"] = c.Acceleration
dragon.Property["deceleration"] = c.Deceleration dragon.Property["deceleration"] = c.Deceleration
dragon.Property["energyrecover"] = c.Energyrecover
dragon.Property["caddtime"] = c.Caddtime dragon.Property["caddtime"] = c.Caddtime
dragon.Property["csubtime"] = c.Csubtime dragon.Property["csubtime"] = c.Csubtime
update["property"] = dragon.Property update["property"] = dragon.Property

View File

@ -63,8 +63,9 @@ func (this *apiComp) CreateRoom(session comm.IUserSession, req *pb.EntertainCrea
return return
} }
p1 := &pb.PlayerData{ p1 := &pb.PlayerData{
Userinfo: comm.GetUserBaseInfo(user), Userinfo: comm.GetUserBaseInfo(user),
Cardid: req.Idcard, Cardid: req.Idcard,
Consumeexp: user.Consumeexp,
} }
if room, err = this.module.gameMgr.CreateMasterRoom(p1); err != nil { if room, err = this.module.gameMgr.CreateMasterRoom(p1); err != nil {
errdata = &pb.ErrorData{ errdata = &pb.ErrorData{

View File

@ -61,8 +61,9 @@ func (this *apiComp) JoinRoom(session comm.IUserSession, req *pb.EntertainJoinRo
return return
} }
p := &pb.PlayerData{ p := &pb.PlayerData{
Userinfo: comm.GetUserBaseInfo(user), Userinfo: comm.GetUserBaseInfo(user),
Cardid: req.Idcard, Cardid: req.Idcard,
Consumeexp: user.Consumeexp,
} }
if _, err = this.module.gameMgr.JoinMasterRoom(req.Roomid, p); err != nil { if _, err = this.module.gameMgr.JoinMasterRoom(req.Roomid, p); err != nil {

View File

@ -58,8 +58,9 @@ func (this *apiComp) Match(session comm.IUserSession, req *pb.EntertainMatchReq)
} }
this.module.match.MatchReq(&pb.DBXXLMatch{ this.module.match.MatchReq(&pb.DBXXLMatch{
Userinfo: comm.GetUserBaseInfo(user), Userinfo: comm.GetUserBaseInfo(user),
Cardid: req.Idcard, Cardid: req.Idcard,
Consumeexp: user.Consumeexp,
}) })
session.SendMsg(string(this.module.GetType()), "match", &pb.EntertainMatchResp{ session.SendMsg(string(this.module.GetType()), "match", &pb.EntertainMatchResp{

View File

@ -251,3 +251,24 @@ func (this *configureComp) GetGameBlockByKey(key int32) (conf *cfg.GameBlockData
err = comm.NewNotFoundConfErr(moduleName, game_block, key) err = comm.NewNotFoundConfErr(moduleName, game_block, key)
return return
} }
// 通过权重获取一个普通元素
func (this *configureComp) GetGameNormalElem() (rd int32) {
var (
v interface{}
szWeight []int32
err error
)
if v, err = this.GetConfigure(game_block); err == nil {
if configure, ok := v.(*cfg.GameBlock); ok {
for _, v := range configure.GetDataList() {
if v.Key > 6 {
break
}
szWeight = append(szWeight, v.Weight)
}
}
}
rd = comm.GetRandW(szWeight) + 1
return
}

View File

@ -68,13 +68,15 @@ func (this *matchComp) MatchNotic(players map[string]interface{}) (err error) {
for pos, v := range playerSlice { for pos, v := range playerSlice {
if pos == 0 { if pos == 0 {
p1 = &pb.PlayerData{ p1 = &pb.PlayerData{
Userinfo: v.Userinfo, Userinfo: v.Userinfo,
Cardid: v.Cardid, Cardid: v.Cardid,
Consumeexp: v.Consumeexp,
} }
} else if pos == 1 { } else if pos == 1 {
p2 = &pb.PlayerData{ p2 = &pb.PlayerData{
Userinfo: v.Userinfo, Userinfo: v.Userinfo,
Cardid: v.Cardid, Cardid: v.Cardid,
Consumeexp: v.Consumeexp,
} }
} else { } else {
break break

View File

@ -146,6 +146,7 @@ func (this *Room) AiOperator() {
this.player2.Energy += v.CurEnergy this.player2.Energy += v.CurEnergy
v.CurEnergy = this.player2.Energy v.CurEnergy = this.player2.Energy
} }
// 广播消息 // 广播消息
if err := this.module.SendMsgSyncToSession(string(this.module.GetType()), "operatorrst", &pb.EntertainOperatorRstPush{ if err := this.module.SendMsgSyncToSession(string(this.module.GetType()), "operatorrst", &pb.EntertainOperatorRstPush{
Mpadata: szMap, Mpadata: szMap,
@ -568,7 +569,15 @@ func (this *Room) GameOver() (errdata *pb.ErrorData) {
if conf, err := this.module.configure.GetGameConsumeintegral(user.Consumeexp); err == nil { if conf, err := this.module.configure.GetGameConsumeintegral(user.Consumeexp); err == nil {
//res = append(res, conf.Onereward...) 这奖励手动领取 //res = append(res, conf.Onereward...) 这奖励手动领取
res = append(res, conf.Rewards...) res = append(res, conf.Rewards...)
for _, v := range res {
if v.A == "attr" && v.T == "consumeexp" {
if winner.Userinfo.Uid == this.player1.Userinfo.Uid {
this.player1.Consumeexp += v.N
} else {
this.player2.Consumeexp += v.N
}
}
}
if errdata, atno = this.module.DispenseAtno(this.szSession[winindex], res, true); errdata != nil { if errdata, atno = this.module.DispenseAtno(this.szSession[winindex], res, true); errdata != nil {
return return
} }

View File

@ -45,9 +45,7 @@ type MapData struct {
// 1~6随机一个数 // 1~6随机一个数
func (this *MapData) GetRandType() int32 { func (this *MapData) GetRandType() int32 {
return this.module.configure.GetGameNormalElem() // 权重随机
n, _ := rand.Int(rand.Reader, big.NewInt(6))
return int32(n.Int64() + 1)
} }
// 玩法带入 // 玩法带入
@ -80,6 +78,39 @@ func (this *MapData) CreateGride(count int) (girdes []*pb.GirdeData) {
return return
} }
// 生成自定义地图
func (this *MapData) SetMap() {
sz2 := []int32{
3, 1, 2, 2, 1, 3, 1,
5, 1, 2, 3, 1, 2, 2,
2, 4, 3, 4, 3, 1, 6,
1, 3, 3, 4, 2, 3, 6,
1, 5, 2, 5, 6, 1, 4,
6, 6, 3, 26, 3, 1, 3,
3, 3, 1, 3, 3, 2, 5,
}
var pos int
for index := Width - 1; index >= 0; index-- {
for j := 0; j < Height; j++ {
Color := sz2[pos]
Cid := sz2[pos]
if sz2[pos] > 6 { // 特殊元素
conf, err := this.module.configure.GetGameBlockByKey(sz2[pos])
if err == nil {
Color = conf.Color
Cid = conf.Key
this.Plat[index+j*Height].Special = conf.Type
}
}
this.Plat[index+j*Height].Color = Color
this.Plat[index+j*Height].Cid = Cid
pos++
}
}
this.CheckAndRefreshPlat()
// this.SetIndelibilityPlat()
}
// 初始化地图数据 // 初始化地图数据
func (this *MapData) InitMap(module *Entertainment, iType int32) { func (this *MapData) InitMap(module *Entertainment, iType int32) {
this.module = module this.module = module
@ -117,7 +148,7 @@ func (this *MapData) InitMap(module *Entertainment, iType int32) {
this.SetIndelibilityPlat() this.SetIndelibilityPlat()
this.Plat = this.GetPalatData() this.Plat = this.GetPalatData()
// this.SetMap() // 方便测试固定地图 //this.SetMap() // 方便测试固定地图
} }
// 交换之前先判断是不是特殊元素的交换 // 交换之前先判断是不是特殊元素的交换
@ -136,6 +167,7 @@ func (this *MapData) CheckSpecialElemChange(oldId, newId int32, color int32) (bS
this.Plat[oldId] = tmp this.Plat[oldId] = tmp
this.operElem = append(this.operElem, newId) this.operElem = append(this.operElem, newId)
this.operElem = append(this.operElem, oldId) this.operElem = append(this.operElem, oldId)
x = this.SpecialElem(int(oldId), this.Plat[oldId].Special) x = this.SpecialElem(int(oldId), this.Plat[oldId].Special)
xc := this.SpecialElem(int(newId), this.Plat[newId].Special) xc := this.SpecialElem(int(newId), this.Plat[newId].Special)
for k := range xc { for k := range xc {
@ -548,12 +580,12 @@ func (this *MapData) DropGirde() bool {
} }
} }
if len(mp) < 2 { if len(mp) < 2 {
for { ilen := 2 - len(mp)
mp = make(map[int]struct{}, ilen)
for i := 0; i < ilen; i++ {
n1, _ := rand.Int(rand.Reader, big.NewInt(int64(len(fill)))) n1, _ := rand.Int(rand.Reader, big.NewInt(int64(len(fill))))
mp[fill[n1.Int64()]] = struct{}{} mp[fill[n1.Int64()]] = struct{}{}
if len(mp) >= 2 {
break
}
} }
if this.iType == 3 { if this.iType == 3 {
sp = 4 sp = 4
@ -738,36 +770,6 @@ func (this *MapData) SkillUp(pos int32, color int32, skillid int32, value int32,
return return
} }
func (this *MapData) SetMap() {
sz2 := []int32{
3, 3, 2, 2, 1, 3, 1,
5, 1, 3, 3, 1, 2, 2,
3, 2, 1, 4, 3, 1, 6,
1, 4, 3, 4, 2, 3, 6,
1, 5, 6, 5, 6, 1, 4,
6, 6, 3, 6, 3, 1, 3,
3, 3, 1, 3, 3, 2, 5,
// 1, 4, 2, 5, 4, 5, 2,
// 3, 2, 3, 5, 2, 1, 4,
// 2, 5, 5, 4, 5, 4, 1,
// 3, 1, 3, 5, 2, 6, 3,
// 4, 5, 4, 2, 4, 1, 1,
// 5, 3, 1, 5, 3, 3, 4,
// 4, 2, 4, 1, 2, 3, 4,
}
var pos int
for index := Width - 1; index >= 0; index-- {
for j := 0; j < Height; j++ {
this.Plat[index+j*Height].Color = sz2[pos]
this.Plat[index+j*Height].Cid = sz2[pos]
pos++
}
}
this.CheckAndRefreshPlat()
// this.SetIndelibilityPlat()
}
// 校验当前地图 有没有能消除的 // 校验当前地图 有没有能消除的
func (this *MapData) CheckAndRefreshPlat() (bEliminate bool) { func (this *MapData) CheckAndRefreshPlat() (bEliminate bool) {
bEliminate = false bEliminate = false
@ -1128,7 +1130,9 @@ func (this *MapData) GetBoomElem(pos int) (elem []int) {
func (this *MapData) GetFireBoom(pos int, itype int32) (elem []int) { func (this *MapData) GetFireBoom(pos int, itype int32) (elem []int) {
x := int(pos / Width) x := int(pos / Width)
y := int(pos % Height) y := int(pos % Height)
if itype == FireUp || itype == FireDown || itype == FireLeft || itype == FireRight {
elem = append(elem, pos)
}
switch itype { switch itype {
case FireUp: //上烟火 case FireUp: //上烟火
for i := 0; i < Height; i++ { for i := 0; i < Height; i++ {
@ -1165,6 +1169,9 @@ func (this *MapData) GetFireBoom(pos int, itype int32) (elem []int) {
// 特殊类型元素 统一处理 // 特殊类型元素 统一处理
func (this *MapData) SpecialElem(id int, s int32) (x map[int]struct{}) { func (this *MapData) SpecialElem(id int, s int32) (x map[int]struct{}) {
if s <= 0 {
return
}
x = make(map[int]struct{}) x = make(map[int]struct{})
if s == FourUType { // 4消上下类型 if s == FourUType { // 4消上下类型
@ -1183,6 +1190,7 @@ func (this *MapData) SpecialElem(id int, s int32) (x map[int]struct{}) {
x[v] = struct{}{} x[v] = struct{}{}
} }
} }
} else if s == BoomType { // 炸弹类型 带走周围一圈+ 上下左右 } else if s == BoomType { // 炸弹类型 带走周围一圈+ 上下左右
for _, key := range this.GetBoomElem(id) { for _, key := range this.GetBoomElem(id) {
x[key] = struct{}{} x[key] = struct{}{}
@ -1192,7 +1200,8 @@ func (this *MapData) SpecialElem(id int, s int32) (x map[int]struct{}) {
x[key] = struct{}{} x[key] = struct{}{}
} }
} }
this.Plat[id].Special = 0
x[id] = struct{}{}
for k := range x { for k := range x {
if k == id { if k == id {
continue continue

View File

@ -91,7 +91,7 @@ func Test_Main(t *testing.T) {
m.InitMap(nil, 1) m.InitMap(nil, 1)
//m.SkillUp(24, 1, 3, 7, true) //m.SkillUp(24, 1, 3, 7, true)
m.SetMap()
b := m.GetFireBoom(1, 7) b := m.GetFireBoom(1, 7)
fmt.Printf("xxxx %d\n", b) fmt.Printf("xxxx %d\n", b)
var vids int var vids int

View File

@ -177,11 +177,12 @@ type PlayerData struct {
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
Userinfo *BaseUserInfo `protobuf:"bytes,1,opt,name=userinfo,proto3" json:"userinfo"` Userinfo *BaseUserInfo `protobuf:"bytes,1,opt,name=userinfo,proto3" json:"userinfo"`
Score int32 `protobuf:"varint,2,opt,name=score,proto3" json:"score"` // 积分 Score int32 `protobuf:"varint,2,opt,name=score,proto3" json:"score"` // 本局战斗得分
Ps int32 `protobuf:"varint,3,opt,name=ps,proto3" json:"ps"` // 体力 Ps int32 `protobuf:"varint,3,opt,name=ps,proto3" json:"ps"` // 体力
Cardid string `protobuf:"bytes,4,opt,name=cardid,proto3" json:"cardid"` // 出战的英雄卡 Cardid string `protobuf:"bytes,4,opt,name=cardid,proto3" json:"cardid"` // 出战的英雄卡
Energy int32 `protobuf:"varint,5,opt,name=energy,proto3" json:"energy"` // 能量进度 Energy int32 `protobuf:"varint,5,opt,name=energy,proto3" json:"energy"` // 能量进度
Consumeexp int32 `protobuf:"varint,6,opt,name=consumeexp,proto3" json:"consumeexp"` // 消消乐积分
} }
func (x *PlayerData) Reset() { func (x *PlayerData) Reset() {
@ -251,14 +252,22 @@ func (x *PlayerData) GetEnergy() int32 {
return 0 return 0
} }
func (x *PlayerData) GetConsumeexp() int32 {
if x != nil {
return x.Consumeexp
}
return 0
}
// 消消乐匹配数据 // 消消乐匹配数据
type DBXXLMatch struct { type DBXXLMatch struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
Userinfo *BaseUserInfo `protobuf:"bytes,1,opt,name=userinfo,proto3" json:"userinfo"` Userinfo *BaseUserInfo `protobuf:"bytes,1,opt,name=userinfo,proto3" json:"userinfo"`
Cardid string `protobuf:"bytes,2,opt,name=cardid,proto3" json:"cardid"` // 选择的卡片ID Cardid string `protobuf:"bytes,2,opt,name=cardid,proto3" json:"cardid"` // 选择的卡片ID
Consumeexp int32 `protobuf:"varint,3,opt,name=consumeexp,proto3" json:"consumeexp"` // 消消乐积分
} }
func (x *DBXXLMatch) Reset() { func (x *DBXXLMatch) Reset() {
@ -307,6 +316,13 @@ func (x *DBXXLMatch) GetCardid() string {
return "" return ""
} }
func (x *DBXXLMatch) GetConsumeexp() int32 {
if x != nil {
return x.Consumeexp
}
return 0
}
type BoxData struct { type BoxData struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -495,7 +511,7 @@ var file_entertain_entertain_db_proto_rawDesc = []byte{
0x28, 0x05, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x28, 0x05, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65,
0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a,
0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07,
0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x22, 0x8d, 0x01, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x79, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x22, 0xad, 0x01, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x79,
0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e,
0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x55, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x55,
0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66,
@ -504,12 +520,16 @@ var file_entertain_entertain_db_proto_rawDesc = []byte{
0x01, 0x28, 0x05, 0x52, 0x02, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x01, 0x28, 0x05, 0x52, 0x02, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69,
0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x12, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x12,
0x16, 0x0a, 0x06, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52,
0x06, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x22, 0x4f, 0x0a, 0x0a, 0x44, 0x42, 0x58, 0x58, 0x4c, 0x06, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x75,
0x6d, 0x65, 0x65, 0x78, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e,
0x73, 0x75, 0x6d, 0x65, 0x65, 0x78, 0x70, 0x22, 0x6f, 0x0a, 0x0a, 0x44, 0x42, 0x58, 0x58, 0x4c,
0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66,
0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x55, 0x73, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x55, 0x73,
0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f,
0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
0x52, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x07, 0x42, 0x6f, 0x78, 0x44, 0x52, 0x06, 0x63, 0x61, 0x72, 0x64, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73,
0x75, 0x6d, 0x65, 0x65, 0x78, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f,
0x6e, 0x73, 0x75, 0x6d, 0x65, 0x65, 0x78, 0x70, 0x22, 0x3b, 0x0a, 0x07, 0x42, 0x6f, 0x78, 0x44,
0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
0x28, 0x05, 0x52, 0x05, 0x62, 0x6f, 0x78, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x28, 0x05, 0x52, 0x05, 0x62, 0x6f, 0x78, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65,
0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6f, 0x70, 0x65,