From f67df3c8df6f7790ad196095e6bd3cef84c3d270 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 16 Apr 2024 13:34:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E5=8D=A1=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/constant.go | 2 + data/DB_GameItem.dat | Bin 3807 -> 3807 bytes data/DB_GameItem.json | 2 +- data/DB_PropExchange.dat | 8 +- data/DB_Task.dat | Bin 583 -> 583 bytes data/gameparam.json | 2 +- etcd/keyconf.go | 92 +++--- gamesrv/base/scene.go | 37 +++ protocol/bag/bag.pb.go | 561 ++++++++++++++++++++++++++++++--- protocol/bag/bag.proto | 34 ++ protocol/doc.md | 1 + protocol/shop/shop.proto_bak | 141 --------- protocol/welfare/welfare.pb.go | 55 ++-- protocol/welfare/welfare.proto | 2 + public | 2 +- worldsrv/action_bag.go | 197 ++++++++++-- worldsrv/bagmgr.go | 95 ++++-- worldsrv/player.go | 17 + worldsrv/taskmgr.go | 4 + worldsrv/welfmgr.go | 1 + xlsx/DB_GameItem.xlsx | Bin 38138 -> 38144 bytes 21 files changed, 935 insertions(+), 318 deletions(-) delete mode 100644 protocol/shop/shop.proto_bak diff --git a/common/constant.go b/common/constant.go index ce97408..39e5f71 100644 --- a/common/constant.go +++ b/common/constant.go @@ -611,6 +611,7 @@ const ( ItemIDPhoneScore = 100006 // 手机抽奖积分 ItemIDWeekScore = 100004 // 周活跃积分 ItemIDGiftBox = 50001 // 碎片礼盒 + ItemIDCollectBox = 50002 // 集卡礼盒 ) func ToItemId(id int32) int32 { @@ -702,6 +703,7 @@ const ( TaskTypeActivityScore = 14 // 周活跃积分数量 TaskTypeFirstLogin = 15 // 每日首次登录 TaskTypeInviteNum = 16 // 邀请绑定数量 + TaskTypeTurnplate = 17 // 转盘抽奖次数 ) const ( diff --git a/data/DB_GameItem.dat b/data/DB_GameItem.dat index 000c018bc2e7522425f312dadde0010c0724bb7e..0719886b450ae70dfa5a59099ab51522d2b9bf47 100644 GIT binary patch delta 14 WcmcaFdtY|LXEsLO&0pAFvjYG!ng&k* delta 16 YcmcaFdtY|LXST^zY$BW4*>A7|06$L#X#fBK diff --git a/data/DB_GameItem.json b/data/DB_GameItem.json index cbfd726..0f1d7ab 100644 --- a/data/DB_GameItem.json +++ b/data/DB_GameItem.json @@ -393,7 +393,7 @@ 1, 0 ], - "Type": 4, + "Type": 13, "Effect0": [ 1, 0, diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index b06b77f..ab684a7 100644 --- a/data/DB_PropExchange.dat +++ b/data/DB_PropExchange.dat @@ -1,5 +1,5 @@ -6ӆԆՆֆ׆"= -.؆نچۆ"= -WӆԆֆچۆՆ׆؆ن"  -]ֆ؆چ܆ӆԆنۆՆ׆" \ No newline at end of file +6ֆ׆ӆԆՆ"= +.ۆ؆نچ"= +WچۆӆԆֆنՆ׆؆"  +]ֆ؆چۆ܆ӆԆՆ׆ن" \ No newline at end of file diff --git a/data/DB_Task.dat b/data/DB_Task.dat index 1328797589bd51cb61d01a79e680b8850e00a2b6..39af72ee7325864ff254fc9d2b9394bebdb7ff50 100644 GIT binary patch delta 101 zcmX@ka-3yCpdbgw!d^Ck3vJ9sY#d8~EdGf}w*}ca76F-DMi9vZEw+>W7>^lqf|WMh iI>HH53sPXjCC?!uz#_q`0MxI+XarU8@U=KpK?(rFcN`D^ delta 87 zcmX@ka-3yCpdcH^l3q3eej^T!g+Tg38}r1Z+moj-3QqQ8JZ8+su?Q$=WW))UY`ArV blS`gMM1VztR{^L}gV6}0AO)u2;cIaKTOSzI diff --git a/data/gameparam.json b/data/gameparam.json index 01c9755..818194c 100644 --- a/data/gameparam.json +++ b/data/gameparam.json @@ -20,7 +20,7 @@ "MatchSeasonRankMaxNum":50, "RobotInviteInitInterval": 1, "RobotInviteIntervalMax": 1, - "ClosePreCreateRoom": false, + "ClosePreCreateRoom": true, "AgoraAddress": "http://47.105.78.29:8081", "InviteUrl": "http://47.105.78.29:8000/" } \ No newline at end of file diff --git a/etcd/keyconf.go b/etcd/keyconf.go index ae44b90..ffa0d23 100644 --- a/etcd/keyconf.go +++ b/etcd/keyconf.go @@ -6,50 +6,50 @@ const ( ETCDKEY_SYS_PLT_DBCFG_PREFIX = "/sys/plt/dbcfg/" //业务配置 - ETCDKEY_ROOT_PREFIX = "/mongo.games.com/game/" - ETCDKEY_PLATFORM_PREFIX = "/mongo.games.com/game/plt/config/" - ETCDKEY_BULLETIN_PREFIX = "/mongo.games.com/game/plt/bulletin/" - ETCDKEY_AGENTCUSTOMER_PREFIX = "/mongo.games.com/game/plt/agent_customer/" - ETCDKEY_GAME_CONFIG_GLOBAL = "/mongo.games.com/game/plt/game_config_global" // 超管平台游戏开关 - ETCDKEY_GAMECONFIG_PREFIX = "/mongo.games.com/game/plt/game_config/" // 平台游戏配置 - ETCDKEY_PACKAGE_PREFIX = "/mongo.games.com/game/plt/package/" - ETCDKEY_GROUPCONFIG_PREFIX = "/mongo.games.com/game/group_config/" - ETCDKEY_BLACKLIST_PREFIX = "/mongo.games.com/game/plt/black_list/" - ETCDKEY_ACT_SIGNIN_PREFIX = "/mongo.games.com/game/activity/signin/" - ETCDKEY_ACT_TASK_PREFIX = "/mongo.games.com/game/activity/task/" - ETCDKEY_ACT_GOLDTASK_PREFIX = "/mongo.games.com/game/activity/goldtask/" - ETCDKEY_ACT_GOLDCOME_PREFIX = "/mongo.games.com/game/activity/goldcome/" - ETCDKEY_ACT_ONLINEREWARD_PREFIX = "/mongo.games.com/game/activity/onlinereward/" - ETCDKEY_ACT_LUCKLYTURNTABLE_PREFIX = "/mongo.games.com/game/activity/lucklyturntable/" - ETCDKEY_ACT_YEB_PREFIX = "/mongo.games.com/game/activity/yeb/" - ETCDKEY_CONFIG_REBATE = "/mongo.games.com/game/plt/game_rebate_config/" - ETCDKEY_PROMOTER_PREFIX = "/mongo.games.com/game/plt/promoter/" - ETCDKEY_ACT_VIP_PREFIX = "/mongo.games.com/game/plt/actvip/" - ETCDKEY_ACT_WEIXIN_SHARE_PREFIX = "/mongo.games.com/game/plt/actshare/" - ETCDKEY_ACT_GIVE_PREFIX = "/mongo.games.com/game/plt/actgive/" - ETCDKEY_ACT_PAY_PREFIX = "/mongo.games.com/game/plt/payact/" - ETCDKEY_ACT_RANDCOIN_PREFIX = "/mongo.games.com/game/plt/randcoin/" - ETCDKEY_ACT_FPAY_PREFIX = "/mongo.games.com/game/plt/fpay/" - ETCDKEY_PLATFORM_PROFITCONTROL = "/mongo.games.com/game/plt/profitcontrol/" - ETCDKEY_MATCH_PROFIX = "/mongo.games.com/game/match/" - ETCDKEY_ACT_TICKET_PROFIX = "/mongo.games.com/game/activity/ticket/" - ETCDKEY_ACT_TICKET_RUNNING = "/mongo.games.com/game/activity/ticket/running" - ETCDKEY_MATCH_GRADESHOP = "/mongo.games.com/game/match/gradeshop/" - ETCDKEY_CONFIG_LOGICLEVEL = "/mongo.games.com/game/logiclevel/" - ETCDKEY_SHOP_EXCHANGE = "/mongo.games.com/game/exchange_shop" - ETCDKEY_GAME_NOTICE = "/mongo.games.com/game/common_notice" - ETCDKEY_SHOP_ITEM = "/mongo.games.com/game/item_shop" - ETCDKEY_GAME_MATCH = "/mongo.games.com/game/game_match" - ETCDKEY_ACT_TURNPLATE = "/mongo.games.com/game/act_turnplate" - ETCDKEY_ACT_7SIGN = "/mongo.games.com/game/act_7sign" - ETCDKEY_ACT_BLINDBOX = "/mongo.games.com/game/act_blindbox" - ETCDKEY_ACT_FIRSTPAY = "/mongo.games.com/game/act_FirstPay" - ETCDKEY_ACT_CONTINUOUSPAY = "/mongo.games.com/game/act_ContinuousPay" - ETCDKEY_VIP_CFG = "/mongo.games.com/game/VIPcfg" - ETCDKEY_WBCtrl_CFG = "/mongo.games.com/game/WBCtrlCfg" - ETCDKEY_PACKAGE_ENTRYSWITCH = "/mongo.games.com/game/plt/entryswitch/" //界面入口开关 - ETCDKEY_CHESSRANK_CFG = "/mongo.games.com/game/plt/chessrank/" // 象棋段位配置 - ETCDKEY_PLAYERPOOL = "/mongo.games.com/game/plt/playerpool/" // 个人水池调控配置 - ETCDKEY_GAME_CONFIG = "/mongo.games.com/game/plt/gameconfig/" // 游戏管理/全局配置 - ETCDKEY_ACT_PHONELOTTERY = "/mongo.games.com/game/act_phoneLottery" + ETCDKEY_ROOT_PREFIX = "/game/" + ETCDKEY_PLATFORM_PREFIX = "/game/plt/config/" + ETCDKEY_BULLETIN_PREFIX = "/game/plt/bulletin/" + ETCDKEY_AGENTCUSTOMER_PREFIX = "/game/plt/agent_customer/" + ETCDKEY_GAME_CONFIG_GLOBAL = "/game/plt/game_config_global" // 超管平台游戏开关 + ETCDKEY_GAMECONFIG_PREFIX = "/game/plt/game_config/" // 平台游戏配置 + ETCDKEY_PACKAGE_PREFIX = "/game/plt/package/" + ETCDKEY_GROUPCONFIG_PREFIX = "/game/group_config/" + ETCDKEY_BLACKLIST_PREFIX = "/game/plt/black_list/" + ETCDKEY_ACT_SIGNIN_PREFIX = "/game/activity/signin/" + ETCDKEY_ACT_TASK_PREFIX = "/game/activity/task/" + ETCDKEY_ACT_GOLDTASK_PREFIX = "/game/activity/goldtask/" + ETCDKEY_ACT_GOLDCOME_PREFIX = "/game/activity/goldcome/" + ETCDKEY_ACT_ONLINEREWARD_PREFIX = "/game/activity/onlinereward/" + ETCDKEY_ACT_LUCKLYTURNTABLE_PREFIX = "/game/activity/lucklyturntable/" + ETCDKEY_ACT_YEB_PREFIX = "/game/activity/yeb/" + ETCDKEY_CONFIG_REBATE = "/game/plt/game_rebate_config/" + ETCDKEY_PROMOTER_PREFIX = "/game/plt/promoter/" + ETCDKEY_ACT_VIP_PREFIX = "/game/plt/actvip/" + ETCDKEY_ACT_WEIXIN_SHARE_PREFIX = "/game/plt/actshare/" + ETCDKEY_ACT_GIVE_PREFIX = "/game/plt/actgive/" + ETCDKEY_ACT_PAY_PREFIX = "/game/plt/payact/" + ETCDKEY_ACT_RANDCOIN_PREFIX = "/game/plt/randcoin/" + ETCDKEY_ACT_FPAY_PREFIX = "/game/plt/fpay/" + ETCDKEY_PLATFORM_PROFITCONTROL = "/game/plt/profitcontrol/" + ETCDKEY_MATCH_PROFIX = "/game/match/" + ETCDKEY_ACT_TICKET_PROFIX = "/game/activity/ticket/" + ETCDKEY_ACT_TICKET_RUNNING = "/game/activity/ticket/running" + ETCDKEY_MATCH_GRADESHOP = "/game/match/gradeshop/" + ETCDKEY_CONFIG_LOGICLEVEL = "/game/logiclevel/" + ETCDKEY_SHOP_EXCHANGE = "/game/exchange_shop" + ETCDKEY_GAME_NOTICE = "/game/common_notice" + ETCDKEY_SHOP_ITEM = "/game/item_shop" + ETCDKEY_GAME_MATCH = "/game/game_match" + ETCDKEY_ACT_TURNPLATE = "/game/act_turnplate" + ETCDKEY_ACT_7SIGN = "/game/act_7sign" + ETCDKEY_ACT_BLINDBOX = "/game/act_blindbox" + ETCDKEY_ACT_FIRSTPAY = "/game/act_FirstPay" + ETCDKEY_ACT_CONTINUOUSPAY = "/game/act_ContinuousPay" + ETCDKEY_VIP_CFG = "/game/VIPcfg" + ETCDKEY_WBCtrl_CFG = "/game/WBCtrlCfg" + ETCDKEY_PACKAGE_ENTRYSWITCH = "/game/plt/entryswitch/" //界面入口开关 + ETCDKEY_CHESSRANK_CFG = "/game/plt/chessrank/" // 象棋段位配置 + ETCDKEY_PLAYERPOOL = "/game/plt/playerpool/" // 个人水池调控配置 + ETCDKEY_GAME_CONFIG = "/game/plt/gameconfig/" // 游戏管理/全局配置 + ETCDKEY_ACT_PHONELOTTERY = "/game/act_phoneLottery" ) diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index 85ef62b..ce5bb1d 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -2319,6 +2319,9 @@ func (this *Scene) TryBillExGameDrop(p *Player) { if p.IsRob { return } + + this.DropCollectBox(p) + baseScore := this.DbGameFree.BaseScore if common.IsLocalGame(this.GameId) { baseScore = this.BaseScore @@ -2371,6 +2374,40 @@ func (this *Scene) TryBillExGameDrop(p *Player) { } } +// DropCollectBox 掉落集卡礼盒 +func (this *Scene) DropCollectBox(p *Player) { + if p == nil || p.IsRob { + return + } + + data := srvdata.PBDB_CollectBoxGainMgr.GetData(this.GetGameFreeId()) + if data == nil { + return + } + + n := this.RandInt(100) + if n < int(data.GetRate()) { + pack := &player.SCGameExDropItems{} + pack.Items = make(map[int32]int32) + itemData := srvdata.PBDB_GameItemMgr.GetData(common.ItemIDCollectBox) + if itemData != nil { + p.Items[itemData.Id] = p.Items[itemData.Id] + 1 + pack.Items = map[int32]int32{itemData.Id: 1} + remark := fmt.Sprintf("游戏掉落%v", itemData.Id) + //logType 0获得 1消耗 + log := model.NewItemLogEx(p.Platform, p.SnId, 0, itemData.Id, itemData.Name, 1, remark) + if log != nil { + logger.Logger.Trace("WriteLog: ", log) + LogChannelSingleton.WriteLog(log) + } + } + if pack != nil && pack.Items != nil && len(pack.Items) != 0 { + p.SendToClient(int(player.PlayerPacketID_PACKET_SCGAMEEXDROPITEMS), pack) + logger.Logger.Trace("SCGAMEEXDROPITEMS", pack) + } + } +} + // 生成名字 func (this *Scene) RandNickName() string { //if rand.Int31n(100) < 60 { diff --git a/protocol/bag/bag.pb.go b/protocol/bag/bag.pb.go index 06e77a4..b3dc67a 100644 --- a/protocol/bag/bag.pb.go +++ b/protocol/bag/bag.pb.go @@ -20,7 +20,7 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -//操作结果 +// 操作结果 type OpResultCode int32 const ( @@ -91,6 +91,9 @@ const ( SPacketID_PACKET_ALL_BAG_USE SPacketID = 2531 //使用背包道具 SPacketID_PACKET_SC_SYNCBAGDATA SPacketID = 2532 //背包数据更新 SPacketID_PACKET_ALL_BAG_END SPacketID = 2549 //最大消息号 + //3000~3099 + SPacketID_PACKET_PropExchange SPacketID = 3000 // 道具兑换 + SPacketID_PACKET_ExchangeList SPacketID = 3001 // 兑换列表 ) // Enum value maps for SPacketID. @@ -101,6 +104,8 @@ var ( 2531: "PACKET_ALL_BAG_USE", 2532: "PACKET_SC_SYNCBAGDATA", 2549: "PACKET_ALL_BAG_END", + 3000: "PACKET_PropExchange", + 3001: "PACKET_ExchangeList", } SPacketID_value = map[string]int32{ "PACKET_BAG_ZERO": 0, @@ -108,6 +113,8 @@ var ( "PACKET_ALL_BAG_USE": 2531, "PACKET_SC_SYNCBAGDATA": 2532, "PACKET_ALL_BAG_END": 2549, + "PACKET_PropExchange": 3000, + "PACKET_ExchangeList": 3001, } ) @@ -138,7 +145,7 @@ func (SPacketID) EnumDescriptor() ([]byte, []int) { return file_bag_proto_rawDescGZIP(), []int{1} } -//物品信息 后续精简 +// 物品信息 后续精简 type ItemInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -216,13 +223,14 @@ func (x *ItemInfo) GetObtainTime() int64 { return 0 } -//PACKET_ALL_BAG_INFO +// PACKET_ALL_BAG_INFO type CSBagInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields NowLocation int32 `protobuf:"varint,1,opt,name=NowLocation,proto3" json:"NowLocation,omitempty"` //0.通用 1.大厅 2.Tienlen 3.捕鱼 + Tp int32 `protobuf:"varint,2,opt,name=Tp,proto3" json:"Tp,omitempty"` // 道具类型 } func (x *CSBagInfo) Reset() { @@ -264,7 +272,14 @@ func (x *CSBagInfo) GetNowLocation() int32 { return 0 } -//PACKET_ALL_BAG_INFO +func (x *CSBagInfo) GetTp() int32 { + if x != nil { + return x.Tp + } + return 0 +} + +// PACKET_ALL_BAG_INFO type SCBagInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -328,7 +343,7 @@ func (x *SCBagInfo) GetBagNumMax() int32 { return 0 } -//PACKET_ALL_BAG_USE +// PACKET_ALL_BAG_USE type CSUpBagInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -416,7 +431,7 @@ func (x *CSUpBagInfo) GetShowId() int64 { return 0 } -//PACKET_ALL_BAG_USE +// PACKET_ALL_BAG_USE type SCUpBagInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -506,7 +521,7 @@ func (x *SCUpBagInfo) GetInfos() []*ItemInfo { return nil } -//PACKET_SC_SYNCBAGDATA +// PACKET_SC_SYNCBAGDATA type SCSyncBagData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -554,6 +569,338 @@ func (x *SCSyncBagData) GetInfos() []*ItemInfo { return nil } +type PropInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ItemId int32 `protobuf:"varint,1,opt,name=ItemId,proto3" json:"ItemId,omitempty"` //物品ID + ItemNum int64 `protobuf:"varint,2,opt,name=ItemNum,proto3" json:"ItemNum,omitempty"` //物品数量 +} + +func (x *PropInfo) Reset() { + *x = PropInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PropInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PropInfo) ProtoMessage() {} + +func (x *PropInfo) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PropInfo.ProtoReflect.Descriptor instead. +func (*PropInfo) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{6} +} + +func (x *PropInfo) GetItemId() int32 { + if x != nil { + return x.ItemId + } + return 0 +} + +func (x *PropInfo) GetItemNum() int64 { + if x != nil { + return x.ItemNum + } + return 0 +} + +// PACKET_PropExchange +type CSPropExchange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 兑换ID +} + +func (x *CSPropExchange) Reset() { + *x = CSPropExchange{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSPropExchange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSPropExchange) ProtoMessage() {} + +func (x *CSPropExchange) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSPropExchange.ProtoReflect.Descriptor instead. +func (*CSPropExchange) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{7} +} + +func (x *CSPropExchange) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +type SCPropExchange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetCode OpResultCode `protobuf:"varint,1,opt,name=RetCode,proto3,enum=bag.OpResultCode" json:"RetCode,omitempty"` // 错误码 + Items []*PropInfo `protobuf:"bytes,2,rep,name=Items,proto3" json:"Items,omitempty"` // 获得道具 + RemainItems []*PropInfo `protobuf:"bytes,3,rep,name=RemainItems,proto3" json:"RemainItems,omitempty"` // 被消耗的道具剩余数量 +} + +func (x *SCPropExchange) Reset() { + *x = SCPropExchange{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCPropExchange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCPropExchange) ProtoMessage() {} + +func (x *SCPropExchange) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCPropExchange.ProtoReflect.Descriptor instead. +func (*SCPropExchange) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{8} +} + +func (x *SCPropExchange) GetRetCode() OpResultCode { + if x != nil { + return x.RetCode + } + return OpResultCode_OPRC_Sucess +} + +func (x *SCPropExchange) GetItems() []*PropInfo { + if x != nil { + return x.Items + } + return nil +} + +func (x *SCPropExchange) GetRemainItems() []*PropInfo { + if x != nil { + return x.RemainItems + } + return nil +} + +type ExchangeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 兑换ID + CostItems []*PropInfo `protobuf:"bytes,2,rep,name=CostItems,proto3" json:"CostItems,omitempty"` // 消耗道具 + GainItems []*PropInfo `protobuf:"bytes,3,rep,name=GainItems,proto3" json:"GainItems,omitempty"` // 获得道具 +} + +func (x *ExchangeInfo) Reset() { + *x = ExchangeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExchangeInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExchangeInfo) ProtoMessage() {} + +func (x *ExchangeInfo) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExchangeInfo.ProtoReflect.Descriptor instead. +func (*ExchangeInfo) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{9} +} + +func (x *ExchangeInfo) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *ExchangeInfo) GetCostItems() []*PropInfo { + if x != nil { + return x.CostItems + } + return nil +} + +func (x *ExchangeInfo) GetGainItems() []*PropInfo { + if x != nil { + return x.GainItems + } + return nil +} + +// PACKET_ExchangeList +type CSExchangeList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tp int32 `protobuf:"varint,1,opt,name=Tp,proto3" json:"Tp,omitempty"` // 兑换类型 1集卡活动 +} + +func (x *CSExchangeList) Reset() { + *x = CSExchangeList{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSExchangeList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSExchangeList) ProtoMessage() {} + +func (x *CSExchangeList) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSExchangeList.ProtoReflect.Descriptor instead. +func (*CSExchangeList) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{10} +} + +func (x *CSExchangeList) GetTp() int32 { + if x != nil { + return x.Tp + } + return 0 +} + +type SCExchangeList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Infos []*ExchangeInfo `protobuf:"bytes,1,rep,name=Infos,proto3" json:"Infos,omitempty"` // 兑换列表 + Tp int32 `protobuf:"varint,2,opt,name=Tp,proto3" json:"Tp,omitempty"` // 兑换类型 +} + +func (x *SCExchangeList) Reset() { + *x = SCExchangeList{} + if protoimpl.UnsafeEnabled { + mi := &file_bag_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCExchangeList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCExchangeList) ProtoMessage() {} + +func (x *SCExchangeList) ProtoReflect() protoreflect.Message { + mi := &file_bag_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCExchangeList.ProtoReflect.Descriptor instead. +func (*SCExchangeList) Descriptor() ([]byte, []int) { + return file_bag_proto_rawDescGZIP(), []int{11} +} + +func (x *SCExchangeList) GetInfos() []*ExchangeInfo { + if x != nil { + return x.Infos + } + return nil +} + +func (x *SCExchangeList) GetTp() int32 { + if x != nil { + return x.Tp + } + return 0 +} + var File_bag_proto protoreflect.FileDescriptor var file_bag_proto_rawDesc = []byte{ @@ -563,10 +910,11 @@ var file_bag_proto_rawDesc = []byte{ 0x65, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x4f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2d, + 0x28, 0x03, 0x52, 0x0a, 0x4f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x09, 0x43, 0x53, 0x42, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x4e, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7b, 0x0a, + 0x52, 0x0b, 0x4e, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, + 0x02, 0x54, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x22, 0x7b, 0x0a, 0x09, 0x53, 0x43, 0x42, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x07, @@ -601,25 +949,58 @@ var file_bag_proto_rawDesc = []byte{ 0x6f, 0x73, 0x22, 0x34, 0x0a, 0x0d, 0x53, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x2a, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x70, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x55, 0x73, 0x65, 0x55, 0x70, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x49, 0x64, 0x45, 0x72, 0x72, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x44, 0x62, 0x45, 0x72, 0x72, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x42, 0x61, 0x67, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x10, 0x06, - 0x2a, 0x88, 0x01, 0x0a, 0x09, 0x53, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x13, - 0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x5a, 0x45, 0x52, - 0x4f, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, - 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe2, 0x13, 0x12, 0x17, 0x0a, - 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, - 0x55, 0x53, 0x45, 0x10, 0xe3, 0x13, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x42, 0x41, 0x47, 0x44, 0x41, 0x54, 0x41, 0x10, - 0xe4, 0x13, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, - 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0xf5, 0x13, 0x42, 0x07, 0x5a, 0x05, 0x2e, - 0x3b, 0x62, 0x61, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x3c, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x49, + 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x22, 0x20, 0x0a, 0x0e, 0x43, 0x53, 0x50, 0x72, 0x6f, 0x70, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x0e, 0x53, 0x43, 0x50, + 0x72, 0x6f, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x62, + 0x61, 0x67, 0x2e, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, + 0x07, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2f, 0x0a, + 0x0b, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x78, + 0x0a, 0x0c, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x2b, + 0x0a, 0x09, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x09, 0x47, + 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x47, + 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x20, 0x0a, 0x0e, 0x43, 0x53, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x22, 0x49, 0x0a, 0x0e, 0x53, 0x43, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x05, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x61, + 0x67, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x54, 0x70, 0x2a, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, + 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x55, 0x73, 0x65, 0x55, 0x70, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x49, 0x64, 0x45, 0x72, 0x72, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x44, 0x62, 0x45, 0x72, 0x72, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x42, 0x61, 0x67, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x52, + 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x10, 0x06, 0x2a, 0xbc, 0x01, + 0x0a, 0x09, 0x53, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x13, 0x0a, 0x0f, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, + 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, + 0x41, 0x47, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe2, 0x13, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x55, 0x53, 0x45, + 0x10, 0xe3, 0x13, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x42, 0x41, 0x47, 0x44, 0x41, 0x54, 0x41, 0x10, 0xe4, 0x13, 0x12, + 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41, + 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0xf5, 0x13, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x50, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x10, + 0xb8, 0x17, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xb9, 0x17, 0x42, 0x07, 0x5a, 0x05, + 0x2e, 0x3b, 0x62, 0x61, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -635,28 +1016,40 @@ func file_bag_proto_rawDescGZIP() []byte { } var file_bag_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_bag_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_bag_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_bag_proto_goTypes = []interface{}{ - (OpResultCode)(0), // 0: bag.OpResultCode - (SPacketID)(0), // 1: bag.SPacketID - (*ItemInfo)(nil), // 2: bag.ItemInfo - (*CSBagInfo)(nil), // 3: bag.CSBagInfo - (*SCBagInfo)(nil), // 4: bag.SCBagInfo - (*CSUpBagInfo)(nil), // 5: bag.CSUpBagInfo - (*SCUpBagInfo)(nil), // 6: bag.SCUpBagInfo - (*SCSyncBagData)(nil), // 7: bag.SCSyncBagData + (OpResultCode)(0), // 0: bag.OpResultCode + (SPacketID)(0), // 1: bag.SPacketID + (*ItemInfo)(nil), // 2: bag.ItemInfo + (*CSBagInfo)(nil), // 3: bag.CSBagInfo + (*SCBagInfo)(nil), // 4: bag.SCBagInfo + (*CSUpBagInfo)(nil), // 5: bag.CSUpBagInfo + (*SCUpBagInfo)(nil), // 6: bag.SCUpBagInfo + (*SCSyncBagData)(nil), // 7: bag.SCSyncBagData + (*PropInfo)(nil), // 8: bag.PropInfo + (*CSPropExchange)(nil), // 9: bag.CSPropExchange + (*SCPropExchange)(nil), // 10: bag.SCPropExchange + (*ExchangeInfo)(nil), // 11: bag.ExchangeInfo + (*CSExchangeList)(nil), // 12: bag.CSExchangeList + (*SCExchangeList)(nil), // 13: bag.SCExchangeList } var file_bag_proto_depIdxs = []int32{ - 0, // 0: bag.SCBagInfo.RetCode:type_name -> bag.OpResultCode - 2, // 1: bag.SCBagInfo.Infos:type_name -> bag.ItemInfo - 0, // 2: bag.SCUpBagInfo.RetCode:type_name -> bag.OpResultCode - 2, // 3: bag.SCUpBagInfo.Infos:type_name -> bag.ItemInfo - 2, // 4: bag.SCSyncBagData.Infos:type_name -> bag.ItemInfo - 5, // [5:5] is the sub-list for method output_type - 5, // [5:5] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 0, // 0: bag.SCBagInfo.RetCode:type_name -> bag.OpResultCode + 2, // 1: bag.SCBagInfo.Infos:type_name -> bag.ItemInfo + 0, // 2: bag.SCUpBagInfo.RetCode:type_name -> bag.OpResultCode + 2, // 3: bag.SCUpBagInfo.Infos:type_name -> bag.ItemInfo + 2, // 4: bag.SCSyncBagData.Infos:type_name -> bag.ItemInfo + 0, // 5: bag.SCPropExchange.RetCode:type_name -> bag.OpResultCode + 8, // 6: bag.SCPropExchange.Items:type_name -> bag.PropInfo + 8, // 7: bag.SCPropExchange.RemainItems:type_name -> bag.PropInfo + 8, // 8: bag.ExchangeInfo.CostItems:type_name -> bag.PropInfo + 8, // 9: bag.ExchangeInfo.GainItems:type_name -> bag.PropInfo + 11, // 10: bag.SCExchangeList.Infos:type_name -> bag.ExchangeInfo + 11, // [11:11] is the sub-list for method output_type + 11, // [11:11] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_bag_proto_init() } @@ -737,6 +1130,78 @@ func file_bag_proto_init() { return nil } } + file_bag_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PropInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bag_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSPropExchange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bag_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCPropExchange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bag_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExchangeInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bag_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSExchangeList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bag_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCExchangeList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -744,7 +1209,7 @@ func file_bag_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bag_proto_rawDesc, NumEnums: 2, - NumMessages: 6, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/bag/bag.proto b/protocol/bag/bag.proto index bf5243a..ee6ba1a 100644 --- a/protocol/bag/bag.proto +++ b/protocol/bag/bag.proto @@ -18,6 +18,9 @@ enum SPacketID { PACKET_ALL_BAG_USE = 2531; //使用背包道具 PACKET_SC_SYNCBAGDATA = 2532;//背包数据更新 PACKET_ALL_BAG_END = 2549; //最大消息号 + //3000~3099 + PACKET_PropExchange = 3000; // 道具兑换 + PACKET_ExchangeList = 3001; // 兑换列表 } //物品信息 后续精简 message ItemInfo{ @@ -43,6 +46,7 @@ message ItemInfo{ //PACKET_ALL_BAG_INFO message CSBagInfo { int32 NowLocation = 1;//0.通用 1.大厅 2.Tienlen 3.捕鱼 + int32 Tp = 2;// 道具类型 } //PACKET_ALL_BAG_INFO message SCBagInfo { @@ -74,4 +78,34 @@ message SCUpBagInfo { //PACKET_SC_SYNCBAGDATA message SCSyncBagData{ repeated ItemInfo Infos = 1;// 物品信息 +} + +message PropInfo{ + int32 ItemId = 1;//物品ID + int64 ItemNum = 2;//物品数量 +} + +// PACKET_PropExchange +message CSPropExchange{ + int32 Id = 1; // 兑换ID +} +message SCPropExchange{ + OpResultCode RetCode = 1; // 错误码 + repeated PropInfo Items = 2; // 获得道具 + repeated PropInfo RemainItems = 3; // 被消耗的道具剩余数量 +} + +message ExchangeInfo{ + int32 Id = 1; // 兑换ID + repeated PropInfo CostItems = 2; // 消耗道具 + repeated PropInfo GainItems = 3; // 获得道具 +} + +// PACKET_ExchangeList +message CSExchangeList{ + int32 Tp = 1; // 兑换类型 1集卡活动 +} +message SCExchangeList{ + repeated ExchangeInfo Infos = 1; // 兑换列表 + int32 Tp = 2; // 兑换类型 } \ No newline at end of file diff --git a/protocol/doc.md b/protocol/doc.md index 4ffacf5..01bc184 100644 --- a/protocol/doc.md +++ b/protocol/doc.md @@ -47,6 +47,7 @@ #### bag(背包) - 2530~2549 +- 3000~3099 #### Pets(人物宠物) - 2550~2579 diff --git a/protocol/shop/shop.proto_bak b/protocol/shop/shop.proto_bak deleted file mode 100644 index 5c62ff3..0000000 --- a/protocol/shop/shop.proto_bak +++ /dev/null @@ -1,141 +0,0 @@ -syntax = "proto3"; -package shop; -option go_package = ".;shop"; -//操作结果 -enum OpResultCode { - OPRC_Sucess = 0; //成功 - OPRC_Error = 1; //失败 -} -//世界杯 -enum SPacketID { - PACKET_SHOP_ZERO = 0; // 弃用消息号 - SHOP_CS_PAYLIST = 2550; //支付方式 - SHOP_SC_PAYLIST = 2551; //支付方式 - SHOP_CS_PAYORDER = 2552; //创建订单 - SHOP_SC_PAYORDER = 2553; //创建订单 - SHOP_CS_EXCHANGE = 2554; //兑换订单 - SHOP_SC_EXCHANGE = 2555; //兑换订单 - SHOP_CS_EXCHANGELIST = 2556; //兑换订单 - SHOP_SC_EXCHANGELIST = 2557; //兑换订单 - SHOP_CS_FLOWLIST = 2558; //请求获取流水列表 - SHOP_SC_FLOWLIST = 2559; //返回流水列表 - SHOP_CS_GET_EXCHANGEINFO = 2560; //请求兑换信息 - SHOP_SC_GET_EXCHANGEINFO = 2561; //返回兑换信息 - SHOP_CS_GET_PAYFLOWLIST = 2562; //请求兑换支付赠送信息 - SHOP_SC_GET_PAYFLOWLIST = 2563; //返回兑换支付赠送信息 - SHOP_SC_GIVECOIN_INFO = 2564; //通知赠送信息,先临时放到这个地方,其他协议需要合并 - -} - -//支付方式列表 -message CSShopPayList { - int32 OS = 1; //OS 操作系统 0 全部 1 android 2 ios -} -message SCShopPayList { - OpResultCode OpCode = 1; //请求结果 - string Data = 2; //平台数据 -} -//创建订单 -message CSShopOrder { - int32 OrderId = 1; //充值平台ID,上面platforms中的id字段 - int32 Count = 2; //充值数量 - string BankerCode = 3; //支付方式 - string ExtCode = 4; - string Ip = 5; //IP地址 -} -message SCShopOrder{ - string PayStr = 1; //支付路径 - string Error = 2; - OpResultCode OpCode = 3; -} -//创建兑换订单 -message CSShopExchange { - int32 ExchangeType = 1; //兑换类型1:支付宝,2:银行卡 - string Account = 2; //兑换账号 - int32 Count = 3; //兑换金额 - string AccountName = 4; //账号名称 - int32 BankID = 5; //银行编号 -} -message SCShopExchange { - OpResultCode OpCode = 1; //请求结果 -} -//兑换订单列表 -message CSShopExchangeList { - int32 PageNo = 1; // 当前页 -} -message SCShopExchangeList { - OpResultCode OpCode = 1; // 请求结果 - string Data = 2; // 列表 - int32 PageNo = 3; // 当前页 - int32 PageSum = 4; // 总页数 -} - -//获取玩家流水列表 -message FlowListLog{ - int32 GameId = 1; //游戏id - int32 GameMode = 2; //游戏模式 - int32 Ts = 3; //记录时间 - int32 GameTiming = 4; //本局游戏用时(mm) - int64 ConvertibilityFlow = 5;//当局玩家流水 -} -message CSFlowList { - int32 PageNo = 1; // 当前页 -} -message SCFlowList { - OpResultCode OpCode = 1; // 请求结果 - repeated FlowListLog Data = 2; // 列表 - int32 PageNo = 3; // 当前页 - int32 PageSum = 4; // 总页数 -} - -//获得玩家的流水信息 -message CSGetExchangeInfo { - -} - -message SCGetExchangeInfo { - OpResultCode OpCode = 1; // 请求结果 - int64 TotalFlow = 2; //玩家流水 - int64 NeedFlow = 3; //自由兑换需要多少流水 - int32 Tax = 4; //兑换税率 - int64 ForceTax = 5; //强制兑换需要扣除税费 - int64 GiveGold = 6; //强制兑换扣除赠送金币数量 -} - -//获取玩家流水兑换打码信息 -message PlayerPayFlowLog{ - int32 PayType = 1; //记录类型 0 充值 1系统赠送 - int64 PayCoin = 2; //充值金额 - int64 GiveCoin = 3; //赠送金额 - int64 PayNeedFlow = 4; //充值需要流水 - int64 GiveNeedFlow = 5; //赠送需要流水 - int64 ForceTax = 6; //强制扣除费用金额 - int64 ForceGiveCoin = 7; //赠送扣除金额 - int32 IsPass = 8; //是否通过审核 1 通过 0 未通过 - int64 Ts = 9; //记录时间 - int64 FinishFlow = 10; //记录之间完成流水 - string OrderID = 11; //订单id - -} - -message CSGetPlayerPayFlowList { - int32 PageNo = 1; // 当前页 -} - -message SCGetPlayerPayFlowList { - OpResultCode OpCode = 1; // 请求结果 - repeated PlayerPayFlowLog Data = 2; // 列表 - int32 PageNo = 3; // 当前页 - int32 PageSum = 4; // 总页数 - int32 PageSize = 5; // 每页记录数 - int32 TotalNum = 6; // 总记录数 -} - -message SCNotifyGiveCoinInfo { - int64 GiveCoin = 1; //赠送金币 - int32 GiveTag = 2; //赠送类型,需要对应关系 -} - - - - diff --git a/protocol/welfare/welfare.pb.go b/protocol/welfare/welfare.pb.go index 0153d93..b8e659b 100644 --- a/protocol/welfare/welfare.pb.go +++ b/protocol/welfare/welfare.pb.go @@ -20,7 +20,7 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -//操作结果 +// 操作结果 type OpResultCode int32 const ( @@ -116,6 +116,7 @@ const ( // 2900~2999 SPacketID_PACKET_CSWelfRelief SPacketID = 2900 //救济金信息 SPacketID_PACKET_SCWelfRelief SPacketID = 2901 //救济金信息 + // 邀请活动 SPacketID_PACKET_CSInviteInfo SPacketID = 2902 //邀请信息 SPacketID_PACKET_SCInviteInfo SPacketID = 2903 //邀请信息 SPacketID_PACKET_CSBindInvite SPacketID = 2904 //绑定邀请人 @@ -211,8 +212,8 @@ func (SPacketID) EnumDescriptor() ([]byte, []int) { return file_welfare_proto_rawDescGZIP(), []int{1} } -//救济金领取 -//PACKET_CS_WELF_GETRELIEFFUND +// 救济金领取 +// PACKET_CS_WELF_GETRELIEFFUND type CSGetReliefFund struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -260,7 +261,7 @@ func (x *CSGetReliefFund) GetIsVideo() bool { return false } -//PACKET_SC_WELF_GETRELIEFFUND +// PACKET_SC_WELF_GETRELIEFFUND type SCGetReliefFund struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -395,8 +396,8 @@ func (x *WelfareDate) GetItem_Id() int32 { return 0 } -//转动转盘 -//PACKET_CS_WELF_GETTURNPLATE +// 转动转盘 +// PACKET_CS_WELF_GETTURNPLATE type CSGetTurnplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -444,7 +445,7 @@ func (x *CSGetTurnplate) GetIsVideo() bool { return false } -//PACKET_SC_WELF_GETTURNPLATE +// PACKET_SC_WELF_GETTURNPLATE type SCGetTurnplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -579,8 +580,8 @@ func (x *AddUpWelfareDate) GetAddUpDate() []*WelfareDate { return nil } -//累计签到 -//PACKET_CS_WELF_GETADDUPSIGN +// 累计签到 +// PACKET_CS_WELF_GETADDUPSIGN type CSGetAddupSign struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -628,7 +629,7 @@ func (x *CSGetAddupSign) GetAddUpDay() int32 { return 0 } -//PACKET_SC_WELF_GETADDUPSIGN +// PACKET_SC_WELF_GETADDUPSIGN type SCGetAddupSign struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -692,8 +693,8 @@ func (x *SCGetAddupSign) GetAddUpSignDay() []int32 { return nil } -//福利信息 -//PACKET_CS_WELF_WELFAREINFO +// 福利信息 +// PACKET_CS_WELF_WELFAREINFO type CSWelfaredInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -850,7 +851,7 @@ func (x *Welfare7SignDate) GetAddUpDate() []*AddUpWelfareDate { return nil } -//PACKET_SC_WELF_WELFAREINFO +// PACKET_SC_WELF_WELFAREINFO type SCWelfaredInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1057,8 +1058,8 @@ func (x *BlindBoxData) GetItem_Id() int32 { return 0 } -//查看盲盒 -//PACKET_CS_WELF_BLINBOXINFO +// 查看盲盒 +// PACKET_CS_WELF_BLINBOXINFO type CSBlindBoxInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1106,7 +1107,7 @@ func (x *CSBlindBoxInfo) GetId() int32 { return 0 } -//PACKET_SC_WELF_BLINBOXINFO +// PACKET_SC_WELF_BLINBOXINFO type SCBlindBoxInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1186,8 +1187,8 @@ func (x *SCBlindBoxInfo) GetCycle() int32 { return 0 } -//领取盲盒 -//PACKET_CS_WELF_GETBLINBOX +// 领取盲盒 +// PACKET_CS_WELF_GETBLINBOX type CSGetBlindBox struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1235,7 +1236,7 @@ func (x *CSGetBlindBox) GetId() int32 { return 0 } -//PACKET_SC_WELF_GETBLINBOX +// PACKET_SC_WELF_GETBLINBOX type SCGetBlindBox struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1378,7 +1379,7 @@ func (x *WelfareSpree) GetDiscount() float64 { return 0 } -//PACKET_CS_WELF_FIRSTPAYINFO +// PACKET_CS_WELF_FIRSTPAYINFO type CSWelfareFirstPayData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1417,7 +1418,7 @@ func (*CSWelfareFirstPayData) Descriptor() ([]byte, []int) { return file_welfare_proto_rawDescGZIP(), []int{18} } -//PACKET_SC_WELF_FIRSTPAYINFO +// PACKET_SC_WELF_FIRSTPAYINFO type SCWelfareFirstPayData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1497,7 +1498,7 @@ func (x *SCWelfareFirstPayData) GetDraw() int32 { return 0 } -//PACKET_CS_WELF_FIRSTPAY +// PACKET_CS_WELF_FIRSTPAY type CSWelfareFirstPay struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1536,7 +1537,7 @@ func (*CSWelfareFirstPay) Descriptor() ([]byte, []int) { return file_welfare_proto_rawDescGZIP(), []int{20} } -//PACKET_SC_WELF_FIRSTPAY +// PACKET_SC_WELF_FIRSTPAY type SCWelfareFirstPay struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1584,7 +1585,7 @@ func (x *SCWelfareFirstPay) GetOpRetCode() OpResultCode { return OpResultCode_OPRC_Sucess } -//PACKET_CS_WELF_CONTINPAYINFO +// PACKET_CS_WELF_CONTINPAYINFO type CSWelfareContinuousPayData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1623,7 +1624,7 @@ func (*CSWelfareContinuousPayData) Descriptor() ([]byte, []int) { return file_welfare_proto_rawDescGZIP(), []int{22} } -//PACKET_SC_WELF_CONTINPAYINFO +// PACKET_SC_WELF_CONTINPAYINFO type SCWelfareContinuousPayData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1711,7 +1712,7 @@ func (x *SCWelfareContinuousPayData) GetDay() int32 { return 0 } -//PACKET_CS_WELF_CONTINPAY +// PACKET_CS_WELF_CONTINPAY type CSWelfareContinuousPay struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1750,7 +1751,7 @@ func (*CSWelfareContinuousPay) Descriptor() ([]byte, []int) { return file_welfare_proto_rawDescGZIP(), []int{24} } -//PACKET_SC_WELF_CONTINPAY +// PACKET_SC_WELF_CONTINPAY type SCWelfareContinuousPay struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/protocol/welfare/welfare.proto b/protocol/welfare/welfare.proto index d44f407..fa3b7d7 100644 --- a/protocol/welfare/welfare.proto +++ b/protocol/welfare/welfare.proto @@ -36,9 +36,11 @@ enum SPacketID { PACKET_SC_WELF_CONTINPAYINFO = 2597;//连续充值信息 PACKET_CS_WELF_CONTINPAY = 2598;//领取(购买)连续充值 后期走充值回调 PACKET_SC_WELF_CONTINPAY = 2599;//领取连续充值 + // 2900~2999 PACKET_CSWelfRelief = 2900;//救济金信息 PACKET_SCWelfRelief = 2901;//救济金信息 + // 邀请活动 PACKET_CSInviteInfo = 2902;//邀请信息 PACKET_SCInviteInfo = 2903;//邀请信息 PACKET_CSBindInvite = 2904;//绑定邀请人 diff --git a/public b/public index f317779..bf19adf 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit f317779a9675bcfd4741c351b69f532fa930cec8 +Subproject commit bf19adf1d5cf74a3ec3d180730404492658dd6d7 diff --git a/worldsrv/action_bag.go b/worldsrv/action_bag.go index b53a797..daaa88e 100644 --- a/worldsrv/action_bag.go +++ b/worldsrv/action_bag.go @@ -30,7 +30,7 @@ func (this *CSBagInfoPacketFactory) CreatePacket() interface{} { func (this *CSBagInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSBagInfoHandler Process recv ", data) - if _, ok := data.(*bag.CSBagInfo); ok { + if msg, ok := data.(*bag.CSBagInfo); ok { p := PlayerMgrSington.GetPlayer(sid) if p == nil { logger.Logger.Warn("CSBagInfoHandler p == nil") @@ -41,28 +41,16 @@ func (this *CSBagInfoHandler) Process(s *netlib.Session, packetid int, data inte return nil } //nowLocation := int(msg.NowLocation - 1) - playbag := BagMgrSingleton.GetBagInfo(p.SnId) + tp := msg.GetTp() // 道具类型 + bagInfo := BagMgrSingleton.GetBagInfo(p.SnId) pack := &bag.SCBagInfo{RetCode: bag.OpResultCode_OPRC_Sucess, BagNumMax: BagItemMax} - if playbag != nil { - for _, v := range playbag.BagItem { + if bagInfo != nil { + for _, v := range bagInfo.BagItem { item := srvdata.PBDB_GameItemMgr.GetData(v.ItemId) - if item != nil && v.ItemNum > 0 /*&& (nowLocation == -1 || (nowLocation < len(item.ShowLocation) && item.ShowLocation[nowLocation] == 1))*/ { + if item != nil && v.ItemNum > 0 && (tp <= 0 || item.GetType() == tp) /*&& (nowLocation == -1 || (nowLocation < len(item.ShowLocation) && item.ShowLocation[nowLocation] == 1))*/ { pack.Infos = append(pack.Infos, &bag.ItemInfo{ - ItemId: v.ItemId, - ItemNum: v.ItemNum, - //Name: item.Name, - //ShowLocation: item.ShowLocation, - //Classify: item.Classify, - //Type: item.Type, - //Effect0: item.Effect0, - //Effect: item.Effect, - //SaleType: item.SaleType, - //SaleGold: item.SaleGold, - //Composition: item.Composition, - //CompositionMax: item.CompositionMax, - //Time: item.Time, - //Location: item.Location, - //Describe: item.Describe, + ItemId: v.ItemId, + ItemNum: v.ItemNum, ObtainTime: v.ObtainTime, }) } @@ -192,6 +180,53 @@ func (this *CSUpBagInfoHandler) Process(s *netlib.Session, packetid int, data in useFunc() } + case common.ItemIDCollectBox: + f() + useFunc := func() { + sum := 0 + for _, v := range srvdata.PBDB_CollectBoxMgr.Datas.GetArr() { + sum += int(v.GetRate()) + } + if sum > 0 { + n := 0 + i := rand.Intn(sum) + for _, v := range srvdata.PBDB_CollectBoxMgr.Datas.GetArr() { + n += int(v.GetRate()) + if i < n { + var items []*Item + for k, vv := range v.ItemID { + if vv > 0 { + items = append(items, &Item{ + ItemId: int32(k), + ItemNum: vv, + ObtainTime: ts, + }) + } + } + if len(items) > 0 { + BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_ItemUse, "player", "道具使用") + for _, v := range items { + data := srvdata.PBDB_GameItemMgr.GetData(v.ItemId) + if data != nil { + // 背包变更记录 + BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, data.Name, v.ItemNum, "集卡礼盒获得") + } + pack.Infos = append(pack.Infos, &bag.ItemInfo{ + ItemId: v.ItemId, + ItemNum: v.ItemNum, + ObtainTime: v.ObtainTime, + }) + } + } + break + } + } + } + } + for i := 0; i < int(msg.ItemNum); i++ { + useFunc() + } + default: logger.Logger.Warnf("道具使用未定义", msg.ItemId) } @@ -259,12 +294,132 @@ func (this *CSUpBagInfoHandler) Process(s *netlib.Session, packetid int, data in return nil } +func CSExchangeList(s *netlib.Session, packetid int, data interface{}, sid int64) error { + logger.Logger.Trace("CSExchangeList", data) + msg, ok := data.(*bag.CSExchangeList) + if !ok { + return nil + } + + p := PlayerMgrSington.GetPlayer(sid) + if p == nil { + return nil + } + + pack := &bag.SCExchangeList{ + Tp: msg.Tp, + } + + for _, v := range srvdata.PBDB_PropExchangeMgr.Datas.GetArr() { + if v.GetGroup() != msg.Tp { + continue + } + var costItems, gainItems []*bag.PropInfo + for k, v := range v.GetCost() { + costItems = append(costItems, &bag.PropInfo{ + ItemId: int32(k), + ItemNum: v, + }) + } + for k, v := range v.GetGain() { + gainItems = append(gainItems, &bag.PropInfo{ + ItemId: int32(k), + ItemNum: v, + }) + } + pack.Infos = append(pack.Infos, &bag.ExchangeInfo{ + CostItems: costItems, + GainItems: gainItems, + }) + } + + p.SendToClient(packetid, pack) + logger.Logger.Tracef("SCExchangeList:%v", pack) + return nil +} + +func CSPropExchange(s *netlib.Session, packetid int, data interface{}, sid int64) error { + logger.Logger.Trace("CSPropExchange", data) + msg, ok := data.(*bag.CSPropExchange) + if !ok { + return nil + } + + p := PlayerMgrSington.GetPlayer(sid) + if p == nil { + return nil + } + + pack := &bag.SCPropExchange{ + RetCode: bag.OpResultCode_OPRC_Error, + } + send := func(code bag.OpResultCode) { + pack.RetCode = code + p.SendToClient(packetid, pack) + logger.Logger.Tracef("SCPropExchange:%v", pack) + } + + info := srvdata.PBDB_PropExchangeMgr.GetData(msg.Id) + if info == nil { + send(bag.OpResultCode_OPRC_IdErr) + return nil + } + // 检查背包是否足够 + var items []*Item + var costItems []*Item + for k, v := range info.GetCost() { + item := BagMgrSingleton.GetItem(p.SnId, int32(k)) + if item == nil || item.ItemNum < v { + send(bag.OpResultCode_OPRC_UseUp) + return nil + } + info := srvdata.PBDB_GameItemMgr.GetData(int32(k)) + if info != nil { + costItems = append(costItems, &Item{ + ItemId: int32(k), + ItemNum: v, + Name: info.Name, + }) + } + } + for k, v := range info.GetGain() { + info := srvdata.PBDB_GameItemMgr.GetData(int32(k)) + if info != nil { + items = append(items, &Item{ + ItemId: int32(k), + ItemNum: v, + Name: info.Name, + }) + } + } + // 扣除背包物品 + for _, item := range costItems { + BagMgrSingleton.SaleItemV2(p, item.ItemId, item.ItemNum, common.GainWay_Collect, "system", "集卡活动兑换") + BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, item.ItemNum, "集卡活动兑换使用") + } + // 增加背包物品 + BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_Collect, "player", "集卡活动兑换") + for _, v := range items { + BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, v.Name, v.ItemNum, "集卡活动兑换获得") + pack.Items = append(pack.Items, &bag.PropInfo{ + ItemId: v.ItemId, + ItemNum: v.ItemNum, + }) + } + + send(bag.OpResultCode_OPRC_Sucess) + return nil +} + func init() { // 查看背包 common.RegisterHandler(int(bag.SPacketID_PACKET_ALL_BAG_INFO), &CSBagInfoHandler{}) netlib.RegisterFactory(int(bag.SPacketID_PACKET_ALL_BAG_INFO), &CSBagInfoPacketFactory{}) - // 道具操作(赠送,出售...) common.RegisterHandler(int(bag.SPacketID_PACKET_ALL_BAG_USE), &CSUpBagInfoHandler{}) netlib.RegisterFactory(int(bag.SPacketID_PACKET_ALL_BAG_USE), &CSUpBagInfoPacketFactory{}) + // 兑换列表 + common.Register(int(bag.SPacketID_PACKET_ExchangeList), &bag.CSExchangeList{}, CSExchangeList) + // 道具兑换 + common.Register(int(bag.SPacketID_PACKET_PropExchange), &bag.CSPropExchange{}, CSPropExchange) } diff --git a/worldsrv/bagmgr.go b/worldsrv/bagmgr.go index ac5f851..6790f98 100644 --- a/worldsrv/bagmgr.go +++ b/worldsrv/bagmgr.go @@ -84,31 +84,53 @@ func (this *BagMgr) GetBagInfo(snid int32) *BagInfo { // GetItem 获取个人的指定道具信息 func (this *BagMgr) GetItem(snid, itemId int32) *Item { - if bagItem, ok := this.PlayerBag[snid]; ok { - if bagItem != nil { - item := bagItem.BagItem[itemId] - if item != nil { - itemX := srvdata.PBDB_GameItemMgr.GetData(item.ItemId) - if itemX != nil { - item.Name = itemX.Name - //item.ShowLocation = itemX.ShowLocation - //item.Classify = itemX.Classify - //item.Type = itemX.Type - item.Effect0 = itemX.Effect - item.Effect = itemX.Effect - item.SaleType = itemX.SaleType - item.SaleGold = itemX.SaleGold - //item.Composition = itemX.Composition - //item.CompositionMax = itemX.CompositionMax - //item.Time = itemX.Time - //item.Location = itemX.Location - //item.Describe = itemX.Describe + p := PlayerMgrSington.GetPlayerBySnId(snid) + if p == nil { + return nil + } + + item := &Item{ + ItemId: itemId, + } + f := func() { + itemX := srvdata.PBDB_GameItemMgr.GetData(itemId) + if itemX != nil { + item.Name = itemX.Name + //item.ShowLocation = itemX.ShowLocation + //item.Classify = itemX.Classify + //item.Type = itemX.Type + item.Effect0 = itemX.Effect + item.Effect = itemX.Effect + item.SaleType = itemX.SaleType + item.SaleGold = itemX.SaleGold + //item.Composition = itemX.Composition + //item.CompositionMax = itemX.CompositionMax + //item.Time = itemX.Time + //item.Location = itemX.Location + //item.Describe = itemX.Describe + } + } + + switch itemId { + case common.ItemIDCoin: + item.ItemNum = p.Coin + f() + case common.ItemIDDiamond: + item.ItemNum = p.Diamond + f() + default: + if bagItem, ok := this.PlayerBag[snid]; ok { + if bagItem != nil { + item = bagItem.BagItem[itemId] + if item != nil { + f() + return item } - return item } } } - return nil + + return item } // AddJybBagInfo 给玩家背包添加道具 @@ -215,13 +237,9 @@ func (this *BagMgr) AddJybBagInfo(p *Player, addItems []*Item, add int64, gainWa // SaleItem 出售道具,减少玩家道具数量 func (this *BagMgr) SaleItem(p *Player, itemId int32, num int64) bool { - if bagInfo, ok := this.PlayerBag[p.SnId]; ok { - if item, ok1 := bagInfo.BagItem[itemId]; ok1 { - if item.ItemNum >= num { - //可以出售 - return this.SalePlayerItem(p, item, num) - } - } + item := this.GetItem(p.SnId, itemId) + if item != nil && item.ItemNum >= num { + return this.SalePlayerItem(p, item, num) } return false } @@ -234,9 +252,30 @@ func (this *BagMgr) SalePlayerItem(p *Player, item *Item, num int64) bool { return true } +func (this *BagMgr) SaleItemV2(p *Player, itemId int32, num int64, gain int32, oper string, remark string) bool { + item := this.GetItem(p.SnId, itemId) + if item != nil && item.ItemNum >= num { + switch item.ItemId { + case common.ItemIDCoin: + p.AddCoin(-num, 0, gain, oper, remark) + return true + case common.ItemIDDiamond: + p.AddDiamond(-num, 0, gain, oper, remark) + return true + default: + return this.SalePlayerItem(p, item, num) + } + } + return false +} + // RecordItemLog 道具操作记录(获得,消耗) func (this *BagMgr) RecordItemLog(platform string, snid, logType, itemId int32, itemName string, count int64, remark string) { //logger.Logger.Trace("RecordItemLog:", platform, snid, logType, itemId, itemName, count, remark) + switch itemId { + case common.ItemIDCoin, common.ItemIDDiamond: + return + } log := model.NewItemLogEx(platform, snid, logType, itemId, itemName, count, remark) if log != nil { LogChannelSingleton.WriteLog(log) diff --git a/worldsrv/player.go b/worldsrv/player.go index 0d7afe1..325abad 100644 --- a/worldsrv/player.go +++ b/worldsrv/player.go @@ -4600,3 +4600,20 @@ func (this *Player) ResetTask(tp int32) { this.WelfData.Task[v.GetId()] = &model.TaskData{} } } + +func (this *Player) CollectTask(taskId int32, num int64) { + // 每日登录游戏赠送一个 + // 每日转盘抽奖赠送一个 + switch taskId { + case common.TaskTypeTurnplate, common.TaskTypeFirstLogin: + oper := fmt.Sprintf("集卡活动%v", taskId) + var items []*Item + items = append(items, &Item{ + ItemId: common.ItemIDCollectBox, + ItemNum: num, + ObtainTime: time.Now().Unix(), + }) + BagMgrSingleton.AddJybBagInfo(this, items, 0, common.GainWay_Collect, "system", oper) + default: + } +} diff --git a/worldsrv/taskmgr.go b/worldsrv/taskmgr.go index 97543de..0138fa0 100644 --- a/worldsrv/taskmgr.go +++ b/worldsrv/taskmgr.go @@ -123,9 +123,13 @@ func (t *TaskHandle) TaskUpdate(id int, data any) { //抽奖次数增加 p.PhoneLotteryTask(common.TaskTypeFirstLogin, 0) p.InviteTask(common.InviteScoreTypeLogin, int32(info.GameID), num) + p.CollectTask(common.TaskTypeFirstLogin, num) case common.TaskTypeInviteNum: + case common.TaskTypeTurnplate: + p.CollectTask(common.TaskTypeTurnplate, num) + default: return } diff --git a/worldsrv/welfmgr.go b/worldsrv/welfmgr.go index f8e17bf..f9b7a53 100644 --- a/worldsrv/welfmgr.go +++ b/worldsrv/welfmgr.go @@ -367,6 +367,7 @@ func (this *WelfareMgr) GetTurnplate(p *Player) { hadSign = int32(len(turnplate.RateList)) } pack.SignDay = hadSign // 已签到天数 + TaskSubjectSingleton.Touch(common.TaskTypeTurnplate, &TaskData{SnId: p.SnId, Num: 1}) break } } diff --git a/xlsx/DB_GameItem.xlsx b/xlsx/DB_GameItem.xlsx index 36a467c14891fca0d3be45942a961618397c8dcc..7f504b892a9675f1173c852353b023f208f08a2f 100644 GIT binary patch delta 5375 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 Q9eODJ9;reS;U&QT0WB5+(EtDd delta 5413 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 B^P2zw