activity_manager.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. )
  8. //精彩活动管理
  9. type ActivitiesManager struct {
  10. updateTimer util.ServerTimer //更新定时器
  11. initStartUp bool
  12. OpenedList map[int32]*model.ConvertActivitiesData
  13. unopenedList map[int32]*model.ConvertActivitiesData
  14. RoleActivitiesList map[int32]*model.ConvertActivitiesData //相对角色创建时间
  15. RoleSystemActList map[int32]*model.ConvertActivitiesData //根据玩家开启系统决定活动开启时间
  16. //过期后的活动是否强制开启(之前没有开启过,只针对相对开服时间开启的活动类型,立即开启)
  17. ExpiredActivitiesList map[int32]*model.ConvertActivitiesData
  18. //砸蛋大奖记录
  19. SmashEggsMsgList []*serverproto.SystemMessage
  20. }
  21. func newActivitiesMag() *ActivitiesManager {
  22. mag := &ActivitiesManager{
  23. OpenedList: map[int32]*model.ConvertActivitiesData{},
  24. unopenedList: map[int32]*model.ConvertActivitiesData{},
  25. RoleActivitiesList: map[int32]*model.ConvertActivitiesData{},
  26. RoleSystemActList: map[int32]*model.ConvertActivitiesData{},
  27. ExpiredActivitiesList: map[int32]*model.ConvertActivitiesData{},
  28. }
  29. mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 5000)
  30. return mag
  31. }
  32. func (this *ActivitiesManager) init(ms, startUptime uint64) {
  33. if this.initStartUp {
  34. return
  35. }
  36. this.initStartUp = true
  37. nowTimeDate := util.GetTimeByUint64(ms)
  38. for _, val := range model.ConvertActivitiesList {
  39. //根据合服标记判断是否需要加入活动队列中(合服活动)
  40. if val.ServiceMark > 0 && !this.isCombineServiceActivity(val.Id) {
  41. continue
  42. }
  43. switch val.TimeType {
  44. case model.ActivitiesTime_Type_Global: //绝对时间
  45. val.CalStartTime = val.StartTime
  46. val.CalEndTime = val.EndTime
  47. val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
  48. case model.ActivitiesTime_Type_Server: //相对开服时间
  49. //当前天凌晨开服要到5点后才算开服的第一天为开始时间
  50. //根据开服时间endday-startday(持续时间)
  51. //startUpDayTime1 := util.GetTimeByUint64(startUptime)
  52. startUpDayTime2 := util.GetDayByTimeStr2(startUptime)
  53. tmpSTime1 := startUpDayTime2
  54. if val.StartDay > 1 {
  55. tmpSTime1 = tmpSTime1.AddDate(0, 0, val.StartDay-1)
  56. }
  57. tempSTime := util.GetTimeByStr(tmpSTime1.Format(util.DATE_FORMAT1) + " " + val.StartTimeStr) //开始时间
  58. tmpSTime2 := startUpDayTime2
  59. if val.EndDay > 1 {
  60. tmpSTime2 = tmpSTime2.AddDate(0, 0, val.EndDay-1)
  61. }
  62. tempETime := util.GetTimeByStr(tmpSTime2.Format(util.DATE_FORMAT1) + " " + val.EndTimeStr) //结束时间
  63. //util.DebugF("id=%v stime=%v etime=%v proc", val.Id, tempSTime, tempETime)
  64. val.CalStartTime = tempSTime
  65. val.CalEndTime = tempETime
  66. val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
  67. case model.ActivitiesTime_Type_Role: //相对创建角色时间
  68. this.RoleActivitiesList[val.Id] = val
  69. case model.ActivitiesTime_Type_System: //根据玩家开启系统决定活动开启时间
  70. this.RoleSystemActList[val.Id] = val
  71. }
  72. if val.TimeType != model.ActivitiesTime_Type_Role &&
  73. val.TimeType != model.ActivitiesTime_Type_System {
  74. //永久活动时间/过期需要重新开启
  75. if val.TimeType == model.ActivitiesTime_Type_None {
  76. this.OpenedList[val.Id] = val
  77. util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
  78. continue
  79. }
  80. //活动结束
  81. if nowTimeDate.After(val.CalEndTime) {
  82. //过期需要重新开启的活动放到ExpiredActivitiesList列表中
  83. if val.ExpiredActivities {
  84. this.ExpiredActivitiesList[val.Id] = val
  85. }
  86. continue
  87. }
  88. //未开启活动
  89. if nowTimeDate.Before(val.CalStartTime) {
  90. this.unopenedList[val.Id] = val
  91. continue
  92. }
  93. this.OpenedList[val.Id] = val
  94. util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
  95. }
  96. }
  97. }
  98. func (this *ActivitiesManager) Update(ms uint64) {
  99. if !this.initStartUp {
  100. startUpTime := service.GetServiceStartupTime()
  101. if startUpTime > 0 {
  102. this.init(ms, startUpTime)
  103. }
  104. }
  105. if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
  106. nowTimeDate := util.GetTimeByUint64(ms)
  107. if len(this.unopenedList) > 0 {
  108. //新开启活动
  109. var newOpenList []*model.ConvertActivitiesData
  110. for _, val := range this.unopenedList {
  111. //判断是否超过最后开启时间的活动
  112. if val.TerminalOpenTimeStr != "" &&
  113. nowTimeDate.After(val.TerminalOpenTime) {
  114. delete(this.unopenedList, val.Id)
  115. continue
  116. }
  117. if nowTimeDate.After(val.CalEndTime) {
  118. delete(this.unopenedList, val.Id)
  119. continue
  120. }
  121. if nowTimeDate.After(val.CalStartTime) {
  122. delete(this.unopenedList, val.Id)
  123. this.OpenedList[val.Id] = val
  124. newOpenList = append(newOpenList, val)
  125. }
  126. }
  127. if len(newOpenList) > 0 {
  128. this.DoActivitiesOpenNtf(newOpenList, ms)
  129. }
  130. }
  131. }
  132. }
  133. //获取开放的精彩活动列表
  134. func (this *ActivitiesManager) GetOpenList(openList *[]*serverproto.ActivitiesData) {
  135. nowTime := util.GetCurrentTimeNow()
  136. for _, val := range this.OpenedList {
  137. if nowTime.After(val.CalStartTime) && nowTime.Before(val.CalEndTime) {
  138. tmpData := &serverproto.ActivitiesData{
  139. Id: val.Id,
  140. Type: val.ActivityType,
  141. Bg: val.BG,
  142. EndTime: val.CalEndTimeMs,
  143. }
  144. *openList = append(*openList, tmpData)
  145. } else {
  146. delete(this.OpenedList, val.Id)
  147. }
  148. }
  149. }
  150. //活动开启服务器主动通知
  151. func (this *ActivitiesManager) DoActivitiesOpenNtf(newOpenList []*model.ConvertActivitiesData, ms uint64) {
  152. ntfMsg := &serverproto.SCActivitiesOpenListNtf{}
  153. for idx := 0; idx < len(newOpenList); idx++ {
  154. tmpData := &serverproto.ActivitiesData{
  155. Id: newOpenList[idx].Id,
  156. Type: newOpenList[idx].ActivityType,
  157. Bg: newOpenList[idx].BG,
  158. EndTime: newOpenList[idx].CalEndTimeMs,
  159. }
  160. ntfMsg.ActivityList = append(ntfMsg.ActivityList, tmpData)
  161. }
  162. curDayEndTime := util.GetLatest5Hour()
  163. for _, chRole := range RoleMag.channelRoleList {
  164. if chRole.GetState() != ROLE_STATE_ONLINE {
  165. continue
  166. }
  167. ntfDetailMsg := &serverproto.SCActivitiesChangeNtf{
  168. CurDayEndTime: curDayEndTime,
  169. }
  170. for idx := 0; idx < len(newOpenList); idx++ {
  171. ret, detailInfo := chRole.(*Role).GetRoleActivity().OpenNewActivities(newOpenList[idx], ms, false)
  172. if ret {
  173. ntfDetailMsg.ActivityDataList = append(ntfDetailMsg.ActivityDataList, detailInfo)
  174. }
  175. }
  176. chRole.ReplayGate(ntfMsg, true)
  177. chRole.ReplayGate(ntfDetailMsg, true)
  178. }
  179. }
  180. //当前合服后的服务器是否开启该合服活动
  181. func (this *ActivitiesManager) isCombineServiceActivity(activityId int32) bool {
  182. //合服后的逻辑区服ID
  183. combineServiceZone := service.GetServiceConfig().Node.Zone
  184. cfgData, ok := serverproto.ServiceRecordCfgLoader[int32(combineServiceZone)]
  185. if !ok {
  186. return false
  187. }
  188. for idx := 0; idx < len(cfgData.ActivitiesId); idx++ {
  189. openActivityId, _ := model.Str2Num(cfgData.ActivitiesId[idx])
  190. if openActivityId == int(activityId) {
  191. return true
  192. }
  193. }
  194. return false
  195. }