actor.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package scout
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/enum"
  6. nameActor "f1-game/internal/name/actor"
  7. nameRemote "f1-game/internal/name/remote"
  8. "f1-game/internal/pb"
  9. "f1-game/nodes/map/internal/db"
  10. dbMapScout "f1-game/nodes/map/internal/db/data/scout"
  11. "time"
  12. ctime "github.com/cherry-game/cherry/extend/time"
  13. cfacade "github.com/cherry-game/cherry/facade"
  14. cactor "github.com/cherry-game/cherry/net/actor"
  15. )
  16. // 侦察
  17. type actor struct {
  18. cactor.Base
  19. table *db.MapScoutTable
  20. }
  21. func Init(app cfacade.IApplication, table *db.MapScoutTable) {
  22. actor := &actor{
  23. table: table,
  24. }
  25. app.ActorSystem().CreateActor(actor.AliasID(), actor)
  26. }
  27. func (p *actor) AliasID() string {
  28. return nameActor.Map_Scout
  29. }
  30. func (p *actor) OnInit() {
  31. // 添加定时器处理
  32. p.Timer().Add(1*time.Second, p.every1STimer)
  33. p.Timer().Add(5*time.Minute, p.checkAndSaveTimer)
  34. p.Remote().Register(nameRemote.MapScout_UpdateStatus, p.updateScoutStatus)
  35. }
  36. // 更新侦察状态
  37. func (p *actor) updateScoutStatus(req *pb.ScoutRequest) int32 {
  38. var (
  39. queueID = req.QueueID
  40. scoutType = req.ScoutType
  41. playerID = req.PlayerID
  42. endTime = req.EndTime
  43. )
  44. if !enum.CheckScoutType(scoutType) {
  45. return code.ScoutTypeError
  46. }
  47. playerScout, found := p.table.GetPlayerScout(playerID)
  48. if !found {
  49. playerScout = dbMapScout.NewPlayerScout()
  50. p.table.AddPlayerScount(playerID, playerScout)
  51. }
  52. if exist := playerScout.CheckQueueScouting(queueID); exist {
  53. return code.ScoutQueueBusy
  54. }
  55. if scoutType == enum.ScoutType_March {
  56. // 添加行军记录
  57. playerScout.AddScoutMarch(queueID, endTime)
  58. } else {
  59. // 添加开始侦察记录
  60. playerScout.AddScouting(queueID, endTime)
  61. }
  62. p.table.SetChangeData()
  63. return code.OK
  64. }
  65. func (p *actor) every1STimer() {
  66. var (
  67. now = ctime.Now().ToMillisecond()
  68. )
  69. // 判断侦察是否结束,通知map处理
  70. for playerID, playerScout := range p.table.PlayerScoutMap {
  71. // 获取侦察行军结束的列表
  72. startIDs := playerScout.RemoveAndGetScoutMarchs(now)
  73. // 获取已结束的侦察列表
  74. endIDs := playerScout.RemoveAndGetScouting(now)
  75. if len(startIDs) <= 0 && len(endIDs) <= 0 {
  76. continue
  77. }
  78. req := &pb.ScoutUpdateNotice{
  79. Starts: startIDs,
  80. Ends: endIDs,
  81. }
  82. targetPath := cfacade.NewChildPath("", nameActor.Map_Player, playerID)
  83. capp.Call(targetPath, nameRemote.MapScout_UpdateNotice, req)
  84. p.table.SetChangeData()
  85. }
  86. }
  87. func (p *actor) checkAndSaveTimer() {
  88. // 删除无用的玩家侦察数据
  89. p.table.RemoveEmptyPlayerScout()
  90. // 检测数据保存
  91. if p.table.IsChangeData() {
  92. p.table.Save2Queue()
  93. }
  94. }
  95. func (p *actor) OnStop() {
  96. p.checkAndSaveTimer()
  97. }