package mapSeason import ( capp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/data" "f1-game/internal/extend/times" nameActor "f1-game/internal/name/actor" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/nodes/map/internal/db" "f1-game/nodes/map/season/seasonQuest" "time" ctime "github.com/cherry-game/cherry/extend/time" clog "github.com/cherry-game/cherry/logger" "github.com/cherry-game/cherry/net/parser/pomelo" ) type ( actor struct { pomelo.ActorBase } ) func NewActor() *actor { actor := &actor{} return actor } func (p *actor) AliasID() string { return nameActor.Map_Season } func (p *actor) OnInit() { p.initSeason() seasonQuest.Service().InitEvents(p.Event()) p.Remote().Register(nameRemote.MapSeason_QuestInfo, p.QuestInfo) p.Remote().Register(nameRemote.MapSeason_QuestCheck, p.QuestCheck) p.Timer().Add(3*time.Second, p.every3STimer) } func (p *actor) initSeason() { seasonTable := db.GetSeasonTable(capp.NodeID()) if seasonTable.StartTime > 0 { return } openTimeStr := data.Const.MapSeasonOpenTime if openTimeStr == "" { clog.Warn("[initSeason] MapSeasonOpenTime is empty") return } openTime, err := times.ParseDateFormat(openTimeStr) if err != nil { clog.Warnf("[initSeason] parse MapSeasonOpenTime failed. time = %s, err = %v", openTimeStr, err) return } seasonOpenTime := ctime.NewSecond(openTime.Unix()) // TODO 赛季匹配还没有做,暂时用常量配置赛季开启时间 seasonTable.StartTime = seasonOpenTime.ToMillisecond() seasonTable.SeasonID = 0 seasonQuest.Service().OnInit(seasonTable) seasonTable.SetChangeData() seasonTable.Save2Queue() clog.Infof("[initSeason] season initialized. nodeID = %s, startTime = %s, seasonID = %d, curQuestID = %d", seasonTable.NodeID, seasonOpenTime.ToDateTimeFormat(), seasonTable.SeasonID, seasonTable.SeasonQuest.CurQuestID, ) } // every3STimer func (p *actor) every3STimer() { seasonTable := db.GetSeasonTable(capp.NodeID()) // 检查下一个赛季任务ID seasonQuest.Service().OnCheckNextID(seasonTable) // 定时保存 seasonTable.Save2Queue() } func (p *actor) QuestInfo(req *pb.I32I64Map) (*pb.SeasonQuestInfo, int32) { var ( questLeagueIDMap = req.Value // 霸业任务和对应的联盟ID seasonTable = db.GetSeasonTable(capp.NodeID()) ) seasonQuestInfo := seasonTable.SeasonQuest.ToProto(questLeagueIDMap) for _, quest := range seasonQuestInfo.Quests { quest.TargetProgress = seasonQuest.Service().GetTargetProgress(quest.QuestID) // 防止进度超过目标进度 if quest.Progress > quest.TargetProgress { quest.Progress = quest.TargetProgress } } return seasonQuestInfo, code.OK } func (p *actor) QuestCheck(req *pb.I32I64) int32 { var ( questID = req.Key // 霸业任务ID leagueID = req.Value // 联盟ID seasonTable = db.GetSeasonTable(capp.NodeID()) nowMillis = ctime.Now().ToMillisecond() ) if !data.SeasonQuest.ContainID(questID) { return code.ConfigNotFound_SeasonQuest } quest, found := seasonTable.SeasonQuest.Quests.Get(questID) if !found { return code.IllegalArgument } if !quest.IsEnded(nowMillis) { return code.SeasonQuest_NotEnded } // 获取目标进度 targetProgress := seasonQuest.Service().GetTargetProgress(quest.QuestID) if quest.GetProgress(leagueID) < targetProgress { return code.SeasonQuestNotComplete } return code.OK }