activity_manager.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. if val.EndTimeStr != "" {
  47. val.CalEndTime = val.EndTime
  48. val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
  49. }
  50. case model.ActivitiesTime_Type_Server: //相对开服时间
  51. //当前天凌晨开服要到5点后才算开服的第一天为开始时间
  52. //根据开服时间endday-startday(持续时间)
  53. //startUpDayTime1 := util.GetTimeByUint64(startUptime)
  54. startUpDayTime2 := util.GetDayByTimeStr2(startUptime)
  55. tmpSTime1 := startUpDayTime2
  56. if val.StartDay > 1 {
  57. tmpSTime1 = tmpSTime1.AddDate(0, 0, val.StartDay-1)
  58. }
  59. tempSTime := util.GetTimeByStr(tmpSTime1.Format(util.DATE_FORMAT1) + " " + val.StartTimeStr) //开始时间
  60. val.CalStartTime = tempSTime
  61. if val.EndTimeStr != "" {
  62. tmpSTime2 := startUpDayTime2
  63. if val.EndDay > 1 {
  64. tmpSTime2 = tmpSTime2.AddDate(0, 0, val.EndDay-1)
  65. }
  66. tempETime := util.GetTimeByStr(tmpSTime2.Format(util.DATE_FORMAT1) + " " + val.EndTimeStr) //结束时间
  67. //util.DebugF("id=%v stime=%v etime=%v proc", val.Id, tempSTime, tempETime)
  68. val.CalEndTime = tempETime
  69. val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
  70. }
  71. case model.ActivitiesTime_Type_Role: //相对创建角色时间
  72. this.RoleActivitiesList[val.Id] = val
  73. case model.ActivitiesTime_Type_System: //根据玩家开启系统决定活动开启时间
  74. this.RoleSystemActList[val.Id] = val
  75. }
  76. if val.TimeType != model.ActivitiesTime_Type_Role &&
  77. val.TimeType != model.ActivitiesTime_Type_System {
  78. //永久活动时间/过期需要重新开启
  79. if val.TimeType == model.ActivitiesTime_Type_None {
  80. this.OpenedList[val.Id] = val
  81. util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
  82. continue
  83. }
  84. //活动结束
  85. if val.EndTimeStr != "" && nowTimeDate.After(val.CalEndTime) {
  86. //过期需要重新开启的活动放到ExpiredActivitiesList列表中
  87. if val.ExpiredActivities {
  88. this.ExpiredActivitiesList[val.Id] = val
  89. }
  90. continue
  91. }
  92. //未开启活动
  93. if nowTimeDate.Before(val.CalStartTime) {
  94. this.unopenedList[val.Id] = val
  95. continue
  96. }
  97. this.OpenedList[val.Id] = val
  98. util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
  99. }
  100. }
  101. }
  102. func (this *ActivitiesManager) Update(ms uint64) {
  103. if !this.initStartUp {
  104. startUpTime := service.GetServiceStartupTime()
  105. if startUpTime > 0 {
  106. this.init(ms, startUpTime)
  107. }
  108. }
  109. if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
  110. nowTimeDate := util.GetTimeByUint64(ms)
  111. if len(this.unopenedList) > 0 {
  112. //新开启活动
  113. var newOpenList []*model.ConvertActivitiesData
  114. for _, val := range this.unopenedList {
  115. //判断是否超过最后开启时间的活动
  116. if val.TerminalOpenTimeStr != "" &&
  117. nowTimeDate.After(val.TerminalOpenTime) {
  118. delete(this.unopenedList, val.Id)
  119. continue
  120. }
  121. //EndTimeStr==""表示无结束时间
  122. if val.EndTimeStr != "" && nowTimeDate.After(val.CalEndTime) {
  123. delete(this.unopenedList, val.Id)
  124. continue
  125. }
  126. if nowTimeDate.After(val.CalStartTime) {
  127. delete(this.unopenedList, val.Id)
  128. this.OpenedList[val.Id] = val
  129. newOpenList = append(newOpenList, val)
  130. }
  131. }
  132. if len(newOpenList) > 0 {
  133. this.DoActivitiesOpenNtf(newOpenList, ms)
  134. }
  135. }
  136. }
  137. }
  138. //获取开放的精彩活动列表
  139. func (this *ActivitiesManager) GetOpenList(openList *[]*serverproto.ActivitiesData) {
  140. nowTime := util.GetCurrentTimeNow()
  141. for _, val := range this.OpenedList {
  142. if nowTime.After(val.CalStartTime) && (nowTime.Before(val.CalEndTime) || val.EndTimeStr == "") {
  143. tmpData := &serverproto.ActivitiesData{
  144. Id: val.Id,
  145. Type: val.ActivityType,
  146. Bg: val.BG,
  147. EndTime: val.CalEndTimeMs,
  148. }
  149. *openList = append(*openList, tmpData)
  150. } else {
  151. delete(this.OpenedList, val.Id)
  152. }
  153. }
  154. }
  155. //活动开启服务器主动通知
  156. func (this *ActivitiesManager) DoActivitiesOpenNtf(newOpenList []*model.ConvertActivitiesData, ms uint64) {
  157. ntfMsg := &serverproto.SCActivitiesOpenListNtf{}
  158. for idx := 0; idx < len(newOpenList); idx++ {
  159. tmpData := &serverproto.ActivitiesData{
  160. Id: newOpenList[idx].Id,
  161. Type: newOpenList[idx].ActivityType,
  162. Bg: newOpenList[idx].BG,
  163. EndTime: newOpenList[idx].CalEndTimeMs,
  164. }
  165. ntfMsg.ActivityList = append(ntfMsg.ActivityList, tmpData)
  166. }
  167. curDayEndTime := util.GetLatest5Hour()
  168. for _, chRole := range RoleMag.channelRoleList {
  169. if chRole.GetState() != ROLE_STATE_ONLINE {
  170. continue
  171. }
  172. ntfDetailMsg := &serverproto.SCActivitiesChangeNtf{
  173. CurDayEndTime: curDayEndTime,
  174. }
  175. for idx := 0; idx < len(newOpenList); idx++ {
  176. ret, detailInfo := chRole.(*Role).GetRoleActivity().OpenNewActivities(newOpenList[idx], ms, false)
  177. if ret {
  178. ntfDetailMsg.ActivityDataList = append(ntfDetailMsg.ActivityDataList, detailInfo)
  179. }
  180. }
  181. chRole.ReplayGate(ntfMsg, true)
  182. chRole.ReplayGate(ntfDetailMsg, true)
  183. }
  184. }
  185. //当前合服后的服务器是否开启该合服活动
  186. func (this *ActivitiesManager) isCombineServiceActivity(activityId int32) bool {
  187. //合服后的逻辑区服ID
  188. combineServiceZone := service.GetServiceConfig().Node.Zone
  189. cfgData, ok := serverproto.ServiceRecordCfgLoader[int32(combineServiceZone)]
  190. if !ok {
  191. return false
  192. }
  193. for idx := 0; idx < len(cfgData.ActivitiesId); idx++ {
  194. openActivityId, _ := model.Str2Num(cfgData.ActivitiesId[idx])
  195. if openActivityId == int(activityId) {
  196. return true
  197. }
  198. }
  199. return false
  200. }