From fe8ccec885cf3c836db0287db01d3c051a5f2583 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 20 Aug 2024 09:06:51 +0800 Subject: [PATCH 1/5] review --- common/broadcasthandler.go | 45 +++++++++++++++++++ common/multicasthandler.go | 50 +++++++++++++++++++++ gamesrv/action/action_server.go | 1 + gamesrv/base/broadcasthandler.go | 61 ------------------------- gamesrv/base/multicasthandler.go | 67 ---------------------------- gamesrv/base/playermgr.go | 2 +- gamesrv/base/scene.go | 6 +-- gamesrv/base/scene_mgr.go | 2 +- gamesrv/fishing/scenedata_fishing.go | 2 +- gatesrv/broadcasthandler.go | 44 +----------------- gatesrv/multicasthandler.go | 48 ++------------------ mgrsrv/api/broadcasthandler.go | 56 +---------------------- mgrsrv/api/webapi_srctrl.go | 2 +- worldsrv/action_server.go | 3 ++ worldsrv/broadcasthandler.go | 62 ------------------------- worldsrv/gamestate.go | 2 +- worldsrv/multicasthandler.go | 67 ---------------------------- worldsrv/platformmgr.go | 3 +- worldsrv/playermgr.go | 18 ++++---- worldsrv/scene.go | 2 +- worldsrv/tmmatch.go | 2 +- 21 files changed, 128 insertions(+), 417 deletions(-) create mode 100644 common/broadcasthandler.go create mode 100644 common/multicasthandler.go delete mode 100644 gamesrv/base/broadcasthandler.go delete mode 100644 gamesrv/base/multicasthandler.go delete mode 100644 worldsrv/broadcasthandler.go delete mode 100644 worldsrv/multicasthandler.go diff --git a/common/broadcasthandler.go b/common/broadcasthandler.go new file mode 100644 index 0000000..0922359 --- /dev/null +++ b/common/broadcasthandler.go @@ -0,0 +1,45 @@ +package common + +import ( + rawproto "google.golang.org/protobuf/proto" + "mongo.games.com/game/proto" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" + "mongo.games.com/goserver/srvlib" + "mongo.games.com/goserver/srvlib/protocol" +) + +func RegisterBoardCastHandler() { + netlib.Register(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &protocol.SSPacketBroadcast{}, BroadcastHandler) +} + +func BroadcastHandler(s *netlib.Session, packetId int, data interface{}) error { + if bp, ok := data.(*protocol.SSPacketBroadcast); ok { + pd := bp.GetData() + sp := bp.GetSessParam() + if bcss := sp.GetBcss(); bcss != nil { + srvlib.ServerSessionMgrSington.Broadcast(int(bp.GetPacketId()), pd, int(bcss.GetSArea()), int(bcss.GetSType())) + } + } + return nil +} + +func CreateBroadcastPacket(sp *protocol.BCSessionUnion, packetId int, data interface{}) (rawproto.Message, error) { + pack := &protocol.SSPacketBroadcast{ + SessParam: sp, + PacketId: proto.Int(packetId), + } + + if byteData, ok := data.([]byte); ok { + pack.Data = byteData + } else { + byteData, err := netlib.MarshalPacket(packetId, data) + if err == nil { + pack.Data = byteData + } else { + logger.Logger.Warnf("CreateBroadcastPacket err:%v", err) + return nil, err + } + } + return pack, nil +} diff --git a/common/multicasthandler.go b/common/multicasthandler.go new file mode 100644 index 0000000..0a60453 --- /dev/null +++ b/common/multicasthandler.go @@ -0,0 +1,50 @@ +package common + +import ( + rawproto "google.golang.org/protobuf/proto" + "mongo.games.com/game/proto" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" + "mongo.games.com/goserver/srvlib" + "mongo.games.com/goserver/srvlib/protocol" +) + +func RegisterMulticastHandler() { + netlib.Register(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), &protocol.SSPacketMulticast{}, MulticastHandler) +} + +func MulticastHandler(s *netlib.Session, packetId int, data interface{}) error { + if mp, ok := data.(*protocol.SSPacketMulticast); ok { + pd := mp.GetData() + sis := mp.GetSessions() + for _, si := range sis { + ss := si.GetMcss() + if ss != nil { + ns := srvlib.ServerSessionMgrSington.GetSession(int(ss.GetSArea()), int(ss.GetSType()), int(ss.GetSId())) + if ns != nil { + ns.Send(int(mp.GetPacketId()), pd /*, s.GetSessionConfig().IsInnerLink*/) + } + } + } + } + return nil +} + +func CreateMulticastPacket(packetId int, data interface{}, sis ...*protocol.MCSessionUnion) (rawproto.Message, error) { + pack := &protocol.SSPacketMulticast{ + Sessions: sis, + PacketId: proto.Int(packetId), + } + if byteData, ok := data.([]byte); ok { + pack.Data = byteData + } else { + byteData, err := netlib.MarshalPacket(packetId, data) + if err == nil { + pack.Data = byteData + } else { + logger.Logger.Errorf("CreateMulticastPacket err:%v", err) + return nil, err + } + } + return pack, nil +} diff --git a/gamesrv/action/action_server.go b/gamesrv/action/action_server.go index 42afa23..10b4483 100644 --- a/gamesrv/action/action_server.go +++ b/gamesrv/action/action_server.go @@ -576,6 +576,7 @@ func init() { return nil })) + common.RegisterMulticastHandler() //玩家离开 netlib.Register(int(server.SSPacketID_PACKET_WG_PlayerLEAVE), server.WGPlayerLeave{}, HandleWGPlayerLeave) //同步记牌器过期时间 diff --git a/gamesrv/base/broadcasthandler.go b/gamesrv/base/broadcasthandler.go deleted file mode 100644 index afebcee..0000000 --- a/gamesrv/base/broadcasthandler.go +++ /dev/null @@ -1,61 +0,0 @@ -package base - -import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" - "mongo.games.com/goserver/srvlib/protocol" -) - -var ( - BroadcastMaker = &BroadcastPacketFactory{} -) - -type BroadcastPacketFactory struct { -} - -type BroadcastHandler struct { -} - -func init() { - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &BroadcastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), BroadcastMaker) -} - -func (this *BroadcastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketBroadcast{} - return pack -} - -func (this *BroadcastPacketFactory) CreateBroadcastPacket(sp *protocol.BCSessionUnion, packetid int, data interface{}) (rawproto.Message, error) { - pack := &protocol.SSPacketBroadcast{ - SessParam: sp, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Warn("BroadcastPacketFactory.CreateBroadcastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *BroadcastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { - if bp, ok := data.(*protocol.SSPacketBroadcast); ok { - pd := bp.GetData() - sp := bp.GetSessParam() - if bcss := sp.GetBcss(); bcss != nil { - srvlib.ServerSessionMgrSington.Broadcast(int(bp.GetPacketId()), pd, int(bcss.GetSArea()), int(bcss.GetSType())) - } - } - return nil -} diff --git a/gamesrv/base/multicasthandler.go b/gamesrv/base/multicasthandler.go deleted file mode 100644 index 6a670d7..0000000 --- a/gamesrv/base/multicasthandler.go +++ /dev/null @@ -1,67 +0,0 @@ -package base - -import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" - "mongo.games.com/goserver/srvlib/protocol" -) - -var ( - MulticastMaker = &MulticastPacketFactory{} -) - -type MulticastPacketFactory struct { -} - -type MulticastHandler struct { -} - -func init() { - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), &MulticastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), MulticastMaker) -} - -func (this *MulticastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketMulticast{} - return pack -} - -func (this *MulticastPacketFactory) CreateMulticastPacket(packetid int, data interface{}, sis ...*protocol.MCSessionUnion) (rawproto.Message, error) { - pack := &protocol.SSPacketMulticast{ - Sessions: sis, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Info("MulticastPacketFactory.CreateMulticastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *MulticastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { - if mp, ok := data.(*protocol.SSPacketMulticast); ok { - pd := mp.GetData() - sis := mp.GetSessions() - for _, si := range sis { - ss := si.GetMcss() - if ss != nil { - ns := srvlib.ServerSessionMgrSington.GetSession(int(ss.GetSArea()), int(ss.GetSType()), int(ss.GetSId())) - if ns != nil { - ns.Send(int(mp.GetPacketId()), pd /*, s.GetSessionConfig().IsInnerLink*/) - } - } - } - } - return nil -} diff --git a/gamesrv/base/playermgr.go b/gamesrv/base/playermgr.go index 5a4db1e..88144ae 100644 --- a/gamesrv/base/playermgr.go +++ b/gamesrv/base/playermgr.go @@ -158,7 +158,7 @@ func (this *PlayerMgr) BroadcastMessage(packetid int, rawpack interface{}) bool sc := &protocol.BCSessionUnion{ Bccs: &protocol.BCClientSession{}, } - pack, err := BroadcastMaker.CreateBroadcastPacket(sc, packetid, rawpack) + pack, err := common.CreateBroadcastPacket(sc, packetid, rawpack) if err == nil && pack != nil { srvlib.ServerSessionMgrSington.Broadcast(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), pack, common.GetSelfAreaId(), srvlib.GateServerType) return true diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index f638b54..9d4bd8c 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -893,7 +893,7 @@ func (this *Scene) Broadcast(packetid int, msg rawproto.Message, excludeSid int6 } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, msg, v...) + pack, err := common.CreateMulticastPacket(packetid, msg, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) @@ -917,7 +917,7 @@ func (this *Scene) RobotBroadcast(packetid int, msg rawproto.Message) { } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, msg, v...) + pack, err := common.CreateMulticastPacket(packetid, msg, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) @@ -941,7 +941,7 @@ func (this *Scene) BroadcastToAudience(packetid int, msg rawproto.Message) { } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, msg, v...) + pack, err := common.CreateMulticastPacket(packetid, msg, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) diff --git a/gamesrv/base/scene_mgr.go b/gamesrv/base/scene_mgr.go index c241b03..1b5b320 100644 --- a/gamesrv/base/scene_mgr.go +++ b/gamesrv/base/scene_mgr.go @@ -195,7 +195,7 @@ func (this *SceneMgr) JackPotSync(platform string, gameIds ...int32) { for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - cPack, err := MulticastMaker.CreateMulticastPacket(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEJACKPOT), pack, v...) + cPack, err := common.CreateMulticastPacket(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEJACKPOT), pack, v...) if err == nil { proto.SetDefaults(cPack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), cPack) diff --git a/gamesrv/fishing/scenedata_fishing.go b/gamesrv/fishing/scenedata_fishing.go index d3a6914..c0ffaff 100644 --- a/gamesrv/fishing/scenedata_fishing.go +++ b/gamesrv/fishing/scenedata_fishing.go @@ -1458,7 +1458,7 @@ func (this *FishingSceneData) BroadCastMessage(packetid int, msg proto.Message, if gateSess == nil || len(v) == 0 { continue } - pack, err := base.MulticastMaker.CreateMulticastPacket(packetid, msg, v...) + pack, err := common.CreateMulticastPacket(packetid, msg, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) diff --git a/gatesrv/broadcasthandler.go b/gatesrv/broadcasthandler.go index 1fb80a0..319bfec 100644 --- a/gatesrv/broadcasthandler.go +++ b/gatesrv/broadcasthandler.go @@ -1,56 +1,16 @@ package main import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/srvlib" "mongo.games.com/goserver/srvlib/protocol" ) -var ( - BroadcastMaker = &BroadcastPacketFactory{} -) - -type BroadcastPacketFactory struct { -} - -type BroadcastHandler struct { -} - func init() { - // 给所有玩家或某个类型的所有服务发消息 - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &BroadcastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), BroadcastMaker) + netlib.Register(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &protocol.SSPacketBroadcast{}, BroadcastHandler) } -func (this *BroadcastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketBroadcast{} - return pack -} - -func (this *BroadcastPacketFactory) CreateBroadcastPacket(sp *protocol.BCSessionUnion, packetid int, data interface{}) (rawproto.Message, error) { - pack := &protocol.SSPacketBroadcast{ - SessParam: sp, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Warn("BroadcastPacketFactory.CreateBroadcastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *BroadcastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { +func BroadcastHandler(s *netlib.Session, packetid int, data interface{}) error { if bp, ok := data.(*protocol.SSPacketBroadcast); ok { pd := bp.GetData() sp := bp.GetSessParam() diff --git a/gatesrv/multicasthandler.go b/gatesrv/multicasthandler.go index ce0f29e..cfcde44 100644 --- a/gatesrv/multicasthandler.go +++ b/gatesrv/multicasthandler.go @@ -1,61 +1,21 @@ package main import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/srvlib" "mongo.games.com/goserver/srvlib/protocol" ) -var ( - MulticastMaker = &MulticastPacketFactory{} -) - -type MulticastPacketFactory struct { -} - -type MulticastHandler struct { -} - func init() { - // 给某些玩家和某些服务发消息 - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), &MulticastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), MulticastMaker) + netlib.Register(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), &protocol.SSPacketMulticast{}, MulticastHandler) } -func (this *MulticastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketMulticast{} - return pack -} - -func (this *MulticastPacketFactory) CreateMulticastPacket(packetid int, data interface{}, sis ...*protocol.MCSessionUnion) (rawproto.Message, error) { - pack := &protocol.SSPacketMulticast{ - Sessions: sis, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Info("MulticastPacketFactory.CreateMulticastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *MulticastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { +func MulticastHandler(s *netlib.Session, packetid int, data interface{}) error { if mp, ok := data.(*protocol.SSPacketMulticast); ok { pd := mp.GetData() sis := mp.GetSessions() for _, si := range sis { - ns := this.getSession(si) + ns := getSession(si) if ns != nil { ns.Send(int(mp.GetPacketId()), pd /*, s.GetSessionConfig().IsInnerLink*/) } @@ -64,7 +24,7 @@ func (this *MulticastHandler) Process(s *netlib.Session, packetid int, data inte return nil } -func (this *MulticastHandler) getSession(su *protocol.MCSessionUnion) *netlib.Session { +func getSession(su *protocol.MCSessionUnion) *netlib.Session { cs := su.GetMccs() if cs != nil { return srvlib.ClientSessionMgrSington.GetSession(cs.GetSId()) diff --git a/mgrsrv/api/broadcasthandler.go b/mgrsrv/api/broadcasthandler.go index a42c07c..803adee 100644 --- a/mgrsrv/api/broadcasthandler.go +++ b/mgrsrv/api/broadcasthandler.go @@ -1,61 +1,9 @@ package api import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" - "mongo.games.com/goserver/srvlib/protocol" + "mongo.games.com/game/common" ) -var ( - BroadcastMaker = &BroadcastPacketFactory{} -) - -type BroadcastPacketFactory struct { -} - -type BroadcastHandler struct { -} - func init() { - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &BroadcastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), BroadcastMaker) -} - -func (this *BroadcastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketBroadcast{} - return pack -} - -func (this *BroadcastPacketFactory) CreateBroadcastPacket(sp *protocol.BCSessionUnion, packetid int, data interface{}) (rawproto.Message, error) { - pack := &protocol.SSPacketBroadcast{ - SessParam: sp, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Warn("BroadcastPacketFactory.CreateBroadcastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *BroadcastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { - if bp, ok := data.(*protocol.SSPacketBroadcast); ok { - pd := bp.GetData() - sp := bp.GetSessParam() - if bcss := sp.GetBcss(); bcss != nil { - srvlib.ServerSessionMgrSington.Broadcast(int(bp.GetPacketId()), pd, int(bcss.GetSArea()), int(bcss.GetSType())) - } - } - return nil + common.RegisterBoardCastHandler() } diff --git a/mgrsrv/api/webapi_srctrl.go b/mgrsrv/api/webapi_srctrl.go index e2b06a6..9d9b932 100644 --- a/mgrsrv/api/webapi_srctrl.go +++ b/mgrsrv/api/webapi_srctrl.go @@ -229,7 +229,7 @@ func SrvCtrlNotice(rw http.ResponseWriter, data []byte) { sc := &protocol.BCSessionUnion{ Bccs: &protocol.BCClientSession{}, } - broadcast, err := BroadcastMaker.CreateBroadcastPacket(sc, int(msg_proto.MSGPacketID_PACKET_SC_NOTICE), noticePacket) + broadcast, err := common.CreateBroadcastPacket(sc, int(msg_proto.MSGPacketID_PACKET_SC_NOTICE), noticePacket) if err != nil || broadcast == nil { pack.Tag = webapi.TagCode_FAILED pack.Msg = "send notice failed(inner error)" diff --git a/worldsrv/action_server.go b/worldsrv/action_server.go index 6dc0a87..28e1e1a 100644 --- a/worldsrv/action_server.go +++ b/worldsrv/action_server.go @@ -789,6 +789,9 @@ func (this *CSAccountInvalidHandler) Process(s *netlib.Session, packetid int, da } func init() { + common.RegisterBoardCastHandler() + common.RegisterMulticastHandler() + common.RegisterHandler(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdHandler{}) netlib.RegisterFactory(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdPacketFactory{}) diff --git a/worldsrv/broadcasthandler.go b/worldsrv/broadcasthandler.go deleted file mode 100644 index 38650cd..0000000 --- a/worldsrv/broadcasthandler.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" - "mongo.games.com/goserver/srvlib/protocol" -) - -var ( - BroadcastMaker = &BroadcastPacketFactory{} -) - -type BroadcastPacketFactory struct { -} - -type BroadcastHandler struct { -} - -func init() { - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), &BroadcastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), BroadcastMaker) -} - -func (this *BroadcastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketBroadcast{} - return pack -} - -func (this *BroadcastPacketFactory) CreateBroadcastPacket(sp *protocol.BCSessionUnion, packetid int, data interface{}) (rawproto.Message, error) { - pack := &protocol.SSPacketBroadcast{ - SessParam: sp, - PacketId: proto.Int(packetid), - } - - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Warn("BroadcastPacketFactory.CreateBroadcastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *BroadcastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { - if bp, ok := data.(*protocol.SSPacketBroadcast); ok { - pd := bp.GetData() - sp := bp.GetSessParam() - if bcss := sp.GetBcss(); bcss != nil { - srvlib.ServerSessionMgrSington.Broadcast(int(bp.GetPacketId()), pd, int(bcss.GetSArea()), int(bcss.GetSType())) - } - } - return nil -} diff --git a/worldsrv/gamestate.go b/worldsrv/gamestate.go index 2eff9a8..f315cec 100644 --- a/worldsrv/gamestate.go +++ b/worldsrv/gamestate.go @@ -75,7 +75,7 @@ func (gsm *GameStateManager) BrodcastGameState(gameId int32, platform string, pa } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packid, pack, v...) + pack, err := common.CreateMulticastPacket(packid, pack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) diff --git a/worldsrv/multicasthandler.go b/worldsrv/multicasthandler.go deleted file mode 100644 index 2a94ceb..0000000 --- a/worldsrv/multicasthandler.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import ( - rawproto "google.golang.org/protobuf/proto" - "mongo.games.com/game/proto" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" - "mongo.games.com/goserver/srvlib/protocol" -) - -var ( - MulticastMaker = &MulticastPacketFactory{} -) - -type MulticastPacketFactory struct { -} - -type MulticastHandler struct { -} - -func init() { - netlib.RegisterHandler(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), &MulticastHandler{}) - netlib.RegisterFactory(int(protocol.SrvlibPacketID_PACKET_SS_MULTICAST), MulticastMaker) -} - -func (this *MulticastPacketFactory) CreatePacket() interface{} { - pack := &protocol.SSPacketMulticast{} - return pack -} - -func (this *MulticastPacketFactory) CreateMulticastPacket(packetid int, data interface{}, sis ...*protocol.MCSessionUnion) (rawproto.Message, error) { - pack := &protocol.SSPacketMulticast{ - Sessions: sis, - PacketId: proto.Int(packetid), - } - if byteData, ok := data.([]byte); ok { - pack.Data = byteData - } else { - byteData, err := netlib.MarshalPacket(packetid, data) - if err == nil { - pack.Data = byteData - } else { - logger.Logger.Info("MulticastPacketFactory.CreateMulticastPacket err:", err) - return nil, err - } - } - proto.SetDefaults(pack) - return pack, nil -} - -func (this *MulticastHandler) Process(s *netlib.Session, packetid int, data interface{}) error { - if mp, ok := data.(*protocol.SSPacketMulticast); ok { - pd := mp.GetData() - sis := mp.GetSessions() - for _, si := range sis { - ss := si.GetMcss() - if ss != nil { - ns := srvlib.ServerSessionMgrSington.GetSession(int(ss.GetSArea()), int(ss.GetSType()), int(ss.GetSId())) - if ns != nil { - ns.Send(int(mp.GetPacketId()), pd /*, s.GetSessionConfig().IsInnerLink*/) - } - } - } - } - return nil -} diff --git a/worldsrv/platformmgr.go b/worldsrv/platformmgr.go index 1fff5f4..7014aa7 100644 --- a/worldsrv/platformmgr.go +++ b/worldsrv/platformmgr.go @@ -10,6 +10,7 @@ import ( "mongo.games.com/goserver/core/utils" srvlibproto "mongo.games.com/goserver/srvlib/protocol" + "mongo.games.com/game/common" "mongo.games.com/game/model" "mongo.games.com/game/proto" hallproto "mongo.games.com/game/protocol/gamehall" @@ -302,7 +303,7 @@ func (pm *PlatformMgr) Broadcast(packetid int, packet interface{}, players map[i } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, packet, v...) + pack, err := common.CreateMulticastPacket(packetid, packet, v...) if err == nil { gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) } diff --git a/worldsrv/playermgr.go b/worldsrv/playermgr.go index 55d4c08..7d76256 100644 --- a/worldsrv/playermgr.go +++ b/worldsrv/playermgr.go @@ -2,7 +2,6 @@ package main import ( "math/rand" - "mongo.games.com/game/worldsrv/internal" "time" "mongo.games.com/goserver/core/basic" @@ -16,7 +15,8 @@ import ( "mongo.games.com/game/common" "mongo.games.com/game/model" "mongo.games.com/game/proto" - server_proto "mongo.games.com/game/protocol/server" + serverproto "mongo.games.com/game/protocol/server" + "mongo.games.com/game/worldsrv/internal" ) var PlayerMgrSington = &PlayerMgr{ @@ -292,7 +292,7 @@ func (this *PlayerMgr) BroadcastMessage(packetid int, rawpack interface{}) bool sc := &srvproto.BCSessionUnion{ Bccs: &srvproto.BCClientSession{}, } - pack, err := BroadcastMaker.CreateBroadcastPacket(sc, packetid, rawpack) + pack, err := common.CreateBroadcastPacket(sc, packetid, rawpack) if err == nil && pack != nil { srvlib.ServerSessionMgrSington.Broadcast(int(srvproto.SrvlibPacketID_PACKET_SS_BROADCAST), pack, common.GetSelfAreaId(), srvlib.GateServerType) return true @@ -318,7 +318,7 @@ func (this *PlayerMgr) BroadcastMessageToPlatform(platform string, packetid int, } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, rawpack, v...) + pack, err := common.CreateMulticastPacket(packetid, rawpack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) @@ -345,7 +345,7 @@ func (this *PlayerMgr) BroadcastMessageToPlatformByFunc(platform string, packeti } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, rawpack, v...) + pack, err := common.CreateMulticastPacket(packetid, rawpack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) @@ -378,7 +378,7 @@ func (this *PlayerMgr) BroadcastMessageToPlatformWithHall(platform string, snid } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, rawpack, v...) + pack, err := common.CreateMulticastPacket(packetid, rawpack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) @@ -391,7 +391,7 @@ func (this *PlayerMgr) BroadcastMessageToPlatformWithHall(platform string, snid // BroadcastMessageToGroup 发送群组消息 func (this *PlayerMgr) BroadcastMessageToGroup(packetid int, rawpack interface{}, tags []string) bool { - pack := &server_proto.SSCustomTagMulticast{ + pack := &serverproto.SSCustomTagMulticast{ Tags: tags, } if byteData, ok := rawpack.([]byte); ok { @@ -405,7 +405,7 @@ func (this *PlayerMgr) BroadcastMessageToGroup(packetid int, rawpack interface{} return false } } - srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_SS_CUSTOMTAG_MULTICAST), pack, common.GetSelfAreaId(), srvlib.GateServerType) + srvlib.ServerSessionMgrSington.Broadcast(int(serverproto.SSPacketID_PACKET_SS_CUSTOMTAG_MULTICAST), pack, common.GetSelfAreaId(), srvlib.GateServerType) return true } @@ -426,7 +426,7 @@ func (this *PlayerMgr) BroadcastMessageToTarget(platform string, target []int32, } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, rawpack, v...) + pack, err := common.CreateMulticastPacket(packetid, rawpack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) diff --git a/worldsrv/scene.go b/worldsrv/scene.go index d885720..407af35 100644 --- a/worldsrv/scene.go +++ b/worldsrv/scene.go @@ -1159,7 +1159,7 @@ func (this *Scene) Broadcast(packetid int, msg rawproto.Message, excludeSid int6 for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetid, msg, v...) + pack, err := common.CreateMulticastPacket(packetid, msg, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) diff --git a/worldsrv/tmmatch.go b/worldsrv/tmmatch.go index 05398c0..482162c 100644 --- a/worldsrv/tmmatch.go +++ b/worldsrv/tmmatch.go @@ -107,7 +107,7 @@ func (tm *TmMatch) BroadcastMessage(packetId int, rawPack interface{}) { } for gateSess, v := range mgs { if gateSess != nil && len(v) != 0 { - pack, err := MulticastMaker.CreateMulticastPacket(packetId, rawPack, v...) + pack, err := common.CreateMulticastPacket(packetId, rawPack, v...) if err == nil { proto.SetDefaults(pack) gateSess.Send(int(srvproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack) From fc29fcddd81dc2da457efd48ce63b4030e4e7591 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 20 Aug 2024 09:54:57 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=9B=BE=E6=A0=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/tournament/tournament.pb.go | 166 ++++++++++++++------------- protocol/tournament/tournament.proto | 1 + worldsrv/action_tournament.go | 3 +- 3 files changed, 91 insertions(+), 79 deletions(-) diff --git a/protocol/tournament/tournament.pb.go b/protocol/tournament/tournament.pb.go index 1b84ad3..a808964 100644 --- a/protocol/tournament/tournament.pb.go +++ b/protocol/tournament/tournament.pb.go @@ -1866,6 +1866,7 @@ type MatchInfo struct { TotalRound int32 `protobuf:"varint,5,opt,name=TotalRound,proto3" json:"TotalRound,omitempty"` // 总轮数 RemainNum int32 `protobuf:"varint,6,opt,name=RemainNum,proto3" json:"RemainNum,omitempty"` // 剩余人数 Players []*MatchPlayer `protobuf:"bytes,7,rep,name=Players,proto3" json:"Players,omitempty"` // 玩家列表 + Icon string `protobuf:"bytes,8,opt,name=Icon,proto3" json:"Icon,omitempty"` // 比赛图标 } func (x *MatchInfo) Reset() { @@ -1949,6 +1950,13 @@ func (x *MatchInfo) GetPlayers() []*MatchPlayer { return nil } +func (x *MatchInfo) GetIcon() string { + if x != nil { + return x.Icon + } + return "" +} + type SCTMMatchList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2414,7 +2422,7 @@ var file_tournament_proto_rawDesc = []byte{ 0x55, 0x73, 0x65, 0x53, 0x6b, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x52, 0x61, 0x6e, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x65, 0x22, 0xf4, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, @@ -2428,84 +2436,86 @@ var file_tournament_proto_rawDesc = []byte{ 0x4e, 0x75, 0x6d, 0x12, 0x31, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x07, 0x50, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x64, 0x0a, 0x0d, 0x53, 0x43, 0x54, 0x4d, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, - 0x54, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x22, 0x2c, 0x0a, 0x0a, - 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x22, 0xc6, 0x01, 0x0a, 0x09, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6f, 0x6d, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, - 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x31, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x07, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x0a, 0x53, 0x43, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x29, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, - 0x54, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x2a, 0xc7, 0x04, 0x0a, - 0x0c, 0x54, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x4e, 0x54, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x0e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, - 0x00, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, - 0x53, 0x54, 0x4d, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xb4, 0x15, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x49, 0x6e, 0x66, 0x6f, - 0x73, 0x10, 0xb5, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, - 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x52, 0x61, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xb6, - 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, - 0x43, 0x54, 0x4d, 0x52, 0x61, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xb7, 0x15, 0x12, 0x19, - 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x53, 0x69, - 0x67, 0x6e, 0x52, 0x61, 0x63, 0x65, 0x10, 0xb8, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x61, 0x63, - 0x65, 0x10, 0xb9, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, - 0x4d, 0x5f, 0x53, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x75, 0x6d, 0x10, - 0xba, 0x15, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, - 0x53, 0x43, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x10, - 0xbb, 0x15, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, - 0x53, 0x43, 0x54, 0x4d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x10, 0xbc, 0x15, 0x12, 0x1d, 0x0a, 0x18, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x63, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x49, 0x63, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x0d, 0x53, 0x43, + 0x54, 0x4d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, + 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, + 0x22, 0x2c, 0x0a, 0x0a, 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x12, 0x0e, + 0x0a, 0x02, 0x54, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, 0x22, 0xc6, + 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, + 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x52, 0x6f, + 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x52, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x07, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x0a, 0x53, 0x43, 0x52, 0x6f, 0x6f, + 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, + 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x54, 0x70, + 0x2a, 0xc7, 0x04, 0x0a, 0x0c, 0x54, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x4e, 0x54, 0x49, + 0x44, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x5a, + 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xb4, 0x15, 0x12, 0x18, + 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x10, 0xb5, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x52, 0x61, 0x6e, 0x6b, 0x4c, 0x69, + 0x73, 0x74, 0x10, 0xb6, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x52, 0x61, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x10, + 0xb7, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, + 0x43, 0x53, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x61, 0x63, 0x65, 0x10, 0xb8, 0x15, 0x12, 0x19, 0x0a, + 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x53, 0x69, 0x67, + 0x6e, 0x52, 0x61, 0x63, 0x65, 0x10, 0xb9, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x69, 0x67, 0x6e, + 0x4e, 0x75, 0x6d, 0x10, 0xba, 0x15, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x10, 0xbb, 0x15, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x10, 0xbc, 0x15, + 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, + 0x54, 0x4d, 0x53, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xbf, 0x15, 0x12, + 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, + 0x4d, 0x53, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xc0, 0x15, 0x12, 0x1d, + 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, + 0x53, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x6b, 0x10, 0xc1, 0x15, 0x12, 0x1d, 0x0a, + 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x6b, 0x10, 0xc2, 0x15, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x53, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xbf, 0x15, 0x12, 0x1d, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xc0, 0x15, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x53, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x6b, 0x10, 0xc1, 0x15, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x52, 0x61, 0x6e, 0x6b, 0x10, 0xc2, 0x15, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x54, 0x4d, 0x53, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0xc3, 0x15, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0xc4, 0x15, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, - 0x74, 0x10, 0xc5, 0x15, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, - 0x4d, 0x5f, 0x53, 0x43, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xc6, 0x15, - 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, - 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xc7, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, - 0x69, 0x73, 0x74, 0x10, 0xc8, 0x15, 0x2a, 0xa2, 0x01, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x52, - 0x61, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x4e, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x46, 0x72, 0x65, 0x65, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x4e, 0x6f, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x08, 0x42, 0x2a, 0x5a, 0x28, 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, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x73, 0x6f, 0x6e, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0xc3, 0x15, 0x12, 0x1e, 0x0a, 0x19, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x54, 0x4d, 0x53, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0xc4, 0x15, 0x12, 0x1a, 0x0a, 0x15, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x43, 0x53, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xc5, 0x15, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, + 0x74, 0x10, 0xc6, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, + 0x4d, 0x5f, 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xc7, 0x15, 0x12, + 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x4d, 0x5f, 0x53, 0x43, 0x52, + 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xc8, 0x15, 0x2a, 0xa2, 0x01, 0x0a, 0x0c, 0x53, + 0x69, 0x67, 0x6e, 0x52, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, + 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x10, 0x01, 0x12, 0x0e, 0x0a, + 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x10, 0x02, 0x12, 0x0f, 0x0a, + 0x0b, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, + 0x09, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x10, 0x06, 0x12, 0x0d, + 0x0a, 0x09, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x46, 0x72, 0x65, 0x65, 0x10, 0x07, 0x12, 0x10, 0x0a, + 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x08, 0x42, + 0x2a, 0x5a, 0x28, 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, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/tournament/tournament.proto b/protocol/tournament/tournament.proto index 7c4086e..08ed170 100644 --- a/protocol/tournament/tournament.proto +++ b/protocol/tournament/tournament.proto @@ -218,6 +218,7 @@ message MatchInfo{ int32 TotalRound = 5; // 总轮数 int32 RemainNum = 6; // 剩余人数 repeated MatchPlayer Players = 7; // 玩家列表 + string Icon = 8; // 比赛图标 } message SCTMMatchList{ diff --git a/worldsrv/action_tournament.go b/worldsrv/action_tournament.go index f55d5d7..bcebbf6 100644 --- a/worldsrv/action_tournament.go +++ b/worldsrv/action_tournament.go @@ -123,10 +123,11 @@ func CSMatchList(s *netlib.Session, packetId int, data interface{}, sid int64) e d := &tournament.MatchInfo{ MatchId: int64(v.TMId), InstanceId: v.SortId, - Name: v.gmd.MatchName, + Name: v.gmd.GetMatchName(), Round: round, TotalRound: v.GetTotalRound(), RemainNum: TournamentMgr.GetRemainNum(v.SortId), + Icon: v.gmd.GetTitleURL(), } for _, v := range TournamentMgr.GetRemainPlayer(v.SortId) { var name, headUrl string From 15d0d2be78ef5eb5c8a584d8d4e336f9ee00a53f Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 20 Aug 2024 10:19:08 +0800 Subject: [PATCH 3/5] update public --- public | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public b/public index 07c189d..df94294 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit 07c189d652b84910258fa33eb3214d39c53edec4 +Subproject commit df942948ff721824a23f1f15f02a0fc84d0b52e9 From 6153903f31e0b5aa82d93766196b1009ad081c26 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 20 Aug 2024 10:44:42 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=9C=BA=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E4=B8=AD=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worldsrv/tournament.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/worldsrv/tournament.go b/worldsrv/tournament.go index cbb198c..02bf60e 100644 --- a/worldsrv/tournament.go +++ b/worldsrv/tournament.go @@ -220,6 +220,21 @@ func (this *Tournament) GetRemainPlayer(sortId int64) []*MatchPlayerInfo { robotPlayer := func(n int) { for _, v := range tm.robotGrades[n] { + if v.copySnid == 0 { + for _, vv := range tm.TmPlayer { + p := PlayerMgrSington.GetPlayerBySnId(vv.SnId) + if p != nil { + ret = append(ret, &MatchPlayerInfo{ + SnId: vv.SnId, + RoleId: p.GetRoleId(), + SkinId: p.Skin.ModId, + Grade: v.grade, + }) + } + break + } + continue + } ret = append(ret, &MatchPlayerInfo{ SnId: v.copySnid, RoleId: v.copyRoleId, From 8df3978077be7bdd26799ee4a790d7e3cb0e29bf Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 20 Aug 2024 14:14:12 +0800 Subject: [PATCH 5/5] update excel --- data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Skin.dat | Bin 896 -> 900 bytes data/DB_Skin.json | 8 ++++---- data/DB_Task.dat | Bin 5299 -> 5299 bytes data/DB_VIP.dat | Bin 2277 -> 2296 bytes data/DB_VIP.json | 19 +++++++++++++++++++ data/DB_VIPShow.dat | 4 ++-- data/DB_VIPShow.json | 4 ++-- public | 2 +- xlsx/DB_Skin.xlsx | Bin 12207 -> 12201 bytes xlsx/DB_VIP.xlsx | Bin 20822 -> 20851 bytes xlsx/DB_VIPShow.xlsx | Bin 14308 -> 14304 bytes 12 files changed, 28 insertions(+), 9 deletions(-) diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index 9d60e50768e4d0593912d1e8d1e4301c7adb3da3..d669ddae534c532f58b1bc44b6c849d0fdc186bc 100644 GIT binary patch literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ0hPZArEfv$ z+i2>;IUwf4?1AY6s{`5((}&l7pgOQUN}OPKG^~BZ!WGNGg5m*~!(j&AfjS6gFp7tO Y2ErTy^8m!*>>P`L9{s}1#XwsK0Avz8H2?qr literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ0hPZArEfv$ z+i2>;Ik1}#(+9I3#Xg|BVCJKm%L#Tz!`eqIT(KN1V26Mm2-E;G5bOXTAExmR)L}4- WaCsDLp%OdCBA`dVFmo}`76JfeB0Mz! diff --git a/data/DB_Skin.dat b/data/DB_Skin.dat index 4d3cb4684c79d83d3c25c314466cd27a4ae3746b..38033997c8e32027c0e5073a264da3474b508350 100644 GIT binary patch delta 52 zcmZo*Z(*NshH?7Dv-+G&PHY^XzX}P6OlD?GWSPjw@nqr!@yYd!qF|XXAeqgx8J{u& E0K-=h)&Kwi delta 48 zcmZo+Z(yHrhH>h|v-<4JPAnX(0t}N`853Fh89AOzydXZgkx>*Z&LqIFc|PM)MgU0X B488yW diff --git a/data/DB_Skin.json b/data/DB_Skin.json index 3a5ce1b..6109313 100644 --- a/data/DB_Skin.json +++ b/data/DB_Skin.json @@ -45,9 +45,9 @@ "SkinPic": "icon_300003", "SkinName": "活力-粉", "SkinType": "mg_02", - "UnlockType": 3, + "UnlockType": 2, "UnlockItem": { - "5": 0 + "310003": 20 }, "SkinSkillName": "活力满满", "SkinSkillIcon": "SkillIcon-30003", @@ -66,9 +66,9 @@ "SkinPic": "icon_300004", "SkinName": "活力-青", "SkinType": "mg_03", - "UnlockType": 3, + "UnlockType": 2, "UnlockItem": { - "2": 0 + "310004": 20 }, "SkinSkillName": "金币满满", "SkinSkillIcon": "SkillIcon-30004", diff --git a/data/DB_Task.dat b/data/DB_Task.dat index 95a4c56dab6ed585319eb9356a5fbd5cf6678ac7..31cd7aa6f2f03615362ddbc1fd73713615db5e58 100644 GIT binary patch delta 193 zcmdn2xmk09p&$px!d^Ck1&8Fk*f^E|S*#nK)-p{l;Sib3%)CjEjbjl|jL{3C>OhO_ zOK#MkSW@llX{Fz&1 z^Jxxym^{pi1-)#WrMYe}PTtNTvYDMnnrZSCE3zk95}854VRtlz$?Bvj4zfA0IIJrr~m)} diff --git a/data/DB_VIP.dat b/data/DB_VIP.dat index f541d80b279a3420c8fb8925b9d73e51cfeb30f1..bc0b4f0779b40b861aa7e9217fa7ef3fd7bd6154 100644 GIT binary patch delta 261 zcmaDV_(PD1t7;-s5f?K91H%T!7wlY36KkuXybJtX&661!tGQW#l0exV;#^IWTNz=} z3*>=ZP9_+)L!GO2axYUYO!Wsnu9nHd%(YO%ZkPeNGvV9=c0jH?3ru!}8<4vc&Yj=~ zG)tSc4yyM@D3H4e&V3Ne)jrvhtpO@~A{EFz1m|wZ1#-RFVX`wyf!r%_ZbL0s$K+U! K22QAlTNnWceL@HT delta 242 zcmew%_*9UIt8yY!5hoJ^!v@9|>|Bi#>#8A~3;bM-lbIQzydB~|UMGyVKpx2BV}ip3GDW(f2_Q$dhJ<@@|*`d5d7Y19m{3CJR(0khj1mhajRQ5zKs-p3n%H1 zDT>QG=iHBTE)xysdFI@L(rFHdoV5U&9=LZpP&Gqdvrp?%%d6I%S zT*ROE?_bX^A8&Wd$JgbNJzsT zCFH73u(MxBTs`FL9RCx$F6p~INk~AwkOtiraRZ2(+`9zdBK`)mAp^4k3R>-v^kW48 z0KpcMe+n6s_XHMy$4Ls98jj&uQ=2_pJ4OUoZ0xm_klCl-wv3R}>N1myVBDYDt^R)r z(D2)5nm8Y;v6RT5+^bLDW)q6VqE39TrS=v zFTLn|twL*mP%!WrpT3toOJ^Yu-SJQ;@T2g@!$S;RtfY4eb{x6igU9`Y3-<-_cg!xO zcJ1)+<(VZc;_Lucah=KnFIo0hfh)Mxs&WgU${0pG{$Nv?@NZAh zujSJg!Zbe$=fIBPd%~w#@=tu=r;+>M%6orgmnRl~zn(ah((!s#(kM$H1N?W=xH7Zr zq~Yht?LwvX=%5Fn6Nz4269(6T^$>`PA@F(~(r$Z$<}v;275tzi( zCfX)3vx$yL%x$7;5(}H?nZ(j2`X=#Y69bc2*~C|qSlh&dNo;H)Kuz5e2c=FM>Yhagc1vJOCU&q9f2SL_5`8?FdPA!k#NL7>_pVo00dZ~FE)iv3;s}V zCOUv>oywTC>yhdPGzqzuFWM0@v2g$sY2(i08$yoJiS8a$Zd4qu04Y5ss zLu}g++cm`Ybj*+uJ{|7J2!tsk^6x|kP;4q=ngCcv8|fgU%xgrKv4bA8AP}@dmJ+Fy zLBpS9Ox4*zj$9E4T0Lt5QL9JTV?!XQAzO(M4%+E4)TO(BP!4Ms`={urVpZ3Pu zMa`V(0BYt`##ABJ+O?4mTA1@1(M9inqJ_C25Y&{VL@3c^Ox4*%Q&|xR>cpBrkaac$ zf~>QZ2qn56Lj~?-Oq+wUoFO`V9lj$v5T@v89uplvg-m5k6=I2QBVFYEd5svND-Vkm zv>*^7M(zlb(RvLM3*t`3CLC}0ztM~+ejZ- zXG0*!I$McQqU$kamc5LrIrNnrhUoCq^p5D&uYY5ENBy4YfU=g*Vk%>*5KD9$>7(h) zYXl~B6TOcfv>*^xS5-A+~LZ?erL$?Ow*Ta+Spmec{aI zj=n&c`l?Jq!-)SPO%1>X9%!{_n;vu6s|6$#n>J~){K00146M<5-4 zTTdHD6n?MN|6pyUib}y(E-f{V)SyaM)hY_4uV`hq;9{>`?-G?ayNR)JF*ej(WFW*8 z14#iJaKgnH{~6C^pZXU%vqOlP9lIbNmif+p=ljmg>^XQJ{~iw6UMMjw7*U5Mm)$AZ z6g3c;2&$9A((|$Jd%u=!nl7soawwvID#OyOqDhZ^pMU1nG~GttRkdMhO4p-94u=+) zQo^!kk3-IAKCkZcPxJ&;{VT6S_jw(3i7kh}GbS<{5*kC6!_)T8NtG2wep zgMp6NPjXo42#(E0#o%)_6bVe5ut+R}{kjtF3CmHTCgLX)>YCh)@CPDlM|oz%h@y25 z=%{jRCZ_htv6#pK#ePs`DJ-fgDjwrMcKsv#F0plxojbo6w!lD>VnKH#Mq4Ey@ZkY3nb6^ z1S~ns#PQ1pNrU#Q-6CKvhnrm^P+=Rcq~TVnRsSGnVw&*z8Ezc@e*|1j!Og>IWfsJ* z`RHF~6iwk5gXBz&dz|FQ#Y3=G2bqmtqyCCV!jt3H@J~!`J|5S0Q2Dig5l^7K9FI}1 z0e;crB7)qH+)f@K1h86YU2MXwGLPNekzVS@A_6Whw;Eaeego}S$f1O}JUI$H$H;et zMP*l(mBl@-TPpL(s)r}IEgCwV=MieuBFZ%C5g27WuwEj+Jkx!n770K5pAwg_l7nky zkj&!RCCrq`VTFe!xKe$8sBceK-+jEMkB4PznMbH^i$>FTpTM_~S^^h|hxoQiFdd`a zYp{@HG@!f+GA9pp+}G7{Kko}JrC_}XsyT3!=P~NpqR;f)-_bM3yn$&8)BU}+iZDI5 z>g1-D+C7WOtf#xbt7pr-gpEyDt%0R=kztEC)9`@6uvN!ER~>_Yd^#|93g5p2i883p z@ffYWgZ^m^ss-gi(h`>a(?R~52K^c%x5=!HlIB7i7ob#$7g(*SO-SMS9pIJ&!2Yd zoUG|}Y{>Tr=8}Yel9BmGdV9g~4osh;e=4m;6BQ145l*7asITMWUDoFA{NTlNaI?mG zFiyP#nS-_fYLfBY1~fNtX#qClYamBTEmX8_bTDc)D$$F|1R6727wEuF^W2bBHyjoq>db z?JHD@3x^Rp#}8>yIY8!nGN@}x?1duv+NToY#WY2?itP%>FS3BUs-d?{n69-g^7Urp zi`gR%*y#0<)@3*1MY4Oil3=B_)5@(Z7+X86mUjFhNp6&}w+fO;bE(fxMj^DZj*f0f z8O)`A`@L%*m|TL{9bN;dT!O0t*e&A95k82sNr_a4AC?^C-y7e5v-u=_1_7s&cPl^y z2PXgklTj@elhG?00V|X2E0YA!vWX#+gDl4ZQ- z!!Q_z?}GoK8zA7@;!nakh~O`oW|%Z9k~PKXv2S`V0kGaMhnnrnC$OG zyrR5RaH7fzl*vFlmLxUhRgA8TsVK&pUqQjNXC2atlTsDT*ilV!#rQRw0uBfXaRG)2 zW*Dx4ZnYtz6;kjGvbs@u0}vcT4h2Y~vG4i#$7?_p`p<<%*>V<{SyZ;uD(*I0@K)To z=Q`UMXS10%>ok8cY?m?>4_2b~CS&Gqearp?%%d6I!R zSR|kK?_bX^A8&Wd$JgbsyBH`zu8+a|(Vdt3dlk@A){p-)!m#?l@-$uXxHn{NotvE6! z9LR7khVD^_?8*0w_{h?z@OZ|~5IOKXjRd^SU;Td~%UQIq2Bjyz-D>sxG)m5Ho#83} zl^pzVNMbhO@q5b7qE3>tQzW4N;+SNG%=WqerF{E5y1-gxJz9yAI&#YwbglZ*B+hxk z55kLi>er>&t97AS%hVJ*^Y4_;D{fhWIVV6R?c0}~@ z%uXy8Y!6m(ozem?oWGUe5^lB1+!at}jAD^|u#lZjLpKb%V55JlNy=-O!oSU-U(5Ms zm2H0H&Ym5j_mc?u>7QgTjzjm+mG}POmj!=IUXKEb>39!i(wLth1N?W=q_nf^q|xWl zg~>1V=->fBC$742O&DAU)$bq9Rja%NdHb{uo0`u z0@$LrF^y{pyS>{>$RI}3)*s~jvChT?u~*b*Y&AxcUoRR5A$oKDi4&d91VYR zesN&OLZy|Uy|Noc7L`wy;0Y`PvX=4h0KhFM5o9mm?#HM#@ISyq@s$|cL|_u3O|(s7 zViO&cnA$|wBxW}8U=nki=$XXACi*6^w27}Kv9gIrlUUnCfSS4?5Y*KzfuOeT2t@VO z2MgSM00KAr008g-nB?Yz00}TA5Tt)VNFYdp34tIDrUZgSm=Oq4VQwRBq{4zgkP1rz zK`N~7BWnUtLRA}aLm)_iErB2bb_AjXFdP97qskHe>PbXB8h`*x^s0wKrv-ngH)9<@ zwT3dL{M1G=PY49bJgpIUs^47MMl#QAq=RIhON4m3Eo7|xv@0KoOL>EUR}Fu$bwg~^ z5ZgAyc67{;5k4L6$OwcfBl7Q92T&}OF--t0qm6WsQKmJb%h*8^%?JeTkhw%kWzg`2 zjHx<1$dO9|LAz%~AZqti_E-}LYRE<+goCzv40UNIW7-0Ms$DCyJ%z12n01{E|IdCXblS)Q+0OHQkDdQvaARMS!Yck z$T}N|P@?NGRNzj=v^6Np8KT42;X9%OVTz8{G1dW8NGM~f5KD9$=_2n>Ys3&;dAQm^ zGXg=@nM;HcUB*%fLGduXB=fgpeD%q2pJE@RpZXqiii5L&DnV(W(3rXjY~V`#NI8Pm#D7B}>T zGnYI10%7W_GF2LmbwIhO)>p<uK~Tq2adGN$V6qrJ8y z5VYDAfgr1{2?U9^kqBX=tsX=Eh2y)+K zmIs6L`q-_y7Cfu&!WV-VF5r|=zB|HUFN0qwEf0Pc95@&94g7Q|^FA~2o;g{RvHUst z56+gMHl8PNtXrMt4&99BB99VL9?;dvW>pq=>)(!_NB;w}UkcY12?A#bZkGfA01=Zv zART{ePa;q36tTT|8%?8b2J*^Um`=&wFmKp2xq3L$()6ObbTT5y@qD zN;XCHM*=~0azuJQ{(bM)l1)(Bo>x+@@H()p+#eg9MGl|MGuD@Zl`n55tf6hWb;R6RGs8?yCvI< z8vJcWdBSGCaY|l~7W8^_uP@LORQ0bs4&Cc<&?z=OHXT%-gk(*#M1PC~lu(bR$1H!p zdm8k2#D0>)N=I;fHfjw%S3?p1vs{3nB06kuI-`HYa@T2K>Jx9 zqg;dhWS@%&azAoAd4LeWYVPJ@8}5{N?Cy;8Qa^$SxU_oHT*U9U&_RW4N|;?HTY={o z{f@Ax?8vgRxF>X>GM}vW@dUR;L#OjRLX8Td1|A6(83U{r$S==v-=dKGXWvue4_2~p zqXd$RxONFMC9+N7Q30-1AL@U&udCyJUem{Iva`w~)Ulw^Ejl(*E8rsW5XWM2(<>@A zz(SJIfYLh1oIKQPe^;*qyd$`hg7rM8WDf9e7^`)(dj>O2y4fx-C|SJm&@DG)VVhn$ z9iL|Uf}Ye-d7ivm|2Fbpe&KR{>mq}(v1jJkO~>Y_kB-=6KN&vb%fwz?lz)W}R`L94 zx7U(AbR8ezdjxYyLdk!~e51X+;CK(F&(S}Xn`R5;4tWtyqRgmo;^QKF+V1?|rE_q- z!QNe*dIvIxZ2{CI>D)^ znvl`6exMBp*$fLMm#UGSkimiVeNLOi{&E7+dX=fl| zVD}0Y;+72v?cIm9sO%>_J!#H0CH6v*yzQL`@nV{yOT|_NEHANuyQ-nLEtsygP4e|- zEsOa&9I|%nBdyDB#PekJa3#S?ZKsu6TQGL^SS{`NLz0{*V}Bhaljc;vowPq_YZH~P zNg2$k0sFmUm|Px#i+j8VP`LzGIZ({wN*N!DHxljbXv1fhZ7z>|F}#{pTBMJ+Y~fRlVJEgJ%72yT}I000pU000yK00000 z00031AOHXWFq6bBK>;z71}-`QOp`$_HUV>!crHKz`IEUWUJ0q%G<9nQ006_2ATL(} gX9|;h3K|wrO9ci10000I01^OA1ONa`D*ylh0EMjEr~m)} diff --git a/xlsx/DB_VIP.xlsx b/xlsx/DB_VIP.xlsx index 0060af6f7ab10cad3e17109409ef530890c9e43e..a1f8201bc1a85102bee15f35ddc9c549d61e63c4 100644 GIT binary patch delta 13825 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 Y$T4YMSpp)C_8%yp3Kooq+}|Po59p+NI{*Lx delta 13745 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 H{Wbp|%C#5H diff --git a/xlsx/DB_VIPShow.xlsx b/xlsx/DB_VIPShow.xlsx index 96e9c67411ca71b864502a159dac1d2223302824..4d007c0c2378c9cca0ef1c8aaef09de188046af1 100644 GIT binary patch delta 2754 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 delta 2739 zcmZ9OX*kpi8^-59mNd>VF@%VjY(--Xh9O&H*VxXGt#pvA4bj+}EC*>)`P=ukG?r|y z76whSq%0v>DvaeQs-X~>UY+;7u5(@I`S5(YpXby4yRUnOGEb?$2k?0_1_r&sI^Zy^ z)#fP{nG`Pn4z*UKWBDjine@!G(C8#upv!0CZmsExNegNXC3t6~gF+H(iMew%*gh@o7#aWBL$|Zd@Ewr^o zT)Ug?f*GkI8M7ra*6F%;&dZYMN4;ott-`BvlTC2Hr}m}1>Kj$v59Pn+(ShXljs!jl zRtoAN|Ks!4Cf4%h#~a)1BYDmti9*ndVVy6~A0t{NiQM&*U|3#!zKh=l*ALVQI)>Gv zKh}2K$#KDvY4&t`-`3jvR*mG?LgPCzz6?crHyKd>(`qw!COx41!|(BWmQ3$w1-_x4 z2My*rg?yHmc6Y|t`+KI|{@`5Ze#w}5FV=t2%;g6p$7^BknR4}fS$ISS+}?i|J^ns4 zK~9j$#?oVdGVso=9{m`Dl**otuHgRKQu{?WcO=DJW)5}>|L&u({4Rf!8qdjnu(n+i zbQ21J2=4=fMI~wKn24aj8;(;pY%C(y!|&&lHN8j8l|zi9@#toYn#3&TiG1%@t~%7$ z)I-n5HCpm-wN#Y}lU8yGp^FjSxo4P8@qtE%>b%WHluLQN>tL8{$=&sxPb=vnUb(6{ zb|SdPe8l^U?>k;fReHRDb&8nWQY=>q_~<8{AHyf6ahpLiE~_Lz_7u;KlFWDIQHilr zm@`hNvr|JXd01o`A2Cy5aMo$zBdh{0C&k;;`@SY3$hCQV&N|{xANcFZwPpJ@c$Scw zj0~qbqAt_E^2Q~{XK|AunP5cY=?j^%KrGtn+1LKZ2E-Yu>(PtxQ?+Uj6nHmy?)v3b z-6Li6%Uq`w87-UsMs2`5IX-xS(=Glk8ZpX=aSA36%jgf=`Fzza#F!yBnLQptH

