package gameMap import ( capp "f1-game/internal/cherry_app" "f1-game/internal/component/redis" "f1-game/internal/data" "f1-game/internal/enum" facade "f1-game/internal/facade" nameActor "f1-game/internal/name/actor" nameRedis "f1-game/internal/name/redis" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/nodes/game/internal/db" gameFacade "f1-game/nodes/game/internal/facade" cfacade "github.com/cherry-game/cherry/facade" clog "github.com/cherry-game/cherry/logger" cproto "github.com/cherry-game/cherry/net/proto" ) var srv = &service{} func Service() *service { return srv } type service struct { facade.PlayerServiceBase[*db.PlayerTable] } func (p *service) SyncMapPlayer(playerID int64) { playerTable, _ := db.GetPlayerTable(playerID) if playerTable.Map.MapNodeID == "" { return } // 同步数据到 Map 节点 p.syncMapPlayer(playerTable) } // 尝试分配地图并同步数据 func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) { if playerTable.Map.MapNodeID == "" { // TODO 新玩家尝试分配到 map-1 节点,后续通过赛季还是匹配自动分配 mapNodeID := "map-1" _, ok := capp.App().Discovery().GetMember(mapNodeID) if !ok { clog.Warnf("map node [%s] not found", mapNodeID) return } playerTable.Map.Join(mapNodeID) playerTable.Save2Queue() redis.Game.SavePlayerDataFields(playerTable.PlayerID, map[string]any{nameRedis.Player_MapNodeID: mapNodeID}) // TODO 分配沙盘聊天室,有了匹配规则再统一改 nodeConfig, found := data.Node.GetByNodeID(mapNodeID) if found { gameFacade.Chat.CreateChatRoom(playerTable.PlayerID, enum.ChatType_Map, int64(nodeConfig.MapID)) } } } func (p *service) syncMapPlayer(playerTable *db.PlayerTable) { // 同步数据到 Map 节点 sync := &pb.SyncMapPlayerRequest{ PlayerID: playerTable.PlayerID, PlayerName: playerTable.Lord.Name, IconID: playerTable.Lord.IconID, FrameID: playerTable.Lord.FrameID, GameNodeID: playerTable.NodeID, } targetPath := cfacade.NewChildPath(playerTable.Map.MapNodeID, nameActor.Map_Player, playerTable.PlayerID) capp.Call(targetPath, nameRemote.MapPlayer_SyncData, sync) }