player.go 4.8 KB

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