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 }