package user import ( capp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/constant" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/sessions" cfacade "github.com/cherry-game/cherry/facade" clog "github.com/cherry-game/cherry/logger" "github.com/cherry-game/cherry/net/parser/pomelo" pmessage "github.com/cherry-game/cherry/net/parser/pomelo/message" cproto "github.com/cherry-game/cherry/net/proto" ) func localRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message, nodeID string) { targetPath := cfacade.NewPath(nodeID, route.HandleName()) err := pomelo.ClusterLocalDataRoute(pomeloAgent, session, route, msg, nodeID, targetPath) if err != nil { pomeloAgent.ResponseCode(session, code.NodeRequestError, true) } } // gameNodeRoute 实现agent路由消息到游戏节点 func gameNodeRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message) { // 获取绑定的ServerID gameNodeID := sessions.GetGameNodeID(session) if gameNodeID == "" { pomeloAgent.Kick(upa.notLoginCode, true) return } localRoute(pomeloAgent, session, route, msg, gameNodeID) } func mapNodeRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message) { // game.login.enter 后才能请求 map 节点 mapNodeID := sessions.GetMapNodeID(session) if mapNodeID == "" { pomeloAgent.ResponseCode(session, code.NodeMapNodeIDIsEmpty, true) return } // 检查节点是否在发现服务器上,如果没有,则通知玩家 if _, found := capp.Discovery().GetMember(mapNodeID); !found { pomeloAgent.ResponseCode(session, code.NodeMapIsClosed, true) return } localRoute(pomeloAgent, session, route, msg, mapNodeID) } // CheckNodeState 判断节点是否可用 // // 判断节点是否达到玩家在线阀值 // 判断节点维护状态&白名单过滤 func checkNodeState(nodeType string, nodeID string, actorID string, uid int64, ip string) int32 { var ( req = &pb.User{ Uid: uid, Ip: ip, } rsp = &pb.I32{} targetPath = cfacade.NewPath(nodeID, actorID) ) errCode := capp.CallWait(targetPath, nameRemote.Ops_CheckNodeState, req, rsp) if code.IsFail(errCode) { clog.Warnf("Check node state fail. nodeID = %v, actorID = %v, errCode = %v", nodeID, actorID, errCode) switch nodeType { case constant.NodeGame: errCode = code.NodeIsClosed case constant.NodeMap: errCode = code.NodeMapIsClosed default: errCode = code.NodeIsClosed } return errCode } return rsp.Value }