From 041bcb7d376e908e1dbed90ac92af3bd6f3f0baa Mon Sep 17 00:00:00 2001 From: meixiongfeng <766881921@qq.com> Date: Thu, 27 Apr 2023 17:03:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E9=98=9F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/json/game_activereward.json | 20 +++- bin/json/game_rdtaskcondi.json | 4 +- bin/json/game_rdtasknpc.json | 16 ++- bin/json/game_taskactivereward.json | 20 +++- modules/caravan/api_buyorsell.go | 152 +-------------------------- modules/caravan/comp_configure.go | 153 +++++++--------------------- modules/caravan/model_troll.go | 4 +- modules/caravan/module.go | 61 +++++++++++ modules/hero/hero_test.go | 10 +- modules/practice/module.go | 2 +- pb/caravan_db.pb.go | 20 ++-- 11 files changed, 175 insertions(+), 287 deletions(-) diff --git a/bin/json/game_activereward.json b/bin/json/game_activereward.json index 03935fad3..f5a02e58f 100644 --- a/bin/json/game_activereward.json +++ b/bin/json/game_activereward.json @@ -10,7 +10,7 @@ "n": 1 } ], - "action": "25004_cheer_act", + "action": "ceshi", "stage": 1 }, { @@ -24,7 +24,7 @@ "n": 2 } ], - "action": "25004_cheer_act", + "action": "ceshi", "stage": 2 }, { @@ -38,7 +38,21 @@ "n": 3 } ], - "action": "25004_cheer_act", + "action": "ceshi", + "stage": 3 + }, + { + "key": 4, + "id_tag": 2, + "active": 160, + "reword": [ + { + "a": "item", + "t": "60002", + "n": 4 + } + ], + "action": "ceshi", "stage": 3 } ] \ No newline at end of file diff --git a/bin/json/game_rdtaskcondi.json b/bin/json/game_rdtaskcondi.json index 3fa215bcd..88ce8a5cf 100644 --- a/bin/json/game_rdtaskcondi.json +++ b/bin/json/game_rdtaskcondi.json @@ -968,7 +968,7 @@ }, "type": 61, "valid": 0, - "NPC": 102, + "NPC": 105, "data1": 1100105, "data2": 0, "data3": 0, @@ -1704,7 +1704,7 @@ }, "type": 61, "valid": 0, - "NPC": 102, + "NPC": 105, "data1": 1100106, "data2": 0, "data3": 0, diff --git a/bin/json/game_rdtasknpc.json b/bin/json/game_rdtasknpc.json index e47dfb5b4..0415ea550 100644 --- a/bin/json/game_rdtasknpc.json +++ b/bin/json/game_rdtasknpc.json @@ -55,6 +55,20 @@ ], "goto": 0 }, + { + "id": 105, + "heroid": 44004, + "datas": [ + "CommandScene", + "主线入口_原石", + "905" + ], + "event": [ + 10, + 166 + ], + "goto": 0 + }, { "id": 10010, "heroid": 25001, @@ -257,7 +271,7 @@ "datas": [ "GameMain", "20070_骇客蛛_1", - "905" + "901" ], "event": [ 2, diff --git a/bin/json/game_taskactivereward.json b/bin/json/game_taskactivereward.json index 03935fad3..f5a02e58f 100644 --- a/bin/json/game_taskactivereward.json +++ b/bin/json/game_taskactivereward.json @@ -10,7 +10,7 @@ "n": 1 } ], - "action": "25004_cheer_act", + "action": "ceshi", "stage": 1 }, { @@ -24,7 +24,7 @@ "n": 2 } ], - "action": "25004_cheer_act", + "action": "ceshi", "stage": 2 }, { @@ -38,7 +38,21 @@ "n": 3 } ], - "action": "25004_cheer_act", + "action": "ceshi", + "stage": 3 + }, + { + "key": 4, + "id_tag": 2, + "active": 160, + "reword": [ + { + "a": "item", + "t": "60002", + "n": 4 + } + ], + "action": "ceshi", "stage": 3 } ] \ No newline at end of file diff --git a/modules/caravan/api_buyorsell.go b/modules/caravan/api_buyorsell.go index c8a6d73e3..6cf52f6f8 100644 --- a/modules/caravan/api_buyorsell.go +++ b/modules/caravan/api_buyorsell.go @@ -3,166 +3,22 @@ package caravan import ( "go_dreamfactory/comm" "go_dreamfactory/pb" - "go_dreamfactory/sys/configure" - "math" ) //参数校验 -func (this *apiComp) BuyOrSellCheck(session comm.IUserSession, req *pb.TrollBuyOrSellReq) (code pb.ErrorCode) { +func (this *apiComp) BuyOrSellCheck(session comm.IUserSession, req *pb.CaravanBuyOrSellReq) (code pb.ErrorCode) { if len(req.Items) == 0 { code = pb.ErrorCode_ReqParameterError } return } -func (this *apiComp) BuyOrSell(session comm.IUserSession, req *pb.TrollBuyOrSellReq) (code pb.ErrorCode, data *pb.ErrorData) { - var ( - bSell bool // 是否有出售 - gold int32 // 当次交易 获得的金币 - earn int32 // 只统计赚的金币 - update map[string]interface{} - gridNum int32 // 格子数量 - trolltrain *pb.DBTrollTrain - ) - update = make(map[string]interface{}) +func (this *apiComp) BuyOrSell(session comm.IUserSession, req *pb.CaravanBuyOrSellReq) (code pb.ErrorCode, data *pb.ErrorData) { + + //update := make(map[string]interface{}) if code = this.BuyOrSellCheck(session, req); code != pb.ErrorCode_Success { return // 参数校验失败直接返回 } - _, err := this.module.modelCaravan.getCaravanList(session.GetUserId()) - if err != nil { - code = pb.ErrorCode_DBError - return - } - dayMaxCount := this.configure.GetTrollRule(comm.TrollBuyCount) - aiMaxCount := this.configure.GetTrollRule(comm.TrollAIBuyCount) - for k, v := range req.Items { - - if v == 0 { // 过滤数量为0 的消息 - continue - } - if trolltrain.RangeId == 0 { - trolltrain.RangeId = 1 - update["rangeId"] = trolltrain.RangeId - } - if v < 0 { - if !bSell { - bSell = true - trolltrain.SellCount += 1 // 交易次数+1 - if trolltrain.SellCount > dayMaxCount || (trolltrain.SellCount+trolltrain.AiCount) > aiMaxCount { - code = pb.ErrorCode_TrollMaxSellCount // 达到最大交易次数 直接返回 - return - } - update["sellCount"] = trolltrain.SellCount - } - } - - if _, ok := trolltrain.Shop[k]; !ok { - if v > 0 { - trolltrain.Shop[k] = v // 限购 - } - } else { - if v > 0 { - trolltrain.Shop[k] += v // 限购 - } - } - // 校验 是否大于买入最大限制 - goods := this.configure.GetTrollGoods(k) - if goods == nil { - return - } - if trolltrain.Shop[k] > goods.Max { // 判断是否有效交易 - // 买入上限 直接返回 - code = pb.ErrorCode_TrollBuyMax - return - } else if trolltrain.Items[k]+v < 0 { //卖出数量不足 - code = pb.ErrorCode_TrollSellMax - return - } - - // 第一次购买商品 - if trolltrain.TarinPos == 0 { - if _, ok := trolltrain.Price[k]; !ok { - trolltrain.Price[k] = 0 - } - trolltrain.Price[k] = goods.Goodsprice * goods.StarMoney / 1000 - trolltrain.RefreshTime = configure.Now().Unix() - //消耗的金币 - gold -= trolltrain.Price[k] * trolltrain.Items[k] - } else { - p := this.configure.GetTrollCoefficient(trolltrain.RangeId) - if p == nil { - return - } - var sellPrice int32 // 交易价格 - if trolltrain.TarinPos == 0 { - sellPrice = goods.Goodsprice * goods.StarMoney / 1000 - } else { - sellPrice = int32(p.Coefficient) * goods.Goodsprice / 1000 - } - // 校验是不是惊喜价格 - if d1, ok := trolltrain.SurpriseID[trolltrain.TarinPos-1]; ok { - if d1 == k { - sellPrice = this.configure.GetTrollRule(comm.TrollSurprise) / 1000 - } - } - if v < 0 { // 卖出 - trolltrain.Items[k] += v - if sellPrice > trolltrain.Price[k] { // 赚了 - earn += (sellPrice - trolltrain.Price[k]) * v - } - gold -= sellPrice * v - } else { // 买入 计算平均价格 - totalGold := trolltrain.Items[k] * trolltrain.Price[k] - totalGold += v * sellPrice - trolltrain.Items[k] += v - trolltrain.Price[k] = totalGold / trolltrain.Items[k] - gold -= v * sellPrice - } - } - } - // 重新计算格子数量 - grid := this.configure.GetTrollRule(comm.TrollItemCount) - for _, v := range trolltrain.Items { - if v > 0 { - gridNum += int32(math.Ceil(float64(v) / float64(grid))) - } - } - - trolltrain.GridNum = gridNum - if gridNum > this.configure.GetTrollRule(comm.TrollGridCount) { // 背包格子上限 - code = pb.ErrorCode_TrollMaxItemCount - return - } - code = this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, int32(gold), true) - if code != pb.ErrorCode_Success { // 金币不足 - code = pb.ErrorCode_GoldNoEnough - return - } - - // 清除数量为0 的 - for k, v := range trolltrain.Items { - if v == 0 { - delete(trolltrain.Items, k) - if _, ok := trolltrain.Price[k]; ok { - delete(trolltrain.Price, k) // 清除价格 - } - } - } - trolltrain.TotalEarn += -int64(earn) // 累计获得的金币 - // check npc level - if confLv := this.configure.GetTrollLv(trolltrain.GetNpcLv() + 1); confLv != nil { - if trolltrain.TotalEarn >= int64(confLv.Money) { - trolltrain.NpcLv += 1 // npc levelUp - update["npcLv"] = trolltrain.NpcLv - } - } - update["items"] = trolltrain.Items - update["price"] = trolltrain.Price - update["totalEarn"] = trolltrain.TotalEarn - - update["gridNum"] = trolltrain.GridNum - update["shop"] = trolltrain.Shop - //this.module.ModifyTrollData(session.GetUserId(), update) // this.module.ModuleRtask.SendToRtask(session, comm.Rtype153, 1) go this.module.ModuleRtask.TriggerTask(session.GetUserId(), comm.GettaskParam(comm.Rtype153, 1)) diff --git a/modules/caravan/comp_configure.go b/modules/caravan/comp_configure.go index 47396485d..97cb5ef22 100644 --- a/modules/caravan/comp_configure.go +++ b/modules/caravan/comp_configure.go @@ -6,7 +6,6 @@ import ( "go_dreamfactory/modules" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" - "sync" ) const ( @@ -14,17 +13,10 @@ const ( game_caravan_lv = "game_itinerant_lv.json" game_caravan_reward = "game_itinerant_reward.json" game_caravan_thing = "game_itinerant_thing.json" - - game_trollgoods = "game_trollgoods.json" - game_trollcoefficient = "game_trollcoefficient.json" - game_trolltrain = "game_trolltrain.json" - game_trollrule = "game_trollrule.json" - game_trolllv = "game_trolllv.json" ) ///配置管理基础组件 type configureComp struct { - hlock sync.RWMutex modules.MCompConfigure } @@ -53,133 +45,66 @@ func (this *configureComp) GetConfigure(name string) (v interface{}, err error) } // 获取列车货物信息 -func (this *configureComp) GetTrollGoods(itemId int32) (data *cfg.GameTrollGoodsData) { - if v, err := this.GetConfigure(game_trollgoods); err == nil { - if configure, ok := v.(*cfg.GameTrollGoods); ok { +func (this *configureComp) GetCaravanCity(cityId int32) (data *cfg.Gameitinerant_cityData) { + if v, err := this.GetConfigure(game_caravan); err == nil { + if configure, ok := v.(*cfg.Gameitinerant_city); ok { + data = configure.Get(cityId) + return + } + } else { + log.Errorf("get GetCaravanCity conf err:%v", err) + } + return +} + +// 获取货物基本信息 +func (this *configureComp) GetCaravanLv(lv int32) (data *cfg.Gameitinerant_lvData) { + if v, err := this.GetConfigure(game_caravan_lv); err == nil { + if configure, ok := v.(*cfg.Gameitinerant_lv); ok { + data = configure.Get(lv) + return + } + } else { + log.Errorf("get GetCaravanGoods conf err:%v", err) + } + return +} + +func (this *configureComp) GetCaravanGoods(itemId int32) (data *cfg.Gameitinerant_thingData) { + if v, err := this.GetConfigure(game_caravan_thing); err == nil { + if configure, ok := v.(*cfg.Gameitinerant_thing); ok { data = configure.Get(itemId) return } } else { - log.Errorf("get GameTrollGoodsData conf err:%v", err) + log.Errorf("get GetCaravanGoods conf err:%v", err) } return } -// 获取商人位置信息 -func (this *configureComp) GetTrollTrain(id int32) (data *cfg.GameTrollTrainData) { - if v, err := this.GetConfigure(game_trolltrain); err == nil { - if configure, ok := v.(*cfg.GameTrollTrain); ok { - data = configure.Get(id) - return - } - } else { - log.Errorf("get GameTrollTrainData conf err:%v", err) - } - return -} - -// 获取基本规则 -func (this *configureComp) GetTrollRule(id int32) int32 { - if v, err := this.GetConfigure(game_trollrule); err == nil { - if configure, ok := v.(*cfg.GameTrollRule); ok { - return configure.Get(id).Quantity - } - } - log.Errorf("get GetTrollRule conf err:%d", id) - - return 1 -} - -func (this *configureComp) GetTrollCoefficient(id int32) (data *cfg.GameTrollCoefficientData) { - if v, err := this.GetConfigure(game_trollcoefficient); err == nil { - if configure, ok := v.(*cfg.GameTrollCoefficient); ok { - data = configure.Get(id) - return - } - } else { - log.Errorf("get GameTrollCoefficientData conf err:%v", err) - } - return -} - -func (this *configureComp) GetTrollLv(id int32) (data *cfg.GameTrollLvData) { - if v, err := this.GetConfigure(game_trolllv); err == nil { - if configure, ok := v.(*cfg.GameTrollLv); ok { - data = configure.Get(id) - return - } - } else { - log.Errorf("get GameTrollCoefficientData conf err:%v", err) - } - return -} - -func (this *configureComp) GetTrollAllTrain() (data []int32) { - data = make([]int32, 0) - if v, err := this.GetConfigure(game_trolltrain); err == nil { - if configure, ok := v.(*cfg.GameTrollTrain); ok { +func (this *configureComp) GetAllCaravanCity() (data []*cfg.Gameitinerant_cityData) { + if v, err := this.GetConfigure(game_caravan); err == nil { + if configure, ok := v.(*cfg.Gameitinerant_city); ok { for _, v := range configure.GetDataList() { - time := v.Time - data = append(data, time) + data = append(data, v) } return } } else { - log.Errorf("get GameTrollTrainData conf err:%v", err) + log.Errorf("get GetAllCaravanCity conf err:%v", err) } return } - -func (this *configureComp) GetTrollMaxCoefficientNux() int32 { - if v, err := this.GetConfigure(game_trollcoefficient); err == nil { - if configure, ok := v.(*cfg.GameTrollCoefficient); ok { - - return int32(len(configure.GetDataList())) - } - } else { - log.Errorf("get GameTrollTrainData conf err:%v", err) - } - return 0 -} - -// 获取车站的数量 -func (this *configureComp) GetTrollMaxTraintNum() int32 { - if v, err := this.GetConfigure(game_trolltrain); err == nil { - if configure, ok := v.(*cfg.GameTrollTrain); ok { - - return int32(len(configure.GetDataList())) - } - } else { - log.Errorf("get GameTrollTrainData conf err:%v", err) - } - return 1 // 至少有1个车站 -} - -func (this *configureComp) GetTrollAllGoods() (data []*cfg.GameTrollGoodsData) { - if v, err := this.GetConfigure(game_trollgoods); err == nil { - if configure, ok := v.(*cfg.GameTrollGoods); ok { - data = configure.GetDataList() - return - } - } else { - log.Errorf("get GameTrollGoodsData conf err:%v", err) - } - return -} - -// 返回商人货物信息 -func (this *configureComp) GetTrollGoodsFor(trainID int32) (data []int32) { - if v, err := this.GetConfigure(game_trollgoods); err == nil { - if configure, ok := v.(*cfg.GameTrollGoods); ok { +func (this *configureComp) GetAllCaravanItem() (data []*cfg.Gameitinerant_thingData) { + if v, err := this.GetConfigure(game_caravan_thing); err == nil { + if configure, ok := v.(*cfg.Gameitinerant_thing); ok { for _, v := range configure.GetDataList() { - if v.Goodsfor == trainID { - data = append(data, v.Id) - } + data = append(data, v) } return } } else { - log.Errorf("get GameTrollGoodsData conf err:%v", err) + log.Errorf("get GetAllCaravanItem conf err:%v", err) } return } diff --git a/modules/caravan/model_troll.go b/modules/caravan/model_troll.go index 559b9b84c..14f241cee 100644 --- a/modules/caravan/model_troll.go +++ b/modules/caravan/model_troll.go @@ -44,7 +44,9 @@ func (this *modelCaravan) getCaravanList(uid string) (result *pb.DBCaravan, err if err = this.Get(uid, result); err != nil && mgo.MongodbNil == err { // 创建一条数据 result.Resettime = configure.Now().Unix() // 设置起始刷新时间 - result.Lv = 1 // 初始1级 + result.Lv = 1 + this.module.InitCaravanCityData(uid, result) // 初始1级 + this.module.InitCaravanItemData(uid, result) err = this.Add(uid, result) return } diff --git a/modules/caravan/module.go b/modules/caravan/module.go index 9efa4a3b8..ab35c5f69 100644 --- a/modules/caravan/module.go +++ b/modules/caravan/module.go @@ -5,6 +5,8 @@ import ( "go_dreamfactory/lego/core" "go_dreamfactory/modules" "go_dreamfactory/pb" + "go_dreamfactory/sys/configure" + "go_dreamfactory/utils" ) type Caravan struct { @@ -43,3 +45,62 @@ func (this *Caravan) ModifyCaravanData(uid string, data map[string]interface{}) } return } + +// 初始化城市信息 +func (this *Caravan) InitCaravanCityData(uid string, data *pb.DBCaravan) { + list := this.configure.GetAllCaravanCity() + data.City = make(map[int32]*pb.CityGoods, 0) + for _, v := range list { + city := &pb.CityGoods{ + Like: []int32{}, + Unlike: []int32{}, + } + if v.Citytype == 1 { // + city.Like = append(city.Like, v.Special...) + city.Unlike = append(city.Like, v.Exspecial...) + } else { // 不喜欢的 随机 citytypenum 个 + if len(v.Special) > int(v.Citytypenum) { + ids := utils.RandomNumbers(0, len(v.Special), int(v.Citytypenum)) + for _, id := range ids { + + city.Like = append(city.Like, v.Special[id]) + } + } else { + city.Like = append(city.Like, v.Special...) + } + + if len(v.Exspecial) > int(v.Exspecialnum) { + ids := utils.RandomNumbers(0, len(v.Exspecial), int(v.Exspecialnum)) + for _, id := range ids { + + city.Like = append(city.Like, v.Exspecial[id]) + } + } else { + city.Unlike = append(city.Like, v.Exspecial...) + } + } + data.City[v.Id] = city + } +} + +// 初始化货物信息 +func (this *Caravan) InitCaravanItemData(uid string, data *pb.DBCaravan) { + items := this.configure.GetAllCaravanItem() + data.Goods = make(map[int32]*pb.Goods, 0) + for _, v := range items { + goods := &pb.Goods{ + Count: 0, // 货物数量 + Period: 0, // 变动周期 + CurPeriod: 1, // 当前变动周期 + Price: 0, // 当前价格 + Time: configure.Now().Unix(), // 刷新时间 + } + if len(v.Changeperiod) != 2 { + continue + } + goods.Period = comm.GetRandNum(v.Changeperiod[0], v.Changeperiod[1]) + goods.Price = v.Goodsprice + data.Goods[v.Id] = goods + } + +} diff --git a/modules/hero/hero_test.go b/modules/hero/hero_test.go index de388f4b5..aa000d9dd 100644 --- a/modules/hero/hero_test.go +++ b/modules/hero/hero_test.go @@ -112,6 +112,11 @@ type sumy struct { } func Test_Main(t *testing.T) { + + ids := utils.RandomNumbers(0, 10, 5) + for _, v := range ids { + fmt.Printf("%d", v) + } c := map[int32]int32{ 3: 100, 6: 250, @@ -203,10 +208,7 @@ func Test_Main(t *testing.T) { } } } - ids := utils.RandomNumbers(0, 10, 5) - for _, v := range ids { - fmt.Printf("%d", v) - } + oldHero := new(pb.DBHero) oldHero.Lv = 2 new := copyPoint(oldHero) diff --git a/modules/practice/module.go b/modules/practice/module.go index 3a74f91b2..0cbfce09e 100644 --- a/modules/practice/module.go +++ b/modules/practice/module.go @@ -118,7 +118,7 @@ func (this *Practice) AddItems(session comm.IUserSession, items map[string]int32 }) } else { room := &pb.DBPracticeRoom{} - conn, err := db.Local() + conn, err := db.Cross() if err != nil { this.Errorln(err) return diff --git a/pb/caravan_db.pb.go b/pb/caravan_db.pb.go index c0f727e3b..80898f87e 100644 --- a/pb/caravan_db.pb.go +++ b/pb/caravan_db.pb.go @@ -25,11 +25,11 @@ type Goods struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count"` // + Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count"` // 货物数量 Period int32 `protobuf:"varint,2,opt,name=period,proto3" json:"period"` // 变动周期 CurPeriod int32 `protobuf:"varint,3,opt,name=curPeriod,proto3" json:"curPeriod"` // 当前变动周期 Price int32 `protobuf:"varint,4,opt,name=price,proto3" json:"price"` // 当前价格 - Time int32 `protobuf:"varint,5,opt,name=time,proto3" json:"time"` // 刷新时间 + Time int64 `protobuf:"varint,5,opt,name=time,proto3" json:"time"` // 刷新时间 } func (x *Goods) Reset() { @@ -92,7 +92,7 @@ func (x *Goods) GetPrice() int32 { return 0 } -func (x *Goods) GetTime() int32 { +func (x *Goods) GetTime() int64 { if x != nil { return x.Time } @@ -104,8 +104,8 @@ type CityGoods struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Like []string `protobuf:"bytes,1,rep,name=like,proto3" json:"like"` // 习惯的货物 - Unlike []string `protobuf:"bytes,2,rep,name=unlike,proto3" json:"unlike"` // 不喜欢的货物 + Like []int32 `protobuf:"varint,1,rep,packed,name=like,proto3" json:"like"` // 习惯的货物 + Unlike []int32 `protobuf:"varint,2,rep,packed,name=unlike,proto3" json:"unlike"` // 不喜欢的货物 } func (x *CityGoods) Reset() { @@ -140,14 +140,14 @@ func (*CityGoods) Descriptor() ([]byte, []int) { return file_caravan_caravan_db_proto_rawDescGZIP(), []int{1} } -func (x *CityGoods) GetLike() []string { +func (x *CityGoods) GetLike() []int32 { if x != nil { return x.Like } return nil } -func (x *CityGoods) GetUnlike() []string { +func (x *CityGoods) GetUnlike() []int32 { if x != nil { return x.Unlike } @@ -278,10 +278,10 @@ var file_caravan_caravan_db_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x75, 0x72, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x43, 0x69, 0x74, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x43, 0x69, 0x74, 0x79, 0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, - 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x75, 0x6e, 0x6c, 0x69, + 0x20, 0x03, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, + 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x75, 0x6e, 0x6c, 0x69, 0x6b, 0x65, 0x22, 0xff, 0x02, 0x0a, 0x09, 0x44, 0x42, 0x43, 0x61, 0x72, 0x61, 0x76, 0x61, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75,