源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

455 lines
14 KiB

преди 4 седмици
  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