route.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package user
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/constant"
  6. nameRemote "f1-game/internal/name/remote"
  7. "f1-game/internal/pb"
  8. "f1-game/internal/sessions"
  9. cfacade "github.com/cherry-game/cherry/facade"
  10. clog "github.com/cherry-game/cherry/logger"
  11. "github.com/cherry-game/cherry/net/parser/pomelo"
  12. pmessage "github.com/cherry-game/cherry/net/parser/pomelo/message"
  13. cproto "github.com/cherry-game/cherry/net/proto"
  14. )
  15. func localRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message, nodeID string) {
  16. targetPath := cfacade.NewPath(nodeID, route.HandleName())
  17. err := pomelo.ClusterLocalDataRoute(pomeloAgent, session, route, msg, nodeID, targetPath)
  18. if err != nil {
  19. pomeloAgent.ResponseCode(session, code.NodeRequestError, true)
  20. }
  21. }
  22. // gameNodeRoute 实现agent路由消息到游戏节点
  23. func gameNodeRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message) {
  24. // 获取绑定的ServerID
  25. gameNodeID := sessions.GetGameNodeID(session)
  26. if gameNodeID == "" {
  27. pomeloAgent.Kick(upa.notLoginCode, true)
  28. return
  29. }
  30. localRoute(pomeloAgent, session, route, msg, gameNodeID)
  31. }
  32. func mapNodeRoute(pomeloAgent *pomelo.Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message) {
  33. // game.login.enter 后才能请求 map 节点
  34. mapNodeID := sessions.GetMapNodeID(session)
  35. if mapNodeID == "" {
  36. pomeloAgent.ResponseCode(session, code.NodeMapNodeIDIsEmpty, true)
  37. return
  38. }
  39. // 检查节点是否在发现服务器上,如果没有,则通知玩家
  40. if _, found := capp.Discovery().GetMember(mapNodeID); !found {
  41. pomeloAgent.ResponseCode(session, code.NodeMapIsClosed, true)
  42. return
  43. }
  44. localRoute(pomeloAgent, session, route, msg, mapNodeID)
  45. }
  46. // CheckNodeState 判断节点是否可用
  47. //
  48. // 判断节点是否达到玩家在线阀值
  49. // 判断节点维护状态&白名单过滤
  50. func checkNodeState(nodeType string, nodeID string, actorID string, uid int64, ip string) int32 {
  51. var (
  52. req = &pb.User{
  53. Uid: uid,
  54. Ip: ip,
  55. }
  56. rsp = &pb.I32{}
  57. targetPath = cfacade.NewPath(nodeID, actorID)
  58. )
  59. errCode := capp.CallWait(targetPath, nameRemote.Ops_CheckNodeState, req, rsp)
  60. if code.IsFail(errCode) {
  61. clog.Warnf("Check node state fail. nodeID = %v, actorID = %v, errCode = %v", nodeID, actorID, errCode)
  62. switch nodeType {
  63. case constant.NodeGame:
  64. errCode = code.NodeIsClosed
  65. case constant.NodeMap:
  66. errCode = code.NodeMapIsClosed
  67. default:
  68. errCode = code.NodeIsClosed
  69. }
  70. return errCode
  71. }
  72. return rsp.Value
  73. }