player.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package rankBase
  2. import (
  3. "f1-game/internal/event"
  4. nameEvent "f1-game/internal/name/event"
  5. nameLocal "f1-game/internal/name/local"
  6. nameRemote "f1-game/internal/name/remote"
  7. "f1-game/internal/pb"
  8. "f1-game/internal/sessions"
  9. "f1-game/nodes/map/internal/db"
  10. "time"
  11. cfacade "github.com/cherry-game/cherry/facade"
  12. clog "github.com/cherry-game/cherry/logger"
  13. cactor "github.com/cherry-game/cherry/net/actor"
  14. "github.com/cherry-game/cherry/net/parser/pomelo"
  15. cproto "github.com/cherry-game/cherry/net/proto"
  16. )
  17. type Player struct {
  18. RankBase
  19. table *db.MapPlayerRankTable
  20. actorBase pomelo.ActorBase
  21. }
  22. func (p *Player) Init(actorBase pomelo.ActorBase, event cactor.IEvent, rankStr string, saveInterval time.Duration) {
  23. p.RankBase.Init(actorBase, rankStr, saveInterval, func(rankID int32) (RankTable, bool) {
  24. table, found := db.LoadMapPlayerRankTableFromDB(rankID)
  25. if found {
  26. p.table = table
  27. return table, true
  28. }
  29. return nil, false
  30. })
  31. p.actorBase = actorBase
  32. // 注册获取排行榜列表接口
  33. p.actorBase.Local().Register(nameLocal.MapRank_PlayerList, p.rankList)
  34. // 注册更新排行榜remote结构
  35. p.actorBase.Remote().Register(nameRemote.UpdateRank, p.updateRank)
  36. event.Register(nameEvent.Map_WatcherSync, p.onUpdatePlayerInfo)
  37. event.Register(nameEvent.League_Quit, p.onPlayerLeagueQuit)
  38. event.Register(nameEvent.League_Join, p.onPlayerLeagueJoin)
  39. event.Register(nameEvent.Map_PlayerPointUpdate, p.onPlayerPointUpdate)
  40. event.Register(nameEvent.Map_LeagueSync, p.onLeagueSync)
  41. clog.Warnf("init rank finish. rankID=%d", p.rankID)
  42. }
  43. func (p *Player) rankList(session *cproto.Session, req *pb.I64) {
  44. playerID := sessions.GetPlayerID(session)
  45. rsp := p.GetRankListWithPlayer(playerID)
  46. p.actorBase.Response(session, rsp)
  47. }
  48. func (p *Player) GetRankListWithPlayer(playerID int64) *pb.PlayerRanklist {
  49. return &pb.PlayerRanklist{
  50. List: p.table.GetRankList(p.GetShowCount()),
  51. MyRank: p.table.GetRank(playerID, p.GetShowCount()),
  52. }
  53. }
  54. func (p *Player) updateRank(rank *pb.RankPlayer) {
  55. inNotRank := p.table.IsNotInRank(rank.PlayerID)
  56. // 玩家不在榜内 且 未达上榜所需条件 跳过 (有可能是一开始在榜上,最后掉下来这种需要更新排行榜)
  57. if inNotRank && rank.Data.Value < p.GetMinRankValue() {
  58. return
  59. }
  60. if update := p.table.AddOrUpdateRank(rank.PlayerID, rank, p.GetRankLimit()); update {
  61. p.MarkChange()
  62. }
  63. }
  64. func (p *Player) onUpdatePlayerInfo(e cfacade.IEventData) {
  65. evt, ok := e.(*event.MapWatcherSync)
  66. if !ok {
  67. clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e)
  68. return
  69. }
  70. var (
  71. playerID = evt.PlayerID()
  72. data = evt.Data()
  73. )
  74. // 如果只是更新城建属性跳过
  75. if data.IsFacilitySync {
  76. return
  77. }
  78. // 查找排行榜玩家数据 不存在直接跳过
  79. rankPlayer := p.table.GetRankPlayer(playerID)
  80. if rankPlayer == nil {
  81. return
  82. }
  83. rankPlayer.PlayerName = data.PlayerName
  84. rankPlayer.IconID = data.IconID
  85. rankPlayer.FrameID = data.FrameID
  86. p.MarkChange()
  87. }
  88. func (p *Player) onPlayerLeagueQuit(e cfacade.IEventData) {
  89. evt, ok := e.(*event.LeagueQuit)
  90. if !ok {
  91. clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e)
  92. return
  93. }
  94. // 查找排行榜玩家数据 不存在直接跳过
  95. rankPlayer := p.table.GetRankPlayer(evt.PlayerID())
  96. if rankPlayer == nil {
  97. return
  98. }
  99. rankPlayer.LeagueID = 0
  100. rankPlayer.LeagueName = ""
  101. p.MarkChange()
  102. }
  103. func (p *Player) onPlayerLeagueJoin(e cfacade.IEventData) {
  104. evt, ok := e.(*event.LeagueJoin)
  105. if !ok {
  106. clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e)
  107. return
  108. }
  109. // 查找排行榜玩家数据 不存在直接跳过
  110. rankPlayer := p.table.GetRankPlayer(evt.PlayerID())
  111. if rankPlayer == nil {
  112. return
  113. }
  114. rankPlayer.LeagueID = evt.LeagueID()
  115. rankPlayer.LeagueName = evt.LeagueName()
  116. p.MarkChange()
  117. }
  118. func (p *Player) onPlayerPointUpdate(e cfacade.IEventData) {
  119. evt, ok := e.(*event.PlayerPointUpdate)
  120. if !ok {
  121. clog.Errorf("[%s] player prestige rank update player info error: %v", p.rankID, e)
  122. return
  123. }
  124. // 查找排行榜玩家数据 不存在直接跳过
  125. rankPlayer := p.table.GetRankPlayer(evt.PlayerID())
  126. if rankPlayer == nil {
  127. return
  128. }
  129. rankPlayer.Point = evt.Point()
  130. p.MarkChange()
  131. }
  132. // 更新玩家联盟信息
  133. func (p *Player) onLeagueSync(e cfacade.IEventData) {
  134. evt, ok := e.(*event.MapLeagueSync)
  135. if !ok {
  136. clog.Errorf("[%s] player prestige rank update league info error: %v", p.rankID, e)
  137. return
  138. }
  139. update := p.table.UpdateLeague(evt.MapLeague())
  140. if update {
  141. p.MarkChange()
  142. }
  143. }
  144. func (p *Player) OnStop() {
  145. p.RankBase.OnStop()
  146. }