源战役客户端
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.3 KiB

  1. ---------------移动跨场景寻路操作包----------------
  2. SourceOperateCrossSceneAction = SourceOperateCrossSceneAction or BaseClass(SourceOperate)
  3. local SourceOperateCrossSceneAction = SourceOperateCrossSceneAction
  4. function SourceOperateCrossSceneAction:__init(scene_id, end_pos, change_scene_callback, action_func, arg_list)
  5. self.type = OperateManager.SourceOperateType.CrossScene
  6. self.init_time = 0
  7. self.src_scene_id = SceneManager.Instance:GetSceneId()
  8. self.target_scene_id = scene_id
  9. self.target_scene_pos = end_pos
  10. self.change_scene_callback = change_scene_callback
  11. self.action_func = action_func
  12. self.arg_list = arg_list
  13. self.is_path_valid = false
  14. self.path_list = nil
  15. self.now_move_src_oper = false
  16. self.scene_path = nil
  17. self.now_scene_id = nil
  18. end
  19. function SourceOperateCrossSceneAction:__delete( )
  20. if self.now_move_src_oper then
  21. self.now_move_src_oper:DeleteMe()
  22. self.now_move_src_oper = false
  23. end
  24. end
  25. function SourceOperateCrossSceneAction:Init()
  26. self.init_time = Status.NowTime
  27. local target_scene_info = ConfigItemMgr.Instance:GetSceneItem(self.target_scene_id)
  28. if not target_scene_info then
  29. return false
  30. end
  31. self.scene_path = SceneConnectMap.Instance:FindPath(self.src_scene_id, self.target_scene_id)
  32. if List.Empty(self.scene_path) then
  33. return false
  34. end
  35. return true
  36. end
  37. function SourceOperateCrossSceneAction:BeforeDelete()
  38. local now_scene_id = SceneManager.Instance:GetSceneId()
  39. local cur_src_oper = self.now_move_src_oper
  40. if not self.is_finish and cur_src_oper and cur_src_oper.now_use_pair and cur_src_oper.total_pair and cur_src_oper.now_use_pair < cur_src_oper.total_pair then
  41. local cross_scene = {id = self.target_scene_id,pos = self.target_scene_pos,change_scene_callback = self.change_scene_callback}
  42. OperateManager.Instance:CheckJumpAction(cur_src_oper.now_use_pair,cur_src_oper.path_list,self.action_func,self.arg_list,cross_scene)
  43. end
  44. end
  45. function SourceOperateCrossSceneAction:ClearNowMoveSrcOper()
  46. if self.now_move_src_oper then
  47. self.now_move_src_oper:DeleteMe()
  48. self.now_move_src_oper = false
  49. end
  50. end
  51. function SourceOperateCrossSceneAction:GetOperImpl()
  52. local now_scene_id = SceneManager.Instance:GetSceneId()
  53. --由于现在走到传送门附近就会触发传送,所以可能now_move_src_oper还没完成,就传到另一个场景,导致主角卡住不动了
  54. --切换了场景,就要删掉
  55. if self.now_scene_id ~= now_scene_id then
  56. self:ClearNowMoveSrcOper()
  57. end
  58. if self.now_move_src_oper and not self.now_move_src_oper:IsFinish() then
  59. return self.now_move_src_oper:GetOper()
  60. end
  61. if self.src_scene_id ~= now_scene_id and self.change_scene_callback then
  62. local is_finish = self.change_scene_callback(now_scene_id)
  63. if is_finish ~= nil and is_finish == true then
  64. self.is_finish = true --由外部来终止这个操作包
  65. return self:GenerateNop(0.2)
  66. end
  67. end
  68. if self.now_scene_id == now_scene_id then
  69. return self:GenerateNop(0.2)
  70. elseif not Scene.Instance:IsSceneLoaded() then
  71. return self:GenerateNop(0.2)
  72. end
  73. if self.target_scene_id == now_scene_id then
  74. if self.target_scene_pos then
  75. self.now_move_src_oper = SourceOperateMove.New(self.target_scene_pos, nil)
  76. self.target_scene_pos = nil
  77. else
  78. self.is_finish = true
  79. if self.action_func then
  80. self.action_func(unpack(self.arg_list))
  81. end
  82. return self:GenerateNop(0.2)
  83. end
  84. else
  85. if self.scene_path == nil then
  86. return nil
  87. end
  88. local path_now_scene_id = List.PopFront(self.scene_path)
  89. if path_now_scene_id ~= now_scene_id then
  90. self.is_finish = true
  91. return self:GenerateNop(0.2)
  92. end
  93. local now_target_scene_id = List.GetFront(self.scene_path)
  94. local door_info = SceneManager.Instance:GetSceneDoorInfo(now_target_scene_id, path_now_scene_id)
  95. if not door_info then
  96. self.is_finish = true
  97. return self:GenerateNop(0.2)
  98. end
  99. self.now_scene_id = now_scene_id
  100. local door_pos = co.TableXY(door_info.x / SceneObj.LogicRealRatio.x, door_info.y / SceneObj.LogicRealRatio.y)
  101. local cross_scene_req = function ()
  102. -- EventSystem.Fire(GlobalEventSystem,SceneEventType.REQUEST_CHANGE_SCENE, door_info.id)
  103. end
  104. self.now_move_src_oper = SourceOperateMove.New(door_pos, cross_scene_req, self.arg_list)
  105. EventSystem.Fire(GlobalEventSystem,EventName.FINDWAY_STARTED)
  106. end
  107. return self.now_move_src_oper:GetOper()
  108. end