package rankBase import ( "f1-game/internal/event" nameEvent "f1-game/internal/name/event" nameLocal "f1-game/internal/name/local" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/nodes/map/internal/db" "time" cfacade "github.com/cherry-game/cherry/facade" clog "github.com/cherry-game/cherry/logger" cactor "github.com/cherry-game/cherry/net/actor" "github.com/cherry-game/cherry/net/parser/pomelo" cproto "github.com/cherry-game/cherry/net/proto" ) type Player struct { RankBase table *db.MapPlayerRankTable actorBase pomelo.ActorBase } func (p *Player) Init(actorBase pomelo.ActorBase, event cactor.IEvent, rankStr string, saveInterval time.Duration) { p.RankBase.Init(actorBase, rankStr, saveInterval, func(rankID int32) (RankTable, bool) { table, found := db.LoadMapPlayerRankTableFromDB(rankID) if found { p.table = table return table, true } return nil, false }) p.actorBase = actorBase // 注册获取排行榜列表接口 p.actorBase.Local().Register(nameLocal.MapRank_PlayerList, p.rankList) // 注册更新排行榜remote结构 p.actorBase.Remote().Register(nameRemote.UpdateRank, p.updateRank) event.Register(nameEvent.Map_WatcherSync, p.onUpdatePlayerInfo) event.Register(nameEvent.League_Quit, p.onPlayerLeagueQuit) event.Register(nameEvent.League_Join, p.onPlayerLeagueJoin) event.Register(nameEvent.Map_PlayerPointUpdate, p.onPlayerPointUpdate) event.Register(nameEvent.Map_LeagueSync, p.onLeagueSync) clog.Warnf("init rank finish. rankID=%d", p.rankID) } func (p *Player) rankList(session *cproto.Session, req *pb.I64) { playerID := sessions.GetPlayerID(session) rsp := p.GetRankListWithPlayer(playerID) p.actorBase.Response(session, rsp) } func (p *Player) GetRankListWithPlayer(playerID int64) *pb.PlayerRanklist { return &pb.PlayerRanklist{ List: p.table.GetRankList(p.GetShowCount()), MyRank: p.table.GetRank(playerID, p.GetShowCount()), } } func (p *Player) updateRank(rank *pb.RankPlayer) { inNotRank := p.table.IsNotInRank(rank.PlayerID) // 玩家不在榜内 且 未达上榜所需条件 跳过 (有可能是一开始在榜上,最后掉下来这种需要更新排行榜) if inNotRank && rank.Data.Value < p.GetMinRankValue() { return } if update := p.table.AddOrUpdateRank(rank.PlayerID, rank, p.GetRankLimit()); update { p.MarkChange() } } func (p *Player) onUpdatePlayerInfo(e cfacade.IEventData) { evt, ok := e.(*event.MapWatcherSync) if !ok { clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e) return } var ( playerID = evt.PlayerID() data = evt.Data() ) // 如果只是更新城建属性跳过 if data.IsFacilitySync { return } // 查找排行榜玩家数据 不存在直接跳过 rankPlayer := p.table.GetRankPlayer(playerID) if rankPlayer == nil { return } rankPlayer.PlayerName = data.PlayerName rankPlayer.IconID = data.IconID rankPlayer.FrameID = data.FrameID p.MarkChange() } func (p *Player) onPlayerLeagueQuit(e cfacade.IEventData) { evt, ok := e.(*event.LeagueQuit) if !ok { clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e) return } // 查找排行榜玩家数据 不存在直接跳过 rankPlayer := p.table.GetRankPlayer(evt.PlayerID()) if rankPlayer == nil { return } rankPlayer.LeagueID = 0 rankPlayer.LeagueName = "" p.MarkChange() } func (p *Player) onPlayerLeagueJoin(e cfacade.IEventData) { evt, ok := e.(*event.LeagueJoin) if !ok { clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e) return } // 查找排行榜玩家数据 不存在直接跳过 rankPlayer := p.table.GetRankPlayer(evt.PlayerID()) if rankPlayer == nil { return } rankPlayer.LeagueID = evt.LeagueID() rankPlayer.LeagueName = evt.LeagueName() p.MarkChange() } func (p *Player) onPlayerPointUpdate(e cfacade.IEventData) { evt, ok := e.(*event.PlayerPointUpdate) if !ok { clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e) return } // 查找排行榜玩家数据 不存在直接跳过 rankPlayer := p.table.GetRankPlayer(evt.PlayerID()) if rankPlayer == nil { return } rankPlayer.Point = evt.Point() p.MarkChange() } // 更新玩家联盟信息 func (p *Player) onLeagueSync(e cfacade.IEventData) { evt, ok := e.(*event.MapLeagueSync) if !ok { clog.Errorf("[%s] player prestige rank update league info error: %v", p.rankID, e) return } update := p.table.UpdateLeague(evt.MapLeague()) if update { p.MarkChange() } } func (p *Player) OnStop() { p.RankBase.OnStop() }