league_timer.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package mapLeague
  2. import (
  3. "f1-game/internal/data"
  4. "f1-game/nodes/map/internal/db"
  5. mapFacade "f1-game/nodes/map/internal/facade"
  6. leagueBase "f1-game/nodes/map/league/base"
  7. leagueStorage "f1-game/nodes/map/league/storage"
  8. "time"
  9. ctime "github.com/cherry-game/cherry/extend/time"
  10. cherryLogger "github.com/cherry-game/cherry/logger"
  11. )
  12. func (p *actorLeague) startTimer() {
  13. //移除所有定时器
  14. p.Timer().RemoveAll()
  15. // 添加跨天定时器
  16. p.Timer().AddFixedHour(int(data.Const.ResetTime), 0, 0, p.onCrossDayTimer)
  17. // 添加每秒定时器
  18. p.Timer().Add(1*time.Second, p.every1STimer)
  19. // 资源定时器
  20. p.Timer().Add(3*time.Second, p.every3STimer)
  21. }
  22. func (p *actorLeague) onCrossDayTimer() {
  23. leagueTable, found := db.GetMapLeagueTable(p.leagueID)
  24. if !found {
  25. return
  26. }
  27. // 跨天重置 // TODO 联盟中记录上一次跨天/跨周的时间戳
  28. mapFacade.LeagueServiceOnReset(leagueTable, false, false)
  29. }
  30. // oneSecondTimer 每1秒定时器
  31. func (p *actorLeague) every1STimer() {
  32. nowSecond := ctime.Now().ToSecond()
  33. // 每日重置检查
  34. p.dailyReset()
  35. // TODO 以下后续改到service中
  36. // 盟主转让
  37. p.leagueLeaderTransferTime(nowSecond)
  38. // 盟主弹劾
  39. p.leagueImpeachTime(nowSecond)
  40. leagueBase.Service().LeagueDiplomacyTimer(p.leagueID, nowSecond)
  41. }
  42. // every3STimer 每3秒定时器
  43. func (p *actorLeague) every3STimer() {
  44. nowSecond := ctime.Now().ToSecond()
  45. leagueStorage.Service().CheckAutoAdd(p.leagueID, nowSecond)
  46. }
  47. // 公会每日重置
  48. func (p *actorLeague) dailyReset() {
  49. if !p.checkDailyReset() {
  50. return
  51. }
  52. p.leagueTable.DailyReset()
  53. mapLeagueStorageTable := db.GetMapLeagueStorageTable(p.leagueID)
  54. mapLeagueStorageTable.DailyReset()
  55. if mapLeagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID); found {
  56. mapLeagueMemberTable.DailyReset()
  57. }
  58. p.Info("dailyReset success.")
  59. // 每周重置
  60. p.weekReset()
  61. }
  62. // 公会每周重置
  63. func (p *actorLeague) weekReset() {
  64. // 每日重置逻辑检查通过,只需要判断当前时间是否是周一
  65. if !ctime.NewSecond(p.leagueTable.DailyRefreshTime).IsMonday() {
  66. return
  67. }
  68. p.leagueTable.WeekReset()
  69. p.leagueTable.Save2Queue()
  70. mapLeagueStorageTable := db.GetMapLeagueStorageTable(p.leagueID)
  71. mapLeagueStorageTable.WeekReset()
  72. if mapLeagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID); found {
  73. mapLeagueMemberTable.WeekReset()
  74. }
  75. p.Info("weekReset success.")
  76. }
  77. // 公会每日重置检查
  78. func (p *actorLeague) checkDailyReset() bool {
  79. // 根据最近一次刷新时间来计算下一次零点时间
  80. nextZeroTime := ctime.NewSecond(p.leagueTable.DailyRefreshTime)
  81. nextZeroTime.SetHour(0) //TODO 零点可以配置在常量中
  82. nextZeroTime.AddDays(1)
  83. // 当前时间
  84. nowSec := ctime.Now().ToSecond()
  85. // 未达到刷新时间
  86. if nowSec < nextZeroTime.ToSecond() {
  87. return false
  88. }
  89. // 设置刷新时间
  90. p.leagueTable.DailyRefreshTime = nowSec
  91. return true
  92. }
  93. func (p *actorLeague) leagueLeaderTransferTime(nowSecond int64) {
  94. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  95. if !found {
  96. return
  97. }
  98. var (
  99. playerID = leagueMemberTable.LeagueMember.Transfer.PlayerID
  100. endTime = leagueMemberTable.LeagueMember.Transfer.EndTime
  101. )
  102. // 不存在转让玩家
  103. if playerID <= 0 || nowSecond < endTime {
  104. return
  105. }
  106. if found = leagueMemberTable.LeagueMember.CheckMemberExist(playerID); found {
  107. leagueTable, found := db.GetMapLeagueTable(p.leagueID)
  108. if !found {
  109. p.Warn("leagueLeaderTransfer leagueTable not found leagueID = %v", p.leagueID)
  110. return
  111. }
  112. oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID
  113. leagueTable.LeagueInfo.LeaderID = playerID
  114. leagueTable.Save2Queue()
  115. // 获取旧盟主职位
  116. leaderJobID := leagueMemberTable.GetLeagueMemberJob(oldLeaderPlayerID)
  117. leagueMemberTable.LeagueJob.Jobs[leaderJobID] = playerID
  118. // 职位变更通知
  119. p.PermissionChangePush(leagueMemberTable, oldLeaderPlayerID, playerID)
  120. // 同步新盟主信息
  121. leagueBase.Service().SyncLeagueLeaderChange(p.leagueID, playerID)
  122. }
  123. leagueMemberTable.SetLeagueTransfer(0, 0)
  124. leagueMemberTable.Save2Queue()
  125. }
  126. func (p *actorLeague) leagueImpeachTime(nowSecond int64) {
  127. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  128. if !found {
  129. return
  130. }
  131. if !leagueMemberTable.LeagueMember.CheckLeagueImpeachExist() {
  132. return
  133. }
  134. // 判断时间是否以达到
  135. if nowSecond < leagueMemberTable.GetLeagueImpeachEndTime() {
  136. return
  137. }
  138. // 时间已到 获取弹劾人数
  139. var (
  140. agreeCount = int32(len(leagueMemberTable.Impeach.AgreePlayerIDs))
  141. rejectCount = int32(len(leagueMemberTable.Impeach.RejectPlayerIDs))
  142. newLeaderID = leagueMemberTable.Impeach.PlayerID
  143. needCount = leagueMemberTable.Impeach.Total / 2
  144. )
  145. // 同意人数大于反对的人数 且 当前同意的人数大于等于总可以投票的人数/2 弹劾成功
  146. if rejectCount < agreeCount && agreeCount >= needCount {
  147. // 盟主转换
  148. leagueTable, found := db.GetMapLeagueTable(p.leagueID)
  149. if !found {
  150. cherryLogger.Warnf("league impeach finish fail, league not found. leagueID:%d", p.leagueID)
  151. return
  152. }
  153. leagueTable.LeagueInfo.LeaderID = newLeaderID
  154. // 如果弹劾玩家存在职位 需要先卸载职位
  155. leagueMemberTable.Resigned(newLeaderID)
  156. leagueTable.Save2Queue()
  157. // 同步新的盟主信息
  158. leagueBase.Service().SyncLeagueLeaderChange(p.leagueID, newLeaderID)
  159. }
  160. // 不管是否弹劾成功 都需要清除弹劾数据
  161. leagueMemberTable.LeagueImpeachClear(newLeaderID)
  162. leagueMemberTable.Save2Queue()
  163. }