monsterManager.lua 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. local monsterManager = class('gameActorMonster')
  2. function monsterManager:ctor()
  3. self.mPetOfMainAlive = false
  4. self.mMonstersInCurrViewFieldMap = {}
  5. self.mMonstersInCurrViewField = {}
  6. self.mMonstersIndexMap = {}
  7. self.mMonsterCount = 0
  8. end
  9. function monsterManager:destory()
  10. if monsterManager.instance then
  11. monsterManager.instance = nil
  12. end
  13. end
  14. function monsterManager:Inst()
  15. if not monsterManager.instance then
  16. monsterManager.instance = monsterManager.new()
  17. end
  18. return monsterManager.instance
  19. end
  20. function monsterManager:AddMonster(monster)
  21. if not monster then
  22. return false
  23. end
  24. local monsterID = monster:GetID()
  25. if self.mMonstersInCurrViewFieldMap[monsterID] then
  26. return false
  27. end
  28. self.mMonsterCount = self.mMonsterCount + 1
  29. local n = self.mMonsterCount
  30. self.mMonstersIndexMap[monsterID] = n
  31. self.mMonstersInCurrViewField[n] = monster
  32. self.mMonstersInCurrViewFieldMap[monsterID] = monster
  33. -- A pet/clone/hero of main player ?
  34. local playerID = global.gamePlayerController:GetMainPlayerID()
  35. if playerID == monster:GetMasterID() then
  36. -- issue: mPetOfMainPlayerID maybe mainplayer pet or hero pet
  37. self.mPetOfMainPlayerID = monsterID
  38. end
  39. end
  40. function monsterManager:RmvMonster(monsterID)
  41. local monster = self.mMonstersInCurrViewFieldMap[monsterID]
  42. if not monster then
  43. return false
  44. end
  45. self.mMonstersInCurrViewFieldMap[monsterID] = nil
  46. local index = self.mMonstersIndexMap[monsterID]
  47. if index == self.mMonsterCount then
  48. self.mMonstersInCurrViewField[index] = nil
  49. else
  50. -- last index --> index
  51. local lastActor = self.mMonstersInCurrViewField[self.mMonsterCount]
  52. self.mMonstersInCurrViewField[index] = lastActor
  53. self.mMonstersIndexMap[lastActor:GetID()] = index
  54. -- reset last value
  55. self.mMonstersInCurrViewField[self.mMonsterCount] = nil
  56. end
  57. self.mMonstersIndexMap[monsterID] = nil
  58. self.mMonsterCount = self.mMonsterCount - 1
  59. end
  60. function monsterManager:GetMonstersInCurrViewField()
  61. return self.mMonstersInCurrViewField, self.mMonsterCount
  62. end
  63. function monsterManager:FindMonsterIDInCurrViewField(noPetOfMainPlayer, noPetOfNetPlayer)
  64. if nil == noPetOfMainPlayer then
  65. noPetOfMainPlayer = false
  66. end
  67. if nil == noPetOfNetPlayer then
  68. noPetOfNetPlayer = true
  69. end
  70. local playerID = global.gamePlayerController:GetMainPlayerID()
  71. local recvVec = {}
  72. local num = 0
  73. for i = 1, self.mMonsterCount do
  74. local m = self.mMonstersInCurrViewField[i]
  75. if m then
  76. if (noPetOfMainPlayer and playerID == m:GetMasterID()) or (noPetOfNetPlayer and m:IsHaveMaster()) then
  77. else
  78. num = num + 1
  79. recvVec[num] = m:GetID()
  80. end
  81. end
  82. end
  83. return recvVec, num
  84. end
  85. function monsterManager:FindMonsterInCurrViewField(noPetOfMainPlayer, noPetOfNetPlayer)
  86. if nil == noPetOfMainPlayer then
  87. noPetOfMainPlayer = false
  88. end
  89. if nil == noPetOfNetPlayer then
  90. noPetOfNetPlayer = true
  91. end
  92. local playerID = global.gamePlayerController:GetMainPlayerID()
  93. local recvVec = {}
  94. local num = 0
  95. for i = 1, self.mMonsterCount do
  96. local m = self.mMonstersInCurrViewField[i]
  97. if m then
  98. if (noPetOfMainPlayer and playerID == m:GetMasterID()) or (noPetOfNetPlayer and m:IsHaveMaster()) then
  99. else
  100. num = num + 1
  101. recvVec[num] = m
  102. end
  103. end
  104. end
  105. return recvVec, num
  106. end
  107. function monsterManager:FindMonsterInCurrViewFieldByTypeIndex(typeIndex, noPetOfMainPlayer, noPetOfNetPlayer)
  108. if nil == noPetOfMainPlayer then
  109. noPetOfMainPlayer = false
  110. end
  111. if nil == noPetOfNetPlayer then
  112. noPetOfNetPlayer = true
  113. end
  114. local playerID = global.gamePlayerController:GetMainPlayerID()
  115. local recvVec = {}
  116. local num = 0
  117. for i = 1, self.mMonsterCount do
  118. local m = self.mMonstersInCurrViewField[i]
  119. if m and m:GetTypeIndex() == typeIndex then
  120. if (noPetOfMainPlayer and playerID == m:GetMasterID()) or (noPetOfNetPlayer and m:IsHaveMaster()) then
  121. else
  122. num = num + 1
  123. recvVec[num] = m
  124. end
  125. end
  126. end
  127. return recvVec, num
  128. end
  129. function monsterManager:FindMonsterInCurrViewFieldByTypeIndexTable(typeIndexTable, noPetOfMainPlayer, noPetOfNetPlayer)
  130. if nil == noPetOfMainPlayer then
  131. noPetOfMainPlayer = false
  132. end
  133. if nil == noPetOfNetPlayer then
  134. noPetOfNetPlayer = true
  135. end
  136. local playerID = global.gamePlayerController:GetMainPlayerID()
  137. local recvVec = {}
  138. local num = 0
  139. for i = 1, self.mMonsterCount do
  140. local m = self.mMonstersInCurrViewField[i]
  141. if m then
  142. for _, typeIndex in pairs(typeIndexTable) do
  143. if m:GetTypeIndex() == typeIndex then
  144. if (noPetOfMainPlayer and playerID == m:GetMasterID()) or (noPetOfNetPlayer and m:IsHaveMaster()) then
  145. else
  146. num = num + 1
  147. recvVec[num] = m
  148. end
  149. end
  150. end
  151. end
  152. end
  153. return recvVec, num
  154. end
  155. function monsterManager:FindMonsterInCurrViewFieldByRace(race)
  156. local recvVec = {}
  157. local num = 0
  158. for i = 1, self.mMonsterCount do
  159. local m = self.mMonstersInCurrViewField[i]
  160. if m and m:GetRace() == race then
  161. num = num + 1
  162. recvVec[num] = m
  163. end
  164. end
  165. return recvVec, num
  166. end
  167. function monsterManager:Cleanup(clearPet)
  168. if clearPet == nil then clearPet = true end
  169. if clearPet then self.mPetOfMainAlive = false end
  170. self.mMonstersInCurrViewFieldMap = {}
  171. self.mMonstersInCurrViewField = {}
  172. self.mMonstersIndexMap = {}
  173. self.mMonsterCount = 0
  174. end
  175. function monsterManager:MonsterCountInView()
  176. return self.mMonsterCount
  177. end
  178. function monsterManager:IsPetOfMainAlive()
  179. return self.mPetOfMainAlive
  180. end
  181. function monsterManager:SetPetOfMainAlive( alive )
  182. self.mPetOfMainAlive = alive
  183. end
  184. return monsterManager