package mapLeague import ( "f1-game/internal/data" "f1-game/nodes/map/internal/db" mapFacade "f1-game/nodes/map/internal/facade" leagueBase "f1-game/nodes/map/league/base" leagueStorage "f1-game/nodes/map/league/storage" "time" ctime "github.com/cherry-game/cherry/extend/time" cherryLogger "github.com/cherry-game/cherry/logger" ) func (p *actorLeague) startTimer() { //移除所有定时器 p.Timer().RemoveAll() // 添加跨天定时器 p.Timer().AddFixedHour(int(data.Const.ResetTime), 0, 0, p.onCrossDayTimer) // 添加每秒定时器 p.Timer().Add(1*time.Second, p.every1STimer) // 资源定时器 p.Timer().Add(3*time.Second, p.every3STimer) } func (p *actorLeague) onCrossDayTimer() { leagueTable, found := db.GetMapLeagueTable(p.leagueID) if !found { return } // 跨天重置 // TODO 联盟中记录上一次跨天/跨周的时间戳 mapFacade.LeagueServiceOnReset(leagueTable, false, false) } // oneSecondTimer 每1秒定时器 func (p *actorLeague) every1STimer() { nowSecond := ctime.Now().ToSecond() // 每日重置检查 p.dailyReset() // TODO 以下后续改到service中 // 盟主转让 p.leagueLeaderTransferTime(nowSecond) // 盟主弹劾 p.leagueImpeachTime(nowSecond) leagueBase.Service().LeagueDiplomacyTimer(p.leagueID, nowSecond) } // every3STimer 每3秒定时器 func (p *actorLeague) every3STimer() { nowSecond := ctime.Now().ToSecond() leagueStorage.Service().CheckAutoAdd(p.leagueID, nowSecond) } // 公会每日重置 func (p *actorLeague) dailyReset() { if !p.checkDailyReset() { return } p.leagueTable.DailyReset() mapLeagueStorageTable := db.GetMapLeagueStorageTable(p.leagueID) mapLeagueStorageTable.DailyReset() if mapLeagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID); found { mapLeagueMemberTable.DailyReset() } p.Info("dailyReset success.") // 每周重置 p.weekReset() } // 公会每周重置 func (p *actorLeague) weekReset() { // 每日重置逻辑检查通过,只需要判断当前时间是否是周一 if !ctime.NewSecond(p.leagueTable.DailyRefreshTime).IsMonday() { return } p.leagueTable.WeekReset() p.leagueTable.Save2Queue() mapLeagueStorageTable := db.GetMapLeagueStorageTable(p.leagueID) mapLeagueStorageTable.WeekReset() if mapLeagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID); found { mapLeagueMemberTable.WeekReset() } p.Info("weekReset success.") } // 公会每日重置检查 func (p *actorLeague) checkDailyReset() bool { // 根据最近一次刷新时间来计算下一次零点时间 nextZeroTime := ctime.NewSecond(p.leagueTable.DailyRefreshTime) nextZeroTime.SetHour(0) //TODO 零点可以配置在常量中 nextZeroTime.AddDays(1) // 当前时间 nowSec := ctime.Now().ToSecond() // 未达到刷新时间 if nowSec < nextZeroTime.ToSecond() { return false } // 设置刷新时间 p.leagueTable.DailyRefreshTime = nowSec return true } func (p *actorLeague) leagueLeaderTransferTime(nowSecond int64) { leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID) if !found { return } var ( playerID = leagueMemberTable.LeagueMember.Transfer.PlayerID endTime = leagueMemberTable.LeagueMember.Transfer.EndTime ) // 不存在转让玩家 if playerID <= 0 || nowSecond < endTime { return } if found = leagueMemberTable.LeagueMember.CheckMemberExist(playerID); found { leagueTable, found := db.GetMapLeagueTable(p.leagueID) if !found { p.Warn("leagueLeaderTransfer leagueTable not found leagueID = %v", p.leagueID) return } oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID leagueTable.LeagueInfo.LeaderID = playerID leagueTable.Save2Queue() // 获取旧盟主职位 leaderJobID := leagueMemberTable.GetLeagueMemberJob(oldLeaderPlayerID) leagueMemberTable.LeagueJob.Jobs[leaderJobID] = playerID // 职位变更通知 p.PermissionChangePush(leagueMemberTable, oldLeaderPlayerID, playerID) // 同步新盟主信息 leagueBase.Service().SyncLeagueLeaderChange(p.leagueID, playerID) } leagueMemberTable.SetLeagueTransfer(0, 0) leagueMemberTable.Save2Queue() } func (p *actorLeague) leagueImpeachTime(nowSecond int64) { leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID) if !found { return } if !leagueMemberTable.LeagueMember.CheckLeagueImpeachExist() { return } // 判断时间是否以达到 if nowSecond < leagueMemberTable.GetLeagueImpeachEndTime() { return } // 时间已到 获取弹劾人数 var ( agreeCount = int32(len(leagueMemberTable.Impeach.AgreePlayerIDs)) rejectCount = int32(len(leagueMemberTable.Impeach.RejectPlayerIDs)) newLeaderID = leagueMemberTable.Impeach.PlayerID needCount = leagueMemberTable.Impeach.Total / 2 ) // 同意人数大于反对的人数 且 当前同意的人数大于等于总可以投票的人数/2 弹劾成功 if rejectCount < agreeCount && agreeCount >= needCount { // 盟主转换 leagueTable, found := db.GetMapLeagueTable(p.leagueID) if !found { cherryLogger.Warnf("league impeach finish fail, league not found. leagueID:%d", p.leagueID) return } leagueTable.LeagueInfo.LeaderID = newLeaderID // 如果弹劾玩家存在职位 需要先卸载职位 leagueMemberTable.Resigned(newLeaderID) leagueTable.Save2Queue() // 同步新的盟主信息 leagueBase.Service().SyncLeagueLeaderChange(p.leagueID, newLeaderID) } // 不管是否弹劾成功 都需要清除弹劾数据 leagueMemberTable.LeagueImpeachClear(newLeaderID) leagueMemberTable.Save2Queue() }