actor_monster.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package mapLogic
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. mapCall "f1-game/nodes/map/internal/call"
  7. "f1-game/nodes/map/internal/db"
  8. clog "github.com/cherry-game/cherry/logger"
  9. )
  10. func (p *actor) initMonster() {
  11. // 补充怪物
  12. for _, monsterFlush := range p.MonsterFlushTables {
  13. var save bool
  14. monsterFlush.FlushLimit.Range(func(monsterConfigID int32, limit int32) bool {
  15. currCount := monsterFlush.GetMonsterCount(monsterConfigID)
  16. if currCount >= limit {
  17. return true
  18. }
  19. monsterRow, ok := data.MapMonster.GetByConfigID(monsterConfigID)
  20. if !ok {
  21. clog.Errorf("[initMonster] AreaID = %v, MonsterID = %v is invalid.", monsterFlush.AreaID, monsterConfigID)
  22. return true
  23. }
  24. // 需要补充多少个怪物
  25. for i := currCount; i < limit; i++ {
  26. monsterTable := db.NewLogicMonsterTable(db.NewGUID(), capp.NodeID(), 0, 0, monsterConfigID, monsterFlush.AreaID)
  27. monsterTable.Save2Queue()
  28. // 拷贝属性
  29. monsterTable.LoadConfig(monsterRow)
  30. p.MonsterTables.Put(monsterTable.ObjectID, monsterTable)
  31. monsterFlush.FlushCount[monsterTable.ConfigID]++
  32. }
  33. save = true
  34. return true
  35. })
  36. if save {
  37. monsterFlush.Save2Queue()
  38. }
  39. }
  40. }
  41. func (p *actor) monsterTimer() {
  42. p.updateTime()
  43. for _, monsterTable := range p.MonsterTables {
  44. p.monsterTicker(monsterTable)
  45. if monsterTable.IsDataChanged {
  46. monsterTable.IsDataChanged = false
  47. monsterTable.Save2Queue()
  48. }
  49. }
  50. }
  51. func (p *actor) monsterTicker(monsterTable *db.LogicMonsterTable) {
  52. if monsterTable.IsDelete {
  53. p.monsterInvalid(monsterTable)
  54. return
  55. }
  56. if monsterTable.CheckFlush(p.nowMillis) {
  57. p.monsterFlush(monsterTable)
  58. }
  59. }
  60. func (p *actor) monsterInvalid(monsterTable *db.LogicMonsterTable) {
  61. p.removeMonster(monsterTable)
  62. monsterTable.IsDelete = true
  63. monsterTable.IsDataChanged = true
  64. // 清理地块
  65. tileTable := p.TileTables.GetValue(monsterTable.GetTileID())
  66. tileTable.SetMonsterObjectID(0)
  67. p.addTileProcess(tileTable)
  68. }
  69. // monsterFlush 怪物刷新
  70. func (p *actor) monsterFlush(monsterTable *db.LogicMonsterTable) {
  71. if monsterTable.IsAlive {
  72. oldTileTable := p.TileTables.GetValue(monsterTable.GetTileID())
  73. oldTileTable.SetMonsterObjectID(0)
  74. // 离开aoi
  75. mapCall.AOI.Leave(monsterTable.ObjectID, enum.ObjectType_Monster)
  76. }
  77. monsterArea := p.MonsterFlushTables.GetValue(monsterTable.AreaID)
  78. point, ok := monsterArea.RandomPoint()
  79. if !ok {
  80. // 无法生成坐标,删除该资源点
  81. clog.Warnf("[monsterFlush] AreaID = %v, MonsterID = %v Point is invalid.", monsterArea.AreaID, monsterTable.ObjectID)
  82. // p.removeMonster(monsterTable)
  83. monsterTable.IsDelete = true
  84. monsterTable.IsDataChanged = true
  85. return
  86. }
  87. // 重置怪物
  88. monsterTable.ResetByFlush(point.X, point.Y, p.now)
  89. // 添加坐标到过滤列表
  90. monsterArea.AddFilterPoint(point.X, point.Y)
  91. // 对象进入AOI
  92. p.addMonsterAOI(monsterTable)
  93. // 存放到 tileTable
  94. tileTable := p.TileTables.GetValue(monsterTable.GetTileID())
  95. tileTable.SetMonsterObjectID(monsterTable.ObjectID)
  96. p.addTileProcess(tileTable)
  97. monsterTable.IsDataChanged = true
  98. }
  99. func (p *actor) monsterDead(monsterTable *db.LogicMonsterTable) {
  100. // 移除忽略的怪物刷新点
  101. p.removeMonsterAreaIDFileterPoint(monsterTable.AreaID, monsterTable.X(), monsterTable.Y())
  102. // 重置属性
  103. monsterTable.ResetByDead()
  104. // 怪物对象离开地图
  105. mapCall.AOI.Leave(monsterTable.ObjectID, monsterTable.Type)
  106. // 清理地块
  107. tileTable := p.TileTables.GetValue(monsterTable.GetTileID())
  108. tileTable.SetMonsterObjectID(0)
  109. p.addTileProcess(tileTable)
  110. }
  111. func (p *actor) removeMonster(monsterTable *db.LogicMonsterTable) {
  112. p.MonsterTables.Remove(monsterTable.ObjectID)
  113. if area, ok := p.MonsterFlushTables.Get(monsterTable.AreaID); ok {
  114. area.RemoveFilterPoint(monsterTable.X(), monsterTable.Y())
  115. area.Save2Queue()
  116. }
  117. }
  118. func (p *actor) addMonsterAreaFilterPoint(x, y int32) {
  119. area := p.getMonsterAreaByPoint(x, y)
  120. if area != nil {
  121. area.AddFilterPoint(x, y)
  122. area.Save2Queue()
  123. }
  124. }
  125. func (p *actor) getMonsterAreaByPoint(x, y int32) *db.LogicMonsterFlushTable {
  126. for _, area := range p.MonsterFlushTables {
  127. if area.ContainsPoint(x, y) {
  128. return area
  129. }
  130. }
  131. return nil
  132. }
  133. func (p *actor) addMonsterAOI(monsterTable *db.LogicMonsterTable) {
  134. marker := monsterTable.ToAOIMarker()
  135. mapCall.AOI.Enter(marker)
  136. }
  137. func (p *actor) removeMonsterAreaIDFileterPoint(areaID int32, x, y int32) {
  138. if area, ok := p.MonsterFlushTables.Get(areaID); ok {
  139. area.RemoveFilterPoint(x, y)
  140. area.Save2Queue()
  141. }
  142. }
  143. func (p *actor) removeMonsterFileterPoint(x, y int32) {
  144. area := p.getMonsterAreaByPoint(x, y)
  145. if area != nil {
  146. area.RemoveFilterPoint(x, y)
  147. area.Save2Queue()
  148. }
  149. }