tower_manager.go 5.0 KB

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