package model import ( "rocommon/util" "roserver/baseserver/model" "roserver/serverproto" "time" ) type TowerManager struct { updateTimer util.ServerTimer //更新定时器 initStartUp bool seasonStartTime, seasonEndTime time.Time refreshTime time.Time day int32 //周期 isRefresh bool //已经有玩家到达1000层可以增加周期 initFromDb bool initFromDb2 bool } func newTowerMag() *TowerManager { mag := &TowerManager{ day: 1, } mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 5000) return mag } func (this *TowerManager) init(ms uint64) { nowTime := util.GetTimeByUint64(ms) if nowTime.Before(this.seasonEndTime) { return } msg := &serverproto.SSTowerWjRankUpdateReq{} SendRankService(msg) util.ErrorF("tower rank refresh time:%v now day:%v isFresh:%v", nowTime, this.day, this.isRefresh) //this.refreshTime = nowTime this.seasonEndTime = this.seasonEndTime.AddDate(0, 0, 7) } // 成功发送消息返回true func (this *TowerManager) initTowerWjInfoFromDB() bool { //util.InfoF("initCompetitionInfoFromDB send to db") ssReqMsg := &serverproto.SSGetServerCompetitionReq{} if SendDb(ssReqMsg) { return true } return false } // 获取当前已经开启的赛季ID(from db) func (this *TowerManager) DoUpdateTowerInfoFromDB(ssAckMsg *serverproto.SSGetServerCompetitionAck) { this.initFromDb2 = true if ssAckMsg.TowerInfo != nil { TowerMag.day = ssAckMsg.TowerInfo.Day TowerMag.isRefresh = ssAckMsg.TowerInfo.IsRefresh } } func getThisWeekendAt23PM() time.Time { now := time.Now() // 计算到本周日的天数差(Sunday=0,Monday=1...) daysUntilSunday := (7 - int(now.Weekday())) % 7 // 本周日 23:00:00 weekendAt23PM := time.Date( now.Year(), now.Month(), now.Day()+daysUntilSunday, // 跳到周日 23, 0, 0, 0, // 23:00:00 now.Location(), ) return weekendAt23PM } func (this *TowerManager) getSeasonTime(seasonId int32) (time.Time, time.Time) { resetTime := int64((model.ConvertArenaSeason.Reset + 1) * HourMs) diffDurationDay := model.ConvertArenaSeason.DiffDurationDay deltaTime := (diffDurationDay + resetTime) * int64(seasonId-1) loc := util.GetLoc() startTime := time.Unix(model.ConvertArenaSeason.StartTime.Unix()+deltaTime, 0).In(loc) endTime := time.Unix(model.ConvertArenaSeason.EndTime.Unix()+deltaTime, 0).In(loc) return startTime, endTime } func (this *TowerManager) Update(ms uint64) { if !this.initStartUp { //获取本周星期weekday的时间戳作为排行榜刷新时间 this.seasonEndTime = getThisWeekendAt23PM() this.initStartUp = true } if !this.initFromDb { if this.initTowerWjInfoFromDB() { this.initFromDb = true } return } if !this.initFromDb2 { this.initFromDb = false return } this.init(ms) //if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) { // if len(ServerStateCacheList) <= 0 { // ssStateMsg := &serverproto.SSGetGServerStateReq{ // ServerType: model.SERVICE_NODE_TYPE_GLOBALCROSSMAP, // } // SendSocial(ssStateMsg) // } //} } func (this *TowerManager) GetRankReward(role uint64, selfRank int32) { if selfRank <= 0 || role == 0 { return } //获取排名奖励,发送邮件 //for _, data := range model.ConvertTowerWjRankInfo[this.day] { // if selfRank >= data.Left && selfRank <= data.Right { // itemList := make([]*serverproto.KeyValueType, 0) // for k, v := range data.RewardList { // itemList = append(itemList, &serverproto.KeyValueType{ // Key: k, // Value: v, // }) // } // //发送邮件 // AddMailOnlineAndOffline([]uint64{role}, model.GlobalMailyuanhangRankAward, int32(serverproto.MailType_MailType_GM), // itemList, []int32{int32(util.GetTimeSeconds())}, "无尽爬塔排行榜奖励", "恭喜您在无尽爬塔中獲得了第"+strconv.FormatInt(int64(selfRank), 10)+"名") // //判断是否有玩家达到1000层,到了周期难度+1 // if this.isRefresh { // this.day++ // this.isRefresh = false // ssNtfMsg := &serverproto.SSServerCompetitionInfoSaveNtf{ // TowerInfo: &serverproto.TowerRound{Day: this.day, IsRefresh: this.isRefresh}, // } // SendDb(ssNtfMsg) // } // util.InfoF("send rank award uid:%v award:%v", role, itemList) // break // } //} // //// 赛季第一名触发称号事件 //var value int32 = 1 //if selfRank != 1 { // value = role.roleTask.GetTypeCnt(int32(serverproto.TaskType_Eve_Arean_First)) * -1 //} else { // TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First_Cnt, 1) //} //role.roleTask.AddTypeCnt(serverproto.TaskType_Eve_Arean_First, value) //TaskMagCheck(role, serverproto.TaskType_Eve_Arean_First, rewardSeasonId) }