arena_manager.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. "time"
  8. )
  9. const HourMs = 24 * 3600
  10. type ArenaSeasonManager struct {
  11. updateTimer util.ServerTimer //更新定时器
  12. curSeasonId, lastSeasonId int32
  13. seasonStartTime, seasonEndTime time.Time
  14. initStartUp bool
  15. startupTimeDate, nowTimeDate time.Time
  16. }
  17. func newArenaSeasonManager() *ArenaSeasonManager {
  18. mag := &ArenaSeasonManager{
  19. initStartUp: false,
  20. }
  21. mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 5000)
  22. return mag
  23. }
  24. func (this *ArenaSeasonManager) getDateByMils(val int64) time.Time {
  25. loc := util.GetLoc()
  26. tempTime := time.Unix(val, 0).In(loc)
  27. return time.Date(tempTime.Year(), tempTime.Month(), tempTime.Day(), 0, 0, 0, 0, loc)
  28. }
  29. func (this *ArenaSeasonManager) initSeasonTime(serviceStartUpTime uint64) {
  30. loc := util.GetLoc()
  31. //获取当前处于第几个赛季
  32. this.nowTimeDate = util.GetCurrentTimeNow()
  33. deltaTime := model.ConvertArenaSeason.DiffDurationDay + int64((model.ConvertArenaSeason.Reset+1)*24*3600)
  34. //startTime := model.ConvertArenaSeason.StartTime
  35. //endTime := model.ConvertArenaSeason.EndTime
  36. //根据开服时间计算赛季开始时间和结束时间
  37. _, startHourTimeStr := util.GetDayAndHourByTimeStr(model.ConvertArenaSeason.StartTimeStr)
  38. serviceStartUpDayTime := util.GetDayByTimeStr2(serviceStartUpTime)
  39. tmpStartTimeStr := serviceStartUpDayTime.Format(util.DATE_FORMAT1) + " " + startHourTimeStr
  40. startTime := util.GetTimeByStr(tmpStartTimeStr)
  41. util.DebugF("tmpStartTime=%v", startTime.String())
  42. _, endHourTimeStr := util.GetDayAndHourByTimeStr(model.ConvertArenaSeason.EndTimeStr)
  43. tmpEndTime := time.Unix(serviceStartUpDayTime.Unix()+model.ConvertArenaSeason.DiffDurationDay, 0).In(loc)
  44. tmpEndTimeStr := tmpEndTime.Format(util.DATE_FORMAT1) + " " + endHourTimeStr
  45. endTime := util.GetTimeByStr(tmpEndTimeStr)
  46. util.DebugF("tmpStartTime=%v", endTime.String())
  47. model.ConvertArenaSeason.StartTime = startTime
  48. model.ConvertArenaSeason.EndTime = endTime
  49. var seasonIdx int32 = 0
  50. //循环赛季
  51. for {
  52. seasonIdx++
  53. if this.nowTimeDate.After(startTime) && this.nowTimeDate.Before(endTime) {
  54. this.curSeasonId = seasonIdx
  55. this.seasonStartTime = startTime
  56. this.seasonEndTime = endTime
  57. util.ErrorF("curSeasonId=%v stime=%v etime=%v", seasonIdx, startTime.Unix(), endTime.Unix())
  58. break
  59. } else if this.nowTimeDate.Before(startTime) {
  60. break
  61. } else if this.nowTimeDate.After(endTime) {
  62. this.lastSeasonId = seasonIdx
  63. }
  64. startTime = time.Unix(startTime.Unix()+deltaTime, 0).In(loc)
  65. endTime = time.Unix(endTime.Unix()+deltaTime, 0).In(loc)
  66. }
  67. }
  68. func (this *ArenaSeasonManager) getNextSeasonTime() (time.Time, time.Time) {
  69. loc := util.GetLoc()
  70. if this.lastSeasonId <= 0 {
  71. return model.ConvertArenaSeason.StartTime, model.ConvertArenaSeason.EndTime
  72. } else {
  73. tempSeasonId := this.lastSeasonId
  74. if this.curSeasonId != 0 {
  75. tempSeasonId = this.curSeasonId
  76. }
  77. resetTime := int64((model.ConvertArenaSeason.Reset + 1) * HourMs)
  78. diffDurationDay := model.ConvertArenaSeason.DiffDurationDay
  79. deltaTime := (diffDurationDay + resetTime) * int64(tempSeasonId)
  80. startTime := time.Unix(model.ConvertArenaSeason.StartTime.Unix()+deltaTime, 0).In(loc)
  81. endTime := time.Unix(model.ConvertArenaSeason.EndTime.Unix()+deltaTime, 0).In(loc)
  82. return startTime, endTime
  83. }
  84. }
  85. func (this *ArenaSeasonManager) getSeasonTime(seasonId int32) (time.Time, time.Time) {
  86. resetTime := int64((model.ConvertArenaSeason.Reset + 1) * HourMs)
  87. diffDurationDay := model.ConvertArenaSeason.DiffDurationDay
  88. deltaTime := (diffDurationDay + resetTime) * int64(seasonId-1)
  89. loc := util.GetLoc()
  90. startTime := time.Unix(model.ConvertArenaSeason.StartTime.Unix()+deltaTime, 0).In(loc)
  91. endTime := time.Unix(model.ConvertArenaSeason.EndTime.Unix()+deltaTime, 0).In(loc)
  92. return startTime, endTime
  93. }
  94. func (this *ArenaSeasonManager) initSeason(serviceStartUpTime uint64) {
  95. if model.ConvertArenaSeason == nil {
  96. util.ErrorF("ConvertArenaSeason zone=%v data not found", service.GetServiceConfig().Node.Zone)
  97. return
  98. }
  99. loc := util.GetLoc()
  100. //ServiceStartTime
  101. this.startupTimeDate = time.Unix(int64(serviceStartUpTime/1000), 0).In(loc)
  102. //util.InfoF("ServiceStartTime=%v", this.startupTimeDate)
  103. this.initStartUp = true
  104. //获取当前处于第几个赛季
  105. this.initSeasonTime(serviceStartUpTime)
  106. }
  107. func (this *ArenaSeasonManager) Update(ms uint64) {
  108. if !this.initStartUp {
  109. startUpTime := service.GetServiceStartupTime()
  110. if startUpTime > 0 {
  111. this.initSeason(startUpTime)
  112. }
  113. }
  114. //赛季更新
  115. if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
  116. this.nowTimeDate = util.GetCurrentTimeNow()
  117. if this.curSeasonId > 0 {
  118. //logUtil.InfoF("curSeasonId:%v endTime:%v", this.curSeasonId, this.seasonEndTime)
  119. //赛季结算
  120. if this.nowTimeDate.After(this.seasonEndTime) {
  121. util.ErrorF("ServiceStartTimeReward curseasonid=%v seasonendtime=%v", this.curSeasonId, this.seasonEndTime)
  122. this.lastSeasonId = this.curSeasonId
  123. this.DoSeasonReward(this.curSeasonId)
  124. // this.lastSeasonId = this.curSeasonId
  125. this.curSeasonId = 0
  126. }
  127. } else {
  128. sTime, eTime := this.getNextSeasonTime()
  129. //开启新赛季
  130. //logUtil.InfoF("openNewSeason id:%v s:%v e:%v", this.lastSeasonId+1, sTime, eTime)
  131. if this.nowTimeDate.After(sTime) {
  132. util.ErrorF("ServiceStartTimeNewSeason lastseasonid=%v starttime=%v", this.lastSeasonId, sTime)
  133. this.curSeasonId = this.lastSeasonId + 1
  134. this.seasonStartTime = sTime
  135. this.seasonEndTime = eTime
  136. this.DoSeasonRefresh()
  137. }
  138. }
  139. }
  140. }
  141. func (this *ArenaSeasonManager) GetSeason() int32 {
  142. if this.curSeasonId <= 0 {
  143. return this.lastSeasonId
  144. }
  145. return this.curSeasonId
  146. }
  147. // 获取对应赛季奖励
  148. func (this *ArenaSeasonManager) GetSeasonReward(role *Role, selfRank, rewardSeasonId int32) {
  149. if selfRank <= 0 || role == nil || model.ConvertArenaSeason == nil {
  150. return
  151. }
  152. //获取排名奖励,发送邮件
  153. for _, data := range model.ConvertArenaSeason.RewardInfo {
  154. if selfRank >= data.Left && selfRank <= data.Right {
  155. //发送邮件
  156. role.GetRoleMail().AddMail(model.GlobalMailIdArenaTopReward, serverproto.MailType_MailType_Arena,
  157. data.RewardList, []int32{selfRank, rewardSeasonId}, "", "")
  158. break
  159. }
  160. }
  161. // 赛季第一名触发称号事件
  162. var value int32 = 1
  163. if selfRank != 1 {
  164. value = role.roleTask.GetTypeCnt(int32(serverproto.TaskType_Eve_Arean_First)) * -1
  165. } else {
  166. TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First_Cnt, 1)
  167. }
  168. role.roleTask.AddTypeCnt(serverproto.TaskType_Eve_Arean_First, value)
  169. TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First, rewardSeasonId)
  170. }
  171. // 赛季结算
  172. func (this *ArenaSeasonManager) DoSeasonReward(seasonId int32) {
  173. ssMsg := &serverproto.SSArenaRankUpdateReq{
  174. LastSeasonId: seasonId,
  175. }
  176. sendNum := 0
  177. for _, chRole := range RoleMag.channelRoleList {
  178. if chRole.GetState() != ROLE_STATE_ONLINE {
  179. continue
  180. }
  181. //段位奖励
  182. chRole.(*Role).GetRoleArena().ScoreLevelReward()
  183. //top排行奖励
  184. //if chRole.(*Role).GetRoleArena().arenaInfo.Score >= model.MinTopRankScore {
  185. if chRole.(*Role).GetRoleArena().arenaInfo.Score > 0 {
  186. ssMsg.RewardPlayerList = append(ssMsg.RewardPlayerList, chRole.GetUUid())
  187. sendNum++
  188. if sendNum >= 50 {
  189. SendRankService(ssMsg)
  190. sendNum = 0
  191. ssMsg.RewardPlayerList = ssMsg.RewardPlayerList[:0]
  192. }
  193. }
  194. }
  195. //rank处理结算数据
  196. SendRankService(ssMsg)
  197. }
  198. // 开启新赛季
  199. func (this *ArenaSeasonManager) DoSeasonRefresh() {
  200. for _, chRole := range RoleMag.channelRoleList {
  201. if chRole.GetState() == ROLE_STATE_ONLINE ||
  202. chRole.GetState() == ROLE_STATE_OFFLINE {
  203. chRole.(*Role).GetRoleArena().DoSeasonRefresh()
  204. }
  205. }
  206. }