| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- 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()
- }
|