| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- package model
- import (
- "rocommon/service"
- "rocommon/util"
- "roserver/baseserver/model"
- "roserver/serverproto"
- )
- //精彩活动管理
- type ActivitiesManager struct {
- updateTimer util.ServerTimer //更新定时器
- initStartUp bool
- OpenedList map[int32]*model.ConvertActivitiesData
- unopenedList map[int32]*model.ConvertActivitiesData
- RoleActivitiesList map[int32]*model.ConvertActivitiesData //相对角色创建时间
- RoleSystemActList map[int32]*model.ConvertActivitiesData //根据玩家开启系统决定活动开启时间
- //过期后的活动是否强制开启(之前没有开启过,只针对相对开服时间开启的活动类型,立即开启)
- ExpiredActivitiesList map[int32]*model.ConvertActivitiesData
- //砸蛋大奖记录
- SmashEggsMsgList []*serverproto.SystemMessage
- }
- func newActivitiesMag() *ActivitiesManager {
- mag := &ActivitiesManager{
- OpenedList: map[int32]*model.ConvertActivitiesData{},
- unopenedList: map[int32]*model.ConvertActivitiesData{},
- RoleActivitiesList: map[int32]*model.ConvertActivitiesData{},
- RoleSystemActList: map[int32]*model.ConvertActivitiesData{},
- ExpiredActivitiesList: map[int32]*model.ConvertActivitiesData{},
- }
- mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 5000)
- return mag
- }
- func (this *ActivitiesManager) init(ms, startUptime uint64) {
- if this.initStartUp {
- return
- }
- this.initStartUp = true
- nowTimeDate := util.GetTimeByUint64(ms)
- for _, val := range model.ConvertActivitiesList {
- //根据合服标记判断是否需要加入活动队列中(合服活动)
- if val.ServiceMark > 0 && !this.isCombineServiceActivity(val.Id) {
- continue
- }
- switch val.TimeType {
- case model.ActivitiesTime_Type_Global: //绝对时间
- val.CalStartTime = val.StartTime
- val.CalEndTime = val.EndTime
- val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
- case model.ActivitiesTime_Type_Server: //相对开服时间
- //当前天凌晨开服要到5点后才算开服的第一天为开始时间
- //根据开服时间endday-startday(持续时间)
- //startUpDayTime1 := util.GetTimeByUint64(startUptime)
- startUpDayTime2 := util.GetDayByTimeStr2(startUptime)
- tmpSTime1 := startUpDayTime2
- if val.StartDay > 1 {
- tmpSTime1 = tmpSTime1.AddDate(0, 0, val.StartDay-1)
- }
- tempSTime := util.GetTimeByStr(tmpSTime1.Format(util.DATE_FORMAT1) + " " + val.StartTimeStr) //开始时间
- tmpSTime2 := startUpDayTime2
- if val.EndDay > 1 {
- tmpSTime2 = tmpSTime2.AddDate(0, 0, val.EndDay-1)
- }
- tempETime := util.GetTimeByStr(tmpSTime2.Format(util.DATE_FORMAT1) + " " + val.EndTimeStr) //结束时间
- //util.DebugF("id=%v stime=%v etime=%v proc", val.Id, tempSTime, tempETime)
- val.CalStartTime = tempSTime
- val.CalEndTime = tempETime
- val.CalEndTimeMs = uint64(val.CalEndTime.UnixNano() / 1e6)
- case model.ActivitiesTime_Type_Role: //相对创建角色时间
- this.RoleActivitiesList[val.Id] = val
- case model.ActivitiesTime_Type_System: //根据玩家开启系统决定活动开启时间
- this.RoleSystemActList[val.Id] = val
- }
- if val.TimeType != model.ActivitiesTime_Type_Role &&
- val.TimeType != model.ActivitiesTime_Type_System {
- //永久活动时间/过期需要重新开启
- if val.TimeType == model.ActivitiesTime_Type_None {
- this.OpenedList[val.Id] = val
- util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
- continue
- }
- //活动结束
- if nowTimeDate.After(val.CalEndTime) {
- //过期需要重新开启的活动放到ExpiredActivitiesList列表中
- if val.ExpiredActivities {
- this.ExpiredActivitiesList[val.Id] = val
- }
- continue
- }
- //未开启活动
- if nowTimeDate.Before(val.CalStartTime) {
- this.unopenedList[val.Id] = val
- continue
- }
- this.OpenedList[val.Id] = val
- util.DebugF("id=%v stime=%v etime=%v open", val.Id, val.CalStartTime, val.CalEndTime)
- }
- }
- }
- func (this *ActivitiesManager) Update(ms uint64) {
- if !this.initStartUp {
- startUpTime := service.GetServiceStartupTime()
- if startUpTime > 0 {
- this.init(ms, startUpTime)
- }
- }
- if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
- nowTimeDate := util.GetTimeByUint64(ms)
- if len(this.unopenedList) > 0 {
- //新开启活动
- var newOpenList []*model.ConvertActivitiesData
- for _, val := range this.unopenedList {
- //判断是否超过最后开启时间的活动
- if val.TerminalOpenTimeStr != "" &&
- nowTimeDate.After(val.TerminalOpenTime) {
- delete(this.unopenedList, val.Id)
- continue
- }
- if nowTimeDate.After(val.CalEndTime) {
- delete(this.unopenedList, val.Id)
- continue
- }
- if nowTimeDate.After(val.CalStartTime) {
- delete(this.unopenedList, val.Id)
- this.OpenedList[val.Id] = val
- newOpenList = append(newOpenList, val)
- }
- }
- if len(newOpenList) > 0 {
- this.DoActivitiesOpenNtf(newOpenList, ms)
- }
- }
- }
- }
- //获取开放的精彩活动列表
- func (this *ActivitiesManager) GetOpenList(openList *[]*serverproto.ActivitiesData) {
- nowTime := util.GetCurrentTimeNow()
- for _, val := range this.OpenedList {
- if nowTime.After(val.CalStartTime) && nowTime.Before(val.CalEndTime) {
- tmpData := &serverproto.ActivitiesData{
- Id: val.Id,
- Type: val.ActivityType,
- Bg: val.BG,
- EndTime: val.CalEndTimeMs,
- }
- *openList = append(*openList, tmpData)
- } else {
- delete(this.OpenedList, val.Id)
- }
- }
- }
- //活动开启服务器主动通知
- func (this *ActivitiesManager) DoActivitiesOpenNtf(newOpenList []*model.ConvertActivitiesData, ms uint64) {
- ntfMsg := &serverproto.SCActivitiesOpenListNtf{}
- for idx := 0; idx < len(newOpenList); idx++ {
- tmpData := &serverproto.ActivitiesData{
- Id: newOpenList[idx].Id,
- Type: newOpenList[idx].ActivityType,
- Bg: newOpenList[idx].BG,
- EndTime: newOpenList[idx].CalEndTimeMs,
- }
- ntfMsg.ActivityList = append(ntfMsg.ActivityList, tmpData)
- }
- curDayEndTime := util.GetLatest5Hour()
- for _, chRole := range RoleMag.channelRoleList {
- if chRole.GetState() != ROLE_STATE_ONLINE {
- continue
- }
- ntfDetailMsg := &serverproto.SCActivitiesChangeNtf{
- CurDayEndTime: curDayEndTime,
- }
- for idx := 0; idx < len(newOpenList); idx++ {
- ret, detailInfo := chRole.(*Role).GetRoleActivity().OpenNewActivities(newOpenList[idx], ms, false)
- if ret {
- ntfDetailMsg.ActivityDataList = append(ntfDetailMsg.ActivityDataList, detailInfo)
- }
- }
- chRole.ReplayGate(ntfMsg, true)
- chRole.ReplayGate(ntfDetailMsg, true)
- }
- }
- //当前合服后的服务器是否开启该合服活动
- func (this *ActivitiesManager) isCombineServiceActivity(activityId int32) bool {
- //合服后的逻辑区服ID
- combineServiceZone := service.GetServiceConfig().Node.Zone
- cfgData, ok := serverproto.ServiceRecordCfgLoader[int32(combineServiceZone)]
- if !ok {
- return false
- }
- for idx := 0; idx < len(cfgData.ActivitiesId); idx++ {
- openActivityId, _ := model.Str2Num(cfgData.ActivitiesId[idx])
- if openActivityId == int(activityId) {
- return true
- }
- }
- return false
- }
|