tower_manager.go 4.7 KB

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