game_sync/gatesrv/action_server.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
}))
}