From a943492d8023eb8186172f33c18c31d34dd4e970 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 10 May 2024 09:17:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=85=91=E6=8D=A2=E6=B8=A0?= =?UTF-8?q?=E9=81=93=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_Game_Drop.dat | 104 ++++++++++++------------- data/DB_Game_Drop.json | 132 ++++++++++++++++---------------- data/DB_PropExchange.dat | 6 +- data/DB_Task.dat | Bin 1999 -> 1999 bytes etcd/keyconf.go | 1 + model/config.go | 2 + protocol/gamehall/game.pb.go | 144 +++++++++++++++++++++++++++++++++-- protocol/gamehall/game.proto | 10 +++ protocol/webapi/common.pb.go | 113 ++++++++++++++++++++++----- protocol/webapi/common.proto | 6 ++ worldsrv/action_game.go | 27 +++++++ worldsrv/etcd.go | 12 +++ xlsx/DB_Game_Drop.xlsx | Bin 21201 -> 21232 bytes 13 files changed, 405 insertions(+), 152 deletions(-) diff --git a/data/DB_Game_Drop.dat b/data/DB_Game_Drop.dat index cb9b22d..93817af 100644 --- a/data/DB_Game_Drop.dat +++ b/data/DB_Game_Drop.dat @@ -208,59 +208,51 @@ (0N: ʺ(0N: (0N: -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -(0: -(0: -z(0N: - -(0N:2 -(0N: -_(0N: -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd -N(0J: -І(0: - (0 : -=(0:: -(0N: - - (0N:Kd \ No newline at end of file +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +(0 : +(0:: +z(0N: +(0N:  +(0N:HL +_(0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: +N(0: +І(0: + (0: +=(0N: +(0N: + (0N: \ No newline at end of file diff --git a/data/DB_Game_Drop.json b/data/DB_Game_Drop.json index 2968cd8..2da5d7a 100644 --- a/data/DB_Game_Drop.json +++ b/data/DB_Game_Drop.json @@ -2205,7 +2205,7 @@ "GameId": 240, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2216,7 +2216,7 @@ "GameId": 240, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2227,7 +2227,7 @@ "GameId": 240, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2238,7 +2238,7 @@ "GameId": 240, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2251,8 +2251,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2262,8 +2262,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2271,7 +2271,7 @@ "GameId": 244, "Bet": 100000, "ItemId1": 30001, - "Rate1": 743, + "Rate1": 1485, "Amount1": [ 1, 1 @@ -2282,7 +2282,7 @@ "GameId": 244, "Bet": 500000, "ItemId1": 30001, - "Rate1": 3713, + "Rate1": 7425, "Amount1": [ 2, 3 @@ -2295,8 +2295,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 5, - 10 + 1, + 5 ] }, { @@ -2306,8 +2306,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 25, - 50 + 13, + 17 ] }, { @@ -2317,8 +2317,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 225, - 250 + 72, + 76 ] }, { @@ -2328,8 +2328,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 300, - 500 + 295, + 299 ] }, { @@ -2337,7 +2337,7 @@ "GameId": 241, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2348,7 +2348,7 @@ "GameId": 241, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2359,7 +2359,7 @@ "GameId": 241, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2370,7 +2370,7 @@ "GameId": 241, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2383,8 +2383,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2394,8 +2394,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2403,7 +2403,7 @@ "GameId": 245, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2414,7 +2414,7 @@ "GameId": 245, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2425,7 +2425,7 @@ "GameId": 245, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2436,7 +2436,7 @@ "GameId": 245, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2449,8 +2449,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2460,8 +2460,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2469,7 +2469,7 @@ "GameId": 242, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2480,7 +2480,7 @@ "GameId": 242, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2491,7 +2491,7 @@ "GameId": 242, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2502,7 +2502,7 @@ "GameId": 242, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2515,8 +2515,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2526,8 +2526,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2535,7 +2535,7 @@ "GameId": 246, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2546,7 +2546,7 @@ "GameId": 246, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2557,7 +2557,7 @@ "GameId": 246, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2568,7 +2568,7 @@ "GameId": 246, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2581,8 +2581,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2592,8 +2592,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2601,7 +2601,7 @@ "GameId": 243, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2612,7 +2612,7 @@ "GameId": 243, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2623,7 +2623,7 @@ "GameId": 243, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2634,7 +2634,7 @@ "GameId": 243, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2647,8 +2647,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2658,8 +2658,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] }, { @@ -2667,7 +2667,7 @@ "GameId": 247, "Bet": 10000, "ItemId1": 30001, - "Rate1": 74, + "Rate1": 149, "Amount1": [ 1, 1 @@ -2678,7 +2678,7 @@ "GameId": 247, "Bet": 50000, "ItemId1": 30001, - "Rate1": 371, + "Rate1": 743, "Amount1": [ 1, 1 @@ -2689,7 +2689,7 @@ "GameId": 247, "Bet": 200000, "ItemId1": 30001, - "Rate1": 1485, + "Rate1": 2970, "Amount1": [ 1, 1 @@ -2700,7 +2700,7 @@ "GameId": 247, "Bet": 1000000, "ItemId1": 30001, - "Rate1": 7425, + "Rate1": 10000, "Amount1": [ 3, 5 @@ -2713,8 +2713,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 10, - 25 + 5, + 9 ] }, { @@ -2724,8 +2724,8 @@ "ItemId1": 30001, "Rate1": 10000, "Amount1": [ - 75, - 100 + 28, + 32 ] } ] diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index b7451ac..bed563e 100644 --- a/data/DB_PropExchange.dat +++ b/data/DB_PropExchange.dat @@ -1,5 +1,5 @@ -6ӆԆՆֆ׆"= +6Նֆ׆ӆԆ"= .؆نچۆ"= -WنچۆӆԆֆ؆Ն׆"  -]ֆ׆؆چۆ܆ӆԆՆن" \ No newline at end of file +WֆՆԆ׆؆نچۆӆ"  +]׆؆ۆӆԆֆ܆Նنچ" \ No newline at end of file diff --git a/data/DB_Task.dat b/data/DB_Task.dat index bb6d5973e78428c38d446594834b5a66a36cd4a8..50d1fa8de0f5314064288ffcb86caf84641cc814 100644 GIT binary patch delta 144 zcmX@lf1ZDWu^=1Al3q3e5i1Ukg+O{iFWW{JLB`3=OoEfs81sZU!J-XoAF)`maV!EV z;M)9*aU&y87l;GX)zDcrc?Gl8c6K2kSq!d^Ck1-)!mY#d8~ERl^af{cP}9E*T#E-Q%affn1zX^eS7Fi}ph zo`$uLST;Xn+{ifDg-vjB0W0g|waliIOW1`re_?jRV#H=|)A5dq diff --git a/etcd/keyconf.go b/etcd/keyconf.go index 7a832c6..a7710b8 100644 --- a/etcd/keyconf.go +++ b/etcd/keyconf.go @@ -53,4 +53,5 @@ const ( ETCDKEY_PLAYERPOOL = "/game/plt/playerpool/" // 个人水池调控配置 ETCDKEY_GAME_CONFIG = "/game/plt/gameconfig/" // 游戏管理/全局配置 ETCDKEY_ACT_PHONELOTTERY = "/game/act_phoneLottery" + ETCDKEY_EXCHANGECHANNEL = "/game/exchange/channel" // 开启兑换功能的渠道 ) diff --git a/model/config.go b/model/config.go index cc0f4a1..d93c6f2 100644 --- a/model/config.go +++ b/model/config.go @@ -115,6 +115,8 @@ type AllConfig struct { *webapi.ExchangeShopList // 商店 ShopInfos map[int32]*ShopInfo // 商品id:商品信息 + // 开启兑换的渠道 + *webapi.ExchangeChannelConfig } type GlobalConfig struct { diff --git a/protocol/gamehall/game.pb.go b/protocol/gamehall/game.pb.go index a15294c..0a97e7f 100644 --- a/protocol/gamehall/game.pb.go +++ b/protocol/gamehall/game.pb.go @@ -284,6 +284,8 @@ const ( GameHallPacketID_PACKET_CS_PLAYER_SWITCHFLAG GameHallPacketID = 8008 GameHallPacketID_PACKET_CSRoomEvent GameHallPacketID = 8009 // 房间事件 GameHallPacketID_PACKET_SCRoomEvent GameHallPacketID = 8010 // 房间事件 + GameHallPacketID_PACKET_CSExchangeChannel GameHallPacketID = 8011 // 开启兑换的渠道 + GameHallPacketID_PACKET_SCExchangeChannel GameHallPacketID = 8012 // 开启兑换的渠道 ) // Enum value maps for GameHallPacketID. @@ -390,6 +392,8 @@ var ( 8008: "PACKET_CS_PLAYER_SWITCHFLAG", 8009: "PACKET_CSRoomEvent", 8010: "PACKET_SCRoomEvent", + 8011: "PACKET_CSExchangeChannel", + 8012: "PACKET_SCExchangeChannel", } GameHallPacketID_value = map[string]int32{ "PACKET_GameHall_ZERO": 0, @@ -493,6 +497,8 @@ var ( "PACKET_CS_PLAYER_SWITCHFLAG": 8008, "PACKET_CSRoomEvent": 8009, "PACKET_SCRoomEvent": 8010, + "PACKET_CSExchangeChannel": 8011, + "PACKET_SCExchangeChannel": 8012, } ) @@ -7182,6 +7188,93 @@ func (x *SCRoomEvent) GetTs() int64 { return 0 } +// PACKET_CSExchangeChannel +type CSExchangeChannel struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CSExchangeChannel) Reset() { + *x = CSExchangeChannel{} + if protoimpl.UnsafeEnabled { + mi := &file_game_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSExchangeChannel) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSExchangeChannel) ProtoMessage() {} + +func (x *CSExchangeChannel) ProtoReflect() protoreflect.Message { + mi := &file_game_proto_msgTypes[102] + 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 CSExchangeChannel.ProtoReflect.Descriptor instead. +func (*CSExchangeChannel) Descriptor() ([]byte, []int) { + return file_game_proto_rawDescGZIP(), []int{102} +} + +// PACKET_SCExchangeChannel +type SCExchangeChannel struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OnChannelName []string `protobuf:"bytes,1,rep,name=OnChannelName,proto3" json:"OnChannelName,omitempty"` // 开启渠道 +} + +func (x *SCExchangeChannel) Reset() { + *x = SCExchangeChannel{} + if protoimpl.UnsafeEnabled { + mi := &file_game_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCExchangeChannel) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCExchangeChannel) ProtoMessage() {} + +func (x *SCExchangeChannel) ProtoReflect() protoreflect.Message { + mi := &file_game_proto_msgTypes[103] + 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 SCExchangeChannel.ProtoReflect.Descriptor instead. +func (*SCExchangeChannel) Descriptor() ([]byte, []int) { + return file_game_proto_rawDescGZIP(), []int{103} +} + +func (x *SCExchangeChannel) GetOnChannelName() []string { + if x != nil { + return x.OnChannelName + } + return nil +} + var File_game_proto protoreflect.FileDescriptor var file_game_proto_rawDesc = []byte{ @@ -7913,7 +8006,12 @@ var file_game_proto_rawDesc = []byte{ 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x54, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x54, 0x73, 0x2a, 0xe6, 0x09, 0x0a, + 0x54, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x54, 0x73, 0x22, 0x13, 0x0a, 0x11, + 0x43, 0x53, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x22, 0x39, 0x0a, 0x11, 0x53, 0x43, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x4f, + 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0xe6, 0x09, 0x0a, 0x11, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x5f, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x47, 0x61, 0x6d, 0x65, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, @@ -7992,7 +8090,7 @@ var file_game_proto_rawDesc = []byte{ 0x5f, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x5f, 0x47, 0x61, 0x6d, 0x65, 0x10, 0xab, 0x46, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x68, 0x72, 0x5f, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x47, 0x61, - 0x6d, 0x65, 0x10, 0xb2, 0x46, 0x2a, 0xd0, 0x17, 0x0a, 0x10, 0x47, 0x61, 0x6d, 0x65, 0x48, 0x61, + 0x6d, 0x65, 0x10, 0xb2, 0x46, 0x2a, 0x8e, 0x18, 0x0a, 0x10, 0x47, 0x61, 0x6d, 0x65, 0x48, 0x61, 0x6c, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x47, 0x61, 0x6d, 0x65, 0x48, 0x61, 0x6c, 0x6c, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, @@ -8181,10 +8279,14 @@ var file_game_proto_rawDesc = []byte{ 0x4c, 0x41, 0x47, 0x10, 0xc8, 0x3e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x10, 0xc9, 0x3e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x52, 0x6f, 0x6f, 0x6d, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x10, 0xca, 0x3e, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x68, 0x61, - 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x10, 0xca, 0x3e, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x10, 0xcb, 0x3e, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x10, 0xcc, 0x3e, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, + 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x68, 0x61, 0x6c, 0x6c, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -8200,7 +8302,7 @@ func file_game_proto_rawDescGZIP() []byte { } var file_game_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_game_proto_msgTypes = make([]protoimpl.MessageInfo, 102) +var file_game_proto_msgTypes = make([]protoimpl.MessageInfo, 104) var file_game_proto_goTypes = []interface{}{ (OpResultCode_Game)(0), // 0: gamehall.OpResultCode_Game (GameHallPacketID)(0), // 1: gamehall.GameHallPacketID @@ -8306,6 +8408,8 @@ var file_game_proto_goTypes = []interface{}{ (*SCNoticeChange)(nil), // 101: gamehall.SCNoticeChange (*CSRoomEvent)(nil), // 102: gamehall.CSRoomEvent (*SCRoomEvent)(nil), // 103: gamehall.SCRoomEvent + (*CSExchangeChannel)(nil), // 104: gamehall.CSExchangeChannel + (*SCExchangeChannel)(nil), // 105: gamehall.SCExchangeChannel } var file_game_proto_depIdxs = []int32{ 0, // 0: gamehall.SCEnterHall.OpRetCode:type_name -> gamehall.OpResultCode_Game @@ -9594,6 +9698,30 @@ func file_game_proto_init() { return nil } } + file_game_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSExchangeChannel); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_game_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCExchangeChannel); 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{ @@ -9601,7 +9729,7 @@ func file_game_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_game_proto_rawDesc, NumEnums: 2, - NumMessages: 102, + NumMessages: 104, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/gamehall/game.proto b/protocol/gamehall/game.proto index 12137c9..c6f81c3 100644 --- a/protocol/gamehall/game.proto +++ b/protocol/gamehall/game.proto @@ -159,6 +159,8 @@ enum GameHallPacketID { PACKET_CS_PLAYER_SWITCHFLAG = 8008; PACKET_CSRoomEvent = 8009; // 房间事件 PACKET_SCRoomEvent = 8010; // 房间事件 + PACKET_CSExchangeChannel = 8011; // 开启兑换的渠道 + PACKET_SCExchangeChannel = 8012; // 开启兑换的渠道 } //进入游戏大厅 //PACKET_CS_ENTERHALL @@ -860,4 +862,12 @@ message SCRoomEvent{ string Content = 4; // 内容 repeated int32 Param= 5; // 参数 int64 Ts = 6; // 时间戳 +} + +// PACKET_CSExchangeChannel +message CSExchangeChannel{} + +// PACKET_SCExchangeChannel +message SCExchangeChannel{ + repeated string OnChannelName = 1; // 开启渠道 } \ No newline at end of file diff --git a/protocol/webapi/common.pb.go b/protocol/webapi/common.pb.go index 085d71f..1edfdf3 100644 --- a/protocol/webapi/common.pb.go +++ b/protocol/webapi/common.pb.go @@ -5701,6 +5701,62 @@ func (x *WelfareCollectConfig) GetSwitch() int32 { return 0 } +// etcd /game/exchange/channel +type ExchangeChannelConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform string `protobuf:"bytes,1,opt,name=Platform,proto3" json:"Platform,omitempty"` + OnChannelName []string `protobuf:"bytes,2,rep,name=OnChannelName,proto3" json:"OnChannelName,omitempty"` // 开启渠道 +} + +func (x *ExchangeChannelConfig) Reset() { + *x = ExchangeChannelConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_common_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExchangeChannelConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExchangeChannelConfig) ProtoMessage() {} + +func (x *ExchangeChannelConfig) ProtoReflect() protoreflect.Message { + mi := &file_common_proto_msgTypes[55] + 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 ExchangeChannelConfig.ProtoReflect.Descriptor instead. +func (*ExchangeChannelConfig) Descriptor() ([]byte, []int) { + return file_common_proto_rawDescGZIP(), []int{55} +} + +func (x *ExchangeChannelConfig) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *ExchangeChannelConfig) GetOnChannelName() []string { + if x != nil { + return x.OnChannelName + } + return nil +} + var File_common_proto protoreflect.FileDescriptor var file_common_proto_rawDesc = []byte{ @@ -6628,10 +6684,16 @@ var file_common_proto_rawDesc = []byte{ 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x26, 0x5a, 0x24, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, 0x65, - 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x59, 0x0a, 0x15, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6646,7 +6708,7 @@ func file_common_proto_rawDescGZIP() []byte { return file_common_proto_rawDescData } -var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 60) +var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 61) var file_common_proto_goTypes = []interface{}{ (*MysqlDbSetting)(nil), // 0: webapi.MysqlDbSetting (*MongoDbSetting)(nil), // 1: webapi.MongoDbSetting @@ -6703,31 +6765,32 @@ var file_common_proto_goTypes = []interface{}{ (*GameConfig)(nil), // 52: webapi.GameConfig (*WelfarePhoneLotteryStatus)(nil), // 53: webapi.WelfarePhoneLotteryStatus (*WelfareCollectConfig)(nil), // 54: webapi.WelfareCollectConfig - nil, // 55: webapi.Platform.BindTelRewardEntry - nil, // 56: webapi.PlayerData.RankScoreEntry - nil, // 57: webapi.ItemShop.AwardEntry - nil, // 58: webapi.VIPcfg.AwardEntry - nil, // 59: webapi.VIPcfg.Privilege7Entry - (*server.DB_GameFree)(nil), // 60: server.DB_GameFree + (*ExchangeChannelConfig)(nil), // 55: webapi.ExchangeChannelConfig + nil, // 56: webapi.Platform.BindTelRewardEntry + nil, // 57: webapi.PlayerData.RankScoreEntry + nil, // 58: webapi.ItemShop.AwardEntry + nil, // 59: webapi.VIPcfg.AwardEntry + nil, // 60: webapi.VIPcfg.Privilege7Entry + (*server.DB_GameFree)(nil), // 61: server.DB_GameFree } var file_common_proto_depIdxs = []int32{ 2, // 0: webapi.Platform.Leaderboard:type_name -> webapi.RankSwitch 3, // 1: webapi.Platform.ClubConfig:type_name -> webapi.ClubConfig 4, // 2: webapi.Platform.ThirdGameMerchant:type_name -> webapi.ThirdGame - 55, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry + 56, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry 6, // 4: webapi.GameConfigGlobal.GameStatus:type_name -> webapi.GameStatus - 60, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree + 61, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree 8, // 6: webapi.PlatformGameConfig.DbGameFrees:type_name -> webapi.GameFree 0, // 7: webapi.PlatformDbConfig.Mysql:type_name -> webapi.MysqlDbSetting 1, // 8: webapi.PlatformDbConfig.MongoDb:type_name -> webapi.MongoDbSetting 1, // 9: webapi.PlatformDbConfig.MongoDbLog:type_name -> webapi.MongoDbSetting - 60, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree - 56, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry + 61, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree + 57, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry 20, // 12: webapi.OnlineReport.GameCount:type_name -> webapi.OnlineGameCnt 22, // 13: webapi.CommonNoticeList.List:type_name -> webapi.CommonNotice 25, // 14: webapi.ExchangeShop.ExType:type_name -> webapi.ExchangeType 24, // 15: webapi.ExchangeShopList.List:type_name -> webapi.ExchangeShop - 57, // 16: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry + 58, // 16: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry 27, // 17: webapi.ItemShopList.List:type_name -> webapi.ItemShop 29, // 18: webapi.MatchInfoAward.ItemId:type_name -> webapi.ItemInfo 30, // 19: webapi.GameMatchDate.Award:type_name -> webapi.MatchInfoAward @@ -6744,8 +6807,8 @@ var file_common_proto_depIdxs = []int32{ 33, // 30: webapi.WelfareSpree.Item:type_name -> webapi.WelfareDate 42, // 31: webapi.WelfareFirstPayDataList.List:type_name -> webapi.WelfareSpree 42, // 32: webapi.WelfareContinuousPayDataList.List:type_name -> webapi.WelfareSpree - 58, // 33: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry - 59, // 34: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry + 59, // 33: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry + 60, // 34: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry 45, // 35: webapi.VIPcfgDataList.List:type_name -> webapi.VIPcfg 33, // 36: webapi.ChessRankConfig.Item:type_name -> webapi.WelfareDate 49, // 37: webapi.ChessRankcfgData.Datas:type_name -> webapi.ChessRankConfig @@ -7422,6 +7485,18 @@ func file_common_proto_init() { return nil } } + file_common_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExchangeChannelConfig); 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{ @@ -7429,7 +7504,7 @@ func file_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_proto_rawDesc, NumEnums: 0, - NumMessages: 60, + NumMessages: 61, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/webapi/common.proto b/protocol/webapi/common.proto index d35d787..236347c 100644 --- a/protocol/webapi/common.proto +++ b/protocol/webapi/common.proto @@ -631,4 +631,10 @@ message WelfarePhoneLotteryStatus{ message WelfareCollectConfig{ string Platform = 1; int32 Switch = 2; // 1.开启 2.关闭 +} + +// etcd /game/exchange/channel +message ExchangeChannelConfig{ + string Platform = 1; + repeated string OnChannelName = 2; // 开启渠道 } \ No newline at end of file diff --git a/worldsrv/action_game.go b/worldsrv/action_game.go index 7ac3e77..4c9d6ba 100644 --- a/worldsrv/action_game.go +++ b/worldsrv/action_game.go @@ -2226,6 +2226,31 @@ func (this *CSRecordAndNoticeHandler) Process(s *netlib.Session, packetid int, d return nil } +func CSExchangeChannel(s *netlib.Session, packetid int, data interface{}, sid int64) error { + logger.Logger.Trace("CSExchangeChannel Process recv ", data) + _, ok := data.(*gamehall.CSExchangeChannel) + if !ok { + return nil + } + + p := PlayerMgrSington.GetPlayer(sid) + if p == nil { + logger.Logger.Warn("CSExchangeChannel p == nil") + return nil + } + + var onChannelName []string + conf := PlatformMgrSingleton.GetConfig(p.Platform).ExchangeChannelConfig + if conf != nil { + onChannelName = conf.OnChannelName + } + + p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SCExchangeChannel), &gamehall.SCExchangeChannel{ + OnChannelName: onChannelName, + }) + return nil +} + func init() { // 观众进入房间 common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCE_ENTERROOM), &CSAudienceEnterRoomHandler{}) @@ -2278,4 +2303,6 @@ func init() { //我的游戏信息及平台公告 common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticeHandler{}) netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticePacketFactory{}) + // 开启兑换的渠道 + common.Register(int(gamehall.GameHallPacketID_PACKET_CSExchangeChannel), gamehall.CSExchangeChannel{}, CSExchangeChannel) } diff --git a/worldsrv/etcd.go b/worldsrv/etcd.go index 5c8c0ea..208dab2 100644 --- a/worldsrv/etcd.go +++ b/worldsrv/etcd.go @@ -35,6 +35,8 @@ func init() { etcd.Register(etcd.ETCDKEY_SHOP_ITEM, webapi.ItemShopList{}, platformConfigEvent) // 集卡活动 etcd.Register(etcd.ETCDKEY_ACT_Collect, webapi.WelfareCollectConfig{}, platformConfigEvent) + // 启动兑换功能的渠道 + etcd.Register(etcd.ETCDKEY_EXCHANGECHANNEL, webapi.ExchangeChannelConfig{}, platformConfigEvent) } func platformConfigEvent(ctx context.Context, completeKey string, isInit bool, event *clientv3.Event, data interface{}) { @@ -125,6 +127,16 @@ func platformConfigEvent(ctx context.Context, completeKey string, isInit bool, e } else { TournamentMgr.UpdateData(false, config) } + case *webapi.ExchangeChannelConfig: + PlatformMgrSingleton.GetConfig(config.Platform).ExchangeChannelConfig = config + if !isInit { + // 通知变更 + for _, v := range PlayerMgrSington.playerOfPlatform[config.Platform] { + if v != nil && v.IsOnLine() { + v.SendToClient(int(hallproto.GameHallPacketID_PACKET_SCExchangeChannel), &hallproto.SCExchangeChannel{}) + } + } + } default: logger.Logger.Errorf("etcd completeKey:%s, Not processed", completeKey) diff --git a/xlsx/DB_Game_Drop.xlsx b/xlsx/DB_Game_Drop.xlsx index d6dfa2a7a7714ad317618b179fa1603876cf241d..55883fa5840efa32e8e1f7f2d14746fdf1980293 100644 GIT binary patch delta 12327 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