源战役客户端
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

455 satır
14 KiB

  1. require("operation.SourceOperate")
  2. require("operation.NowOperate")
  3. require("operation.NowOperateNop")
  4. require("operation.SourceOperateCrossSceneAction")
  5. require("operation.SourceOperateMove")
  6. require("operation.NowOperateMove")
  7. require("operation.SourceOperateJump")
  8. require("operation.NowOperateJump")
  9. require("operation.SourceOperateTargetAction")
  10. require("operation.NowOperateTargetMove")
  11. OperateManager = OperateManager or BaseClass()
  12. local OperateManager = OperateManager
  13. local rawget = rawget
  14. local GlobalEventSystem = GlobalEventSystem
  15. OperateManager.OperateType = {
  16. Unknown = 0,
  17. Move = 1,
  18. Attack = 2,
  19. Skill = 3,
  20. }
  21. OperateManager.SourceOperateType =
  22. {
  23. Unknown = 1,
  24. Move = 2,
  25. CrossScene = 3,
  26. TargetAction = 4,
  27. }
  28. function OperateManager:__init()
  29. OperateManager.Instance = self
  30. self.source_oper = false
  31. self.now_oper = false
  32. self.enter_playing_handle = nil
  33. self.quit_playing_handle = nil
  34. --当前阶段是否需要运行
  35. self.need_run = false
  36. --最小移动周期
  37. self.min_move_tip_time = 0.3
  38. self.jump_point_obj = nil --跳点对象
  39. --注册相关事件
  40. self:RegisterEvents()
  41. --添加到Runner中以便每帧执行Update
  42. Runner.Instance:AddLateRunObj(self, 1)
  43. -- 当前寻路点
  44. self.current_target_pos = co.Vector2(0,0)
  45. self.pokemon_source_oper_list = false
  46. self.pokemon_now_oper_list = {}
  47. end
  48. function OperateManager:RegisterEvents( )
  49. local enter_playing_callback = function ( )
  50. self.need_run = true
  51. end
  52. local quit_playing_callback = function ( )
  53. self.need_run = false
  54. end
  55. self.enter_playing_handle =
  56. EventSystem.Bind(GlobalEventSystem,SceneManager.START, enter_playing_callback)
  57. self.quit_playing_handle =
  58. EventSystem.Bind(GlobalEventSystem,SceneManager.DISPOSE, quit_playing_callback)
  59. end
  60. function OperateManager:DeleteMe()
  61. EventSystem.UnBind(GlobalEventSystem,self.enter_playing_handle)
  62. EventSystem.UnBind(GlobalEventSystem,self.quit_playing_handle)
  63. end
  64. function OperateManager:LateUpdate(now_time, elapse_time)
  65. if not self.need_run then
  66. return
  67. end
  68. if self.pokemon_source_oper_list then
  69. if TableSize(self.pokemon_source_oper_list) > 0 then
  70. local source_oper
  71. local now_oper
  72. local source_delete_list = {}
  73. for pokemon_id,source_oper in pairs(self.pokemon_source_oper_list) do
  74. now_oper = self.pokemon_now_oper_list[pokemon_id]
  75. if not now_oper then
  76. if source_oper:IsFinish() then
  77. source_oper:DeleteMe()
  78. source_oper = nil
  79. source_delete_list[pokemon_id] = true
  80. else
  81. self.pokemon_now_oper_list[pokemon_id] = source_oper:GetOper()
  82. end
  83. else
  84. if now_oper:Excute(elapse_time) then
  85. now_oper:DeleteMe()
  86. now_oper = nil
  87. self.pokemon_now_oper_list[pokemon_id] = nil
  88. end
  89. end
  90. end
  91. for pokemon_id,_ in pairs(source_delete_list) do
  92. self.pokemon_source_oper_list[pokemon_id] = nil
  93. end
  94. end
  95. end
  96. if self.source_oper then
  97. if not self.now_oper then
  98. if self.source_oper:IsFinish() then
  99. local next_target = self.source_oper:GetNextTarget()
  100. local cross_scene = self.source_oper:GetCrossScene()
  101. self.source_oper:DeleteMe()
  102. self.source_oper = false
  103. if next_target then
  104. -- print("next_target------------:", next_target.target.x, next_target.target.y)
  105. self:StartMoveAction(next_target.target,next_target.func,next_target.arg)
  106. end
  107. if cross_scene then
  108. self:StartCrossSceneAction(cross_scene.id, cross_scene.pos, cross_scene.change_scene_callback, cross_scene.action_func, cross_scene.arg_list)
  109. end
  110. else
  111. self.now_oper = self.source_oper:GetOper() or false
  112. end
  113. end
  114. end
  115. if self.now_oper then
  116. if self.now_oper:Excute(elapse_time) then
  117. if self.now_oper then
  118. self.now_oper:DeleteMe()
  119. self.now_oper = false
  120. end
  121. end
  122. return
  123. end
  124. end
  125. --clear_now_scene 跨场景寻路的过程中清掉当前场景的操作包
  126. function OperateManager:ClearSrcOper(clear_now_scene)
  127. if clear_now_scene and self.source_oper and self.source_oper.type == OperateManager.SourceOperateType.CrossScene then
  128. self.source_oper:ClearNowMoveSrcOper()
  129. else
  130. if self.source_oper then
  131. -- if self.source_oper.BeforeDelete then
  132. -- self.source_oper:BeforeDelete()
  133. -- end
  134. self.source_oper:DeleteMe()
  135. end
  136. self.source_oper = false
  137. end
  138. if self.now_oper then
  139. self.now_oper:DeleteMe()
  140. self.now_oper = false
  141. end
  142. if AutoFightManager:getInstance().auto_find_way_state then
  143. EventSystem.Fire(GlobalEventSystem,SceneEventType.CLEAR_SRC_OPERATE)
  144. end
  145. end
  146. function OperateManager:IsNoOperWork(owner_key)
  147. return not self.source_oper and not self.now_oper
  148. end
  149. function OperateManager:GetNowSrcOper()
  150. return self.source_oper
  151. end
  152. --由摇杆触发,停止移动
  153. --is_fire_evt 返回is_fire_evt,有些地方执行了这个方法,又触发FINDWAY_ENDED
  154. function OperateManager:StopMove(clear_now_scene)
  155. local main_role = Scene.Instance:GetMainRole()
  156. if main_role == nil then
  157. return
  158. end
  159. local is_fire_evt = false
  160. main_role:WaitForNextMove()
  161. self:ClearSrcOper(clear_now_scene)
  162. if not self.source_oper then
  163. is_fire_evt = true
  164. EventSystem.Fire(GlobalEventSystem,EventName.FINDWAY_ENDED)
  165. end
  166. return is_fire_evt
  167. end
  168. function OperateManager:IsNearJumpArea( point )
  169. local check = function(x_a,y_a)
  170. local cur_pos_x = point.x + x_a
  171. local cur_pos_y = point.y + y_a
  172. local is_jump = SceneManager:getInstance():IsAreaType(cur_pos_x,cur_pos_y, AreaDataIndex.JumpType)
  173. if is_jump then
  174. return true
  175. end
  176. end
  177. if check(0,0) or check(1,0) or check(0,1) or check(-1,0) or check(0,-1) or check(1,-1) or check(1,1) or check(-1,1) or check(-1,-1) then
  178. return true
  179. end
  180. return false
  181. end
  182. function OperateManager:CheckJumpAction( now_pair,path_list,action_func,arg_list,cross_scene )
  183. if EnglineVersion and AppConst_EnglineVer >= 4 then
  184. local end_pos = path_list[#path_list].end_point
  185. local end_is_block = SceneManager:getInstance():IsBlockXY(end_pos.x, end_pos.y)
  186. if end_is_block then
  187. return
  188. end
  189. local posx,posy = Scene.Instance:GetMainRole():GetLogicPos()
  190. if self:IsNearJumpArea(co.TableXY(posx,posy)) then
  191. for i=1, now_pair -2, 1 do
  192. table.remove(path_list,1)
  193. end
  194. local try_jump = function()
  195. OperateManager.Instance:StartJumpAction(path_list,action_func,arg_list,cross_scene)
  196. end
  197. TimerQuest.AddDelayQuest(GlobalTimerQuest, try_jump,0.1)
  198. end
  199. end
  200. end
  201. function OperateManager:CurSourceOper()
  202. local after_jump_data = nil
  203. local oper_type = nil
  204. if self.source_oper then
  205. oper_type = self.source_oper.type
  206. if oper_type == OperateManager.SourceOperateType.CrossScene then
  207. after_jump_data = {
  208. self.source_oper.target_scene_id,
  209. self.source_oper.target_scene_pos,
  210. self.source_oper.change_scene_callback,
  211. self.source_oper.action_func,
  212. self.source_oper.arg_list,
  213. }
  214. elseif oper_type == OperateManager.SourceOperateType.Move then
  215. -- PrintTable(self.source_oper.end_pos)
  216. local pos_x,pos_y = Scene.Instance:GetMainRole():GetLogicPos()
  217. if self.source_oper.end_pos.x and self.source_oper.end_pos.y then
  218. -- local is_near = GameMath.IsPointNear(pos_x, pos_y, self.source_oper.end_pos.x, self.source_oper.end_pos.y, 0)
  219. -- if not is_near then
  220. after_jump_data = {
  221. self.source_oper.end_pos,
  222. self.source_oper.action_func,
  223. self.source_oper.arg_list,
  224. }
  225. -- end
  226. end
  227. end
  228. self:ClearSrcOper()
  229. end
  230. return after_jump_data,oper_type
  231. end
  232. --以下均接受逻辑坐标
  233. -- function OperateManager:StartJumpPointAction( jump_point_obj )
  234. -- self.jump_point_obj = jump_point_obj
  235. -- if self.jump_point_obj == nil then return end
  236. -- local play_action = function()
  237. -- if self.jump_point_obj then
  238. -- self.jump_point_obj:DoJump()
  239. -- end
  240. -- end
  241. -- local onMainRoleJumpEnd = function()
  242. -- if self.jump_point_obj and self.jump_point_obj:JumpFinish() then
  243. -- if self.after_jump_event then
  244. -- GlobalEventSystem:UnBind(self.after_jump_event)
  245. -- end
  246. -- self.jump_point_obj = nil
  247. -- else
  248. -- GlobalTimerQuest:AddDelayQuest(play_action,0.1)
  249. -- end
  250. -- GlobalEventSystem:Fire(EventName.JUMP_POINT_END)
  251. -- end
  252. -- local after_jump_data,oper_type = self:CurSourceOper()
  253. -- if after_jump_data then
  254. -- local onMainRoleJumpEnd = function()
  255. -- if self.jump_point_obj and self.jump_point_obj:JumpFinish() then
  256. -- if oper_type == OperateManager.SourceOperateType.Move then
  257. -- local end_pos = after_jump_data[1]
  258. -- if not SceneManager:getInstance():IsAreaType(end_pos.x,end_pos.y, AreaDataIndex.JumpType) then
  259. -- -- print("------StartJumpPointAction-------:", after_jump_data[1].x,after_jump_data[1].y)
  260. -- self:StartMoveAction(after_jump_data[1],after_jump_data[2],after_jump_data[3])
  261. -- end
  262. -- else
  263. -- self:StartCrossSceneAction(after_jump_data[1], after_jump_data[2], after_jump_data[3], after_jump_data[4], after_jump_data[5])
  264. -- end
  265. -- if self.after_jump_event then
  266. -- GlobalEventSystem:UnBind(self.after_jump_event)
  267. -- end
  268. -- self.jump_point_obj = nil
  269. -- else
  270. -- GlobalTimerQuest:AddDelayQuest(play_action,0.1)
  271. -- end
  272. -- end
  273. -- self.after_jump_event = GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_JUMP_END, onMainRoleJumpEnd)
  274. -- else
  275. -- self.after_jump_event = GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_JUMP_END, onMainRoleJumpEnd)
  276. -- end
  277. -- if self.jump_point_obj then
  278. -- self.jump_point_obj:DoJump()
  279. -- end
  280. -- end
  281. function OperateManager:JumpEndHandler()
  282. if self.jump_end_not_continue then
  283. self:ClearSrcOper()
  284. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  285. self.jump_end_not_continue = false
  286. return
  287. end
  288. local after_jump_data,oper_type = self:CurSourceOper()
  289. print("--------------JumpEndHandler------------:", after_jump_data)
  290. if after_jump_data then
  291. if oper_type == OperateManager.SourceOperateType.Move then
  292. local end_pos = after_jump_data[1]
  293. if not SceneManager:getInstance():IsAreaType(end_pos.x,end_pos.y, AreaDataIndex.JumpType) then
  294. print("------------跳完后继续寻路----------")
  295. --优化,如果是跳跃才能到达的点,mapview算出的是目标点范围一个点,而不是最近的,这里重新计算
  296. -- if after_jump_data[3] and after_jump_data[3][1] and after_jump_data[3][2] then
  297. -- Scene.Instance:MainRoleMove(after_jump_data[3][1],after_jump_data[3][2],after_jump_data[2])
  298. -- else
  299. self:StartMoveAction(after_jump_data[1],after_jump_data[2],after_jump_data[3])
  300. -- end
  301. end
  302. else
  303. self:StartCrossSceneAction(after_jump_data[1], after_jump_data[2], after_jump_data[3], after_jump_data[4], after_jump_data[5])
  304. end
  305. end
  306. end
  307. function OperateManager:StartMoveAction(end_pos, action_func, ...)
  308. self:ClearSrcOper()
  309. self.source_oper = SourceOperateMove.New(end_pos, action_func, {...})
  310. end
  311. function OperateManager:StartJumpAction(path_list, action_func, arg_list,cross_scene)
  312. self:ClearSrcOper()
  313. self.source_oper = SourceOperateJump.New(path_list, action_func, arg_list,cross_scene)
  314. end
  315. function OperateManager:StartInitedMoveAction(path, action_func, ...)
  316. self:ClearSrcOper()
  317. self.source_oper = SourceOperateMove.New(nil, action_func, {...})
  318. self.source_oper:SetPathList(path)
  319. end
  320. --[[@
  321. : TargetAction操作(,)
  322. :
  323. target_compress_id ID int32
  324. range numeric
  325. action_func function
  326. action_period_func , function
  327. action_end_func function
  328. clear_func function
  329. scene_obj:
  330. :
  331. :
  332. : deadline
  333. ]]
  334. function OperateManager:StartTargetAction(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj)
  335. -- print("OperateManager:ClearSrcOper 9")
  336. self:ClearSrcOper()
  337. self.source_oper = SourceOperateTargetAction.New(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj)
  338. return true
  339. end
  340. function OperateManager:StartPokemonTargetAction(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj,pokemon_id)
  341. self.pokemon_source_oper_list = self.pokemon_source_oper_list or {}
  342. self:ClearPokemonSrcOper(pokemon_id)
  343. self.pokemon_source_oper_list[pokemon_id] = SourceOperateTargetAction.New(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj)
  344. return true
  345. end
  346. --clear_now_scene 跨场景寻路的过程中清掉当前场景的操作包
  347. function OperateManager:ClearPokemonSrcOper(pokemon_id)
  348. local source_oper = self.pokemon_source_oper_list[pokemon_id]
  349. if source_oper then
  350. source_oper:DeleteMe()
  351. source_oper = nil
  352. self.pokemon_source_oper_list[pokemon_id] = nil
  353. end
  354. local now_oper = self.pokemon_now_oper_list[pokemon_id]
  355. if now_oper then
  356. now_oper:DeleteMe()
  357. now_oper = nil
  358. self.pokemon_now_oper_list[pokemon_id] = nil
  359. end
  360. end
  361. --clear_now_scene 跨场景寻路的过程中清掉当前场景的操作包
  362. function OperateManager:ClearAllPokemonSrcOper()
  363. if TableSize(self.pokemon_source_oper_list) > 0 then
  364. for pokemon_id,_ in pairs(self.pokemon_source_oper_list) do
  365. local source_oper = self.pokemon_source_oper_list[pokemon_id]
  366. if source_oper then
  367. source_oper:DeleteMe()
  368. source_oper = nil
  369. end
  370. local now_oper = self.pokemon_now_oper_list[pokemon_id]
  371. if now_oper then
  372. now_oper:DeleteMe()
  373. now_oper = nil
  374. end
  375. end
  376. end
  377. self.pokemon_source_oper_list = {}
  378. self.pokemon_now_oper_list = {}
  379. end
  380. function OperateManager:StartCrossSceneAction(scene_id, end_pos, change_scene_callback, action_func, ...)
  381. self:ClearSrcOper()
  382. self.source_oper = SourceOperateCrossSceneAction.New(scene_id,
  383. end_pos, change_scene_callback, action_func, {...})
  384. return true
  385. end