actor_res.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package mapLogic
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/event"
  7. "f1-game/internal/types"
  8. mapCall "f1-game/nodes/map/internal/call"
  9. "f1-game/nodes/map/internal/db"
  10. clog "github.com/cherry-game/cherry/logger"
  11. )
  12. func (p *actor) resTimer() {
  13. p.updateTime()
  14. for _, resTable := range p.ResTables {
  15. p.resTicker(resTable)
  16. if resTable.IsDataChanged {
  17. resTable.IsDataChanged = false
  18. resTable.Save2Queue()
  19. }
  20. }
  21. }
  22. func (p *actor) resTicker(resTable *db.LogicResTable) {
  23. if resTable.IsDelete {
  24. p.resInvalid(resTable)
  25. return
  26. }
  27. if resTable.IsDiscard() {
  28. p.doResDiscard(resTable)
  29. }
  30. }
  31. // resInvalid 资源点无效
  32. func (p *actor) resInvalid(resTable *db.LogicResTable) {
  33. p.removeWatcherRes(resTable)
  34. // 清理地块
  35. if !resTable.Point.IsZero() {
  36. tileTable := p.TileTables.GetValue(resTable.GetTileID())
  37. tileTable.SetResObjectID(0)
  38. // 把驻守队列遣散
  39. p.tileGarrionRetreat(tileTable)
  40. }
  41. p.removeRes(resTable)
  42. // resTable.IsDelete = true
  43. resTable.IsDataChanged = true
  44. }
  45. // resDead 资源死亡
  46. func (p *actor) resDead(resTable *db.LogicResTable) {
  47. p.removeWatcherRes(resTable)
  48. // TODO: 资源死亡(被覆盖)要标记为删除,不然重启服务器又会跑出来
  49. resTable.IsDelete = true
  50. // 清理地块上的资源对象ID
  51. tileTable := p.TileTables.GetValue(resTable.GetTileID())
  52. tileTable.SetResObjectID(0)
  53. // 把地块上的驻守队伍遣散
  54. p.tileGarrionRetreat(tileTable)
  55. p.addTileProcess(tileTable)
  56. // 资源点对象离开地图
  57. mapCall.AOI.Leave(resTable.ObjectID, enum.ObjectType_Res)
  58. }
  59. func (p *actor) doResDiscard(resTable *db.LogicResTable) {
  60. if resTable.DiscardEndTime > p.nowMillis {
  61. return
  62. }
  63. clog.Debugf("Res discard: ResID = %v, PlayerID = %v", resTable.ObjectID, resTable.PlayerID)
  64. p.removeWatcherRes(resTable)
  65. resTable.ResetByDiscard()
  66. p.UpdateObjectFull(resTable.ObjectID, resTable.Type)
  67. // 把驻守队列遣散
  68. tileTable := p.TileTables.GetValue(resTable.GetTileID())
  69. p.tileGarrionRetreat(tileTable)
  70. p.addTileProcess(tileTable)
  71. }
  72. func (p *actor) addResAOI(resTable *db.LogicResTable) {
  73. marker := resTable.ToAOIMarker()
  74. mapCall.AOI.Enter(marker)
  75. }
  76. func (p *actor) removeRes(resTable *db.LogicResTable) {
  77. p.ResTables.Remove(resTable.ObjectID)
  78. }
  79. func (p *actor) resReplenish(points types.Points) {
  80. // 移除建筑补充被覆盖的资源点
  81. resDatas := data.ResData()
  82. for _, point := range points {
  83. tileID, ok := data.PointToTileID(point.X, point.Y)
  84. if !ok {
  85. continue
  86. }
  87. resData, ok := resDatas[tileID]
  88. if !ok {
  89. continue
  90. }
  91. resRow, ok := data.MapRes.GetByConfigID(resData.ConfigId)
  92. if !ok {
  93. clog.Warnf("res config not found. tileID = %d, point = (%d, %d) ,configID = %d", tileID, point.X, point.Y, resData.ConfigId)
  94. continue
  95. }
  96. tileTable := p.TileTables.GetValue(tileID)
  97. if tileTable.ResObjectID > 0 {
  98. continue
  99. }
  100. resTable := db.NewLogicResTable(db.NewGUID(), capp.NodeID(), point.X, point.Y, resRow.ConfigID)
  101. resTable.LoadConfigs(resRow)
  102. resTable.Init()
  103. resTable.Save2Queue()
  104. // 拷贝属性
  105. p.ResTables.Put(resTable.ObjectID, resTable)
  106. // 存放到 tileTable
  107. tileTable.SetResObjectID(resTable.ObjectID)
  108. p.addTileProcess(tileTable)
  109. // 对象进入AOI
  110. p.addResAOI(resTable)
  111. }
  112. }
  113. func (p *actor) removeWatcherRes(resTable *db.LogicResTable) {
  114. if !resTable.HasPlayer() {
  115. return
  116. }
  117. // 删除玩家资源
  118. watcherTable := p.WatcherTables.GetValue(resTable.PlayerID)
  119. watcherTable.RemoveRes(resTable.ObjectID)
  120. // 推送
  121. p.PushOwnerMapObjectDel(resTable.PlayerID, resTable.ObjectID)
  122. // 抛事件
  123. p.PostEvent(event.NewResUpdate(watcherTable.PlayerID, &event.MapResUpdateData{
  124. ObjectID: resTable.ObjectID,
  125. UpdateType: enum.ResUpdate_Delete,
  126. }))
  127. }