tower_manager.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/model"
  5. "roserver/serverproto"
  6. "strconv"
  7. "time"
  8. )
  9. type TowerManager struct {
  10. updateTimer util.ServerTimer //更新定时器
  11. initStartUp bool
  12. seasonStartTime, seasonEndTime time.Time
  13. refreshTime time.Time
  14. day int32 //周期
  15. isRefresh bool //已经有玩家到达1000层可以增加周期
  16. initFromDb bool
  17. initFromDb2 bool
  18. }
  19. func newTowerMag() *TowerManager {
  20. mag := &TowerManager{
  21. day: 1,
  22. }
  23. mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 5000)
  24. return mag
  25. }
  26. func (this *TowerManager) init(ms uint64) {
  27. nowTime := util.GetTimeByUint64(ms)
  28. if nowTime.Before(this.seasonEndTime) {
  29. return
  30. }
  31. msg := &serverproto.SSTowerWjRankUpdateReq{}
  32. SendRankService(msg)
  33. util.ErrorF("tower rank refresh time:%v", nowTime)
  34. //this.refreshTime = nowTime
  35. this.seasonEndTime = this.seasonEndTime.AddDate(0, 0, 7)
  36. }
  37. // 成功发送消息返回true
  38. func (this *TowerManager) initTowerWjInfoFromDB() bool {
  39. //util.InfoF("initCompetitionInfoFromDB send to db")
  40. ssReqMsg := &serverproto.SSGetServerCompetitionReq{}
  41. if SendDb(ssReqMsg) {
  42. return true
  43. }
  44. return false
  45. }
  46. // 获取当前已经开启的赛季ID(from db)
  47. func (this *TowerManager) DoUpdateTowerInfoFromDB(ssAckMsg *serverproto.SSGetServerCompetitionAck) {
  48. this.initFromDb2 = true
  49. if ssAckMsg.TowerInfo != nil {
  50. TowerMag.day = ssAckMsg.TowerInfo.Day
  51. TowerMag.isRefresh = ssAckMsg.TowerInfo.IsRefresh
  52. }
  53. }
  54. func getThisWeekendAt23PM() time.Time {
  55. now := time.Now()
  56. // 计算到本周日的天数差(Sunday=0,Monday=1...)
  57. daysUntilSunday := (7 - int(now.Weekday())) % 7
  58. // 本周日 23:00:00
  59. weekendAt23PM := time.Date(
  60. now.Year(),
  61. now.Month(),
  62. now.Day()+daysUntilSunday, // 跳到周日
  63. 23, 0, 0, 0, // 23:00:00
  64. now.Location(),
  65. )
  66. return weekendAt23PM
  67. }
  68. func (this *TowerManager) getSeasonTime(seasonId int32) (time.Time, time.Time) {
  69. resetTime := int64((model.ConvertArenaSeason.Reset + 1) * HourMs)
  70. diffDurationDay := model.ConvertArenaSeason.DiffDurationDay
  71. deltaTime := (diffDurationDay + resetTime) * int64(seasonId-1)
  72. loc := util.GetLoc()
  73. startTime := time.Unix(model.ConvertArenaSeason.StartTime.Unix()+deltaTime, 0).In(loc)
  74. endTime := time.Unix(model.ConvertArenaSeason.EndTime.Unix()+deltaTime, 0).In(loc)
  75. return startTime, endTime
  76. }
  77. func (this *TowerManager) Update(ms uint64) {
  78. if !this.initStartUp {
  79. //获取本周星期weekday的时间戳作为排行榜刷新时间
  80. this.seasonEndTime = getThisWeekendAt23PM()
  81. this.initStartUp = true
  82. }
  83. if !this.initFromDb {
  84. if this.initTowerWjInfoFromDB() {
  85. this.initFromDb = true
  86. }
  87. return
  88. }
  89. if !this.initFromDb2 {
  90. this.initFromDb = false
  91. return
  92. }
  93. this.init(ms)
  94. //if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
  95. // if len(ServerStateCacheList) <= 0 {
  96. // ssStateMsg := &serverproto.SSGetGServerStateReq{
  97. // ServerType: model.SERVICE_NODE_TYPE_GLOBALCROSSMAP,
  98. // }
  99. // SendSocial(ssStateMsg)
  100. // }
  101. //}
  102. }
  103. func (this *TowerManager) GetRankReward(role uint64, selfRank int32) {
  104. if selfRank <= 0 || role == 0 {
  105. return
  106. }
  107. //获取排名奖励,发送邮件
  108. for _, data := range model.ConvertTowerWjRankInfo[this.day] {
  109. if selfRank >= data.Left && selfRank <= data.Right {
  110. itemList := make([]*serverproto.KeyValueType, 0)
  111. for k, v := range data.RewardList {
  112. itemList = append(itemList, &serverproto.KeyValueType{
  113. Key: k,
  114. Value: v,
  115. })
  116. }
  117. //发送邮件
  118. AddMailOnlineAndOffline([]uint64{role}, model.GlobalMailyuanhangRankAward, int32(serverproto.MailType_MailType_GM),
  119. itemList, []int32{int32(util.GetTimeSeconds())}, "无尽爬塔排行榜奖励", "恭喜您在无尽爬塔中獲得了第"+strconv.FormatInt(int64(selfRank), 10)+"名")
  120. //判断是否有玩家达到1000层,到了周期难度+1
  121. if this.isRefresh {
  122. this.day++
  123. this.isRefresh = false
  124. ssNtfMsg := &serverproto.SSServerCompetitionInfoSaveNtf{
  125. TowerInfo: &serverproto.TowerRound{Day: this.day, IsRefresh: this.isRefresh},
  126. }
  127. SendDb(ssNtfMsg)
  128. }
  129. util.InfoF("send rank award uid:%v award:%v", role, itemList)
  130. break
  131. }
  132. }
  133. //
  134. //// 赛季第一名触发称号事件
  135. //var value int32 = 1
  136. //if selfRank != 1 {
  137. // value = role.roleTask.GetTypeCnt(int32(serverproto.TaskType_Eve_Arean_First)) * -1
  138. //} else {
  139. // TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First_Cnt, 1)
  140. //}
  141. //role.roleTask.AddTypeCnt(serverproto.TaskType_Eve_Arean_First, value)
  142. //TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First, rewardSeasonId)
  143. }