actor.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package mapSeason
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/data"
  6. "f1-game/internal/extend/times"
  7. nameActor "f1-game/internal/name/actor"
  8. nameRemote "f1-game/internal/name/remote"
  9. "f1-game/internal/pb"
  10. "f1-game/nodes/map/internal/db"
  11. "f1-game/nodes/map/season/seasonQuest"
  12. "time"
  13. ctime "github.com/cherry-game/cherry/extend/time"
  14. clog "github.com/cherry-game/cherry/logger"
  15. "github.com/cherry-game/cherry/net/parser/pomelo"
  16. )
  17. type (
  18. actor struct {
  19. pomelo.ActorBase
  20. }
  21. )
  22. func NewActor() *actor {
  23. actor := &actor{}
  24. return actor
  25. }
  26. func (p *actor) AliasID() string {
  27. return nameActor.Map_Season
  28. }
  29. func (p *actor) OnInit() {
  30. p.initSeason()
  31. seasonQuest.Service().InitEvents(p.Event())
  32. p.Remote().Register(nameRemote.MapSeason_QuestInfo, p.QuestInfo)
  33. p.Remote().Register(nameRemote.MapSeason_QuestCheck, p.QuestCheck)
  34. p.Timer().Add(3*time.Second, p.every3STimer)
  35. }
  36. func (p *actor) initSeason() {
  37. seasonTable := db.GetSeasonTable(capp.NodeID())
  38. if seasonTable.StartTime > 0 {
  39. return
  40. }
  41. openTimeStr := data.Const.MapSeasonOpenTime
  42. if openTimeStr == "" {
  43. clog.Warn("[initSeason] MapSeasonOpenTime is empty")
  44. return
  45. }
  46. openTime, err := times.ParseDateFormat(openTimeStr)
  47. if err != nil {
  48. clog.Warnf("[initSeason] parse MapSeasonOpenTime failed. time = %s, err = %v", openTimeStr, err)
  49. return
  50. }
  51. seasonOpenTime := ctime.NewSecond(openTime.Unix())
  52. // TODO 赛季匹配还没有做,暂时用常量配置赛季开启时间
  53. seasonTable.StartTime = seasonOpenTime.ToMillisecond()
  54. seasonTable.SeasonID = 0
  55. seasonQuest.Service().OnInit(seasonTable)
  56. seasonTable.SetChangeData()
  57. seasonTable.Save2Queue()
  58. clog.Infof("[initSeason] season initialized. nodeID = %s, startTime = %s, seasonID = %d, curQuestID = %d",
  59. seasonTable.NodeID,
  60. seasonOpenTime.ToDateTimeFormat(),
  61. seasonTable.SeasonID,
  62. seasonTable.SeasonQuest.CurQuestID,
  63. )
  64. }
  65. // every3STimer
  66. func (p *actor) every3STimer() {
  67. seasonTable := db.GetSeasonTable(capp.NodeID())
  68. // 检查下一个赛季任务ID
  69. seasonQuest.Service().OnCheckNextID(seasonTable)
  70. // 定时保存
  71. seasonTable.Save2Queue()
  72. }
  73. func (p *actor) QuestInfo(req *pb.I32I64Map) (*pb.SeasonQuestInfo, int32) {
  74. var (
  75. questLeagueIDMap = req.Value // 霸业任务和对应的联盟ID
  76. seasonTable = db.GetSeasonTable(capp.NodeID())
  77. )
  78. seasonQuestInfo := seasonTable.SeasonQuest.ToProto(questLeagueIDMap)
  79. for _, quest := range seasonQuestInfo.Quests {
  80. quest.TargetProgress = seasonQuest.Service().GetTargetProgress(quest.QuestID)
  81. // 防止进度超过目标进度
  82. if quest.Progress > quest.TargetProgress {
  83. quest.Progress = quest.TargetProgress
  84. }
  85. }
  86. return seasonQuestInfo, code.OK
  87. }
  88. func (p *actor) QuestCheck(req *pb.I32I64) int32 {
  89. var (
  90. questID = req.Key // 霸业任务ID
  91. leagueID = req.Value // 联盟ID
  92. seasonTable = db.GetSeasonTable(capp.NodeID())
  93. nowMillis = ctime.Now().ToMillisecond()
  94. )
  95. if !data.SeasonQuest.ContainID(questID) {
  96. return code.ConfigNotFound_SeasonQuest
  97. }
  98. quest, found := seasonTable.SeasonQuest.Quests.Get(questID)
  99. if !found {
  100. return code.IllegalArgument
  101. }
  102. if !quest.IsEnded(nowMillis) {
  103. return code.SeasonQuest_NotEnded
  104. }
  105. // 获取目标进度
  106. targetProgress := seasonQuest.Service().GetTargetProgress(quest.QuestID)
  107. if quest.GetProgress(leagueID) < targetProgress {
  108. return code.SeasonQuestNotComplete
  109. }
  110. return code.OK
  111. }