| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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()
- }
|