135 lines
4.7 KiB
Go
135 lines
4.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/gob"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/netlib"
|
|
"mongo.games.com/goserver/srvlib"
|
|
|
|
"mongo.games.com/game/common"
|
|
"mongo.games.com/game/model"
|
|
"mongo.games.com/game/protocol/server"
|
|
)
|
|
|
|
func init() {
|
|
// 绑定gamesrv session
|
|
netlib.RegisterFactory(int(server.SSPacketID_PACKET_GG_PLAYERSESSIONBIND), netlib.PacketFactoryWrapper(func() interface{} {
|
|
return &server.GGPlayerSessionBind{}
|
|
}))
|
|
netlib.RegisterHandler(int(server.SSPacketID_PACKET_GG_PLAYERSESSIONBIND), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
|
|
logger.Logger.Trace("receive GGPlayerSessionBind:", pack)
|
|
if msg, ok := pack.(*server.GGPlayerSessionBind); ok {
|
|
sid := msg.GetSid()
|
|
clientss := srvlib.ClientSessionMgrSington.GetSession(sid)
|
|
if clientss != nil {
|
|
clientss.SetAttribute(common.ClientSessionAttribute_GameServer, s)
|
|
}
|
|
}
|
|
return nil
|
|
}))
|
|
|
|
// 解绑定gamesrv session
|
|
netlib.RegisterFactory(int(server.SSPacketID_PACKET_GG_PLAYERSESSIONUNBIND), netlib.PacketFactoryWrapper(func() interface{} {
|
|
return &server.GGPlayerSessionUnBind{}
|
|
}))
|
|
netlib.RegisterHandler(int(server.SSPacketID_PACKET_GG_PLAYERSESSIONUNBIND), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
|
|
logger.Logger.Trace("receive GGPlayerSessionUnBind:", pack)
|
|
if msg, ok := pack.(*server.GGPlayerSessionUnBind); ok {
|
|
sid := msg.GetSid()
|
|
clientss := srvlib.ClientSessionMgrSington.GetSession(sid)
|
|
if clientss != nil {
|
|
clientss.RemoveAttribute(common.ClientSessionAttribute_GameServer)
|
|
}
|
|
}
|
|
return nil
|
|
}))
|
|
|
|
// 绑定session组标记
|
|
netlib.RegisterFactory(int(server.SSPacketID_PACKET_SG_BINDGROUPTAG), netlib.PacketFactoryWrapper(func() interface{} {
|
|
return &server.SGBindGroupTag{}
|
|
}))
|
|
netlib.RegisterHandler(int(server.SSPacketID_PACKET_SG_BINDGROUPTAG), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
|
|
logger.Logger.Trace("receive WGBindGroupTag:", pack)
|
|
if msg, ok := pack.(*server.SGBindGroupTag); ok {
|
|
if len(msg.GetTags()) == 0 {
|
|
return nil
|
|
}
|
|
|
|
sid := msg.GetSid()
|
|
clientss := srvlib.ClientSessionMgrSington.GetSession(sid)
|
|
if clientss != nil {
|
|
var myTags []string
|
|
param := clientss.GetAttribute(common.ClientSessionAttribute_GroupTag)
|
|
if param != nil {
|
|
if tags, ok := param.([]string); ok {
|
|
myTags = tags
|
|
}
|
|
}
|
|
switch msg.GetCode() {
|
|
case server.SGBindGroupTag_OpCode_Add: //add tags
|
|
var addTags []string
|
|
for _, t := range msg.GetTags() {
|
|
if !common.InSliceString(myTags, t) {
|
|
addTags = append(addTags, t)
|
|
myTags = append(myTags, t)
|
|
}
|
|
}
|
|
if len(addTags) != 0 {
|
|
clientss.SetAttribute(common.ClientSessionAttribute_GroupTag, myTags)
|
|
CustomGroupMgrSington.AddToGroup(addTags, sid, clientss)
|
|
}
|
|
case server.SGBindGroupTag_OpCode_Del: //del tags
|
|
var delTags []string
|
|
var ok bool
|
|
for _, t := range msg.GetTags() {
|
|
if myTags, ok = common.DelSliceString(myTags, t); ok {
|
|
delTags = append(delTags, t)
|
|
}
|
|
}
|
|
if len(delTags) != 0 {
|
|
clientss.SetAttribute(common.ClientSessionAttribute_GroupTag, myTags)
|
|
CustomGroupMgrSington.DelFromGroup(delTags, sid)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}))
|
|
|
|
// 自定义组播,给用户组发消息
|
|
netlib.RegisterFactory(int(server.SSPacketID_PACKET_SS_CUSTOMTAG_MULTICAST), netlib.PacketFactoryWrapper(func() interface{} {
|
|
return &server.SSCustomTagMulticast{}
|
|
}))
|
|
netlib.RegisterHandler(int(server.SSPacketID_PACKET_SS_CUSTOMTAG_MULTICAST), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
|
|
logger.Logger.Trace("receive SSCustomTagMulticast:", pack)
|
|
if msg, ok := pack.(*server.SSCustomTagMulticast); ok {
|
|
tags := msg.GetTags()
|
|
CustomGroupMgrSington.Broadcast(tags, msg.RawData)
|
|
}
|
|
return nil
|
|
}))
|
|
|
|
// 同步玩家数据
|
|
netlib.RegisterFactory(int(server.SSPacketID_PACKET_WR_PlayerData), netlib.PacketFactoryWrapper(func() interface{} {
|
|
return &server.WRPlayerData{}
|
|
}))
|
|
netlib.RegisterHandler(int(server.SSPacketID_PACKET_WR_PlayerData), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
|
|
if msg, ok := pack.(*server.WRPlayerData); ok {
|
|
pd := &model.PlayerData{}
|
|
buf := bytes.NewBuffer(msg.GetPlayerData())
|
|
dec := gob.NewDecoder(buf)
|
|
err := dec.Decode(pd)
|
|
if err != nil {
|
|
logger.Logger.Warnf("WRPlayerData Unmarshal %v error:%v", pd, err)
|
|
return nil
|
|
}
|
|
ns := srvlib.ClientSessionMgrSington.GetSession(msg.GetSid())
|
|
if ns != nil {
|
|
ns.SetAttribute(common.ClientSessionAttribute_PlayerData, pd)
|
|
}
|
|
}
|
|
return nil
|
|
}))
|
|
}
|