league.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package rankBase
  2. import (
  3. "f1-game/internal/constant"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/event"
  7. nameEvent "f1-game/internal/name/event"
  8. nameLocal "f1-game/internal/name/local"
  9. nameRemote "f1-game/internal/name/remote"
  10. "f1-game/internal/pb"
  11. "f1-game/internal/sessions"
  12. "f1-game/nodes/map/internal/db"
  13. "time"
  14. cfacade "github.com/cherry-game/cherry/facade"
  15. clog "github.com/cherry-game/cherry/logger"
  16. cactor "github.com/cherry-game/cherry/net/actor"
  17. "github.com/cherry-game/cherry/net/parser/pomelo"
  18. cproto "github.com/cherry-game/cherry/net/proto"
  19. )
  20. type League struct {
  21. RankBase
  22. table *db.MapLeagueRankTable
  23. actorBase pomelo.ActorBase
  24. }
  25. func (p *League) Init(actorBase pomelo.ActorBase, event cactor.IEvent, rankStr string, saveInterval time.Duration) {
  26. p.RankBase.Init(actorBase, rankStr, saveInterval, func(rankID int32) (RankTable, bool) {
  27. table, found := db.LoadMapLeagueRankTableFromDB(rankID)
  28. if found {
  29. p.table = table
  30. return table, true
  31. }
  32. return nil, false
  33. })
  34. p.actorBase = actorBase
  35. p.actorBase.Local().Register(nameLocal.MapRank_LeagueList, p.rankList)
  36. p.actorBase.Remote().Register(nameRemote.UpdateRank, p.updateRank)
  37. // 注册事件
  38. event.Register(nameEvent.Map_LeagueSync, p.onLeagueSync)
  39. event.Register(nameEvent.League_Upgrade, p.onLeagueUpgrade)
  40. event.Register(nameEvent.Map_WatcherSync, p.onPlayerSync)
  41. event.Register(nameEvent.MapLeague_LeaderChange, p.onLeagueLeaderChange)
  42. event.Register(nameEvent.League_Build, p.onLeagueBuild)
  43. clog.Warnf("init rank finish. rankID=%d", p.rankID)
  44. }
  45. // 获取排行榜列表
  46. func (p *League) rankList(session *cproto.Session, req *pb.I32) {
  47. leagueID := sessions.GetLeagueID(session)
  48. rsp := p.GetRankListWithLeague(leagueID)
  49. p.actorBase.Response(session, rsp)
  50. }
  51. func (p *League) GetRankListWithLeague(leagueID int64) *pb.LeagueRanklist {
  52. myRank := int32(0)
  53. if leagueID > 0 {
  54. myRank = p.table.GetRank(leagueID)
  55. }
  56. return &pb.LeagueRanklist{
  57. List: p.table.GetRankList(p.GetShowCount()),
  58. MyRank: myRank,
  59. }
  60. }
  61. func (p *League) updateRank(rank *pb.RankLeague) {
  62. leagueRank := p.table.GetRank(rank.LeagueID)
  63. // 联盟不在榜内 且 未达上榜所需条件
  64. if leagueRank <= 0 && rank.Data.Value < p.GetMinRankValue() {
  65. return
  66. }
  67. if update := p.table.AddOrUpdateRank(rank.LeagueID, rank, p.GetRankLimit()); update {
  68. p.MarkChange()
  69. }
  70. }
  71. func (p *League) onLeagueSync(e cfacade.IEventData) {
  72. clog.Debugf("[%d] league sync req.", p.rankID)
  73. evt, ok := e.(*event.MapLeagueSync)
  74. if !ok {
  75. clog.Errorf("[%d] league sync error: %v", p.rankID, e)
  76. return
  77. }
  78. var (
  79. leagueID = evt.UniqueID()
  80. league = evt.MapLeague()
  81. )
  82. rankLeague, found := p.table.GetRankLeague(leagueID)
  83. if !found {
  84. return
  85. }
  86. rankLeague.LeagueName = league.LeagueName
  87. rankLeague.LeagueAbbName = league.LeagueAbbName
  88. p.MarkChange()
  89. }
  90. func (p *League) onLeagueUpgrade(e cfacade.IEventData) {
  91. clog.Debugf("[%d] league sync req.", p.rankID)
  92. evt, ok := e.(*event.LeagueUpgrade)
  93. if !ok {
  94. clog.Errorf("[%d] league sync error: %v", p.rankID, e)
  95. return
  96. }
  97. var (
  98. leagueID = evt.UniqueID()
  99. leagueLevel = evt.GetLevel()
  100. )
  101. rankLeague, found := p.table.GetRankLeague(leagueID)
  102. if !found {
  103. return
  104. }
  105. leagueLevelRow, found := data.LeagueLevel.GetByLevel(leagueLevel)
  106. if !found {
  107. clog.Errorf("[%d] league level not found. leagueID = %d, leagueLevel = %d", p.rankID, leagueID, leagueLevel)
  108. return
  109. }
  110. rankLeague.MemberLimit = leagueLevelRow.LevelAttrs.GetI32(enum.LeagueAttrMemberCountLimit)
  111. p.MarkChange()
  112. }
  113. func (p *League) onPlayerSync(e cfacade.IEventData) {
  114. clog.Debugf("[%d] league player sync req.", p.rankID)
  115. evt, ok := e.(*event.MapWatcherSync)
  116. if !ok {
  117. clog.Errorf("[%d] league player sync error: %v", p.rankID, e)
  118. return
  119. }
  120. var (
  121. playerID = evt.UniqueID()
  122. )
  123. rankLeague, found := p.table.GetRankLeagueByLeaderID(playerID)
  124. if found {
  125. rankLeague.PlayerName = evt.Data().PlayerName
  126. p.MarkChange()
  127. }
  128. }
  129. func (p *League) onLeagueLeaderChange(e cfacade.IEventData) {
  130. clog.Debugf("[%d] league player sync req.", p.rankID)
  131. evt, ok := e.(*event.LeagueLeaderChange)
  132. if !ok {
  133. clog.Errorf("[%d] league leader change error: %v", p.rankID, e)
  134. return
  135. }
  136. rankLeague, found := p.table.GetRankLeague(evt.UniqueID())
  137. if found {
  138. rankLeague.LeaderID = evt.LeaderID()
  139. rankLeague.PlayerName = evt.LeaderName()
  140. p.MarkChange()
  141. }
  142. }
  143. func (p *League) onLeagueBuild(e cfacade.IEventData) {
  144. clog.Debugf("[%d] league build req.", p.rankID)
  145. evt, ok := e.(*event.LeagueBuild)
  146. if !ok {
  147. clog.Errorf("[%d] league build error: %v", p.rankID, e)
  148. return
  149. }
  150. // 不是联盟驻地
  151. if evt.BuildID() != constant.MapBuild_LeaguePoint {
  152. return
  153. }
  154. rankLeague, found := p.table.GetRankLeague(evt.UniqueID())
  155. if found {
  156. rankLeague.Point = evt.Point()
  157. p.MarkChange()
  158. }
  159. }
  160. func (p *League) OnStop() {
  161. p.RankBase.OnStop()
  162. }