service.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package gameMap
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/component/redis"
  5. "f1-game/internal/data"
  6. "f1-game/internal/enum"
  7. facade "f1-game/internal/facade"
  8. nameActor "f1-game/internal/name/actor"
  9. nameRedis "f1-game/internal/name/redis"
  10. nameRemote "f1-game/internal/name/remote"
  11. "f1-game/internal/pb"
  12. "f1-game/nodes/game/internal/db"
  13. gameFacade "f1-game/nodes/game/internal/facade"
  14. cfacade "github.com/cherry-game/cherry/facade"
  15. clog "github.com/cherry-game/cherry/logger"
  16. cproto "github.com/cherry-game/cherry/net/proto"
  17. )
  18. var srv = &service{}
  19. func Service() *service {
  20. return srv
  21. }
  22. type service struct {
  23. facade.PlayerServiceBase[*db.PlayerTable]
  24. }
  25. func (p *service) SyncMapPlayer(playerID int64) {
  26. playerTable, _ := db.GetPlayerTable(playerID)
  27. if playerTable.Map.MapNodeID == "" {
  28. return
  29. }
  30. // 同步数据到 Map 节点
  31. p.syncMapPlayer(playerTable)
  32. }
  33. // 尝试分配地图并同步数据
  34. func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  35. if playerTable.Map.MapNodeID == "" {
  36. // TODO 新玩家尝试分配到 map-1 节点,后续通过赛季还是匹配自动分配
  37. mapNodeID := "map-1"
  38. _, ok := capp.App().Discovery().GetMember(mapNodeID)
  39. if !ok {
  40. clog.Warnf("map node [%s] not found", mapNodeID)
  41. return
  42. }
  43. playerTable.Map.Join(mapNodeID)
  44. playerTable.Save2Queue()
  45. redis.Game.SavePlayerDataFields(playerTable.PlayerID, map[string]any{nameRedis.Player_MapNodeID: mapNodeID})
  46. // TODO 分配沙盘聊天室,有了匹配规则再统一改
  47. nodeConfig, found := data.Node.GetByNodeID(mapNodeID)
  48. if found {
  49. gameFacade.Chat.CreateChatRoom(playerTable.PlayerID, enum.ChatType_Map, int64(nodeConfig.MapID))
  50. }
  51. }
  52. }
  53. func (p *service) syncMapPlayer(playerTable *db.PlayerTable) {
  54. // 同步数据到 Map 节点
  55. sync := &pb.SyncMapPlayerRequest{
  56. PlayerID: playerTable.PlayerID,
  57. PlayerName: playerTable.Lord.Name,
  58. IconID: playerTable.Lord.IconID,
  59. FrameID: playerTable.Lord.FrameID,
  60. GameNodeID: playerTable.NodeID,
  61. }
  62. targetPath := cfacade.NewChildPath(playerTable.Map.MapNodeID, nameActor.Map_Player, playerTable.PlayerID)
  63. capp.Call(targetPath, nameRemote.MapPlayer_SyncData, sync)
  64. }