123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- package servers
- import (
- sjson "encoding/json"
- "errors"
- "leafstalk/covenant/pbfmsg"
- "leafstalk/log"
- "leafstalk/network/cluster"
- "reflect"
- )
- // type PlayerGate struct {
- // PlayerId int64
- // GateId int32
- // }
- type PlayerAgent struct {
- *cluster.ServerAgent
- PlayerId int64
- GateId int64
- }
- // var (
- // allPlayerGates *cach2.Cache
- // )
- // func InitPlayerAgentList() {
- // allPlayerGates = cach2.New(0, 10*time.Minute)
- // }
- func NewPlayerAgent(serverAgent *cluster.ServerAgent, msg *pbfmsg.RouteMsg) *PlayerAgent {
- pa := new(PlayerAgent)
- pa.ServerAgent = serverAgent
- pa.PlayerId = msg.PlayerId
- pa.GateId = msg.GateId
- return pa
- }
- func GetUserData(serverAgent *cluster.ServerAgent, request *pbfmsg.RouteMsg) func() interface{} {
- return func() interface{} {
- return NewPlayerAgent(serverAgent, request)
- }
- }
- // func GetPlayerAgent(msg *pbfmsg.RouteMsg, serverAgent *cluster.ServerAgent) interface{} {
- // if msg.PlayerId == 0 { // || msg.GateId == 0
- // return serverAgent
- // }
- // strId := strconv.FormatInt(msg.PlayerId, 10)
- // if v, ok := allPlayerGates.Get(strId); ok {
- // old := v.(*PlayerGate)
- // if old.PlayerId == msg.PlayerId && old.GateId == msg.GateId {
- // return NewPlayerAgent(old, serverAgent)
- // }
- // }
- // npg := newPlayerGate(msg)
- // return NewPlayerAgent(npg, serverAgent)
- // }
- // func newPlayerGate(msg *pbfmsg.RouteMsg) *PlayerGate {
- // p := new(PlayerGate)
- // p.PlayerId = msg.PlayerId
- // p.GateId = msg.GateId
- // return p
- // }
- // func NewPlayerGate(playerId int64, gateId int32) *PlayerGate {
- // p := new(PlayerGate)
- // p.PlayerId = playerId
- // p.GateId = gateId
- // return p
- // }
- // // func (p *PlayerGate) GetGateId() int32 {
- // // return atomic.LoadInt32(&p.GateId)
- // // }
- // // func (p *PlayerGate) SetGateId(gateId int32) {
- // // atomic.StoreInt32(&p.GateId, gateId)
- // // }
- // // 客户端登录,记录玩家网关
- // func AddPlayerGate(playerId int64, gateId int32) {
- // // 确保信息不会被删除
- // // gateId 不等时,不能修改只能添加,因为信息有可能被使用
- // strId := strconv.FormatInt(playerId, 10)
- // if v, ok := allPlayerGates.Get(strId); ok {
- // old := v.(*PlayerGate)
- // if old.GateId == gateId {
- // allPlayerGates.SetDefault(strId, v)
- // return
- // }
- // }
- // //
- // pg := NewPlayerGate(playerId, gateId)
- // allPlayerGates.SetDefault(strId, pg)
- // }
- // // 客户端退出,延迟删除玩家网关
- // func RemovePlayerGate(playerId int64) {
- // strId := strconv.FormatInt(playerId, 10)
- // if v, ok := allPlayerGates.Get(strId); ok {
- // allPlayerGates.Set(strId, v, 3*time.Minute)
- // }
- // }
- func CopyPlayerAgent(agent *PlayerAgent) *PlayerAgent {
- p := new(PlayerAgent)
- p.ServerAgent = agent.ServerAgent
- p.PlayerId = agent.PlayerId
- p.GateId = agent.GateId
- return p
- }
- func (p *PlayerAgent) SendToPlayer(Msg interface{}) error {
- data, _ := sjson.Marshal(Msg)
- if len(data) > 2048 {
- data = data[:2048]
- }
- msgType := reflect.TypeOf(Msg)
- var msgName string
- if msgType != nil && msgType.Kind() == reflect.Ptr {
- msgName = msgType.Elem().Name()
- }
- log.Infow("SendToPlayer", "playerId", p.PlayerId, msgName, string(data))
- s := GetServerById(p.GateId)
- if s != nil && s.Agent != nil {
- _, err := s.Agent.WriteClientRouteMsg(Msg, p.PlayerId)
- return err
- }
- log.Warn("no found gate.", p.GateId)
- return errors.New("no found gate")
- }
- // rpc回应消息,需要传递rpcMsgId;
- // rpc请求消息和非rpc消息,不用传递rpcMsgIds
- func (p *PlayerAgent) SendToServer(Msg interface{}, rpcMsgIds ...int64) error {
- if p.ServerAgent != nil {
- rpcMsgId := int64(0)
- if len(rpcMsgIds) > 0 {
- rpcMsgId = rpcMsgIds[0]
- }
- // if rpcMsg, ok := Msg.(msg.RPCer); ok {
- // return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsg.GetMsgId())
- // }
- return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsgId)
- }
- log.Warn("no found server agent")
- return errors.New("no server agent")
- }
- // func (p *PlayerAgent) SendRpcMsgToServer(Msg msg.RPCer) error {
- // return p.SendToServer(Msg, Msg.GetMsgId())
- // }
- // func (p *PlayerAgent) SendToServer(Msg interface{}, rpcMsgId int64) error {
- // if p.ServerAgent != nil {
- // return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsgId)
- // }
- // log.Warn("no found server agent")
- // return errors.New("no server agent")
- // }
|