A z;q!x5Or58(w}*Kf{1xK@i~TFIhXDnrF=4w&K7qIhqLuT-@BD{{kCzWVM+;uqB%Keb z9{m8X7~BsXI&GQV5vwFbGsHqZiBt%D?O+=O>x9tE+kd_jzqGW&u?L}6E#lPDF2l2L z9LP3-C+`TWw) zpkjq3_}3Z~6-q<5PA_9Lc}wXA0>wc?Ti%dH4zLx-gDETR_grx*xl%sJVt0=9FX(z1 z&_)<29W9H=af38zXc5FFTvuk!Z)qTA)kHYC&_1CxKN5FcyNcSr{*bU?v8gZqglB(w zFW@y4+0|QqBmrF@pRmD$dn(jB!X#`+tVXNGn-{-`Txu}qKVy?_+^WRZBvftPp&U}& z(wliCAY`-HUK0JCBW=5A9-aM@I4DP?yqex*3jkK?E(kQHjm~*J9wH3 z;P0TYvvJKD?R!{U;QxgMNYmz{-EefHOk$B&ikp9)`_6o1WDOi(WHDSTNsMmHU^fA% zwkeoM%GlkOnUX&unD?9*C`;oGgk$j6TOT;2^Y|ViXAWyxDaWN&yOXErSAK4UX;pSP zJ1v}Iz;IE##Lro>hN^p1ycFsb@vb^$7XJG6x(+^OpTZs$rL4k}%d~VC_YXmV{&3aJ zWGl&=>E0sQr^uSv7vG|F$o2w4H&Z`bR|U!q%jKHx`Y8F2G%^=H&-H5sU|%~8=63be zk8mo-d15PPTqPafq*UXCUM1NN%(N`~$U)u8ZxH*)nbhiK$A zu-Mi3Qc6BpkkA5CsN=(1F?DA&@U*H||AnE0_3~9-$=0JFN^o4Jhtly-X z4`=nE4bBm^_H$@h6Z%fd7(#s+p&s>F{#-o9BKUQCVzb^SQ-j|QjK_BQr#xIm=E1hs7eoFmJ46 zd`^4g#93S=pTT{u<4fP#=CM=GV6GigL*A z831)k$gGBL%IYUwHN=#^h8(H%qvZ~{XQ+01?YeDs;`2iA$S2yByJO+V)2n})Y zmbw%W30A9v|F3LB92vlXIXELA37o)Tfl?5rfd_g)V-0iQE_h8tAK-vJds`3W(Dn#X|W;IO7KAPI_U=>j&OjTRob4F0L5c=iB;PrqV&=7A790%j@c2Io`XoMFB12Dqi79Jt}Pr-peBz|4*&Ho;F!oYfM hF_54wCjC#`|6AmN_*+ENRs((q?`x~@3#