源战役客户端
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.

7096 lines
229 KiB

  1. require("game.scene.MapView")
  2. require("game.scene.SkyBox")
  3. require("game.scene.SapManager")
  4. require("game.scene.SceneConfig")
  5. require("game.scene.SceneDropObj")
  6. require("game.scene.SceneDropManager")
  7. require("game.scene.sceneBoard.NameBoard")
  8. require("game.scene.sceneBoard.NameBoardManager")
  9. require("game.scene.sceneBoard.TalkBoard")
  10. require("game.scene.sceneobj.MoveObj")
  11. require("game.scene.sceneobj.ObjPool")
  12. require("game.scene.sceneobj.SceneObj")
  13. require("game.scene.sceneobj.Door")
  14. require("game.scene.sceneobj.Character")
  15. require("game.scene.sceneobj.Monster")
  16. require("game.scene.sceneobj.Other")
  17. require("game.scene.sceneobj.Role")
  18. require("game.scene.sceneobj.Partner")
  19. require("game.scene.sceneobj.MainRole")
  20. require("game.scene.sceneobj.Npc")
  21. require("game.scene.sceneobj.Clothe")
  22. require("game.scene.sceneobj.Weapon")
  23. require("game.scene.sceneobj.PoseState")
  24. require("game.scene.sceneobj.FindVo")
  25. require("game.scene.sceneobj.JumpPoint")
  26. require("game.scene.sceneobj.WayPoint")
  27. require("game.scene.sceneobj.Sprite")
  28. require("game.scene.sceneobj.Pet")
  29. require("game.scene.sceneobj.Baby")
  30. require("game.scene.sceneobj.HeadWear")
  31. require("game.scene.sceneobj.Evil")
  32. require("game.scene.sceneobj.Grave")
  33. require("game.scene.sceneobj.ImageObj")
  34. require("game.scene.sceneobj.HookRole")
  35. require("game.scene.sceneobj.Pokemon")
  36. require("game.scene.sceneobj.AssisitPokemon")
  37. require("game.scene.sceneobj.Build")
  38. require("game.scene.sceneobj.Furniture")
  39. require("game.scene.sceneobj.BuildBaby")
  40. require("game.scene.sceneobj.GWFollower")
  41. require("game.scene.sceneobj.GalaxyPearl")
  42. require("game.scene.sceneobj.JumpOneStep")
  43. require("game.sharedata.PartnerVo")
  44. require("game.sharedata.MonsterVo")
  45. require("game.sharedata.MonsterTypeVo")
  46. require("game.sharedata.NpcVo")
  47. require("game.sharedata.DoorVo")
  48. require("game.sharedata.OtherVo")
  49. require("game.sharedata.JumpPointVo")
  50. require("game.sharedata.SpriteVo")
  51. require("game.sharedata.EvilVo")
  52. require("game.sharedata.PetVo")
  53. require("game.sharedata.BabyVo")
  54. require("game.sharedata.GraveVo")
  55. require("game.sharedata.HookRoleVo")
  56. require("game.sharedata.PokemonVo")
  57. require("game.sharedata.GWFollowerVo")
  58. require("game.sharedata.AssisitPokemonVo")
  59. Scene = Scene or BaseClass()
  60. local Scene = Scene
  61. local GameMath = GameMath
  62. local GlobalEventSystem = GlobalEventSystem
  63. local SceneEventType = SceneEventType
  64. local math = math
  65. local table_insert = table.insert
  66. local table_sort = table.sort
  67. local SapManager = SapManager
  68. local Config = Config
  69. local tonumber = tonumber
  70. local EventName = EventName
  71. local IsTableEmpty = IsTableEmpty
  72. local GameMath_GetDistance = GameMath.GetDistance
  73. local GameMath_IsPointNear = GameMath.IsPointNear
  74. local lua_viewM = lua_viewM
  75. local co_TableXY = co.TableXY
  76. local SceneObj_LogicRealRatio_x = SceneObj.LogicRealRatio.x
  77. local SceneObj_LogicRealRatio_y = SceneObj.LogicRealRatio.y
  78. local co_NormaliseXYTable = co.NormaliseXYTable
  79. --寻找目标类型
  80. Scene.FIND_TARGET_TYPE = {
  81. monster = 1,
  82. role = 2,
  83. partner = 3,
  84. all = 100,
  85. }
  86. function Scene:__init()
  87. if Scene.Instance ~= nil then
  88. LogError("Scene is a singleton class")
  89. end
  90. Scene.Instance = self
  91. self.mapView = MapView:getInstance()
  92. self.main_camera = MainCamera:getInstance()
  93. self.main_role = nil
  94. self.SkillMgr = SkillManager:getInstance()
  95. self.scene_mgr = SceneManager:getInstance()
  96. self.role_mgr = RoleManager:getInstance()
  97. self.mainrole_vo = self.role_mgr.mainRoleInfo
  98. self.config_mgr = ConfigItemMgr.Instance
  99. self.nameBoard_mgr = NameBoardManager.getInstance()
  100. self.auto_fight_mgr = AutoFightManager:getInstance()
  101. -- self.fight_back_mgr = FightBackManager:getInstance()
  102. self.role_list = {} --玩家列表 包括主角
  103. self.partner_list = {} --伙伴列表
  104. self.monster_list = {} --怪物列表
  105. self.other_list = {} --其他对象列表
  106. self.npc_list = {} --Npc列表
  107. self.door_list = {} --door列表
  108. self.drop_list = {} --掉落列表
  109. self.sprite_list = {} --小精灵列表
  110. self.evil_list = {} --小精灵列表
  111. self.pet_list = {} --ai娘列表
  112. self.pokemon_list = {} --宠物列表
  113. self.assisit_pokemon_list = {} --宠物副本协战宠物列表
  114. self.baby_list = {} --宝宝列表
  115. self.gwfollower_list = {} --本服团战粮草护送
  116. self.jumppoint_list = {} --跳点列表
  117. self.waypoint = nil --路径点
  118. self.grave_list = {} --怪物墓碑列表
  119. self.build_list = {} --家园建筑列表
  120. self.furniture_list = {} --家园家具列表
  121. self.hook_role_list = {} --离线挂机玩家列表
  122. self.build_baby_list = {} --家园建筑列表
  123. self.jump_one_step_list = {} --跳一跳跳台列表
  124. self.monster_pool = ObjPool.New(ObjMaxCache.Monster)
  125. self.other_pool = ObjPool.New(ObjMaxCache.Other)
  126. self.evil_pool = ObjPool.New(ObjMaxCache.Evil)
  127. self.role_pool = ObjPool.New(ObjMaxCache.OtherRole)
  128. self.partner_pool = ObjPool.New(ObjMaxCache.Partner)
  129. self.npc_pool = ObjPool.New(ObjMaxCache.NPC)
  130. self.drop_pool = ObjPool.New(ObjMaxCache.DropItem)
  131. self.sprite_pool = ObjPool.New(ObjMaxCache.Sprite)
  132. self.pet_pool = ObjPool.New(ObjMaxCache.Pet)
  133. self.pokemon_pool = ObjPool.New(ObjMaxCache.Pokemon)
  134. self.assisit_pokemon_pool = ObjPool.New(ObjMaxCache.AssisitPokemon)
  135. self.baby_pool = ObjPool.New(ObjMaxCache.Baby)
  136. self.gwfollower_pool = ObjPool.New(ObjMaxCache.GWFollower)
  137. self.grave_pool = ObjPool.New(ObjMaxCache.Grave)
  138. self.hook_role_pool = ObjPool.New(ObjMaxCache.HookRole)
  139. self.jump_one_step_pool = ObjPool.New(ObjMaxCache.JumpOneStep)
  140. --延时处理的函数列表(用于处理延时删除等逻辑)
  141. self.delay_handle_funcs = {}
  142. --怪物尸体列表
  143. self.dead_body_list = {}
  144. self.dead_body_count = 0
  145. --预加载的资源是否加载完
  146. self.preload_res_is_loaded = false
  147. --场景数据是否加载完
  148. self.scene_data_loaded = false
  149. --场景是否正在执行update的方法
  150. self.is_in_update = false
  151. --场景更新步频
  152. self.update_scene_times_index = 0
  153. --场景更新消耗时间
  154. self.update_elapse_time = 0.0
  155. --场景更新步频
  156. self.late_update_scene_times_index = 0
  157. --场景更新消耗时间
  158. self.late_update_elapse_time = 0.0
  159. --是否在一键拾取状态中
  160. self.is_in_pick_all_state = false
  161. self:InitEvents()
  162. self:InitSAPFunction()
  163. self.last_dir_move_end_time = 0 --遥感上次操作时间
  164. self.last_attack_time = 0 --上次自动攻击的时间
  165. self.last_find_target_time = 0 --上次自动寻怪的时间
  166. self.last_ranAttackObj = nil --上次技能攻击主要目标
  167. self.last_auto_pick_id = false --上一个自动采集物的id
  168. self.last_auto_pick_time = false --上一个自动采集物成功采集的时间
  169. self.auto_find_and_attack_interval = Config.otherFightInfo.mainrole_autoAttack_interval --最小寻怪和攻击间隔
  170. self.god_open_level = Config.ConfigOpenLv.FunctionIconOpenLv.God --降神开放等级
  171. --当前选中对象
  172. self.curr_click_target = nil
  173. --点击屏幕的初始点
  174. self.touch_bengin_y = 0
  175. self.touch_bengin_x = 0
  176. --是否允许点击屏幕
  177. self.enable_click_screen = true
  178. self.update_role_name = false
  179. self.update_monster_name = false
  180. self.update_partner_name = false
  181. self.update_role_mode = false
  182. self.cur_jump_index = 0
  183. self.jump_count = 0
  184. --是否过场景状态
  185. self.is_loading_scene = false
  186. self.user_manul_time = 0
  187. --上次自动拾取物品时间
  188. self.auto_pick_time = 0
  189. --选中目标特效对象
  190. self.click_target_effect = nil
  191. self.jump_curr_trigger_index = false
  192. self.check_visible_role_num_time = false
  193. self.curr_click_target = false
  194. self.manual_target = false
  195. --是否12002 回来 加载npc结束
  196. self.load_npc_finish = false
  197. --是否加载进度条加载完成
  198. self.load_progress_finished = false
  199. --挂机优先选择目标配置
  200. self.target_auto_fight_cfg = false
  201. self.find_monster_pos = false --设置找怪物的点,在这个点附近开启寻怪自动打模型
  202. self.request_change_god_time = 0
  203. self.is_first_enter_game = true --启动游戏后第一次进场景
  204. self.is_first_enter_scene = true --从创角选角流程后第一次进场景
  205. self.is_first_load_bg_finish = false --第一次进场景背景图加载结束
  206. self.load_scene_timeout_max = false --延长加载场景超时时间
  207. self.can_opt_joy_stick = true --是否可以操作遥杆
  208. self.pick_drop_distance = 1000 --掉落的拾取距离p
  209. self.only_main_role_pick = false --是否只使用主角拾取,
  210. self.need_change_move_speed = false --是否需要改变拾取速度
  211. self.find_monster_distance = 1000 --寻路开启自动挂机的距离的平方
  212. self.preload_max_time = 20
  213. self.pre_check_distance = 1000 --预选目标的检测距离,手动情况下生效
  214. self.is_in_babydun = false -- 是否允许自动挂机
  215. self.is_showing_sky_box = false --当前是否在显示天空盒
  216. end
  217. function Scene:getInstance()
  218. if Scene.Instance == nil then
  219. Scene.New()
  220. end
  221. return Scene.Instance
  222. end
  223. function Scene:AddLayerSceneListener()
  224. local layer_scene = UiFactory.GetSceneCanvas().gameObject
  225. local onScreenDown = function(targer,x,y)
  226. if self.enable_click_screen then
  227. self:OnTouchBegin(x,y)
  228. GlobalEventSystem:Fire(SceneEventType.SCENE_TOUCH_DOWN, {x = x, y = y})
  229. if Input.GetMouseButtonDown(0) then
  230. self.mouse_down = true
  231. end
  232. end
  233. end
  234. local onScreenUp = function(targer,x,y)
  235. if self.enable_click_screen then
  236. self:OnTouchEnd(x,y)
  237. GlobalEventSystem:Fire(SceneEventType.SCENE_TOUCH_UP, {x = x, y = y})
  238. self.mouse_down = false
  239. end
  240. end
  241. local function onScreenDrag(target,x, y)
  242. if self.enable_click_screen then
  243. self:OnDrag(x, y)
  244. GlobalEventSystem:Fire(SceneEventType.SCENE_TOUCH_MOVE, {x = x, y = y})
  245. end
  246. end
  247. AddDragEvent(layer_scene,onScreenDrag)
  248. AddDownEvent(layer_scene,onScreenDown)
  249. AddUpEvent(layer_scene,onScreenUp)
  250. end
  251. function Scene:InitEvents()
  252. self:AddLayerSceneListener()
  253. local function roleAdd(role_id, role_vo)
  254. self:CreateRole(role_vo)
  255. end
  256. local function roleDel(role_id)
  257. self:DeleteRole(role_id)
  258. end
  259. local function partnerAdd(partner_id, partner_vo)
  260. self:CreatePartner(partner_vo)
  261. end
  262. local function partnerDel(partner_id)
  263. self:DeletePartner(partner_id)
  264. end
  265. local function monsterAdd( ins_id, monster_vo)
  266. self:CreateMonster(monster_vo)
  267. end
  268. local function monsterDel( ins_id)
  269. self:DeleteMonster(ins_id)
  270. end
  271. local function otherAdd( ins_id, other_vo)
  272. self:CreateOther(other_vo)
  273. end
  274. local function otherDel( ins_id)
  275. self:DeleteOther(ins_id)
  276. end
  277. local function door_add(enter_scene_id, vo)
  278. self:CreateDoor(vo)
  279. end
  280. local function jumppoint_add(vo)
  281. self:CreateJumpPoint(vo)
  282. end
  283. local function npc_add(ins_id, vo)
  284. self:CreateNpc(vo)
  285. end
  286. local function waypoint_add(vo)
  287. self:CreateWayPoint(vo)
  288. end
  289. local function delete_npc(id)
  290. self:DeleteNpc(id)
  291. end
  292. local function delete_door(id)
  293. self:DeleteDoor(id)
  294. end
  295. local function delete_jumppoint(id)
  296. self:DeleteJumpPoint(id)
  297. end
  298. local function delete_wappoint(id)
  299. self:DeleteWayPoint(id)
  300. end
  301. local function graveAdd(ins_id, grave_vo)
  302. self:CreateGrave(grave_vo)
  303. end
  304. local function graveDel(ins_id)
  305. self:DeleteGrave(ins_id)
  306. end
  307. local function hookRoleAdd(role_id, role_vo)
  308. self:CreateHookRole(role_vo)
  309. end
  310. local function hookRoleDel(role_id)
  311. self:DeleteHookRole(role_id)
  312. end
  313. local function buildAdd(build_vo)
  314. self:CreateBuild(build_vo)
  315. end
  316. local function buildDel( ins_id)
  317. self:DeleteBuild(ins_id)
  318. end
  319. local function buildBabyAdd(build_baby_vo)
  320. self:CreateBuildBaby(build_baby_vo)
  321. end
  322. local function buildBabyDel( ins_id)
  323. self:DeleteBuildBaby(ins_id)
  324. end
  325. local function furnitureAdd(furniture_vo)
  326. self:CreateFurniture(furniture_vo)
  327. end
  328. local function furnitureDel( ins_id)
  329. self:DeleteFurniture(ins_id)
  330. end
  331. local function sceneLoad(hide_load_progress)
  332. self:CancelWaitQuest() --切场景前关掉定时器
  333. self:OpenSceneLoadView(hide_load_progress)
  334. end
  335. --delay_jump_type 1 攻击后传送 2 攻击后跳跃
  336. local function onMainRoleJump(delay_jump_type)
  337. MainCamera.Instance:ChangeSmoothState(MainCamera.SmoothState.Jump)
  338. local main_role = Scene.Instance:GetMainRole()
  339. if main_role == nil or main_role:IsGhostMode() then return end
  340. if main_role.is_shoe_flying then return end
  341. if main_role.curr_multi_jump_type == Role.MULTI_JUMP_TYPE.Jump_4 then return end --在跳水的那一下,不能进行跳跃
  342. --预估距离
  343. local distance = nil
  344. local jump_type = main_role.curr_multi_jump_type or 1
  345. distance = main_role:GetPredictJumpDistance(jump_type)
  346. local dir = SkillManager:getInstance().joy_stick_dir or main_role.direction
  347. local dist = distance
  348. local end_pos = co.TableXY(main_role.real_pos.x + dir.x * dist, main_role.real_pos.y + dir.y * dist)
  349. --[[
  350. 1. point_1
  351. 2. point_2
  352. 3. point_2 3D模式下的最终落点point_3
  353. 4.point_3是否是障碍点DoJump()
  354. 5.
  355. 6.
  356. 0
  357. ]]
  358. --要先计算一次目标点是否可以跳过去
  359. if self.scene_mgr:CannotJumpCrossBlockScene() then
  360. end_pos = co.Vector2(SourceOperateMove.FindNearestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos, false))
  361. elseif self.scene_mgr:IsBlockXY(end_pos.x/SceneObj_LogicRealRatio_x, end_pos.y / SceneObj_LogicRealRatio_y) then
  362. end_pos = co.Vector2(SourceOperateMove.FindNearestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos, false))
  363. end
  364. if jump_type == Role.MULTI_JUMP_TYPE.Jump_1 then
  365. local ttdistance = GameMath_GetDistance(end_pos.x, end_pos.y, main_role.real_pos.x, main_role.real_pos.y, true)
  366. end_pos = main_role:GetJumpEndPos(end_pos,jump_type)
  367. local ttdistance2 = GameMath_GetDistance(end_pos.x, end_pos.y, main_role.real_pos.x, main_role.real_pos.y, true)
  368. end
  369. local lx = end_pos.x / SceneObj_LogicRealRatio_x
  370. local ly = end_pos.y / SceneObj_LogicRealRatio_y
  371. if self.scene_mgr:CannotJumpCrossBlockScene() then
  372. end_pos = co.Vector2(SourceOperateMove.FindNearestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos, false))
  373. else
  374. if self.scene_mgr:IsBlockXY(lx, ly) then
  375. local fastPos = co.Vector2(SourceOperateMove.FindFastestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos))
  376. if self.scene_mgr:IsBlockXY(fastPos.x / SceneObj_LogicRealRatio_x,fastPos.y / SceneObj_LogicRealRatio_y) then
  377. end_pos = SourceOperateMove.FindNoBlockPos(main_role.logic_pos) --如果跳跃的位置是不可行走区域,就找到最近的一个可行走点,跳过去
  378. end_pos.x = end_pos.x * SceneObj_LogicRealRatio_x
  379. end_pos.y = end_pos.y * SceneObj_LogicRealRatio_y
  380. else
  381. end_pos = fastPos
  382. end
  383. end
  384. local end_height = Scene.Instance:GetZoneHeight(end_pos.x/SceneObj_LogicRealRatio_x, end_pos.y/ SceneObj_LogicRealRatio_y) --落地点的高度
  385. local a = Config.otherFightInfo.jump_gravity_speed[jump_type]
  386. local upTime = Config.otherFightInfo.jump_vspeed[jump_type][1] / a -- 上升时间
  387. local max_height = 0.5 * a * upTime * upTime + main_role.jump_height+main_role.obj_pos_height*100 --最大跳跃高度 1/2 at2
  388. if end_height*100 > max_height then
  389. end_pos = co.Vector2(SourceOperateMove.FindNearestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos, false))
  390. end
  391. end
  392. main_role:DoJump(end_pos,nil,nil,nil,nil,jump_type,false,false,false,false,false,false,delay_jump_type)
  393. SkillManager:getInstance().joy_stick_dir = nil
  394. end
  395. local function onMainRoleJumpEnd(force_check, logic_x, logic_y)
  396. local main_role = self.main_role
  397. if main_role then
  398. if main_role.move_flag and main_role.move_flag == MOVE_TYPE.ACCELERATE then
  399. MainCamera.Instance:ChangeSmoothState(MainCamera.SmoothState.NewBieTask)
  400. else
  401. MainCamera.Instance:ChangeSmoothState(MainCamera.SmoothState.Normal)
  402. end
  403. end
  404. self:CheckJumpPoint(force_check, logic_x, logic_y)
  405. self:CheckDoorInSameScene(true)
  406. end
  407. local function onMainRoleMoveEnd()
  408. if not self.check_jump_point_time then
  409. self:CheckJumpPoint()
  410. self.check_jump_point_time = Status.NowTime
  411. else
  412. if Status.NowTime - self.check_jump_point_time > Config.otherFightInfo.check_jump_point_space then
  413. self:CheckJumpPoint()
  414. self.check_jump_point_time = Status.NowTime
  415. end
  416. end
  417. end
  418. local function onRoleTaskJump(end_pos,call_back,move_vspeed,role, force_jump)
  419. MainCamera.Instance:ChangeSmoothState(MainCamera.SmoothState.TaskJump)
  420. local role = role or Scene.Instance:GetMainRole()
  421. if role == nil then return end
  422. if role.is_shoe_flying then return end
  423. if role:IsInState(PoseState.TASK_JUMP) and not force_jump then return end
  424. local distance = GameMath_GetDistance(role.real_pos.x,role.real_pos.y,end_pos.x,end_pos.y,true)
  425. local dir = CoVector2.New(end_pos.x - role.real_pos.x ,end_pos.y - role.real_pos.y)
  426. dir:normalise()
  427. --跳跃次数
  428. local count_cfg = Config.otherFightInfo.shoe_muiti_jump_info
  429. local need_count = 0
  430. for i=1,#count_cfg do
  431. if distance >= count_cfg[i].min and distance <= count_cfg[i].max then
  432. need_count = count_cfg[i].jump_counts
  433. break
  434. end
  435. end
  436. --如果是强制跳跃,那就让他一段跳
  437. if need_count == 0 and force_jump then
  438. need_count = 1
  439. end
  440. if need_count == 0 then
  441. local findVo = FindVo.New()
  442. findVo.type = FindVo.POINT
  443. findVo.sceneId = SceneManager.Instance:GetSceneId()
  444. findVo.x = end_pos.x / SceneObj.LogicRealRatio.x
  445. findVo.y = end_pos.y / SceneObj.LogicRealRatio.y
  446. findVo.call_back = call_back
  447. GlobalEventSystem:Fire(EventName.STOPAUTOFIGHT)
  448. Scene:getInstance():FindElement(findVo)
  449. else
  450. local target_list = {}
  451. if need_count == 1 then
  452. target_list = {
  453. [1] = co.TableXY(end_pos.x,end_pos.y),
  454. }
  455. elseif need_count == 2 then
  456. target_list = {
  457. [1] = co.TableXY(role.real_pos.x + dir.x * distance / 2,role.real_pos.y + dir.y * distance / 2),
  458. [2] = co.TableXY(end_pos.x,end_pos.y),
  459. }
  460. elseif need_count == 3 then
  461. target_list = {
  462. [1] = co.TableXY(role.real_pos.x + dir.x * distance / 3,role.real_pos.y + dir.y * distance / 3),
  463. [2] = co.TableXY(role.real_pos.x + dir.x * distance / 3 * 2,role.real_pos.y + dir.y * distance / 3 * 2),
  464. [3] = co.TableXY(end_pos.x,end_pos.y),
  465. }
  466. end
  467. GlobalEventSystem:Fire(EventName.CANCEL_SPEED_BUFF)
  468. role:DoTaskJump(Role.MULTI_JUMP_TYPE.Jump_2, target_list,call_back,move_vspeed,true)
  469. end
  470. end
  471. local function onRoleGameFlyJump(jump_time,start_pos, end_pos, role, call_back, is_fail)
  472. MainCamera.Instance:ChangeSmoothState(MainCamera.SmoothState.Jump)
  473. local main_role = role or Scene.Instance:GetMainRole()
  474. if main_role == nil then return end
  475. local distance = nil
  476. local dir = main_role.direction
  477. local dist,move_hspeed,move_vspeed = main_role:GetGameJumpDistanceAndSpeed(jump_time)
  478. local end_pos = co.TableXY(main_role.real_pos.x + dir.x * dist, main_role.real_pos.y + dir.y * dist)
  479. local start_pos = co.TableXY(main_role.real_pos.x, main_role.real_pos.y)
  480. main_role:DoGameFlyJump(end_pos,start_pos,move_hspeed,move_vspeed,call_back,is_fail)
  481. end
  482. local function onMainRoleMove()
  483. if not self.check_jump_point_time then
  484. self:CheckJumpPoint()
  485. self.check_jump_point_time = Status.NowTime
  486. else
  487. if Status.NowTime - self.check_jump_point_time > Config.otherFightInfo.check_jump_point_space then
  488. self:CheckJumpPoint()
  489. self:CheckSkyBoxArea()
  490. self:CheckDoorInSameScene()
  491. self.check_jump_point_time = Status.NowTime
  492. end
  493. end
  494. end
  495. local function reset_fun(logic_x, logic_y, is_dir_move)
  496. if AutoFightManager.Instance.go_to_pos and AutoFightManager:getInstance():GetAutoFightState() then
  497. AutoFightManager:getInstance():CacheGoToPos()
  498. end
  499. if not self:CheckJumpPoint(nil, logic_x, logic_y) then
  500. if not is_dir_move then
  501. OperateManager.Instance:StopMove()
  502. end
  503. end
  504. end
  505. local function onMainRoleJumpEndImm()
  506. if AutoFightManager:getInstance():GetAutoFightState() then
  507. self:UpdateAutoFight(true)
  508. end
  509. end
  510. local function onSceneChange()
  511. local id = SceneManager:getInstance():GetSceneId()
  512. if Config.ConfigDoorInSameScene[id] then
  513. self.has_same_scene_door = true
  514. else
  515. self.has_same_scene_door = false
  516. end
  517. if not self.is_set_frame_rate then
  518. self.is_set_frame_rate = true
  519. setTimeout(function() SetGameFrameRate() end,10)
  520. end
  521. -- self:ChangeMainRoleScale()
  522. -- local need_check
  523. -- local scene_info = self.scene_mgr:GetSceneInfo()
  524. -- if scene_info then
  525. -- if Config.ConfigSceneDangerEffect.Type[scene_info.type] and self.scene_mgr:IsShowDangerWarnScene() then
  526. -- need_check = true
  527. -- if not self.bind_hp_handler then
  528. -- local function onHpChange()
  529. -- if RoleManager.Instance.mainRoleInfo.hp / RoleManager.Instance.mainRoleInfo.maxHp < 0.3 then
  530. -- EventSystem.Fire(GlobalEventSystem,EventName.PLAY_DANGER_EFFECT, true)
  531. -- else
  532. -- EventSystem.Fire(GlobalEventSystem,EventName.PLAY_DANGER_EFFECT, false)
  533. -- end
  534. -- end
  535. -- self.bind_hp_handler = RoleManager.Instance.mainRoleInfo:BindOne("hp", onHpChange)
  536. -- onHpChange()
  537. -- end
  538. -- end
  539. -- end
  540. -- if not need_check then
  541. -- EventSystem.Fire(GlobalEventSystem,EventName.PLAY_DANGER_EFFECT, false)
  542. -- if self.bind_hp_handler then
  543. -- RoleManager.Instance.mainRoleInfo:UnBind(self.bind_hp_handler)
  544. -- self.bind_hp_handler = nil
  545. -- end
  546. -- end
  547. -- local playerLv = RoleManager:getInstance():GetMainRoleVo().level
  548. -- if playerLv > 85 and not SystemRuntimePlatform.IsIphone() then
  549. -- SceneDropManager:getInstance():CreateDropEffectToPool()
  550. -- end
  551. end
  552. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_MOVE_TO_BLOCK, reset_fun) --移动至障碍区
  553. GlobalEventSystem:Bind(SceneEventType.DOOR_VO_ADD, door_add) --传送门增加
  554. GlobalEventSystem:Bind(SceneEventType.DOOR_VO_REMOVE, delete_door) --传送门移除
  555. GlobalEventSystem:Bind(SceneEventType.JUMPPOINT_VO_ADD, jumppoint_add) --跳点增加
  556. GlobalEventSystem:Bind(SceneEventType.JUMPPOINT_VO_REMOVE, delete_jumppoint) --跳点移除
  557. GlobalEventSystem:Bind(SceneEventType.NPC_VO_ADD, npc_add) --npc增加
  558. GlobalEventSystem:Bind(SceneEventType.NPC_VO_REMOVE, delete_npc) --npc移除
  559. GlobalEventSystem:Bind(SceneEventType.ROLE_VO_ADD, roleAdd) --角色增加
  560. GlobalEventSystem:Bind(SceneEventType.ROLE_VO_REMOVE, roleDel) --角色移除
  561. GlobalEventSystem:Bind(SceneEventType.PARTNER_VO_ADD, partnerAdd) --伙伴增加
  562. GlobalEventSystem:Bind(SceneEventType.PARTNER_VO_REMOVE, partnerDel) --伙伴移除
  563. GlobalEventSystem:Bind(SceneEventType.MONSTER_VO_ADD, monsterAdd) --怪物增加
  564. GlobalEventSystem:Bind(SceneEventType.MONSTER_VO_REMOVE, monsterDel) --怪物移除
  565. GlobalEventSystem:Bind(SceneEventType.OTHER_VO_ADD, otherAdd) --普通场景对象增加
  566. GlobalEventSystem:Bind(SceneEventType.OTHER_VO_REMOVE, otherDel) --普通场景对象移除
  567. GlobalEventSystem:Bind(SceneEventType.OPEN_SCENE_LOAD_VIEW, sceneLoad) --打开场景加载页
  568. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_JUMP, onMainRoleJump) --主角跳跃
  569. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_JUMP_END, onMainRoleJumpEnd) --跳跃结束
  570. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_JUMP_END_IMM, onMainRoleJumpEndImm) --跳跃结束
  571. GlobalEventSystem:Bind(ObjectEventType.MAINROLE_MOVE_EVENT_IMME,onMainRoleMove) --主角移动
  572. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_MOVE_END, onMainRoleMoveEnd) --移动结束
  573. GlobalEventSystem:Bind(SceneEventType.CREATE_WAY_POINT, waypoint_add) --寻路点增加
  574. GlobalEventSystem:Bind(SceneEventType.DELETE_WAY_POINT, delete_wappoint) --寻路点移除
  575. GlobalEventSystem:Bind(SceneEventType.GRAVE_VO_ADD, graveAdd) --墓碑增加
  576. GlobalEventSystem:Bind(SceneEventType.GRAVE_VO_REMOVE, graveDel) --墓碑移除
  577. GlobalEventSystem:Bind(SceneEventType.HOOK_VO_ADD, hookRoleAdd) --挂机角色增加
  578. GlobalEventSystem:Bind(SceneEventType.HOOK_VO_REMOVE, hookRoleDel) --挂机角色移除
  579. GlobalEventSystem:Bind(SceneEventType.BUILD_VO_ADD, buildAdd) --家园建筑增加
  580. GlobalEventSystem:Bind(SceneEventType.BUILD_VO_REMOVE, buildDel) --家园建筑移除
  581. GlobalEventSystem:Bind(SceneEventType.FURNITURE_VO_ADD, furnitureAdd) --家具增加
  582. GlobalEventSystem:Bind(SceneEventType.FURNITURE_VO_REMOVE, furnitureDel) --家具移除
  583. GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, onSceneChange) --场景加载页完成
  584. GlobalEventSystem:Bind(SceneEventType.BUILD_BABY_VO_ADD, buildBabyAdd) --建筑宝宝增加
  585. GlobalEventSystem:Bind(SceneEventType.BUILD_BABY_REMOVE, buildBabyDel) --建筑宝宝移除
  586. GlobalEventSystem:Bind(SceneEventType.TASK_MUL_JUMP, onRoleTaskJump) --任务跳跃
  587. GlobalEventSystem:Bind(SceneEventType.GAME_FLY_JUMP, onRoleGameFlyJump) --游戏跳跃
  588. local function hide_all_mon()
  589. self.is_hide_all_mon = true
  590. self:UpdateAllMonsterVisible()
  591. end
  592. local function show_all_mon()
  593. self.is_hide_all_mon = nil
  594. self:UpdateAllMonsterVisible()
  595. end
  596. GlobalEventSystem:Bind(SceneEventType.HIDE_ALL_MONSTER, hide_all_mon)
  597. GlobalEventSystem:Bind(SceneEventType.SHOW_ALL_MONSTER, show_all_mon)
  598. local function hide_all_role()
  599. self.is_hide_all_role = true
  600. self:UpdateRoleVisibleState(true)
  601. end
  602. local function show_all_role()
  603. self.is_hide_all_role = nil
  604. self:UpdateRoleVisibleState(true)
  605. end
  606. GlobalEventSystem:Bind(SceneEventType.HIDE_ALL_ROLE, hide_all_role)
  607. GlobalEventSystem:Bind(SceneEventType.SHOW_ALL_ROLE, show_all_role)
  608. local function onBlockSettingChange(key, value)
  609. --处于性能考虑 这几个可以立马生效 其他的 只有重新创建的时候才生效 不屏蔽主角的
  610. if key == "wing" then -- 炫翼
  611. for _, v in pairs(self.role_list) do
  612. if v ~= self.main_role then
  613. if v.ChangeWing then
  614. v:ChangeWing()
  615. end
  616. end
  617. end
  618. for _, v in pairs(self.hook_role_list) do
  619. if v.ChangeWing then
  620. v:ChangeWing()
  621. end
  622. end
  623. elseif key == "talisman" then -- 宝具
  624. for _, v in pairs(self.role_list) do
  625. if v.ChangeSprite then
  626. v:ChangeSprite()
  627. end
  628. end
  629. elseif key == "headwear" then
  630. for _, v in pairs(self.role_list) do
  631. if v ~= self.main_role then
  632. if v.ChangeHeadWear then
  633. v:ChangeHeadWear()
  634. end
  635. end
  636. end
  637. elseif key == "aiNiang" then --ai娘
  638. for _, v in pairs(self.role_list) do
  639. if v ~= self.main_role then
  640. if v.ChangePet then
  641. v:ChangePet()
  642. end
  643. end
  644. end
  645. elseif key == "godWeapon" then -- 武器
  646. for _, v in pairs(self.role_list) do
  647. if v ~= self.main_role then
  648. if v.ChangeWeapon then
  649. v:ChangeWeapon()
  650. end
  651. end
  652. end
  653. elseif key == "baby" then
  654. for _, v in pairs(self.role_list) do
  655. if v ~= self.main_role then
  656. if v.ChangeBaby then
  657. v:ChangeBaby()
  658. end
  659. end
  660. end
  661. elseif key == "title" then -- 称号
  662. for _, v in pairs(self.role_list) do
  663. if v ~= self.main_role then
  664. --没有使用ChangeDsgt是因为nameboard里面把子节点隐藏了,所以ChangeDsgt不够哟
  665. if v.UpdateDsgt then
  666. v:UpdateDsgt()
  667. end
  668. end
  669. end
  670. elseif key == "active" then
  671. for _, v in pairs(self.role_list) do
  672. if v ~= self.main_role then
  673. if v.ShowLivenessImage then
  674. v:ShowLivenessImage()
  675. end
  676. end
  677. end
  678. elseif key == "pet" then -- 宠物
  679. for _, v in pairs(self.role_list) do
  680. if v ~= self.main_role then
  681. if v.ChangePokemonId then
  682. v:ChangePokemonId()
  683. end
  684. end
  685. end
  686. elseif key == "horse" then -- 座驾
  687. for _, v in pairs(self.role_list) do
  688. if v ~= self.main_role then
  689. if v.ChangeHorse then
  690. v:ChangeHorse()
  691. end
  692. end
  693. end
  694. elseif key == "scenePtc" then
  695. lua_settingM:SetSceneEffect(value)
  696. elseif key == "shadow" then -- 实时阴影效果
  697. if self.main_role then
  698. self.main_role:ChangeDynamicShadowState()
  699. end
  700. end
  701. end
  702. lua_settingM:Bind(GameSettingManager.BLOCK_SETTING_CHANGE, onBlockSettingChange)
  703. local function onMonsterDeadHandler(id)
  704. self.scene_mgr:DeleteMonsterVo(id, SceneManager.DELETE_MONSTER_DEAD)
  705. end
  706. GlobalEventSystem:Bind(ObjectEventType.OBJ_DEAD, onMonsterDeadHandler)
  707. --尸体渐隐结束的回调
  708. local function deadbody_fade_end_func(deadbody_id)
  709. self:DeleteDeadBody(deadbody_id)
  710. end
  711. GlobalEventSystem:Bind(ObjectEventType.OBJ_DEADBODY_FADE_END, deadbody_fade_end_func)
  712. local function roleWalkCompleteHandler()
  713. self:RoleWalkCompleteHandler(true)
  714. end
  715. GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_MOVE_END, roleWalkCompleteHandler)
  716. local function start_check_collect_btn(bool,limit_id_list)
  717. if bool then
  718. self.check_collect_btn_limit_list = limit_id_list
  719. if not self.check_collect_id then
  720. local function check_clock()
  721. self:CheckMainUICollectBtnState()
  722. end
  723. self.check_collect_id = GlobalTimerQuest:AddPeriodQuest(check_clock,1,-1)
  724. end
  725. else
  726. if self.check_collect_id then
  727. GlobalTimerQuest:CancelQuest(self.check_collect_id)
  728. self.check_collect_id =nil
  729. end
  730. GlobalEventSystem:Fire(EventName.SHOW_MAINUI_COLLECT_BTN,false)
  731. end
  732. end
  733. GlobalEventSystem:Bind(EventName.CHECK_COLLECT_BTN, start_check_collect_btn)
  734. local function onSceneStart()
  735. if not self.click_target_effect then
  736. self:CreateClickTargetEffect()
  737. end
  738. if self.find_vo_cache then
  739. self.find_vo_cache = nil
  740. end
  741. GlobalEventSystem:Fire(EventName.SHOW_MAINUI_COLLECT_BTN, false)
  742. end
  743. GlobalEventSystem:Bind(SceneManager.START,onSceneStart)
  744. --创建掉落列表
  745. local function onRefreshDropList(vo)
  746. local sid = self.scene_mgr:GetSceneId()
  747. if vo and vo.map_id == sid then
  748. self:RefreshDropList(vo)
  749. end
  750. end
  751. GlobalEventSystem:Bind(SceneEventType.BROADCAST_SCENE_DROP_LIST, onRefreshDropList)
  752. local function onUpdateRoleLimitHandler()
  753. self:UpdateRoleVisibleState(true)
  754. end
  755. GlobalEventSystem:Bind(SceneEventType.UPDATE_ROLE_LIMIT, onUpdateRoleLimitHandler)
  756. local function findway_ended_func()
  757. self:ClearLastAttack()
  758. -- DialogueModel:getInstance():SetMultSelectTaskID(nil)
  759. end
  760. GlobalEventSystem:Bind(EventName.FINDWAY_ENDED, findway_ended_func)
  761. -- local function onCancelClickTarget()
  762. -- end
  763. -- GlobalEventSystem:Bind(SceneEventType.CANCEL_CLICK_TARGET, onCancelClickTarget)
  764. local function onCamareMoveHandler()
  765. --摄像机移动时,主角停止移动时,更新名字条位置
  766. if self.main_role then
  767. local x,y = self.main_role:GetRealPos()
  768. local mainrole_height = self.main_role.obj_pos_height
  769. if not self.main_role:IsGhostMode() then
  770. self.main_role.name_board:UpdatePos(x,y,mainrole_height)
  771. end
  772. end
  773. self.nameBoard_mgr:UpdateAllNameBoard()
  774. end
  775. EventSystem.Bind(GlobalEventSystem,SceneEventType.CAMERA_MOVE,onCamareMoveHandler)
  776. local function onScreenMousePress()
  777. if SceneManager.Instance:IsSceneStart() then
  778. local main_role = Scene.Instance:GetMainRole()
  779. if main_role then
  780. main_role.stand_init_time = 0
  781. end
  782. end
  783. end
  784. EventSystem.Bind(GlobalEventSystem,GameInputManager.GameInputEvent.MOUSE_PRESS, onScreenMousePress)
  785. local function onPkStatusChangeHandler()
  786. --改变模式 当前的对象可能变成不可攻击的
  787. local defender = self.curr_click_target
  788. if defender and defender:GetVo() then
  789. local attacker_vo = RoleManager.Instance:GetMainRoleVo()
  790. local defender_vo = defender:GetVo()
  791. if not SceneManager.Instance:CanPKByPKStatus(attacker_vo,defender_vo) then
  792. GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD,false)
  793. self:CancelClickTarget()
  794. end
  795. end
  796. end
  797. RoleManager.Instance.mainRoleInfo:BindOne("pk_status", onPkStatusChangeHandler)
  798. --只有主角的需要,因为可能地图没加载完就去设置位置,可能是障碍区
  799. -- local function onSceneMapLoadCompleted()
  800. -- if self.main_role then
  801. -- self.main_role:SetFollowObjPosition()
  802. -- end
  803. -- end
  804. -- EventSystem.Bind(GlobalEventSystem,EventName.LOADMAP_COMPLETE,onSceneMapLoadCompleted)
  805. local load_npc_finish = function()
  806. self.load_npc_finish = true
  807. end
  808. GlobalEventSystem:Bind(EventName.NPC_LOAD_FINISH,load_npc_finish)
  809. if not self.write_cache_file_timer and tonumber(AppConst.EnglineVer) >= 77 then
  810. local write_func = function()
  811. local mainrole = Scene.Instance:GetMainRole()
  812. if mainrole and mainrole:IsInState(PoseState.ATTACK) then
  813. return
  814. end
  815. local cache_count = resMgr:GetDownloadCacheFileCount()
  816. if cache_count > 0 then
  817. resMgr:WriteDownloadCacheFile()
  818. end
  819. end
  820. self.write_cache_file_timer = TimerQuest.AddPeriodQuest(GlobalTimerQuest, write_func, 2, -1)
  821. end
  822. local function dun_drop_all_list( ... )--结算的时候收纳所有掉落道具
  823. local goods_data = {}
  824. for _, v in pairs(self.drop_list) do
  825. if v.state ~= 4 then
  826. v.state = 4--飞到角色身上
  827. v.not_fly_float = true--这里不需要单个飘字
  828. goods_data[#goods_data + 1] = {goods_type_id = v.vo.type_id,num = v.vo.drop_num}
  829. end
  830. end
  831. if #goods_data > 0 then
  832. MainUIModel:getInstance():AddFloatInfo(goods_data,true)
  833. end
  834. end
  835. GlobalEventSystem:Bind(BaseDungeonModel.FINISH_DROP_LIST, dun_drop_all_list)
  836. --守护拾取检测
  837. local on_check_evil_auto_pick = function()
  838. if not self.only_main_role_pick and not SceneManager:getInstance():IsGuildScene() and ItemUseModel:getInstance():HasWearEvil() and self.main_role and self.main_role.evil then
  839. self:OnEvilPick()
  840. end
  841. end
  842. GlobalEventSystem:Bind(EventName.EVIL_AUTO_PICK,on_check_evil_auto_pick)
  843. --一键拾取过程中
  844. local onUpdatePickAllDropState = function(state)
  845. self.is_in_pick_all_state = state
  846. print('Ych:Scene.lua[968] data', self.is_in_pick_all_state)
  847. end
  848. GlobalEventSystem:Bind(EventName.UPDATE_PICK_ALL_DROP_STATE,onUpdatePickAllDropState)
  849. end
  850. --[[
  851. res_name:
  852. need_select:
  853. ]]
  854. function Scene:CreateClickTargetEffect(res_name, need_select)
  855. local effect_name = res_name or "mrsd_xuanzhong_001"
  856. self.effect_res = effect_name --用于判断是否需要加载其他特效
  857. local function load_call_back(objs, is_gameObject)
  858. if objs and objs[0] then
  859. self.click_target_effect = is_gameObject and objs[0] or newObject(objs[0])
  860. self.click_target_effect:SetActive(false)
  861. if need_select then
  862. self:SetClickTarget(self.curr_click_target, true)
  863. else
  864. if self.main_role and not IsNull(self.main_role.parent_transform) then
  865. self.click_target_effect.transform:SetParent(self.main_role.parent_transform)
  866. end
  867. end
  868. end
  869. end
  870. lua_resM:loadPrefab(self,effect_name,effect_name, load_call_back)
  871. end
  872. --传送点在同一个场景里的传送门
  873. function Scene:CheckDoorInSameScene(fire_evt)
  874. if not self.has_same_scene_door then return end
  875. local main_role = Scene.Instance:GetMainRole()
  876. local dist = dist or 2
  877. local near_door = nil
  878. local cfg = Config.ConfigDoorInSameScene[SceneManager:getInstance():GetSceneId()]
  879. if cfg then
  880. local posX,posY = self.main_role:GetLogicPos()
  881. local door_posX = 0
  882. local door_posY = 0
  883. for i,door in pairs(cfg) do
  884. door_posX = door.x / SceneObj_LogicRealRatio_x
  885. door_posY = door.y / SceneObj_LogicRealRatio_y
  886. if GameMath_IsPointNear(posX, posY, door_posX, door_posY, dist) then
  887. near_door = door
  888. do break end
  889. end
  890. end
  891. if near_door then
  892. if fire_evt then
  893. self:RoleWalkCompleteHandler(true)
  894. else
  895. OperateManager.Instance:StopMove()
  896. end
  897. end
  898. end
  899. end
  900. function Scene:CheckSkyBoxArea()
  901. local area_info = Config.SkyBoxAreaInfo[self.scene_mgr:GetSceneId()]
  902. if area_info then
  903. local x, y = self.main_role:GetRealPos()
  904. for i, vo in ipairs(area_info) do
  905. local dis = GameMath_GetDistance(x, y, vo.center_pos.x, vo.center_pos.y, true)
  906. if dis < vo.range and (not vo.task_list or TaskModel.getInstance():IsBetweenTaskListState(vo.task_list)) then
  907. if not self.is_showing_sky_box then
  908. local cfg =
  909. {
  910. black_ground_alpha = vo.black_ground_alpha,
  911. show_type = vo.black_ground_show_type,
  912. sky_res = vo.black_ground_sky_res,
  913. show_target_alpha = vo.show_target_alpha,
  914. show_step_alpha = vo.show_step_alpha,
  915. hide_target_alpha = vo.hide_target_alpha,
  916. hide_step_alpha = vo.hide_step_alpha,
  917. }
  918. MainCamera.getInstance():ShowBlackSky(cfg.sky_res, cfg.show_target_alpha, cfg.show_step_alpha)
  919. self.is_showing_sky_box = cfg
  920. end
  921. break
  922. else
  923. if self.is_showing_sky_box then
  924. MainCamera.getInstance():HideBlackSky(self.is_showing_sky_box.sky_res, self.is_showing_sky_box.hide_target_alpha, self.is_showing_sky_box.hide_step_alpha)
  925. self.is_showing_sky_box = false
  926. end
  927. end
  928. end
  929. end
  930. end
  931. function Scene:CheckJumpPoint(force_check,role_id)
  932. local main_role = role_id and self:GetRole(role_id) or self.main_role
  933. if main_role == nil or main_role:IsGhostMode() then return false end
  934. local scene_info = Config.MultiJumpPos[self.scene_mgr:GetSceneId()]
  935. local x, y = main_role:GetRealPos()
  936. local function on_task_jump( )
  937. if scene_info then
  938. for j, pvo in ipairs(scene_info) do
  939. for i, vo in ipairs(pvo) do
  940. local range = vo.range * vo.range
  941. local check_cd_time = vo.jump_show_type == 2 and 1 or 5
  942. if (not main_role.jump_curr_trigger_index or main_role.jump_curr_trigger_index == j) and GameMath_GetDistance(x, y, vo.start_pos.x, vo.start_pos.y, false) <= range and not main_role:IsInState(PoseState.FLY_SHOE_EFFECT) and not main_role:IsInState(PoseState.TaskJump) then
  943. -- if vo.trigger_time then
  944. -- print("tanar: [Scene 1069]=> i : ",i, Status.NowTime - vo.trigger_time)
  945. -- end
  946. if vo.trigger_time == nil or Status.NowTime - vo.trigger_time > check_cd_time then
  947. main_role.jump_curr_trigger_index = j
  948. vo.trigger_time = Status.NowTime
  949. if vo.jump_show_type == 2 then
  950. main_role:DoFlyShoeEffect(vo.middle_pos, 3)
  951. else
  952. GlobalEventSystem:Fire(SceneEventType.TASK_MUL_JUMP,vo.middle_pos,nil,nil, nil , true)
  953. end
  954. return true
  955. end
  956. end
  957. end
  958. end
  959. end
  960. end
  961. if on_task_jump() then
  962. return true
  963. end
  964. local lx, ly = main_role:GetLogicPos()
  965. --如果是跳点区域 或者
  966. local is_jump = self.scene_mgr:IsAreaType(lx, ly, AreaDataIndex.JumpType)
  967. --上一个区域跳跃结束点是障碍点
  968. local next_jump_is_block = force_check and self.scene_mgr:IsBlockXY(lx, ly) and main_role:IsInState(PoseState.TASK_JUMP)
  969. if is_jump or next_jump_is_block then
  970. if force_check then
  971. local nearest_end_pos, nearest_end_dis = nil, nil
  972. -- print("tanar: [Scene 1096]=> is_jump: ",is_jump)
  973. if is_jump then
  974. on_task_jump()
  975. elseif next_jump_is_block then
  976. local unblock_pos = SourceOperateMove.FindNoBlockPos(main_role.logic_pos)
  977. if unblock_pos then
  978. nearest_end_pos = co_TableXY(unblock_pos.x * SceneObj_LogicRealRatio_x, unblock_pos.y * SceneObj_LogicRealRatio_y)
  979. else
  980. return false
  981. end
  982. else
  983. return false
  984. end
  985. if nearest_end_pos then
  986. GlobalEventSystem:Fire(SceneEventType.TASK_MUL_JUMP, nearest_end_pos, nil, nil, nil, true)
  987. end
  988. --[[
  989. local end_pos = nil
  990. local multi_jump = false
  991. if is_jump then
  992. local distance = nil
  993. distance = main_role:GetPredictJumpDistance(main_role.curr_multi_jump_type or 1)
  994. local dir = main_role.direction
  995. local dist = distance or 800
  996. end_pos = co.TableXY(main_role.real_pos.x + dir.x * dist, main_role.real_pos.y + dir.y * dist)
  997. lx = end_pos.x / SceneObj_LogicRealRatio_x
  998. ly = end_pos.y / SceneObj_LogicRealRatio_y
  999. if self.scene_mgr:IsBlockXY(lx, ly) then
  1000. local ex, ey, result = SourceOperateMove.FindFastestPos(co.TableXY(main_role.real_pos.x,main_role.real_pos.y), end_pos)
  1001. if result then
  1002. end_pos = co.Vector2(ex, ey)
  1003. -- elseif self.scene_mgr:IsAreaType(lx, ly, AreaDataIndex.JumpType) then
  1004. else
  1005. main_role:CancelSmoothHeight();
  1006. multi_jump = true
  1007. end
  1008. end
  1009. elseif next_jump_is_block then
  1010. local unblock_pos = SourceOperateMove.FindNoBlockPos(main_role.logic_pos)
  1011. if unblock_pos then
  1012. end_pos = co.TableXY(unblock_pos.x * SceneObj_LogicRealRatio_x, unblock_pos.y * SceneObj_LogicRealRatio_y)
  1013. multi_jump = false
  1014. else
  1015. return false
  1016. end
  1017. else
  1018. return false
  1019. end
  1020. self.last_multi_jump_time = Status.NowTime
  1021. -- main_role:DoJump(end_pos, true)
  1022. GlobalEventSystem:Fire(SceneEventType.TASK_MUL_JUMP, end_pos, nil, nil, nil, true)
  1023. if multi_jump then
  1024. if main_role.jump_info then
  1025. main_role.jump_area_mutil_jump_end_time = Status.NowTime + main_role.jump_info.move_time * 0.85
  1026. end
  1027. else
  1028. main_role.jump_area_mutil_jump_end_time = nil
  1029. end
  1030. ]]
  1031. end
  1032. main_role:CancelSmoothHeight()
  1033. return true
  1034. end
  1035. return false
  1036. end
  1037. function Scene:InitSAPFunction()
  1038. local func = function(operate,obj_type,obj_data)
  1039. if operate == SapManager.OperateType.CreateOBJ then
  1040. if obj_type == SapManager.ObjType.JumpPoint then
  1041. local jumppoint_vo = obj_data
  1042. local jumppoint = JumpPoint.New(jumppoint_vo)
  1043. self.jumppoint_list[jumppoint.id] = jumppoint
  1044. elseif obj_type == SapManager.ObjType.Door then
  1045. local door = Door.New(obj_data)
  1046. if obj_data.is_same_scene then
  1047. self.door_list[obj_data.enter_scene_id.."-"..obj_data.index] = door
  1048. else
  1049. self.door_list[obj_data.enter_scene_id] = door
  1050. end
  1051. elseif obj_type == SapManager.ObjType.NPC then
  1052. if not self.npc_list[tonumber(obj_data.instance_id)] then
  1053. local npc_obj = self.npc_pool:GetObjFreeList()
  1054. if not npc_obj then
  1055. npc_obj = Npc.New()
  1056. end
  1057. npc_obj:InitNpc(obj_data)
  1058. self.npc_list[tonumber(obj_data.instance_id)] = npc_obj
  1059. end
  1060. elseif obj_type == SapManager.ObjType.Tile then
  1061. self.mapView:CreateTile(obj_data)
  1062. elseif obj_type == SapManager.ObjType.Effect then
  1063. self.mapView:CreateEffect(obj_data)
  1064. elseif obj_type == SapManager.ObjType.Model then
  1065. self.mapView:CreateModel(obj_data)
  1066. elseif obj_type == SapManager.ObjType.MoveObj then
  1067. self.mapView:CreateMoveObj(obj_data)
  1068. elseif obj_type == SapManager.ObjType.SpecialModel then
  1069. self.mapView:CreateSpecialModel(obj_data)
  1070. elseif obj_type == SapManager.ObjType.CacheEffect then
  1071. self.mapView:CreateCacheEffect(obj_data)
  1072. end
  1073. elseif operate == SapManager.OperateType.DestoryOBJ then
  1074. if obj_type == SapManager.ObjType.JumpPoint then
  1075. local jumopoint = self.jumppoint_list[obj_data]
  1076. if jumopoint ~= nil then
  1077. jumopoint:DeleteMe()
  1078. self.jumppoint_list[obj_data] = nil
  1079. end
  1080. elseif obj_type == SapManager.ObjType.Door then
  1081. local door = self.door_list[obj_data]
  1082. if door ~= nil then
  1083. door:DeleteMe()
  1084. self.door_list[obj_data] = nil
  1085. end
  1086. elseif obj_type == SapManager.ObjType.NPC then
  1087. local npc = self.npc_list[obj_data]
  1088. if npc ~= nil then
  1089. self.npc_pool:ReleaseObj(npc)
  1090. self.npc_list[obj_data] = nil
  1091. end
  1092. elseif obj_type == SapManager.ObjType.Tile then
  1093. self.mapView:DeleteTile(obj_data)
  1094. elseif obj_type == SapManager.ObjType.Effect then
  1095. self.mapView:DeleteEffect(obj_data)
  1096. elseif obj_type == SapManager.ObjType.Model then
  1097. self.mapView:DeleteModel(obj_data)
  1098. elseif obj_type == SapManager.ObjType.MoveObj then
  1099. self.mapView:DeleteMoveObj(obj_data)
  1100. elseif obj_type == SapManager.ObjType.SpecialModel then
  1101. self.mapView:DeleteSpecialModel(obj_data)
  1102. elseif obj_type == SapManager.ObjType.CacheEffect then
  1103. self.mapView:DeleteCacheEffect(obj_data)
  1104. end
  1105. end
  1106. end
  1107. SapManager:getInstance():RegisterCallbackFunc(func)
  1108. end
  1109. function Scene:RefreshDropList(vo)
  1110. local drop_list = vo.drop_list
  1111. if drop_list then
  1112. local len = #drop_list
  1113. if len > 0 then
  1114. local new_item
  1115. for i = 1,len do
  1116. drop_list[i].boss_type = vo.boss_type
  1117. self:CreateDropObj(drop_list[i],vo.pos_x,vo.pos_y)
  1118. end
  1119. end
  1120. end
  1121. end
  1122. function Scene:OpenAutoLoadView(last_time, need_bind_event)
  1123. if self.sceneLoadView then
  1124. self.sceneLoadView:AutoToShow(last_time, need_bind_event)
  1125. end
  1126. end
  1127. function Scene:OpenSceneLoadView(hide_load_progress, scene_id, need_black_screen)
  1128. if UserMsgAdapter.Instance:GetIsAutoConnecting() then
  1129. hide_load_progress = true
  1130. UserMsgAdapter.Instance:SetIsAutoConnecting(false)
  1131. end
  1132. if self.scene_mgr:NoLoadingViewScene() then
  1133. ChangeSceneMovie.getInstance():TryOpen()
  1134. else
  1135. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1136. return
  1137. end
  1138. if not self.sceneLoadView then
  1139. self.sceneLoadView = SceneLoadView.New()
  1140. end
  1141. self.sceneLoadView:Open(hide_load_progress, scene_id, need_black_screen)
  1142. end
  1143. end
  1144. function Scene:CloseSceneLoadView()
  1145. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1146. self.sceneLoadView:Close()
  1147. --进入游戏场景有再允许静默重连
  1148. if not self.is_first_change_scene then
  1149. self.is_first_change_scene = true
  1150. ClientConfig.is_ban_auto_connect = false
  1151. end
  1152. end
  1153. end
  1154. function Scene:SceneLoadingEnter(sceneId)
  1155. print("tanar: [Scene 1269]=> sceneId: ",sceneId)
  1156. self:ChangeScene(sceneId)
  1157. end
  1158. function Scene:ChangeScene( sceneId )
  1159. self.curr_click_target = false
  1160. self.manual_target = false
  1161. self.is_clearing = false
  1162. self.preload_res_is_loaded = false
  1163. self.scene_data_loaded = false
  1164. self.startFocus = true
  1165. self.load_npc_finish = false
  1166. self.load_progress_finished = false
  1167. self.is_in_pick_all_state = false
  1168. local time = Status.NowTime
  1169. local load_effect_finish = function( step )
  1170. if self.sceneLoadView then
  1171. self.sceneLoadView:RealUpdateProgress(step, 1, SceneLoadView.LOAD_SCENE_TITLE)
  1172. end
  1173. end
  1174. local load_map_func = function()
  1175. self:SceneDataLoadCompleted()
  1176. end
  1177. self.mapView:Load(sceneId, load_map_func, load_effect_finish )
  1178. if self.sceneLoadView then
  1179. if not self.sceneLoadView.is_first_show then
  1180. self:CheckToPreLoad()
  1181. else
  1182. local function onOpenCallback()
  1183. self:CheckToPreLoad()
  1184. end
  1185. self.sceneLoadView:SetOpenCallBackFunc(onOpenCallback)
  1186. end
  1187. end
  1188. end
  1189. function Scene:CheckToPreLoad()
  1190. self.scene_change_start_time = Status.NowTime
  1191. local scene_info = self.scene_mgr:GetSceneInfo()
  1192. self:PreLoadSceneObjRes(scene_info)
  1193. end
  1194. function Scene:PreLoadSceneObjRes(scene_info)
  1195. --播放场景背景音乐
  1196. local cur_scene = self.scene_mgr:GetSceneId()
  1197. lua_soundM:PlayBackground(cur_scene, true)
  1198. --无缝加载的场景不走预加载流程
  1199. if self.scene_mgr:NoLoadingViewScene() then
  1200. self.preload_res_is_loaded = true
  1201. self.load_progress_finished = true
  1202. GlobalEventSystem:Fire(SceneEventType.REQUEST_SCENE_INFO)
  1203. return
  1204. end
  1205. --清理Scene类的资源引用
  1206. lua_resM:clearReference(self)
  1207. --重置艺术字缓存池
  1208. WorldArtFontManager:getInstance():InitCacheList()
  1209. --删除不属于当前角色的静态职业技能资源,最多检测8个职业
  1210. local main_role_vo = RoleManager.Instance:GetMainRoleVo()
  1211. local career = main_role_vo.career
  1212. local sex = main_role_vo.sex
  1213. for i = 1, 4 do
  1214. for j = 1,2 do
  1215. if not (i == career and j == sex) then
  1216. lua_resM:RemoveStaticObj(i.."@"..j)
  1217. end
  1218. end
  1219. end
  1220. --清空所有缓存池对象
  1221. lua_resM:ClearAllObjPool()
  1222. --写入静默下载缓存的版本数据
  1223. if tonumber(AppConst.EnglineVer) > 83 and StepPackModule.Instance.max_download_speed then
  1224. Util.AutoWriteVersionFile(9999)
  1225. end
  1226. --写入下载缓存的文件
  1227. if tonumber(AppConst.EnglineVer) >= 77 then
  1228. resMgr:WriteAllDownloadCacheFile()
  1229. end
  1230. --执行内存清理
  1231. resMgr:CollectAllMemory()
  1232. if tonumber(AppConst.EnglineVer) >= 77 then
  1233. resMgr:SetCacheDownloadMode(false)
  1234. end
  1235. if SystemMemoryLevel.Cur == SystemMemoryLevel.Low and SystemRuntimePlatform.IsIphone() then
  1236. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1237. self.sceneLoadView:RealUpdateProgress(1, 1, SceneLoadView.LOAD_PRELOAD_RES)
  1238. end
  1239. self.start_preload_sceneObjRes_time = Status.NowTime
  1240. self:PreLoadSceneObjResCompleted()
  1241. return
  1242. end
  1243. --场景切换时增加协程,提升加载速度
  1244. InitResLoadSpeed(3)
  1245. SetAsyncUpLoadLevel(2)
  1246. if tonumber(AppConst.EnglineVer) >= 87 then
  1247. --AppConst.LoadResWaitNextFrame = false
  1248. end
  1249. --self.preload_last_time = os.clock()
  1250. --最多预加载的模型种类数量
  1251. local model_count_limit = lua_resM:GetMaxPoolObjCount() * 0.4
  1252. --每个种类最多重复预加载的数量
  1253. local child_model_count_limit = lua_resM:GetMaxChildPoolObjCount()
  1254. --需要预加载的场景模型列表
  1255. local pre_load_mode_list = {}
  1256. --需要预加载的ab列表
  1257. local pre_load_ab_list = {}
  1258. --需要预加载的技能id列表 key是技能id value: 0 是动态删除特效资源的技能类型 1 是静态的 2 是职业技能资源
  1259. -- local pre_load_skills = {[SkillManager.MonsterBaseSkill_1] = 1,[SkillManager.MonsterBaseSkill_2] = 1}
  1260. local pre_load_skills = {}
  1261. --需要预加载的技能图标
  1262. local config_list = self.SkillMgr:getCfgInitiativeSkillList()
  1263. if config_list then
  1264. for _,id in pairs(config_list) do
  1265. pre_load_skills[id] = 2
  1266. self.config_mgr:GetSkillItem(id)
  1267. end
  1268. end
  1269. --怒气技能
  1270. local career_index = career.."@"..sex
  1271. local anger_skill_id = SkillManager.AngerSkill[career_index]
  1272. if anger_skill_id then
  1273. pre_load_skills[anger_skill_id] = 2
  1274. end
  1275. --技能三连击的图标
  1276. local three_attacks = SkillManager.ThreeAttackSkills[career_index]
  1277. if three_attacks then
  1278. for _, id in pairs(three_attacks) do
  1279. pre_load_skills[id] = 2
  1280. self.config_mgr:GetSkillItem(id)
  1281. end
  1282. end
  1283. --需要预加载的模型总数量
  1284. local total_model_count = 0
  1285. --主角当前模型预加载
  1286. local fashion_model_id, fashion_chartlet_id = main_role_vo:GetRoleClotheTextureId()
  1287. local mainrole_res = main_role_vo:GetRoleClotheId()
  1288. if fashion_model_id and fashion_chartlet_id then
  1289. mainrole_res = fashion_model_id
  1290. end
  1291. if mainrole_res then
  1292. pre_load_mode_list[mainrole_res] = 1
  1293. total_model_count = total_model_count + 1
  1294. end
  1295. --需要预加载的特效列表
  1296. local effect_res_list = {}
  1297. --重置怪物缓存池
  1298. local obj_count = self.monster_pool:GetObjCount()
  1299. local obj = nil
  1300. for i = obj_count, 13 do
  1301. obj = Monster.New()
  1302. obj.vo = self.scene_mgr:CreateMonsterVo()
  1303. self.monster_pool:ReleaseObj(obj)
  1304. end
  1305. --重置NPC缓存池
  1306. obj_count = self.npc_pool:GetObjCount()
  1307. for i = obj_count, 2 do
  1308. obj = Npc.New()
  1309. obj.vo = NpcVo.New()
  1310. self.npc_pool:ReleaseObj(obj)
  1311. end
  1312. --重置角色缓存池
  1313. obj_count = self.role_pool:GetObjCount()
  1314. for i = obj_count, 8 do
  1315. obj = Role.New()
  1316. obj.vo = self.scene_mgr:CreateRoleVo()
  1317. self.role_pool:ReleaseObj(obj)
  1318. end
  1319. --当前预加载的模型种类数量
  1320. local curr_model_count = 0
  1321. --预加载场景NPC模型,NPC一个就行了
  1322. if scene_info and scene_info.Npcs then
  1323. local obj_cfg = nil
  1324. for id, _ in pairs(scene_info.Npcs) do
  1325. obj_cfg = ConfigItemMgr.Instance:GetNpcItem(id)
  1326. if obj_cfg and obj_cfg.icon > 0 and curr_model_count < model_count_limit then
  1327. if pre_load_mode_list[obj_cfg.icon] == nil then
  1328. pre_load_mode_list[obj_cfg.icon] = 0
  1329. curr_model_count = curr_model_count + 1
  1330. end
  1331. if pre_load_mode_list[obj_cfg.icon] <= 0 then
  1332. pre_load_mode_list[obj_cfg.icon] = pre_load_mode_list[obj_cfg.icon] + 1
  1333. total_model_count = total_model_count + 1
  1334. end
  1335. end
  1336. end
  1337. end
  1338. --预加载场景怪物ID
  1339. local pre_load_monster_id_list = {}
  1340. if scene_info and scene_info.mon then
  1341. for _, id in ipairs(scene_info.mon) do
  1342. table_insert(pre_load_monster_id_list, id)
  1343. end
  1344. end
  1345. --新手全息模型
  1346. if self.mainrole_vo.level <= 1 then
  1347. local model_res = self.mainrole_vo.career
  1348. pre_load_mode_list[model_res] = 1
  1349. total_model_count = total_model_count + 1
  1350. end
  1351. --角色落地特效,只有放这里才能够快
  1352. table_insert(effect_res_list,"effect_transmit_flydown_L_Toe0")
  1353. table_insert(effect_res_list,"effect_transmit_flydown_root")
  1354. --新手流程场景需要预加载的资源
  1355. if self.mainrole_vo.level <= 120 then
  1356. --预加载跳跃点特效
  1357. if scene_info then
  1358. local jump_info = Config.JumpSceneInfo[scene_info.id]
  1359. if jump_info then
  1360. table_insert(effect_res_list,"scene_tiaoyue")
  1361. end
  1362. end
  1363. --预加载传送点特效
  1364. if scene_info and scene_info.Doors and TableSize(scene_info.Doors) > 0 then
  1365. table_insert(effect_res_list, Door.ParticleResName)
  1366. end
  1367. end
  1368. --根据需要预加载的怪物ID,确定预加载的怪物模型和特效
  1369. local mon_cfg = nil
  1370. for _, id in ipairs(pre_load_monster_id_list) do
  1371. mon_cfg = ConfigItemMgr.Instance:GetMonsterDataItem(id)
  1372. if mon_cfg and mon_cfg.icon > 0 and curr_model_count < model_count_limit then
  1373. if pre_load_mode_list[mon_cfg.icon] == nil then
  1374. pre_load_mode_list[mon_cfg.icon] = 0
  1375. curr_model_count = curr_model_count + 1
  1376. end
  1377. if pre_load_mode_list[mon_cfg.icon] < child_model_count_limit then
  1378. pre_load_mode_list[mon_cfg.icon] = pre_load_mode_list[mon_cfg.icon] + 1
  1379. total_model_count = total_model_count + 1
  1380. end
  1381. end
  1382. end
  1383. --根据需要预加载的技能ID,确定预加载的特效资源
  1384. local effect_res_name_list = {}
  1385. for skill_id, is_static in pairs(pre_load_skills) do
  1386. local movie_cfg = self.SkillMgr:GetFightSkillMovie(skill_id)
  1387. if movie_cfg and movie_cfg.particles then
  1388. for i, p_vo in ipairs(movie_cfg.particles) do
  1389. if is_static == 1 then
  1390. lua_resM:AppendStaticObjName(p_vo.res)
  1391. elseif is_static == 2 then
  1392. lua_resM:AppendStaticObjName(p_vo.res,career_index)
  1393. end
  1394. if not effect_res_name_list[p_vo.res] then
  1395. effect_res_name_list[p_vo.res] = true
  1396. table_insert(effect_res_list,p_vo.res)
  1397. end
  1398. end
  1399. end
  1400. end
  1401. local load_effect_count = #effect_res_list
  1402. local load_mode_count = total_model_count
  1403. local load_complete_effect_count = 0
  1404. local load_complete_mode_count = 0
  1405. local load_skill_icon_count = 0
  1406. local load_complete_skill_icon_count = 0
  1407. local has_load_res_count = 0
  1408. local load_ab_count = #pre_load_ab_list
  1409. local load_complete_ab_count = 0
  1410. local load_res_total = load_effect_count + load_mode_count + load_ab_count
  1411. --加载完成回调入口
  1412. local function checkHasLoadComplete()
  1413. if load_complete_effect_count == load_effect_count
  1414. and load_complete_mode_count == load_mode_count
  1415. and load_complete_skill_icon_count == load_skill_icon_count
  1416. and load_complete_ab_count == load_ab_count
  1417. then
  1418. self:PreLoadSceneObjResCompleted()
  1419. end
  1420. end
  1421. --场景加载界面设置
  1422. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1423. self.sceneLoadView:RealUpdateProgress(1, load_res_total, SceneLoadView.LOAD_PRELOAD_RES)
  1424. end
  1425. --记录开始预加载的时间,用于判断加载超时
  1426. self.start_preload_sceneObjRes_time = Status.NowTime
  1427. local load_empty_check = function()
  1428. checkHasLoadComplete()
  1429. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1430. self.sceneLoadView:RealUpdateProgress(has_load_res_count, load_res_total, SceneLoadView.LOAD_PRELOAD_RES)
  1431. end
  1432. end
  1433. --预加载特效
  1434. local cur_effect_index = 1
  1435. local load_effect_func = nil
  1436. self.pre_pool_effect = {}
  1437. load_effect_func = function()
  1438. if cur_effect_index <= load_effect_count then
  1439. local res = effect_res_list[cur_effect_index]
  1440. cur_effect_index = cur_effect_index + 1
  1441. if res then
  1442. local function load_call_back(objs, is_gameObject)
  1443. if self.start_preload_sceneObjRes_time then
  1444. load_complete_effect_count = load_complete_effect_count + 1
  1445. if objs and objs[0] then
  1446. local effect_go = is_gameObject and objs[0] or newObject(objs[0])
  1447. lua_resM:AddObjToPool(self, res, res, effect_go)
  1448. self.pre_pool_effect[res] = true
  1449. else
  1450. logWarn("切场景预加载 ------- 找不到特效资源" .. res)
  1451. end
  1452. checkHasLoadComplete()
  1453. end
  1454. has_load_res_count = has_load_res_count + 1
  1455. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1456. self.sceneLoadView:RealUpdateProgress(has_load_res_count, load_res_total, SceneLoadView.LOAD_PRELOAD_RES)
  1457. end
  1458. setTimeout(load_effect_func,0.01)
  1459. end
  1460. local ignore_pool = true
  1461. if lua_resM.static_obj_name_list[res] then
  1462. ignore_pool = false
  1463. end
  1464. lua_resM:loadPrefab(self, res, res, load_call_back, ignore_pool)
  1465. else
  1466. load_complete_effect_count = load_complete_effect_count + 1
  1467. has_load_res_count = has_load_res_count + 1
  1468. load_empty_check()
  1469. setTimeout(load_effect_func,0.01)
  1470. end
  1471. end
  1472. end
  1473. --预加载模型
  1474. local temp_load_mode_list = {}
  1475. for res, count in pairs(pre_load_mode_list) do
  1476. for i=1,count do
  1477. table_insert(temp_load_mode_list,res)
  1478. end
  1479. end
  1480. local cur_model_index = 1
  1481. local load_model_func = nil
  1482. load_model_func = function()
  1483. if cur_model_index <= load_mode_count then
  1484. local res = temp_load_mode_list[cur_model_index]
  1485. cur_model_index = cur_model_index + 1
  1486. local abName, resName = GameResPath.GetModelClotheRes(nil, res)
  1487. if abName and resName then
  1488. local function load_call_back(objs)
  1489. if self.start_preload_sceneObjRes_time then
  1490. load_complete_mode_count = load_complete_mode_count + 1
  1491. if objs and objs[0] then
  1492. local mode_go = newObject(objs[0])
  1493. SetLocalPosition(mode_go.transform)
  1494. SetLocalRotation(mode_go.transform)
  1495. SetLocalScale(mode_go.transform, 1)
  1496. lua_resM:AddObjToPool(self, abName, resName, mode_go)
  1497. else
  1498. logWarn("切场景预加载 ------- 找不到模型资源" .. res)
  1499. end
  1500. checkHasLoadComplete()
  1501. end
  1502. has_load_res_count = has_load_res_count + 1
  1503. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1504. self.sceneLoadView:RealUpdateProgress(has_load_res_count, load_res_total, SceneLoadView.LOAD_PRELOAD_RES)
  1505. end
  1506. setTimeout(load_model_func,0.01)
  1507. end
  1508. lua_resM:loadPrefab(self, abName, resName, load_call_back, true)
  1509. else
  1510. load_complete_mode_count = load_complete_mode_count + 1
  1511. has_load_res_count = has_load_res_count + 1
  1512. load_empty_check()
  1513. setTimeout(load_model_func,0.01)
  1514. end
  1515. end
  1516. end
  1517. --预加载ab
  1518. local cur_ab_index = 1
  1519. local load_ab_func = nil
  1520. load_ab_func = function()
  1521. if cur_ab_index <= load_ab_count then
  1522. local res = pre_load_ab_list[cur_ab_index]
  1523. local args = Split(res,",")
  1524. local abName, resName = args[1], args[2]
  1525. cur_ab_index = cur_ab_index + 1
  1526. --print("预加载ad资源",abName,resName)
  1527. if abName and resName then
  1528. local function load_call_back(objs)
  1529. if self.start_preload_sceneObjRes_time then
  1530. load_complete_ab_count = load_complete_ab_count + 1
  1531. if objs and objs[0] then
  1532. local go = newObject(objs[0])
  1533. SetLocalPosition(go.transform)
  1534. SetLocalRotation(go.transform)
  1535. SetLocalScale(go.transform, 1)
  1536. lua_resM:AddObjToPool(self, abName, resName, go)
  1537. else
  1538. logWarn("切场景预加载 ------- 找不到ab资源" .. res)
  1539. end
  1540. checkHasLoadComplete()
  1541. end
  1542. has_load_res_count = has_load_res_count + 1
  1543. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  1544. self.sceneLoadView:RealUpdateProgress(has_load_res_count, load_res_total, SceneLoadView.LOAD_PRELOAD_RES)
  1545. end
  1546. setTimeout(load_ab_func,0.01)
  1547. end
  1548. lua_resM:loadPrefab(self, abName, resName, load_call_back, true)
  1549. else
  1550. load_complete_ab_count = load_complete_ab_count + 1
  1551. has_load_res_count = has_load_res_count + 1
  1552. load_empty_check()
  1553. setTimeout(load_ab_func,0.01)
  1554. end
  1555. end
  1556. end
  1557. local max_load_count = 12
  1558. if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
  1559. max_load_count = 6
  1560. elseif SystemMemoryLevel.Cur == SystemMemoryLevel.Middle then
  1561. max_load_count = 8
  1562. end
  1563. for i = 1, max_load_count do
  1564. load_model_func()
  1565. load_effect_func()
  1566. load_ab_func()
  1567. end
  1568. end
  1569. function Scene:IsPreLoadPoolEffect(res)
  1570. if not self.pre_pool_effect then
  1571. return false
  1572. end
  1573. return self.pre_pool_effect[res]
  1574. end
  1575. --预加载成功
  1576. function Scene:PreLoadSceneObjResCompleted()
  1577. if self.start_preload_sceneObjRes_time then
  1578. self.start_preload_sceneObjRes_time = nil
  1579. self.preload_res_is_loaded = true
  1580. GlobalEventSystem:Fire(SceneEventType.REQUEST_SCENE_INFO)
  1581. end
  1582. self.is_first_enter_scene = false
  1583. self.is_first_enter_game = false
  1584. self.load_scene_timeout_max = false
  1585. if tonumber(AppConst.EnglineVer) >= 77 and not SystemRuntimePlatform.IsIphone() then
  1586. resMgr:SetCacheDownloadMode(true)
  1587. end
  1588. end
  1589. --加载完场景数据
  1590. function Scene:SceneDataLoadCompleted()
  1591. InitResLoadSpeed(1)
  1592. self.scene_data_loaded = true
  1593. if self.sceneLoadView then
  1594. self.sceneLoadView:RealUpdateProgress(1, 1, SceneLoadView.LOAD_SCENE_DATA)
  1595. end
  1596. self:SetEnterSceneFlag()
  1597. self.main_camera:InitCameraSetting()
  1598. if self.startFocus then
  1599. local vo = self.mainrole_vo
  1600. if self.main_role then
  1601. self.main_role:SetRealPos(vo.pos_x,vo.pos_y)
  1602. self.main_role:DeilyClearTrailRenderer()
  1603. else
  1604. self.main_camera:UpdateCameraPosDirect(vo.pos_x,vo.pos_y)
  1605. end
  1606. end
  1607. --每次进场景重新设置一下技能
  1608. self.SkillMgr:Fire(SkillManager.UPDATE_SKILL_LIST)
  1609. GlobalEventSystem:Fire(EventName.LOADMAP_COMPLETE,self.scene_mgr:GetSceneId())
  1610. end
  1611. function Scene:IsSceneLoaded()
  1612. return self.scene_data_loaded
  1613. end
  1614. function Scene:GetClickTarget()
  1615. return self.curr_click_target
  1616. end
  1617. --[[
  1618. force:
  1619. ]]
  1620. function Scene:SetClickTarget(target, force)
  1621. if self.curr_click_target == target and not force then return end
  1622. if self.curr_click_target and self.curr_click_target ~= target then
  1623. self:CancelClickTarget()
  1624. end
  1625. self.curr_click_target = target
  1626. if target then
  1627. --小怪显示血条
  1628. if target and target.SetHideNameBordOnSelect then
  1629. target:SetHideNameBordOnSelect(false)
  1630. end
  1631. if target and target.SetObjectIsOnSelect then
  1632. target:SetObjectIsOnSelect(true)
  1633. end
  1634. if target:GetType() ~= SceneBaseType.Role then
  1635. --选中怪物时,就把头像清掉
  1636. GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, false)
  1637. end
  1638. --挂脚底特效
  1639. if IsNull(self.click_target_effect) then
  1640. destroy(self.click_target_effect)
  1641. self.click_target_effect = nil
  1642. if not self.recreate_target_effect then
  1643. self.recreate_target_effect = true
  1644. self:CreateClickTargetEffect(nil, true)
  1645. end
  1646. return
  1647. end
  1648. if lua_viewM.is_lock_screen then
  1649. if self.click_target_effect.activeSelf then
  1650. self.click_target_effect:SetActive(false)
  1651. end
  1652. else
  1653. local transform = self.click_target_effect.transform
  1654. transform:SetParent(target.parent_transform)
  1655. SetLocalPosition(transform,0,0.1,0)
  1656. transform.localRotation = Quaternion.Euler(target.rotateX, 0,0)
  1657. self.click_target_effect:SetActive(true)
  1658. end
  1659. end
  1660. --如果在boss场景, 选中boss的时候就显示血条
  1661. if target and self.scene_mgr:IsBossScene() and target:GetType() == SceneBaseType.Monster
  1662. and target:GetVo() and BossModel:GetInstance():GetIsBossById(target:GetVo().type_id) then
  1663. GlobalEventSystem:Fire(EventName.SHOW_HITER_BLOOD_VIEW, true, target:GetVo())
  1664. end
  1665. end
  1666. function Scene:CancelClickTarget(force_select_new_target,force_Cancel)
  1667. if self.curr_click_target and self.curr_click_target.GetType then
  1668. if not force_select_new_target and self.manual_target and not self.manual_target:IsDead() and self.manual_target == self.curr_click_target and not force_Cancel then --不取消手选的目标
  1669. return
  1670. end
  1671. if self.curr_click_target and self.curr_click_target.SetHideNameBordOnSelect then
  1672. self.curr_click_target:SetHideNameBordOnSelect(true)
  1673. end
  1674. if self.curr_click_target and self.curr_click_target.SetObjectIsOnSelect then
  1675. self.curr_click_target:SetObjectIsOnSelect(false)
  1676. end
  1677. if IsNull(self.click_target_effect) then
  1678. -- destroy(self.click_target_effect)
  1679. -- self.click_target_effect = nil
  1680. -- self:CreateClickTargetEffect()
  1681. else
  1682. self.click_target_effect:SetActive(false)
  1683. end
  1684. --挂机选择目标那里会找不到怪物
  1685. if self.manual_target == self.curr_click_target then
  1686. self.manual_target = false
  1687. end
  1688. self.curr_click_target = false
  1689. self.has_task_target = false
  1690. GlobalEventSystem:Fire(SceneEventType.CANCEL_CLICK_TARGET)
  1691. -- if force_select_new_target then
  1692. -- self:UpdateAutoFindTarget()
  1693. -- local skill_id = self.SkillMgr:PrepareAutoFightSkill(true)
  1694. -- if skill_id and type(skill_id) == "number" then
  1695. -- self.SkillMgr:SetAttackCompleteSkill(skill_id)
  1696. -- end
  1697. -- end
  1698. end
  1699. end
  1700. function Scene:UpdateClickTargetEffect()
  1701. if self.curr_click_target and self.main_role then
  1702. local real_x, real_y = self.curr_click_target:GetRealPos()
  1703. local real_pos_x, real_pos_y = self.main_role:GetRealPos()
  1704. local range
  1705. if self.scene_mgr:IsGuildScene() then -- 社团场景扩大更新范围
  1706. range = 4000*4000
  1707. else
  1708. range = 800 * 800
  1709. end
  1710. if GameMath_GetDistance(real_pos_x, real_pos_y, real_x, real_y, false) > range then
  1711. self:CancelClickTarget(nil, true)
  1712. end
  1713. end
  1714. -------------------------
  1715. --超过一定距离之后,头像消失
  1716. local attack_vo = self.scene_mgr:GetAttackHeadVo()
  1717. if attack_vo and self.main_role then
  1718. local attack_role = self:GetRole(attack_vo.role_id)
  1719. if attack_role then
  1720. local real_x, real_y = attack_role:GetRealPos()
  1721. local real_pos_x, real_pos_y = self.main_role:GetRealPos()
  1722. local distance = 800 * 800
  1723. if GameMath_GetDistance(real_pos_x, real_pos_y, real_x, real_y, false) > distance then
  1724. self.scene_mgr:ResetAttackHeadVo(true)
  1725. end
  1726. end
  1727. end
  1728. -------------------------
  1729. end
  1730. function Scene:OnTouchBegin(x,y)
  1731. TaskModel:getInstance().circle_use_clock = false--重置跑环界面倒计时
  1732. -------------------------
  1733. self.touch_bengin_y = nil
  1734. self.touch_bengin_x = nil
  1735. --[[
  1736. if Input.touchCount == 2 then
  1737. if self.two_finger_drag_start_pos == nil then
  1738. self.two_finger_drag_start_pos = {base_dist = GameMath_GetDistance(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, Input.GetTouch(1).position.x, Input.GetTouch(1).position.y, true),
  1739. change_state = 0} --0无 1放大 2缩小
  1740. else
  1741. self.two_finger_drag_start_pos.base_dist = GameMath_GetDistance(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, Input.GetTouch(1).position.x, Input.GetTouch(1).position.y, true)
  1742. self.two_finger_drag_start_pos.change_state = 0
  1743. end
  1744. self.two_finger_drag_start_pos.last_dist = self.two_finger_drag_start_pos.base_dist
  1745. else
  1746. self.two_finger_drag_start_pos = nil
  1747. end
  1748. ]]
  1749. if Input.touchCount == 1 or Input.touchCount == 0 then
  1750. x = ScreenToViewportPoint(x, 0)
  1751. if x < 330 then
  1752. self.touch_bengin_y = nil
  1753. else
  1754. self.touch_bengin_y = y
  1755. end
  1756. self.touch_bengin_x = x
  1757. end
  1758. end
  1759. function Scene:OnDrag(x, y)
  1760. --屏蔽视野操作
  1761. if true then
  1762. return
  1763. end
  1764. -- if Input.touchCount == 2 and self.two_finger_drag_start_pos then
  1765. -- local x0, y0 = Input.GetTouch(0).position.x, Input.GetTouch(0).position.y
  1766. -- local x1, y1 = Input.GetTouch(1).position.x, Input.GetTouch(1).position.y
  1767. -- local base_dist = self.two_finger_drag_start_pos.base_dist
  1768. -- local now_dist = GameMath_GetDistance(x0, y0, x1, y1, true)
  1769. -- local last_dist = self.two_finger_drag_start_pos.last_dist
  1770. -- if (last_dist > now_dist and self.two_finger_drag_start_pos.change_state == 1) or (last_dist < now_dist and self.two_finger_drag_start_pos.change_state == 2) then
  1771. -- self.two_finger_drag_start_pos.base_dist = last_dist
  1772. -- base_dist = self.two_finger_drag_start_pos.base_dist
  1773. -- end
  1774. -- self.two_finger_drag_start_pos.last_dist = now_dist
  1775. -- local off_y = ScreenToViewportPoint(now_dist - base_dist, 0)
  1776. -- if off_y > 0 then
  1777. -- off_y = off_y > 150 and 150 or off_y
  1778. -- local new_size = self.main_camera.camera_curr_size * (1 - off_y / 1500)
  1779. -- if new_size < 10 then
  1780. -- new_size = 10
  1781. -- end
  1782. -- self.main_camera:SetBaseCameraSize(new_size)
  1783. -- self.two_finger_drag_start_pos.change_state = 1
  1784. -- else
  1785. -- off_y = off_y < -150 and -150 or off_y
  1786. -- local new_size = self.main_camera.camera_curr_size * (1 - off_y / 1500)
  1787. -- if new_size > self.main_camera.camera_base_size * 1.3 then
  1788. -- new_size = self.main_camera.camera_base_size * 1.3
  1789. -- end
  1790. -- self.main_camera:SetBaseCameraSize(new_size)
  1791. -- self.two_finger_drag_start_pos.change_state = 2
  1792. -- end
  1793. -- return
  1794. -- end
  1795. if x < ScreenWidth/2 then
  1796. return
  1797. end
  1798. if Input.touchCount == 1 or Input.touchCount == 0 then
  1799. local mainrole = Scene.Instance:GetMainRole()
  1800. if mainrole and mainrole.transform then
  1801. local value = 0
  1802. if self.touch_bengin_x and math.abs(self.touch_bengin_x - x) > CameraRotateByScreen then
  1803. if self.touch_bengin_x - x > CameraRotateByScreen then
  1804. value = -1.5
  1805. elseif x - self.touch_bengin_x > CameraRotateByScreen then
  1806. value = 1.5
  1807. end
  1808. MainCamera.Instance:RotateAround(mainrole.transform.position,Vector3.up,value)
  1809. self.touch_bengin_x = x
  1810. end
  1811. -------------------------
  1812. --Y轴上的视角变化
  1813. --[[
  1814. if self.touch_bengin_y and math.abs(self.touch_bengin_y - y) > CameraRotateByScreen then
  1815. value = 0
  1816. if self.touch_bengin_y - y > CameraRotateByScreen then
  1817. value = -1.5
  1818. elseif y - self.touch_bengin_y > CameraRotateByScreen then
  1819. value = 1.5
  1820. end
  1821. MainCamera.Instance:RotateAround(mainrole.transform.position, MainCamera.Instance.transform.right, value)
  1822. MainCamera.Instance.isSmoothing = true
  1823. MainCamera.Instance:SmoothPosToTarget()
  1824. self.touch_bengin_y = y
  1825. end
  1826. --]]
  1827. -------------------------
  1828. self.rotate_camera_state = true
  1829. return
  1830. end
  1831. end
  1832. if self.rotate_camera_state then
  1833. self.rotate_camera_state = false
  1834. self.wait_cancel_rotate_camera_state = true
  1835. end
  1836. end
  1837. function Scene:OnTouchEnd(x,y)
  1838. if self.two_finger_drag_start_pos then
  1839. return
  1840. end
  1841. if not self.main_role then
  1842. return
  1843. end
  1844. if self.main_role:IsFishingState() or self.main_role:IsInState(PoseState.TASK_JUMP) then --主角正在钓鱼 限制点击屏幕操作
  1845. return
  1846. end
  1847. if self.scene_mgr:IsPkBattleScene() and PkBattleModel:getInstance():IsTransferState() then
  1848. Message.show("传送中,不能操作")
  1849. return
  1850. end
  1851. if self.main_role then
  1852. --无主角界面屏蔽点击操作
  1853. if self.main_role.disabled then
  1854. return
  1855. elseif self.touch_bengin_y then
  1856. if self.touch_bengin_y - y > 100 then
  1857. if self.last_change_horse_time and Time.time - self.last_change_horse_time < 2 then
  1858. -- Message.show("操作过于频繁,请稍后")
  1859. return
  1860. end
  1861. GlobalEventSystem:Fire(EventName.HIDE_HORSE)
  1862. self.last_change_horse_time = Time.time
  1863. return
  1864. elseif y - self.touch_bengin_y > 100 then
  1865. if self.last_change_horse_time and Time.time - self.last_change_horse_time < 2 then
  1866. -- Message.show("操作过于频繁,请稍后")
  1867. return
  1868. end
  1869. GlobalEventSystem:Fire(EventName.RIDE_HORSE)
  1870. self.last_change_horse_time = Time.time
  1871. return
  1872. end
  1873. end
  1874. end
  1875. if self.wait_cancel_rotate_camera_state then
  1876. self.wait_cancel_rotate_camera_state = false
  1877. return
  1878. end
  1879. local scene_pos = {}
  1880. if self.mouse_down then
  1881. local pos = Util.RaycastFromMouse(MainCamera.Instance.camera)
  1882. if pos ~= Vector3.zero then
  1883. scene_pos.x = pos.x * MainCamera.PixelsToUnits
  1884. scene_pos.y = pos.z * MainCamera.PixelsToUnits
  1885. else
  1886. return
  1887. end
  1888. end
  1889. --暂时先跑旧的拾取逻辑,后续优化
  1890. local query_list = self:PointQuery(scene_pos)
  1891. local have_pick_info = (#query_list > 0)
  1892. local clickTarget = query_list[1] or nil
  1893. local is_pick_handled = true
  1894. if clickTarget then
  1895. if clickTarget:GetType() == SceneBaseType.Monster then
  1896. --不能选中自己的怪
  1897. local is_mine = clickTarget:GetVo().role_id == RoleManager.Instance.mainRoleInfo.role_id
  1898. if is_mine then
  1899. return
  1900. end
  1901. -------------------------
  1902. --幻魔星域次数满了就不让点击选中了
  1903. local support_boss = GuildModel:getInstance():GetGuildSupportBossId( )--要过滤掉当前协助的进攻对象
  1904. if support_boss ~= clickTarget:GetVo().type_id then
  1905. local is_desert_scene = self.scene_mgr:IsBossDesertedScene() or self.scene_mgr:IsDesertedBossCrossScene()
  1906. if is_desert_scene then
  1907. local monster_type = clickTarget:GetVo().boss_type
  1908. if (monster_type == BossType.DesertedMonster) or (monster_type == BossType.DesertedBoss) then
  1909. local rest_boss_time, rest_mon_time = BossModel:GetInstance():GetDesertedBossRestNum( )
  1910. if (rest_boss_time <= 0 and rest_mon_time > 0 and -- 仅有精英怪次数 打精英
  1911. monster_type == BossType.DesertedMonster) or
  1912. (rest_boss_time > 0 and rest_mon_time <= 0 and -- 仅有BOSS次数 打BOSS
  1913. monster_type == BossType.DesertedBoss) or
  1914. (rest_boss_time > 0 and rest_mon_time > 0) -- 都有
  1915. then
  1916. --对应次数还有,可以选中
  1917. else
  1918. return
  1919. end
  1920. end
  1921. end
  1922. end
  1923. -------------------------
  1924. if clickTarget:GetVo().type == MonsterType.COLLECT or clickTarget:GetVo().type == MonsterType.PICK or clickTarget:GetVo().type == MonsterType.TASK_COLLECT or clickTarget:GetVo().type == MonsterType.UD_COLLECT then
  1925. if self.scene_mgr:IsGuildGuardDungeon() and not BaseDungeonModel:getInstance():IsCanCollect(clickTarget:GetVo().type_id) then
  1926. Message.show("个人采集宝箱已达到上限")
  1927. return
  1928. end
  1929. self:MainRoleAttackMonster(clickTarget)
  1930. is_pick_handled = false
  1931. elseif clickTarget:GetVo().type == MonsterType.PRICE and clickTarget:GetVo().can_attack ~= 1 then
  1932. local npc_id = MonsterShowDialogWithNpcId[clickTarget:GetVo().type_id]
  1933. if npc_id then
  1934. GlobalEventSystem:Fire(SceneEventType.SHOW_TASK, npc_id)
  1935. end
  1936. else
  1937. is_pick_handled = false
  1938. end
  1939. self.manual_target = clickTarget
  1940. elseif clickTarget:GetType() == SceneBaseType.Role then
  1941. if EscortModel:getInstance():IsEscortState() then--在护送屏蔽点击其他角色
  1942. return
  1943. end
  1944. if self:ForceAttackRole(clickTarget) then
  1945. return
  1946. end
  1947. self:SetClickTarget(clickTarget,true)
  1948. GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, true, clickTarget.vo, 1)
  1949. return
  1950. elseif clickTarget:GetType() == SceneBaseType.Npc then
  1951. if clickTarget:IsClientNpc() or self.scene_mgr:IsClientHideNpc(clickTarget.id) then
  1952. return
  1953. end
  1954. self:mainRoleToNpc(clickTarget.id)
  1955. is_pick_handled = false
  1956. self.manual_target = clickTarget
  1957. elseif clickTarget:GetType() == SceneBaseType.Door then
  1958. self:MainRoleMoveToDoor(clickTarget.vo)
  1959. is_pick_handled = false
  1960. self.manual_target = false
  1961. return --直接return,不用SetClickTarget
  1962. elseif clickTarget:GetType() == SceneBaseType.Build then
  1963. local build_type = clickTarget:GetVo().id
  1964. GlobalEventSystem:Fire(SceneEventType.ONCLICK_BUILD, clickTarget)
  1965. is_pick_handled = false
  1966. return
  1967. end
  1968. self:SetClickTarget(clickTarget)
  1969. if (clickTarget:GetType() == SceneBaseType.Monster and clickTarget:GetVo().type == MonsterType.NORMAL and self.scene_mgr:IsCanAttackByMainRole(clickTarget:GetVo())) then
  1970. EventSystem.Fire(GlobalEventSystem,EventName.STARTAUTOFIGHT, false, true)
  1971. end
  1972. Scene.Instance.user_manul_time = 0
  1973. end
  1974. is_pick_handled = false
  1975. if is_pick_handled then
  1976. --嘲讽buff屏蔽点击移动
  1977. if self.main_role and self.main_role.buff_manager:hasChaofengBuff() then return end
  1978. local idleMove = function()
  1979. Scene.Instance.user_manul_time = Status.NowTime
  1980. end
  1981. if AutoFightManager:getInstance():GetAutoFightState() then
  1982. local x = scene_pos.x
  1983. local y = scene_pos.y
  1984. AutoFightManager:getInstance():CacheGoToPos(x, y,self.scene_mgr:GetSceneId())
  1985. end
  1986. --跳完后 不继续寻路
  1987. OperateManager.Instance.jump_end_not_continue = true
  1988. local cache_x = scene_pos.x
  1989. local cache_y = scene_pos.y
  1990. if not scene_pos.x or not scene_pos.y then
  1991. return
  1992. end
  1993. scene_pos.x = scene_pos.x/SceneObj_LogicRealRatio_x
  1994. scene_pos.y = scene_pos.y/SceneObj_LogicRealRatio_y
  1995. local is_endPos_block = self.scene_mgr:IsBlockXY(scene_pos.x, scene_pos.y)
  1996. if is_endPos_block then
  1997. self:MainRoleMove(scene_pos,0,idleMove)
  1998. else
  1999. self:MainRoleMove(scene_pos,0,idleMove)
  2000. end
  2001. self.user_manul_time = Status.NowTime
  2002. --如果移动的时候选择目标是npc 则 取消 否则会影响挂机选择目标
  2003. if self.curr_click_target and self.curr_click_target:GetType() == SceneBaseType.Npc then
  2004. self:CancelClickTarget()
  2005. end
  2006. self.find_monster_pos = false
  2007. GlobalEventSystem:Fire(EventName.OPEN_LEFT_MIDDLE_MENU, false) --收起菜单
  2008. GlobalEventSystem:Fire(SceneEventType.TOUCH_GROUND_END)
  2009. --点击场景,重置寻路状态
  2010. self:ResetUserManulState()
  2011. end
  2012. end
  2013. --根据世界坐标选择被选中的模型
  2014. function Scene:PointQuery(world_pt, obj_type)
  2015. local selected_list = {}
  2016. local npc_obj_list = {}
  2017. local query_list = nil
  2018. obj_type = obj_type or SceneBaseType.All --全部
  2019. if obj_type == SceneBaseType.Npc or obj_type == SceneBaseType.All then
  2020. for id,obj in pairs(self.npc_list) do
  2021. if obj:CheckInBound(world_pt) then
  2022. table_insert(npc_obj_list,obj)
  2023. table_insert(selected_list,obj)
  2024. end
  2025. end
  2026. end
  2027. if obj_type == SceneBaseType.Role or obj_type == SceneBaseType.All then
  2028. for id,obj in pairs(self.role_list) do
  2029. if obj:CheckInBound(world_pt) and not obj.vo.is_virtual_friend then
  2030. table_insert(selected_list,obj)
  2031. end
  2032. end
  2033. end
  2034. -- if obj_type == SceneBaseType.Partner or obj_type == SceneBaseType.All then
  2035. -- for id,obj in pairs(self.partner_list) do
  2036. -- if obj:CheckInBound(world_pt) then
  2037. -- table_insert(selected_list,obj)
  2038. -- end
  2039. -- end
  2040. -- end
  2041. if obj_type == SceneBaseType.Monster or obj_type == SceneBaseType.All then
  2042. for id,obj in pairs(self.monster_list) do
  2043. if obj:CheckInBound(world_pt) then
  2044. table_insert(selected_list,obj)
  2045. end
  2046. end
  2047. end
  2048. -- if obj_type == SceneBaseType.Other or obj_type == SceneBaseType.All then
  2049. -- for id,obj in pairs(self.other_list) do
  2050. -- if obj:CheckInBound(world_pt) then
  2051. -- table_insert(selected_list,obj)
  2052. -- end
  2053. -- end
  2054. -- end
  2055. -- if obj_type == SceneBaseType.Door or obj_type == SceneBaseType.All then
  2056. -- for id,obj in pairs(self.door_list) do
  2057. -- if obj:CheckInBound(world_pt) then
  2058. -- table_insert(selected_list,obj)
  2059. -- end
  2060. -- end
  2061. -- end
  2062. -- if obj_type == SceneBaseType.Build or obj_type == SceneBaseType.All then
  2063. -- for id,obj in pairs(self.build_list) do
  2064. -- if obj:CheckInBound(world_pt) then
  2065. -- table_insert(selected_list,obj)
  2066. -- end
  2067. -- end
  2068. -- end
  2069. -- if obj_type == SceneBaseType.BuildBaby or obj_type == SceneBaseType.All then
  2070. -- for id,obj in pairs(self.build_baby_list) do
  2071. -- if obj:CheckInBound(world_pt) then
  2072. -- table_insert(selected_list,obj)
  2073. -- end
  2074. -- end
  2075. -- end
  2076. if #npc_obj_list > 0 then
  2077. if #npc_obj_list > 1 then
  2078. local function onSortHandler(v1,v2)
  2079. return v1.real_pos.y < v2.real_pos.y
  2080. end
  2081. table_sort(npc_obj_list,onSortHandler)
  2082. end
  2083. return npc_obj_list
  2084. end
  2085. if #selected_list > 1 then
  2086. --根据y轴方向排序 y越小越靠前
  2087. local function onSortHandler(v1,v2)
  2088. return v1.real_pos.y < v2.real_pos.y
  2089. end
  2090. table_sort(selected_list,onSortHandler)
  2091. end
  2092. return selected_list
  2093. end
  2094. --手动选中目标,强制切换到战斗
  2095. function Scene:ForceAttackRole(clickTarget)
  2096. if clickTarget and self.scene_mgr:IsCanAttackByMainRole(clickTarget:GetVo(), true) then
  2097. self:SetClickTarget(clickTarget)
  2098. self:MainRoleAttackRole(clickTarget)
  2099. GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
  2100. self.scene_mgr:SetAttackHeadVo(clickTarget.vo, nil, true)
  2101. return true
  2102. end
  2103. return false
  2104. end
  2105. function Scene:MainRoleMoveToDoor(door_vo)
  2106. local dx, dy = door_vo.pixel_x/SceneObj_LogicRealRatio_x, door_vo.pixel_y/SceneObj_LogicRealRatio_y
  2107. local lx, ly = self.main_role:GetLogicPos()
  2108. if GameMath_GetDistance(lx, ly, dx, dy, false) <= 1 then
  2109. self:RoleWalkCompleteHandler()
  2110. else
  2111. self:MainRoleMove(co.TableXY(dx, dy))
  2112. end
  2113. end
  2114. function Scene:mainRoleToNpc(npc_id)
  2115. local npc_info = self.scene_mgr:GetNpcVo(npc_id)
  2116. if npc_info == nil then
  2117. return
  2118. end
  2119. local npcpos = co.TableXY(npc_info.logic_x, npc_info.logic_y)
  2120. local rolepos = co.TableXY(self.main_role:GetLogicPos())
  2121. local dist = 2--ActionDis.NPC
  2122. local check_distance = 420
  2123. if self.main_role and self.main_role:IsOnHorse() then
  2124. dist = 2.5
  2125. check_distance = 500
  2126. end
  2127. local action_func = function ()
  2128. if not self.main_role then
  2129. return
  2130. end
  2131. -- 转向
  2132. self:clearGoToData()
  2133. if self.main_role:IsInState(PoseState.MOVE) then
  2134. self.main_role:DoStand()
  2135. end
  2136. local dir2 = co.SubtractXYTable(npcpos, rolepos)
  2137. self.main_role:SetDirection(dir2)
  2138. -- local is_fire_evt = OperateManager.Instance:StopMove()
  2139. local npc = self:GetNpc(npc_id)
  2140. if npc ~= nil then
  2141. self:SetClickTarget(npc)
  2142. if npc.vo and not Config.ConfigGuildWar.KeepDirectNpc[npc.vo.type_id] then
  2143. local dir = co.TableXY(self.main_role.real_pos.x - npc.real_pos.x, self.main_role.real_pos.y - npc.real_pos.y)
  2144. npc:SetDirection(dir)
  2145. end
  2146. if GameMath_GetDistance(self.main_role.real_pos.x, self.main_role.real_pos.y, npc.real_pos.x, npc.real_pos.y, true) < check_distance then
  2147. -- if FishModel:getInstance():IsFishNpc(npc_id) then --如果是钓鱼NPC 就打开钓鱼对话界面
  2148. -- GlobalEventSystem:Fire(EventName.OPEN_FISH_NPC_VIEW,npc_info,true)
  2149. -- else
  2150. GlobalEventSystem:Fire(SceneEventType.SHOW_TASK, npc_info.instance_id)
  2151. -- end
  2152. end
  2153. end
  2154. -- if not is_fire_evt then
  2155. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  2156. -- end
  2157. end
  2158. local npc = self:GetNpc(npc_id)
  2159. if npc ~= nil then
  2160. self:SetClickTarget(npc)
  2161. end
  2162. -- 如果已经在范围内了
  2163. if GameMath_GetDistance(npcpos.x, npcpos.y, rolepos.x, rolepos.y, true) <= dist + 1 then
  2164. action_func()
  2165. else
  2166. self:MainRoleMoveAndCancel(co.TableXY(npc_info.logic_x, npc_info.logic_y), dist, action_func,false)
  2167. end
  2168. end
  2169. --[[
  2170. *
  2171. * @param point
  2172. *
  2173. ]]
  2174. function Scene:MainRoleMoveAndCancel(point, range, end_function,is_fire_evt)
  2175. if self:ChcekCanMove() == false then
  2176. return
  2177. end
  2178. range = range or 0
  2179. --定点移动
  2180. self:MainRoleMove(point, range, end_function,is_fire_evt)
  2181. if SkillManager.getInstance().currentSkillId ~= 0 then
  2182. SkillManager.getInstance():setCurrentSkillId()
  2183. end
  2184. end
  2185. --[[
  2186. *
  2187. * @param point
  2188. * @return
  2189. *
  2190. ]]
  2191. function Scene:GetExitByPoint(posX, posY,dist,enter_scene_id)
  2192. dist = dist or 2
  2193. enter_scene_id = enter_scene_id or 0
  2194. for i,door in pairs(self.door_list) do
  2195. local door_posX, door_posY = door:GetLogicPos()
  2196. if GameMath.IsPointNear(posX, posY, door_posX, door_posY, dist) and (enter_scene_id == 0 or door.id == enter_scene_id) then
  2197. return door
  2198. end
  2199. end
  2200. return nil;
  2201. end
  2202. function Scene:GetExitByJump(posX, posY)
  2203. for i,jumppoint in pairs(self.jumppoint_list) do
  2204. local jump_posX, jump_posY = jumppoint:GetLogicPos()
  2205. if GameMath.IsPointNear(posX, posY, jump_posX, jump_posY, 2) then
  2206. return jumppoint
  2207. end
  2208. end
  2209. return nil;
  2210. end
  2211. --[[
  2212. .
  2213. zsm
  2214. ]]
  2215. function Scene:RoleWalkCompleteHandler(not_fire_move_end)
  2216. if self.is_clearing then --正在清理场景或者主角被锁定动作状态不能处理走完动作
  2217. return
  2218. end
  2219. local main_role = self:GetMainRole()
  2220. if main_role:IsInState(PoseState.ATTACK) or main_role:IsGhostMode() then
  2221. return
  2222. end
  2223. if main_role.is_shoe_flying then
  2224. return
  2225. end
  2226. self:clearGoToData()
  2227. if not not_fire_move_end then
  2228. GlobalEventSystem:Fire(SceneEventType.MAIN_ROLE_MOVE_END)
  2229. end
  2230. --场景加载完后加个cd限制,避免出生在传送阵附近又马上被传送走(前提是切换场景只会走一次传送门)
  2231. if self.scene_load_view_complete_time and Time.time - self.scene_load_view_complete_time < 3 then
  2232. return
  2233. end
  2234. --传送点
  2235. local door = self:GetExitByPoint(self.main_role:GetLogicPos())
  2236. local now_oper = OperateManager.Instance:GetNowSrcOper()
  2237. -- if door ~= nil and (door:GetVo().is_same_scene or now_oper == nil or (now_oper.now_use_pair == nil and now_oper.total_pair == nil )
  2238. -- or (now_oper.now_use_pair and now_oper.total_pair and now_oper.now_use_pair > now_oper.total_pair)) then
  2239. if door ~= nil and (not now_oper or (not now_oper.now_use_pair and not now_oper.total_pair)
  2240. or (now_oper.now_use_pair and now_oper.total_pair and now_oper.now_use_pair > now_oper.total_pair)) then
  2241. local scene_info = ConfigItemMgr.Instance:GetSceneItem(door:GetVo().enter_scene_id)
  2242. local function scene_door_callback()
  2243. local temp_scene_id = door:GetVo().enter_scene_id
  2244. local temp_send_type = SceneTransType.GateNear
  2245. local temp_x, temp_y = 0, 0
  2246. local task_send_type, task_find_vo = TaskModel:getInstance():GetChangeSceneType()
  2247. if task_send_type and task_find_vo then
  2248. temp_send_type = task_send_type
  2249. temp_scene_id = task_find_vo.sceneId
  2250. temp_x, temp_y = task_find_vo.x*SceneObj_LogicRealRatio_x, task_find_vo.y*SceneObj_LogicRealRatio_y
  2251. end
  2252. local data =
  2253. {
  2254. scene_id = temp_scene_id,
  2255. send_type = temp_send_type,
  2256. x = temp_x,
  2257. y = temp_y,
  2258. }
  2259. --print("tanar: [Scene 2562]=> door:GetVo().x, door:GetVo().y: ",door:GetVo().x, door:GetVo().y)
  2260. SceneController.Instance:ClientRequestChangeScene(-1,data)
  2261. self.change_scene_request_time = Status.NowTime
  2262. TaskModel:getInstance():SetChangeSceneType(false)
  2263. end
  2264. if self.change_scene_request_time == nil then
  2265. scene_door_callback()
  2266. elseif Status.NowTime - self.change_scene_request_time > 1.5 then
  2267. scene_door_callback()
  2268. end
  2269. end
  2270. -- self:CheckMainUICollectBtnState()
  2271. end
  2272. --设置下面那个函数的限定ID列表
  2273. function Scene:SetCheckCollectBtnLimitIdList(list,all)
  2274. self.check_collect_btn_limit_list = list
  2275. self.check_collect_btn_all = all
  2276. end
  2277. --检测主界面采集按钮显示状态
  2278. function Scene:CheckMainUICollectBtnState()
  2279. if not(SceneManager:getInstance():IsMainCityAndFieldScene() or SceneManager:getInstance():IsTeamDungeonScene() or SceneManager:getInstance():IsGuildGuardDungeon()) then
  2280. return
  2281. end
  2282. local vo = nil
  2283. local x1, y1 = self.mainrole_vo.pos_x, self.mainrole_vo.pos_y
  2284. local x2, y2 = nil
  2285. local show_collect_btn = false
  2286. local collect_vo = nil
  2287. for v, monster in pairs(self.monster_list) do
  2288. local vo = monster:GetVo()
  2289. if self.check_collect_btn_all or (self.check_collect_btn_limit_list and self.check_collect_btn_limit_list[vo.type_id]) then
  2290. if vo and (vo.type == MonsterType.COLLECT or vo.type == MonsterType.TASK_COLLECT or vo.type == MonsterType.MISSION_COLLECT or vo.type == MonsterType.UD_COLLECT) then
  2291. x2, y2 = monster:GetRealPos()
  2292. local dis = GameMath_GetDistance(x1, y1, x2, y2, false)
  2293. if dis<= 150000 then
  2294. show_collect_btn = true
  2295. collect_vo = v
  2296. break
  2297. end
  2298. end
  2299. end
  2300. end
  2301. GlobalEventSystem:Fire(EventName.SHOW_MAINUI_COLLECT_BTN, show_collect_btn,collect_vo)
  2302. end
  2303. function Scene:ChcekCanMove()
  2304. if self.mainrole_vo.chaosTime > 0 then
  2305. Message.show("你处于混乱状态,暂时不能自由移动!")
  2306. return false
  2307. end
  2308. return true
  2309. end
  2310. function Scene:CreateDoor(door_vo)
  2311. local id = door_vo.enter_scene_id
  2312. if door_vo.is_same_scene then
  2313. id = door_vo.enter_scene_id.."-"..door_vo.index
  2314. end
  2315. local obj =
  2316. {
  2317. id = id,
  2318. type = SapManager.ObjType.Door,
  2319. pos = co.TableXY(door_vo.pixel_x,door_vo.pixel_y),
  2320. size = co.TableXY(100,100),
  2321. data = door_vo,
  2322. }
  2323. SapManager:getInstance():RegisterObj(obj)
  2324. end
  2325. function Scene:CreateJumpPoint(jumppoint_vo)
  2326. local obj =
  2327. {
  2328. id = jumppoint_vo.instance_id,
  2329. type = SapManager.ObjType.JumpPoint,
  2330. pos = co.TableXY(jumppoint_vo.real_pos.x,jumppoint_vo.real_pos.y),
  2331. size = co.TableXY(100,100),
  2332. data = jumppoint_vo,
  2333. }
  2334. SapManager:getInstance():RegisterObj(obj)
  2335. end
  2336. function Scene:CreateWayPoint(waypoint_vo)
  2337. if self.waypoint == nil then
  2338. self.waypoint = WayPoint.New(waypoint_vo)
  2339. end
  2340. if self.waypoint then
  2341. self.waypoint:InitWayPointVo(waypoint_vo)
  2342. end
  2343. return self.waypoint, true
  2344. end
  2345. --is_same_scene 是否场景
  2346. function Scene:CreateMainRole()
  2347. local main_role = MainRole.New(self.mainrole_vo)
  2348. print("CreateMainRole 主角坐标:", main_role.vo.pos_x, main_role.vo.pos_y, Status.NowTime)
  2349. local id = main_role.id
  2350. self.role_list[id] = main_role
  2351. self:SetMainRole(main_role)
  2352. main_role:LoadInfoFromVo()
  2353. GlobalEventSystem:Fire(EventName.CREATE_MAIN_ROLE_SUCCESS)
  2354. GlobalEventSystem:Fire(EventName.SHOWRELIVEWINDOW,1) --关闭复活界面
  2355. self.mapView:ResetSceneActionObjHeight()
  2356. SkillManager:getInstance().joy_stick_dir = nil
  2357. return main_role, true
  2358. end
  2359. function Scene:CreateRole(role_vo)
  2360. if not self.main_role then
  2361. return
  2362. end
  2363. local role_id = role_vo.role_id
  2364. if role_id == RoleManager.Instance:GetMainRoleId() then
  2365. self.mainrole_vo:ChangeFromVo(role_vo)
  2366. return
  2367. end
  2368. -- 角色复活
  2369. local exist_role = self.role_list[role_id]
  2370. if exist_role then
  2371. GlobalEventSystem:Fire(EventName.EXECUTE_DELEY_FIGHT_INFO)
  2372. self:DeleteRole(role_id)
  2373. end
  2374. local role = self.role_pool:GetObjFreeList()
  2375. if role == nil then
  2376. role = Role.New()
  2377. end
  2378. self.role_list[role_id] = role
  2379. role:InitRoleVo(role_vo)
  2380. role:LoadInfoFromVo()
  2381. return role, true
  2382. end
  2383. function Scene:CreateHookRole(role_vo)
  2384. local role_id = role_vo.role_id
  2385. local exist_role = self.hook_role_list[role_id]
  2386. if exist_role then
  2387. GlobalEventSystem:Fire(EventName.EXECUTE_DELEY_FIGHT_INFO)
  2388. self:DeleteHookRole(role_id)
  2389. end
  2390. local role = self.hook_role_pool:GetObjFreeList()
  2391. if role == nil then
  2392. role = HookRole.New()
  2393. end
  2394. self.hook_role_list[role_id] = role
  2395. role:InitRoleVo(role_vo)
  2396. role:LoadInfoFromVo()
  2397. return role, true
  2398. end
  2399. function Scene:CreatePartner(partner_vo)
  2400. if not self.main_role then
  2401. return
  2402. end
  2403. local partner_id = partner_vo.partner_id
  2404. local exist_partner = self.partner_list[partner_id]
  2405. if exist_partner then
  2406. GlobalEventSystem:Fire(EventName.EXECUTE_DELEY_FIGHT_INFO)
  2407. self:DeletePartner(partner_id)
  2408. end
  2409. local partner = self.partner_pool:GetObjFreeList()
  2410. if partner == nil then
  2411. partner = Partner.New()
  2412. end
  2413. self.partner_list[partner_id] = partner
  2414. partner:InitPartnerVo(partner_vo)
  2415. partner:LoadInfoFromVo()
  2416. if lua_viewM.is_lock_screen then
  2417. partner:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  2418. end
  2419. return partner, true
  2420. end
  2421. function Scene:CreateNpc(npc_vo)
  2422. local npc_exist = self.npc_list[tonumber(npc_vo.instance_id)]
  2423. if npc_exist == nil then
  2424. -- 见到才加载模式
  2425. local obj =
  2426. {
  2427. id = npc_vo.instance_id,
  2428. type = SapManager.ObjType.NPC,
  2429. pos = co.TableXY(npc_vo.pos_x,npc_vo.pos_y),
  2430. size = co.TableXY(100,100),
  2431. data = npc_vo,
  2432. }
  2433. SapManager:getInstance():RegisterObj(obj)
  2434. else
  2435. npc_exist.vo = npc_vo
  2436. npc_exist:SetCfgActionAndAngle()
  2437. npc_exist:BindVoEvents()
  2438. npc_exist:DoMove(co.TableXY(npc_vo.pos_x, npc_vo.pos_y))
  2439. npc_exist.move_flag = MOVE_TYPE.NORMOL_MOVE
  2440. end
  2441. end
  2442. function Scene:CreateMonster(monster_vo)
  2443. local monster = self.monster_list[monster_vo.instance_id]
  2444. if monster ~= nil then
  2445. self.monster_pool:ReleaseObj(monster)
  2446. self.monster_list[monster_vo.instance_id] = nil
  2447. end
  2448. monster = self.monster_pool:GetObjFreeList()
  2449. if monster == nil then
  2450. monster = Monster.New()
  2451. end
  2452. self.monster_list[monster_vo.instance_id] = monster
  2453. monster:InitMonsterVo(monster_vo)
  2454. monster:LoadInfoFromVo()
  2455. if (self.is_hide_all_mon or monster:HasBlockSetting("monster")) and not self.scene_mgr:IsNotBlockMonsterScene() then
  2456. monster:SetModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit, true)
  2457. end
  2458. return monster, true
  2459. end
  2460. function Scene:CreateOther(other_vo)
  2461. local other = self.other_list[other_vo.instance_id]
  2462. if other ~= nil then
  2463. self.other_pool:ReleaseObj(other)
  2464. self.other_list[other_vo.instance_id] = nil
  2465. end
  2466. other = self.other_pool:GetObjFreeList()
  2467. if other == nil then
  2468. other = Other.New()
  2469. end
  2470. self.other_list[other_vo.instance_id] = other
  2471. other:InitOtherVo(other_vo)
  2472. other:LoadInfoFromVo()
  2473. return other, true
  2474. end
  2475. function Scene:CreateSprite(owner, owner_vo)
  2476. local sprite = self.sprite_list[owner.id]
  2477. if sprite ~= nil then
  2478. self.sprite_pool:ReleaseObj(sprite)
  2479. self.sprite_list[owner.id] = nil
  2480. end
  2481. sprite = self.sprite_pool:GetObjFreeList()
  2482. if sprite == nil then
  2483. sprite = Sprite.New()
  2484. end
  2485. self.sprite_list[owner.id] = sprite
  2486. local sprite_vo = SpriteVo.New()
  2487. sprite_vo:SetVo(owner:GetVo())
  2488. sprite:InitSpriteVo(owner, sprite_vo)
  2489. sprite:LoadInfoFromVo()
  2490. return sprite, true
  2491. end
  2492. function Scene:DeleteSprite(instance_id )
  2493. local sprite = self.sprite_list[instance_id]
  2494. if sprite ~= nil then
  2495. self.sprite_list[instance_id] = nil
  2496. self.sprite_pool:ReleaseObj(sprite)
  2497. end
  2498. end
  2499. ---------守护------
  2500. function Scene:CreateEvil(owner, owner_vo)
  2501. local evil = self.evil_list[owner.id]
  2502. if evil ~= nil then
  2503. self.evil_pool:ReleaseObj(evil)
  2504. self.evil_list[owner.id] = nil
  2505. end
  2506. evil = self.evil_pool:GetObjFreeList()--自由动作列表
  2507. if evil == nil then
  2508. evil = Evil.New()
  2509. end
  2510. self.evil_list[owner.id] = evil
  2511. local evil_vo = EvilVo.New()
  2512. evil_vo:SetVo(owner:GetVo())
  2513. evil:InitEvilVo(owner, evil_vo)
  2514. evil:LoadInfoFromVo()
  2515. return evil, true
  2516. end
  2517. function Scene:DeleteEvil(instance_id )
  2518. local sprite = self.evil_list[instance_id]
  2519. if sprite ~= nil then
  2520. self.evil_list[instance_id] = nil
  2521. self.evil_pool:ReleaseObj(sprite)
  2522. end
  2523. end
  2524. ---------------------------------- 宠物相关 ----------------
  2525. function Scene:CreatePokemon(owner,owner_vo)
  2526. local pokemon = self.pokemon_list[owner.id]
  2527. if pokemon ~= nil then
  2528. self.pokemon_pool:ReleaseObj(pokemon)
  2529. self.pokemon_list[owner.id] = nil
  2530. end
  2531. pokemon = self.pokemon_pool:GetObjFreeList()
  2532. if pokemon == nil then
  2533. pokemon = Pokemon.New()
  2534. end
  2535. self.pokemon_list[owner.id] = pokemon
  2536. local pokemon_vo = PokemonVo.New()
  2537. pokemon_vo:SetVo(owner.id, owner_vo.pokemon_id, owner_vo.pokemon_star)
  2538. pokemon:InitPokemonVo(owner, owner_vo, pokemon_vo)
  2539. pokemon:LoadInfoFromVo()
  2540. return pokemon, true
  2541. end
  2542. function Scene:DeletePokemon(instance_id )
  2543. local pokemon = self.pokemon_list[instance_id]
  2544. if pokemon ~= nil then
  2545. self.pokemon_list[instance_id] = nil
  2546. self.pokemon_pool:ReleaseObj(pokemon)
  2547. end
  2548. end
  2549. ---------------------------------- 宠物副本协战宠物相关 ----------------
  2550. function Scene:CreateAssisitPokemon(owner,owner_vo,assisit_pokemon_id,index)
  2551. local assisit_pokemon = nil
  2552. if self.assisit_pokemon_list[owner.id] and self.assisit_pokemon_list[owner.id][index] then
  2553. assisit_pokemon = self.assisit_pokemon_list[owner.id][index]
  2554. end
  2555. if assisit_pokemon ~= nil then
  2556. self.assisit_pokemon_pool:ReleaseObj(assisit_pokemon)
  2557. self.assisit_pokemon_list[owner.id][index] = nil
  2558. end
  2559. assisit_pokemon = self.assisit_pokemon_pool:GetObjFreeList()
  2560. if assisit_pokemon == nil then
  2561. assisit_pokemon = AssisitPokemon.New()
  2562. end
  2563. self.assisit_pokemon_list[owner.id] = self.assisit_pokemon_list[owner.id] or {}
  2564. self.assisit_pokemon_list[owner.id][index] = assisit_pokemon
  2565. local assisit_pokemon_vo = AssisitPokemonVo.New()
  2566. local assisit_pokemon_data = PetModel:getInstance():GetPetListById(assisit_pokemon_id)
  2567. local assisit_pokemon_star = 1
  2568. if assisit_pokemon_data then
  2569. assisit_pokemon_star = assisit_pokemon_data.pet_star
  2570. end
  2571. assisit_pokemon_vo:SetVo(owner.id, assisit_pokemon_id, assisit_pokemon_star,index)
  2572. assisit_pokemon:InitPokemonVo(owner, owner_vo, assisit_pokemon_vo)
  2573. assisit_pokemon:LoadInfoFromVo()
  2574. return assisit_pokemon, true
  2575. end
  2576. function Scene:DeleteAssisitPokemon(instance_id ,index)
  2577. local assisit_pokemon = nil
  2578. if self.assisit_pokemon_list[instance_id] and self.assisit_pokemon_list[instance_id][index] then
  2579. assisit_pokemon = self.assisit_pokemon_list[instance_id][index]
  2580. end
  2581. if assisit_pokemon ~= nil then
  2582. self.assisit_pokemon_list[instance_id][index] = nil
  2583. self.assisit_pokemon_pool:ReleaseObj(assisit_pokemon)
  2584. end
  2585. end
  2586. ---------------------------------- ai娘相关 ----------------
  2587. function Scene:CreatePet(owner,owner_vo)
  2588. local pet = self.pet_list[owner.id]
  2589. if pet ~= nil then
  2590. self.pet_pool:ReleaseObj(pet)
  2591. self.pet_list[owner.id] = nil
  2592. end
  2593. pet = self.pet_pool:GetObjFreeList()
  2594. if pet == nil then
  2595. pet = Pet.New()
  2596. end
  2597. self.pet_list[owner.id] = pet
  2598. local pet_vo = PetVo.New()
  2599. pet_vo:SetVo(owner.id, owner_vo.pet_id)
  2600. pet:InitPetVo(owner, owner_vo, pet_vo)
  2601. pet:LoadInfoFromVo()
  2602. return pet, true
  2603. end
  2604. function Scene:DeletePet(instance_id )
  2605. local pet = self.pet_list[instance_id]
  2606. if pet ~= nil then
  2607. self.pet_list[instance_id] = nil
  2608. self.pet_pool:ReleaseObj(pet)
  2609. end
  2610. end
  2611. ---------------------------------- 宝宝相关 ----------------
  2612. function Scene:CreateBaby(owner,owner_vo)
  2613. local baby = self.baby_list[owner.id]
  2614. if baby ~= nil then
  2615. self.baby_pool:ReleaseObj(baby)
  2616. self.baby_list[owner.id] = nil
  2617. end
  2618. baby = self.baby_pool:GetObjFreeList()
  2619. if baby == nil then
  2620. baby = Baby.New()
  2621. end
  2622. self.baby_list[owner.id] = baby
  2623. local baby_vo = BabyVo.New()
  2624. baby_vo:SetVo(owner.id, owner_vo,owner_vo.baby_id)
  2625. baby:InitBabyVo(owner, owner_vo, baby_vo)
  2626. baby:LoadInfoFromVo()
  2627. return baby, true
  2628. end
  2629. function Scene:DeleteBaby(instance_id)
  2630. local baby = self.baby_list[instance_id]
  2631. if baby ~= nil then
  2632. self.baby_list[instance_id] = nil
  2633. self.baby_pool:ReleaseObj(baby)
  2634. end
  2635. end
  2636. ----------------------本服团战粮草护送相关---------------
  2637. function Scene:CreateGWFollower(owner)
  2638. local gwfollower = self.gwfollower_list[owner.id]
  2639. if gwfollower ~= nil then
  2640. self.gwfollower_pool:ReleaseObj(gwfollower)
  2641. self.gwfollower_list[owner.id] = nil
  2642. end
  2643. gwfollower = self.gwfollower_pool:GetObjFreeList()
  2644. if gwfollower == nil then
  2645. gwfollower = GWFollower.New()
  2646. end
  2647. self.gwfollower_list[owner.id] = gwfollower
  2648. local gwfollower_vo = GWFollowerVo.New()
  2649. gwfollower_vo:SetVo(owner:GetVo())
  2650. gwfollower:InitGWFollowerVo(owner, gwfollower_vo)
  2651. gwfollower:LoadInfoFromVo()
  2652. return gwfollower, true
  2653. end
  2654. function Scene:DeleteGWFollower(instance_id )
  2655. local gwfollower = self.gwfollower_list[instance_id]
  2656. if gwfollower ~= nil then
  2657. self.gwfollower_list[instance_id] = nil
  2658. self.gwfollower_pool:ReleaseObj(gwfollower)
  2659. end
  2660. end
  2661. ------------------------------------------------------------------
  2662. ----------------------跳一跳跳台相关---------------
  2663. function Scene:CreateJumpOneStep(vo, step_id)
  2664. local jump_one_step = self.jump_one_step_list[step_id]
  2665. if jump_one_step ~= nil then
  2666. self.jump_one_step_pool:ReleaseObj(jump_one_step)
  2667. self.jump_one_step_pool[step_id] = nil
  2668. end
  2669. jump_one_step = self.jump_one_step_pool:GetObjFreeList()
  2670. if jump_one_step == nil then
  2671. jump_one_step = JumpOneStep.New()
  2672. end
  2673. self.jump_one_step_list[step_id] = jump_one_step
  2674. jump_one_step:InitStepVo(vo)
  2675. return jump_one_step, true
  2676. end
  2677. function Scene:DeleteJumpOneStep(step_id )
  2678. local jump_one_step = self.jump_one_step_list[step_id]
  2679. if jump_one_step ~= nil then
  2680. self.jump_one_step_list[step_id] = nil
  2681. self.jump_one_step_pool:ReleaseObj(jump_one_step)
  2682. end
  2683. end
  2684. ------------------------------------------------------------------
  2685. -------------家园建筑宝宝相关
  2686. function Scene:CreateBuildBaby(build_baby_vo)
  2687. local buildBaby = self.build_baby_list[build_baby_vo.instance_id]
  2688. if buildBaby == nil then
  2689. buildBaby = BuildBaby.New()
  2690. self.build_baby_list[build_baby_vo.instance_id] = buildBaby
  2691. buildBaby:InitBuildtBabyVo(build_baby_vo)
  2692. buildBaby:LoadInfoFromVo()
  2693. end
  2694. return buildBaby,true
  2695. end
  2696. function Scene:DeleteBuildBaby( build_baby_id )
  2697. local buildBaby = self.build_baby_list[build_baby_id]
  2698. if buildBaby ~= nil then
  2699. self.build_baby_list[build_baby_id]:DeleteMe()
  2700. self.build_baby_list[build_baby_id] = nil
  2701. end
  2702. end
  2703. ----------------------家园相关---------------
  2704. function Scene:CreateBuild(build_vo)
  2705. local build = self.build_list[build_vo.instance_id]
  2706. if build == nil then
  2707. build = Build.New()
  2708. self.build_list[build_vo.instance_id] = build
  2709. end
  2710. build:InitBuildtVo(build_vo)
  2711. build:LoadInfoFromVo()
  2712. return build, true
  2713. end
  2714. function Scene:DeleteBuild( build_id )
  2715. local build = self.build_list[build_id]
  2716. if build ~= nil then
  2717. self.build_list[build_id]:DeleteMe()
  2718. self.build_list[build_id] = nil
  2719. end
  2720. end
  2721. function Scene:CreateFurniture(furniture_vo)
  2722. local furniture = self.furniture_list[furniture_vo.instance_id]
  2723. if furniture == nil then
  2724. furniture = Furniture.New()
  2725. self.furniture_list[furniture_vo.instance_id] = furniture
  2726. end
  2727. furniture:InitFurnituretVo(furniture_vo)
  2728. furniture:LoadInfoFromVo()
  2729. return furniture, true
  2730. end
  2731. function Scene:DeleteFurniture( furniture_id )
  2732. local furniture = self.furniture_list[furniture_id]
  2733. if furniture ~= nil then
  2734. self.furniture_list[furniture_id]:DeleteMe()
  2735. self.furniture_list[furniture_id] = nil
  2736. end
  2737. end
  2738. ------------------------------------------------------------------
  2739. function Scene:CreateDropObj(drop_vo,center_x,center_y)
  2740. local drop = self.drop_list[drop_vo.drop_id]
  2741. if drop ~= nil then
  2742. self.drop_pool:ReleaseObj(drop)
  2743. self.drop_list[drop_vo.drop_id] = nil
  2744. end
  2745. drop = self.drop_pool:GetObjFreeList()
  2746. if drop == nil then
  2747. drop = SceneDropObj.New()
  2748. end
  2749. drop:InitDropVo(drop_vo,center_x,center_y)
  2750. self.drop_list[drop_vo.drop_id] = drop
  2751. GlobalEventSystem:DelayFire(EventName.EVIL_AUTO_PICK)
  2752. return drop, true
  2753. end
  2754. --删除某个人的掉落当他离开场景
  2755. function Scene:DeleteDropWhenLeaveScene(role_id)
  2756. for k,drop in pairs(self.drop_list) do
  2757. local vo = drop:GetDropVo()
  2758. if vo and vo.role_id == role_id then
  2759. --如果是自己的先显示提示
  2760. if vo.role_id == RoleManager.Instance:GetMainRoleId() then
  2761. drop:ShowDropTip()
  2762. end
  2763. self:DeleteDropObj(vo.drop_id)
  2764. end
  2765. end
  2766. end
  2767. function Scene:DeleteRole( role_id )
  2768. local obj = self.role_list[role_id]
  2769. if obj ~= nil then
  2770. if obj == self.main_role then
  2771. print("warning:try to remove mainrole as normal role , failed!")
  2772. return
  2773. end
  2774. --删除该对象的闭包函数
  2775. local del_role_func = function ( )
  2776. self.role_list[role_id] = nil
  2777. self.role_pool:ReleaseObj(obj)
  2778. end
  2779. if self.is_in_update then
  2780. --更新过程中延时删除
  2781. table_insert(self.delay_handle_funcs, del_role_func)
  2782. else
  2783. --直接删除对象
  2784. del_role_func()
  2785. end
  2786. if obj == self.curr_click_target then
  2787. self:CancelClickTarget(true)
  2788. end
  2789. end
  2790. end
  2791. --删除离线挂机角色
  2792. function Scene:DeleteHookRole(role_id)
  2793. local obj = self.hook_role_list[role_id]
  2794. if obj then
  2795. self.hook_role_pool:ReleaseObj(obj)
  2796. self.hook_role_list[role_id] = nil
  2797. end
  2798. end
  2799. function Scene:DeletePartner( partner_id )
  2800. local obj = self.partner_list[partner_id]
  2801. if obj ~= nil then
  2802. local del_partner_func = function ( )
  2803. self.partner_list[partner_id] = nil
  2804. self.partner_pool:ReleaseObj(obj)
  2805. end
  2806. if self.is_in_update then
  2807. --更新过程中延时删除
  2808. table_insert(self.delay_handle_funcs, del_partner_func)
  2809. else
  2810. --直接删除对象
  2811. del_partner_func()
  2812. end
  2813. end
  2814. end
  2815. function Scene:GetMonsterDeadBody(instance_id)
  2816. for _, monster in pairs(self.dead_body_list) do
  2817. if monster.id == instance_id then
  2818. return monster
  2819. end
  2820. end
  2821. return nil
  2822. end
  2823. function Scene:DeleteMonster( instance_id )
  2824. local monster = self.monster_list[instance_id]
  2825. if monster ~= nil then
  2826. self.monster_list[instance_id] = nil
  2827. --把怪物尸体放到另一个队列里
  2828. self.dead_body_count = self.dead_body_count + 1
  2829. self.dead_body_list[self.dead_body_count] = monster
  2830. monster:SetDeadBodyID(self.dead_body_count)
  2831. --如果不是死亡时的删除,要让怪物Fade渐隐
  2832. if not monster:IsDead() then
  2833. local dead_body_id = self.dead_body_count
  2834. self:DeleteDeadBody(dead_body_id)
  2835. end
  2836. if monster == self.curr_click_target then
  2837. self:CancelClickTarget()
  2838. end
  2839. end
  2840. end
  2841. function Scene:DeleteOther( instance_id )
  2842. local other = self.other_list[instance_id]
  2843. if other ~= nil then
  2844. self.other_list[instance_id] = nil
  2845. self.other_pool:ReleaseObj(other)
  2846. end
  2847. end
  2848. --删除怪物尸体
  2849. function Scene:DeleteDeadBody(dead_body_id)
  2850. local obj = self.dead_body_list[dead_body_id]
  2851. if obj then
  2852. self.monster_pool:ReleaseObj(obj)
  2853. self.dead_body_list[dead_body_id] = nil
  2854. end
  2855. end
  2856. function Scene:DeleteDoor( enter_scene_id )
  2857. SapManager:getInstance():UnRegisterObj(SapManager.ObjType.Door,enter_scene_id)
  2858. end
  2859. function Scene:DeleteJumpPoint( id )
  2860. SapManager:getInstance():UnRegisterObj(SapManager.ObjType.JumpPoint,id)
  2861. end
  2862. function Scene:DeleteNpc( ins_id )
  2863. SapManager:getInstance():UnRegisterObj(SapManager.ObjType.NPC,ins_id)
  2864. end
  2865. function Scene:DeleteDropObj( drop_id )
  2866. local drop = self.drop_list[drop_id]
  2867. if drop ~= nil then
  2868. self.drop_pool:ReleaseObj(drop)
  2869. self.drop_list[drop_id] = nil
  2870. end
  2871. end
  2872. function Scene:DeleteWayPoint( id )
  2873. if self.waypoint ~= nil then
  2874. self.waypoint:DeleteMe()
  2875. self.waypoint = nil
  2876. end
  2877. end
  2878. function Scene:clearGoToData()
  2879. self.goToPos = nil
  2880. self.goToFunc = nil
  2881. end
  2882. function Scene:ClearScene(clear_doors_npcs_jumps)
  2883. if clear_doors_npcs_jumps == nil then
  2884. clear_doors_npcs_jumps = true
  2885. end
  2886. if clear_doors_npcs_jumps then
  2887. self.is_clearing = true
  2888. end
  2889. --先清空所有对象列表 再执行DeleteMe 避免执行DeleteMe操作的过程中调用列表 导致vo为nil
  2890. local role_delete_list_proxy = self.role_list
  2891. self.role_list = {}
  2892. local partner_delete_list_proxy = self.partner_list
  2893. self.partner_list = {}
  2894. local monster_delete_list_proxy = self.monster_list
  2895. self.monster_list = {}
  2896. local dead_body_delete_list_proxy = self.dead_body_list
  2897. self.dead_body_list = {}
  2898. local other_delete_list_proxy = self.other_list
  2899. self.other_list = {}
  2900. local drop_delete_list_proxy = self.drop_list
  2901. self.drop_list = {}
  2902. local sprite_delete_list_proxy = self.sprite_list
  2903. self.sprite_list = {}
  2904. local evil_delete_list_proxy = self.evil_list
  2905. self.evil_list = {}
  2906. local pet_delete_list_proxy = self.pet_list
  2907. self.pet_list = {}
  2908. local pokemon_delete_list_proxy = self.pokemon_list
  2909. self.pokemon_list = {}
  2910. local assisit_pokemon_delete_list_proxy = self.assisit_pokemon_list
  2911. self.assisit_pokemon_list = {}
  2912. local baby_delete_list_proxy = self.baby_list
  2913. self.baby_list = {}
  2914. local gwflollower_delete_list_proxy = self.gwfollower_list
  2915. self.gwfollower_list = {}
  2916. local grave_delete_list_proxy = self.grave_list
  2917. self.grave_list = {}
  2918. local hook_role_delete_list_proxy = self.hook_role_list
  2919. self.hook_role_list = {}
  2920. local build_delete_list_proxy = self.build_list
  2921. self.build_list = {}
  2922. local jump_one_step_delete_list_proxy = self.jump_one_step_list
  2923. self.jump_one_step_list = {}
  2924. local furniture_delete_list_proxy = self.furniture_list
  2925. self.furniture_list = {}
  2926. -- local build_baby_delete_list_proxy = self.build_baby_list
  2927. -- for _,v in ipairs(build_baby_delete_list_proxy) do
  2928. -- v:DeleteMe()
  2929. -- end
  2930. -- self.build_baby_list = {}
  2931. for _, v in pairs(build_delete_list_proxy) do
  2932. v:DeleteMe()
  2933. end
  2934. for _, v in pairs(furniture_delete_list_proxy) do
  2935. v:DeleteMe()
  2936. end
  2937. for _, v in pairs(role_delete_list_proxy) do
  2938. if self.main_role ~= v then
  2939. self.role_pool:ReleaseObj(v)
  2940. end
  2941. end
  2942. for _, v in pairs(partner_delete_list_proxy) do
  2943. self.role_pool:ReleaseObj(v)
  2944. end
  2945. for _, v in pairs(monster_delete_list_proxy) do
  2946. self.monster_pool:ReleaseObj(v)
  2947. end
  2948. for _, v in pairs(dead_body_delete_list_proxy) do
  2949. self.monster_pool:ReleaseObj(v)
  2950. end
  2951. for _, v in pairs(other_delete_list_proxy) do
  2952. self.other_pool:ReleaseObj(v)
  2953. end
  2954. for _, v in pairs(drop_delete_list_proxy) do
  2955. self.drop_pool:ReleaseObj(v)
  2956. end
  2957. for _, v in pairs(sprite_delete_list_proxy) do
  2958. self.sprite_pool:ReleaseObj(v)
  2959. end
  2960. for _, v in pairs(evil_delete_list_proxy) do
  2961. self.evil_pool:ReleaseObj(v)
  2962. end
  2963. for _, v in pairs(pet_delete_list_proxy) do
  2964. self.pet_pool:ReleaseObj(v)
  2965. end
  2966. for _, v in pairs(pokemon_delete_list_proxy) do
  2967. self.pokemon_pool:ReleaseObj(v)
  2968. end
  2969. for _, list in pairs(assisit_pokemon_delete_list_proxy) do
  2970. for _, v in pairs(list) do
  2971. self.assisit_pokemon_pool:ReleaseObj(v)
  2972. end
  2973. end
  2974. for _, v in pairs(baby_delete_list_proxy) do
  2975. self.baby_pool:ReleaseObj(v)
  2976. end
  2977. for _, v in pairs(gwflollower_delete_list_proxy) do
  2978. self.gwfollower_pool:ReleaseObj(v)
  2979. end
  2980. for _, v in pairs(jump_one_step_delete_list_proxy) do
  2981. self.jump_one_step_pool:ReleaseObj(v)
  2982. end
  2983. for _, v in pairs(grave_delete_list_proxy) do
  2984. self.grave_pool:ReleaseObj(v)
  2985. end
  2986. for _, v in pairs(hook_role_delete_list_proxy) do
  2987. self.hook_role_pool:ReleaseObj(v)
  2988. end
  2989. self:clearGoToData()
  2990. if clear_doors_npcs_jumps then
  2991. for _, v in pairs(self.npc_list) do
  2992. self.npc_pool:ReleaseObj(v)
  2993. end
  2994. self.npc_list = {}
  2995. for _, v in pairs(self.door_list) do
  2996. v:DeleteMe()
  2997. end
  2998. self.door_list = {}
  2999. for _, v in pairs(self.jumppoint_list) do
  3000. v:DeleteMe()
  3001. end
  3002. self.jumppoint_list = {}
  3003. end
  3004. if self.waypoint then
  3005. self.waypoint:DeleteMe()
  3006. self.waypoint = nil
  3007. end
  3008. LuaViewManager:getInstance():ClearTimer()
  3009. --清除所有粒子特效
  3010. ParticleManager:getInstance():DelAllEffects(clear_doors_npcs_jumps)
  3011. --主角最后删除
  3012. if self.main_role then
  3013. self.main_role:DeleteMe()
  3014. self.main_role = nil
  3015. end
  3016. self.enable_click_screen = true
  3017. self.curr_click_target = false
  3018. self.manual_target = false
  3019. self.find_monster_pos = false
  3020. if self.click_target_effect then
  3021. destroy(self.click_target_effect)
  3022. self.effect_res = nil
  3023. self.click_target_effect = nil
  3024. self.recreate_target_effect = false
  3025. end
  3026. -- OperateManager.Instance:ClearAllPokemonSrcOper()
  3027. end
  3028. function Scene:UnBindMainRoleVo()
  3029. if self.main_role then
  3030. self.main_role:UnBindVo()
  3031. end
  3032. end
  3033. function Scene:MainRoleMove(end_pos, range, end_function,is_fire_evt)
  3034. self:clearGoToData()
  3035. local orign_end_pos = Vector2(end_pos.x, end_pos.y) --一开始传进来的结束坐标,用来跳跃后重新计算路径
  3036. range = range or 0
  3037. if range > 0 then
  3038. local start_pos = Vector2(self.main_role:GetLogicPos())
  3039. local path_info = self.mapView:FindWay(start_pos, Vector2(end_pos.x, end_pos.y), range)
  3040. if path_info then
  3041. local total_point = #path_info
  3042. if total_point >= 1 then
  3043. local game_end_pos = path_info[total_point]
  3044. end_pos.x, end_pos.y = game_end_pos.x, game_end_pos.y
  3045. end
  3046. end
  3047. end
  3048. self.goToPos = end_pos
  3049. self.goToFunc = end_function
  3050. is_fire_evt = is_fire_evt == nil and true or is_fire_evt
  3051. local function end_func()
  3052. self:clearGoToData()
  3053. if is_fire_evt then
  3054. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  3055. end
  3056. if end_function ~= nil then
  3057. end_function()
  3058. end
  3059. end
  3060. OperateManager.Instance:StartMoveAction(end_pos, end_func, orign_end_pos, range)
  3061. end
  3062. function Scene:GetRole(role_id)
  3063. if role_id == RoleManager.Instance:GetMainRoleId() then
  3064. return self:GetMainRole()
  3065. end
  3066. return self.role_list[role_id]
  3067. end
  3068. function Scene:GetAllRole()
  3069. return self.role_list
  3070. end
  3071. --rx,ry玩家真实坐标
  3072. --flag 玩家移动方式
  3073. -- args_1, args_2, args_3, args_4 移动自定义参数
  3074. function Scene:RoleMove(role_id, rx, ry, flag, args_1, args_2, args_3, args_4)
  3075. flag = flag or 0
  3076. x = rx or 0
  3077. y = ry or 0
  3078. local role = self:GetRole(role_id)
  3079. if role ~= nil then
  3080. role.move_flag = flag
  3081. local end_pos = co.TempVector2(x, y)
  3082. if flag == MOVE_TYPE.NORMOL_MOVE then --正常移动
  3083. if not role:IsInState(PoseState.JUMP) then
  3084. role:FindPathAndMove(end_pos)
  3085. end
  3086. elseif flag == MOVE_TYPE.JUMP then -- 跳跃
  3087. role:DoJumpFromRoleMove(args_1, args_2, args_3, args_4, Role.MULTI_JUMP_TYPE.Jump_1)
  3088. elseif flag == MOVE_TYPE.ACCELERATE then --加速
  3089. role:FindPathAndMove(end_pos)
  3090. elseif flag == MOVE_TYPE.FLASH then --闪现闪避
  3091. local dir = co.TableXY(end_pos.x - role.real_pos.x, end_pos.y - role.real_pos.y)
  3092. role:SetDirection(dir)
  3093. role:DoFlash(end_pos)
  3094. elseif flag == MOVE_TYPE.RUSH then --冲刺
  3095. role:DoRush(end_pos)
  3096. elseif flag == MOVE_TYPE.BLINK then --瞬移
  3097. role:SetRealPos(x,y)
  3098. role:DoStand()
  3099. elseif flag == MOVE_TYPE.TASK_JUMP then --任务三段跳
  3100. role:DoJumpFromRoleMove(args_1, args_2, args_3, args_4, Role.MULTI_JUMP_TYPE.Jump_2)
  3101. else
  3102. end
  3103. role:GetVo().pos_x = end_pos.x
  3104. role:GetVo().pos_y = end_pos.y
  3105. end_pos:DeleteV()
  3106. else
  3107. -- print("warning! can not find a role to handle move response!")
  3108. end
  3109. end
  3110. function Scene:MonsterMove(instance_id, pos_x, pos_y, speedFlag, endDirState)
  3111. speedFlag = speedFlag or 0
  3112. local monster = self:GetMonster(instance_id)
  3113. if monster ~= nil then
  3114. if self.monster_move_end_pos == nil then
  3115. self.monster_move_end_pos = {x = pos_x, y = pos_y}
  3116. else
  3117. self.monster_move_end_pos.x, self.monster_move_end_pos.y = pos_x, pos_y
  3118. end
  3119. if lua_viewM.is_lock_screen then
  3120. monster:SetRealPos(self.monster_move_end_pos.x,self.monster_move_end_pos.y)
  3121. else
  3122. -- monster:SetMoveEndPos(pos_x,pos_y)
  3123. monster:FindPathAndMove(self.monster_move_end_pos)
  3124. end
  3125. end
  3126. end
  3127. function Scene:PartnerMove(instance_id, pos_x, pos_y, speedFlag, endDirState)
  3128. speedFlag = speedFlag or 0
  3129. local partner = self:GetPartner(instance_id)
  3130. if partner ~= nil then
  3131. local end_pos = co.TableXY(pos_x, pos_y)
  3132. partner:FindPathAndMove(end_pos)
  3133. end
  3134. end
  3135. function Scene:OtherMove(instance_id, pos_x, pos_y, speedFlag, endDirState)
  3136. speedFlag = speedFlag or 0
  3137. local other = self:GetOther(instance_id)
  3138. if other ~= nil then
  3139. local end_pos = co.TableXY(pos_x, pos_y)
  3140. other:FindPathAndMove(end_pos)
  3141. end
  3142. end
  3143. function Scene:NpcMove(instance_id, pos_x, pos_y, dir, dist, speedFlag, endDirState)
  3144. speedFlag = speedFlag or 0
  3145. local npc = self:GetNpc(instance_id)
  3146. if npc ~= nil then
  3147. local real_x, real_y = npc:GetRealPos()
  3148. if GameMath_GetDistance(real_x, real_y, pos_x, pos_y, false) > dist * dist then
  3149. co.NormaliseXYTable(dir)
  3150. local end_pos = co.TableXY(pos_x + dir.x * (dist - 10), pos_y + dir.y * (dist - 10))
  3151. npc:FindPathAndMove(end_pos)
  3152. end
  3153. end
  3154. end
  3155. function Scene:MainRoleDirectionMove(dir)
  3156. if not self.scene_mgr:IsSceneStart() then
  3157. return
  3158. end
  3159. if dir == nil then
  3160. --松开摇杆,重置寻路状态
  3161. self:ResetUserManulState()
  3162. if not self.main_role or not self.main_role.joy_jump_state then
  3163. OperateManager.Instance:StopMove()
  3164. end
  3165. if self.main_role and self.main_role:CanMove() then
  3166. self.main_role:ForceSendPos()
  3167. end
  3168. self.main_camera:JoyStickState(false)
  3169. else
  3170. if self.main_role and self.main_role.story_cfg then
  3171. return
  3172. end
  3173. --手动操作重置状态
  3174. local task_change_scene_type = TaskModel:getInstance():GetChangeSceneType()
  3175. if task_change_scene_type then
  3176. TaskModel:getInstance():SetChangeSceneType(false, false)
  3177. end
  3178. self.main_camera:JoyStickState(true)
  3179. if not self.main_role or not self.main_role.joy_jump_state then
  3180. OperateManager.Instance:ClearSrcOper()
  3181. end
  3182. if self.main_role then
  3183. self.main_role:DoDirectionMove(dir)
  3184. end
  3185. end
  3186. end
  3187. --is_hook 是否挂机
  3188. function Scene:MainRoleSkillMove(dir,elapse_time,is_hook)
  3189. if not self.main_role then
  3190. return
  3191. end
  3192. if dir == nil then
  3193. self.main_role:DoSkillMoveEnd(dir,elapse_time)
  3194. return
  3195. end
  3196. self.main_camera:JoyStickState(true)
  3197. if not self.main_role or not self.main_role.joy_jump_state then
  3198. OperateManager.Instance:ClearSrcOper()
  3199. end
  3200. if self.main_role then
  3201. self.main_role:DoSkillMove(dir,elapse_time,is_hook)
  3202. end
  3203. end
  3204. function Scene:UpdateRole()
  3205. if self.update_role_name or self.update_role_mode then
  3206. for id, role in pairs(self.role_list) do
  3207. if self.update_role_name then
  3208. role:UpdateName()
  3209. end
  3210. if self.update_role_mode then
  3211. role:ChangeModeHide()
  3212. end
  3213. end
  3214. self.update_role_name = false
  3215. self.update_role_mode = false
  3216. end
  3217. end
  3218. function Scene:UpdateMonster()
  3219. if self.update_monster_name then
  3220. for id, mon in pairs(self.monster_list) do
  3221. mon:UpdateName()
  3222. end
  3223. self.update_monster_name = false
  3224. end
  3225. end
  3226. function Scene:UpdatePartner()
  3227. if self.update_partner_name then
  3228. for id, partner in pairs(self.partner_list) do
  3229. partner:UpdateName()
  3230. end
  3231. self.update_partner_name = false
  3232. end
  3233. end
  3234. function Scene:UpdateNpc()
  3235. end
  3236. function Scene:LateUpdate(now_time, elapse_time)
  3237. if not self.scene_data_loaded then
  3238. return
  3239. end
  3240. local cam_pos = self.main_camera:GetCameraPos()
  3241. if cam_pos then
  3242. self.mapView:Update( cam_pos )
  3243. SapManager:getInstance():Update(cam_pos)
  3244. end
  3245. self.is_in_update = true
  3246. self.late_update_scene_times_index = self.late_update_scene_times_index + 1
  3247. self.late_update_elapse_time = self.late_update_elapse_time + elapse_time
  3248. for _, v in pairs(self.role_list) do
  3249. if v ~= self.main_role then
  3250. if v:CanUpdate() then
  3251. v:Update(now_time, self.late_update_elapse_time)
  3252. else
  3253. v:AddIgnoreUpdateIndex()
  3254. end
  3255. end
  3256. end
  3257. for _, v in pairs(self.other_list) do
  3258. if v:CanUpdate() then
  3259. v:Update(now_time, self.late_update_elapse_time)
  3260. else
  3261. v:AddIgnoreUpdateIndex()
  3262. end
  3263. end
  3264. for _, v in pairs(self.sprite_list) do
  3265. if v.IsMainRoleSprite and v:IsMainRoleSprite() then
  3266. v:MainRoleUpdate(now_time, self.late_update_elapse_time)
  3267. else
  3268. if v:CanUpdate() then
  3269. v:OtherRoleUpdate(now_time, self.late_update_elapse_time)
  3270. else
  3271. v:AddIgnoreUpdateIndex()
  3272. end
  3273. end
  3274. end
  3275. for _, v in pairs(self.evil_list) do
  3276. if v:CanUpdate() then
  3277. v:Update(now_time, self.late_update_elapse_time)
  3278. else
  3279. v:AddIgnoreUpdateIndex()
  3280. end
  3281. end
  3282. -- for _, v in pairs(self.partner_list) do
  3283. -- if v:CanUpdate() then
  3284. -- v:Update(now_time, self.late_update_elapse_time)
  3285. -- else
  3286. -- v:AddIgnoreUpdateIndex()
  3287. -- end
  3288. -- end
  3289. for _, v in pairs(self.pet_list) do
  3290. if v:CanUpdate() then
  3291. v:Update(now_time, self.late_update_elapse_time)
  3292. else
  3293. v:AddIgnoreUpdateIndex()
  3294. end
  3295. end
  3296. for _, v in pairs(self.pokemon_list) do
  3297. if v:CanUpdate() then
  3298. v:Update(now_time, self.late_update_elapse_time)
  3299. else
  3300. v:AddIgnoreUpdateIndex()
  3301. end
  3302. end
  3303. for _, list in pairs(self.assisit_pokemon_list) do
  3304. for _,v in pairs(list) do
  3305. if v:CanUpdate() then
  3306. v:Update(now_time, self.late_update_elapse_time)
  3307. else
  3308. v:AddIgnoreUpdateIndex()
  3309. end
  3310. end
  3311. end
  3312. for _, v in pairs(self.baby_list) do
  3313. if v:CanUpdate() then
  3314. v:Update(now_time, self.late_update_elapse_time)
  3315. else
  3316. v:AddIgnoreUpdateIndex()
  3317. end
  3318. end
  3319. for _, v in pairs(self.gwfollower_list) do
  3320. if v:CanUpdate() then
  3321. v:Update(now_time, self.late_update_elapse_time)
  3322. else
  3323. v:AddIgnoreUpdateIndex()
  3324. end
  3325. end
  3326. for _, v in pairs(self.jump_one_step_list) do
  3327. --if v:CanUpdate() then
  3328. v:Update(now_time, self.late_update_elapse_time)
  3329. --else
  3330. --v:AddIgnoreUpdateIndex()
  3331. --end
  3332. end
  3333. for _, v in pairs(self.npc_list) do
  3334. if v:CanUpdate() then
  3335. v:Update(now_time, self.late_update_elapse_time)
  3336. else
  3337. v:AddIgnoreUpdateIndex()
  3338. end
  3339. end
  3340. -- for _, v in pairs(self.door_list) do
  3341. -- v:Update(now_time, self.late_update_elapse_time)
  3342. -- end
  3343. for _, v in pairs(self.drop_list) do
  3344. if v:IsFinishState() then
  3345. self:DeleteDropObj(v:GetDropId())
  3346. else
  3347. v:Update(now_time, self.late_update_elapse_time)
  3348. end
  3349. end
  3350. if not lua_viewM.is_lock_screen then
  3351. for _, v in pairs(self.hook_role_list) do
  3352. if v:CanUpdate() then
  3353. v:Update(now_time, self.late_update_elapse_time)
  3354. else
  3355. v:AddIgnoreUpdateIndex()
  3356. end
  3357. end
  3358. end
  3359. self.late_update_elapse_time = 0
  3360. self.is_in_update = false
  3361. --调用延时函数(避免回调过程出错对应列表始终不清空)
  3362. if not IsTableEmpty(self.delay_handle_funcs) then
  3363. local delay_funcs = self.delay_handle_funcs
  3364. self.delay_handle_funcs = {}
  3365. for _, v in pairs(delay_funcs) do
  3366. if v then
  3367. v()
  3368. end
  3369. end
  3370. end
  3371. if not self.scene_mgr:IsSceneStart() then
  3372. return
  3373. end
  3374. if self.late_update_scene_times_index % 13 == 0 then
  3375. self:UpdateRole()
  3376. end
  3377. if self.late_update_scene_times_index % 13 == 0 then
  3378. self:UpdateMonster()
  3379. end
  3380. -- if self.late_update_scene_times_index % 20 == 0 then
  3381. -- self:UpdateNpc()
  3382. -- end
  3383. if rawget(self, "main_role") and not self.main_role.disabled then
  3384. if self.late_update_scene_times_index % 7 == 0 then
  3385. self:UpdateAutoFight()
  3386. elseif self.late_update_scene_times_index % 61 == 0 then
  3387. self:UpdateClickTargetEffect()
  3388. elseif self.late_update_scene_times_index % 101 == 0 then
  3389. self:UpdateRoleVisibleState()
  3390. end
  3391. end
  3392. if self.last_find_jump_nearest_vo_time and Time.time - self.last_find_jump_nearest_vo_time > 3 then
  3393. print("tanar: [Scene 3904]=> self.last_find_jump_nearest_vo_time: ",self.last_find_jump_nearest_vo_time)
  3394. self.last_find_jump_nearest_vo_time = nil
  3395. end
  3396. local guild_model = GuildModel:getInstance()
  3397. if self.scene_mgr:IsPetDungeon() then
  3398. --宠物副本需要检测buff球距离
  3399. if self.late_update_scene_times_index % 25 == 0 then
  3400. self:CheckBuffBall()
  3401. end
  3402. elseif self.scene_mgr:IsGuildScene() and guild_model:IsGuildCollectActive() then
  3403. --社团封印裂隙活动自动采集状态需要自动寻路去找采集怪
  3404. if self.late_update_scene_times_index % 31 == 0 and guild_model:IsAutoGuildCollectState() then
  3405. --只在角色站立不动没事干且状态为自动社团采集状态时才执行自动寻路逻辑
  3406. if self.main_role:IsInState(PoseState.WAITSTAND) or self.main_role:IsInState(PoseState.STAND) then
  3407. guild_model:Fire(GuildModel.AUTO_FIND_WAY_TO_GUILD_COLLECT_MON)
  3408. end
  3409. end
  3410. elseif self.scene_mgr:IsGuildCSGRScene() and guild_model:IsCSGRInCollectRound() then
  3411. -- 本国团战如果处于采集阶段并激活了自动采集则需要自动寻找最近的采集物
  3412. if self.late_update_scene_times_index % 62 == 0 and guild_model:GetCSGRAUtoCollectStatus() then
  3413. -- 只在角色站立不动没事干且状态为自动采集状态时才执行自动寻路逻辑
  3414. if self.main_role:IsInState(PoseState.WAITSTAND) or self.main_role:IsInState(PoseState.STAND) then
  3415. guild_model:CSGRAutoCollect()
  3416. end
  3417. end
  3418. -- elseif (self.escort_model and self.escort_model:IsEscortState() and self.escort_model.not_pause ) or (EscortModel:GetInstance():IsEscortState() and EscortModel:GetInstance().not_pause )then--在护送的时候要检测怪的距离(暂时 不确定性能会不会有很大影响 应该不会)
  3419. -- self:CheckEscortDistance()
  3420. end
  3421. end
  3422. function Scene:Update( now_time, elapse_time )
  3423. local preload_max_time = self.preload_max_time
  3424. -- if self.is_first_enter_game or self.is_first_enter_scene or self.load_scene_timeout_max then
  3425. -- preload_max_time = preload_max_time * 2
  3426. -- end
  3427. -- if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then
  3428. -- preload_max_time = preload_max_time * 0.75
  3429. -- end
  3430. --预加载超时关闭
  3431. if self.start_preload_sceneObjRes_time and now_time - self.start_preload_sceneObjRes_time >= preload_max_time then
  3432. self:PreLoadSceneObjResCompleted()
  3433. if self.sceneLoadView then
  3434. self.load_progress_finished = true
  3435. self.scene_data_loaded = true
  3436. self.sceneLoadView.scene_load_progress_finished = true
  3437. self.start_preload_sceneObjRes_time = nil
  3438. end
  3439. GlobalEventSystem:Fire(EventName.TIMEOUT_ENTER_SCENE)
  3440. end
  3441. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  3442. -- if self.sceneLoadView.scene_load_progress_finished and self.scene_data_loaded and self.preload_res_is_loaded then
  3443. if self.sceneLoadView.scene_load_progress_finished and self.scene_data_loaded then
  3444. LuaMemManager:getInstance():checkToReleaseMem(true)
  3445. self.load_progress_finished = true
  3446. self:CloseSceneLoadView()
  3447. GlobalEventSystem:Fire(EventName.NOTICE_SCENE_LOAD_WILL_COMPLETE)
  3448. self.scene_load_view_complete_time = Time.time
  3449. end
  3450. if not self.sceneLoadView.hide_load_progress then
  3451. return
  3452. end
  3453. end
  3454. if self.main_role then
  3455. self.main_role:Update(now_time, elapse_time)
  3456. if self.find_monster_pos then
  3457. local x,y = self.main_role:GetRealPos()
  3458. if GameMath_GetDistance(x,y,self.find_monster_pos.x,self.find_monster_pos.y,false) <= self.find_monster_distance * self.find_monster_distance then
  3459. local attack_list = self:FindTargets(Scene.FIND_TARGET_TYPE.all, 1, nil, self.find_monster_distance, nil, nil, nil, nil, nil, nil, nil, nil, nil, true,nil,false)
  3460. if attack_list and attack_list[1] then
  3461. if self.main_role:GetMainRoleInBabyDunFlag() then -- 宝宝副本,走宝宝副本的挂机技能
  3462. self.SkillMgr:PrepareAutoFightSkillInBabyDun()
  3463. else
  3464. self.SkillMgr:PrepareAutoFightSkill()
  3465. end
  3466. local obj_type = attack_list[1].obj_type
  3467. if obj_type == SceneBaseType.Role then
  3468. self:MainRoleAttackRole(attack_list[1])
  3469. elseif obj_type == SceneBaseType.Monster then
  3470. self:MainRoleAttackMonster(attack_list[1])
  3471. end
  3472. self.find_monster_pos = false
  3473. GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
  3474. end
  3475. end
  3476. end
  3477. end
  3478. self.update_scene_times_index = self.update_scene_times_index + 1
  3479. self.update_elapse_time = self.update_elapse_time + elapse_time
  3480. if not lua_viewM.is_lock_screen then
  3481. for _, v in pairs(self.monster_list) do
  3482. if v:CanUpdate() then
  3483. v:Update(now_time, self.update_elapse_time)
  3484. else
  3485. v:AddIgnoreUpdateIndex()
  3486. end
  3487. end
  3488. end
  3489. --正在渐隐的的怪物尸体
  3490. for _, v in pairs(self.dead_body_list) do
  3491. if v:CanUpdate() then
  3492. v:Update(now_time, self.update_elapse_time)
  3493. else
  3494. v:AddIgnoreUpdateIndex()
  3495. end
  3496. end
  3497. self.update_elapse_time = 0
  3498. end
  3499. function Scene:UpdateAllMonsterVisible()
  3500. if self.scene_mgr:IsNotBlockMonsterScene() then
  3501. return
  3502. end
  3503. for id, mon in pairs(self.monster_list) do
  3504. if self.is_hide_all_mon then
  3505. if not mon:HasModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit) then
  3506. mon:SetModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit, true)
  3507. end
  3508. else
  3509. if mon:HasModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit) then
  3510. mon:SetModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit, false)
  3511. end
  3512. end
  3513. end
  3514. end
  3515. --更新玩家显示状态
  3516. function Scene:UpdateRoleVisibleState(force_to_check)
  3517. if self.check_visible_role_num_time == false or Time.time - self.check_visible_role_num_time > 10 or force_to_check then
  3518. self.check_visible_role_num_time = Time.time
  3519. --设置的同屏玩家数量
  3520. local player_limit_setting_count = 0
  3521. if not LuaViewManager:getInstance().is_lock_screen then
  3522. player_limit_setting_count = (lua_settingM:GetBlockProperty("other") or self.is_hide_all_role) and 0 or lua_settingM:GetPlayerCounts()
  3523. end
  3524. -- local mainRole_defender_list = self.scene_mgr.mainRole_defender_list --攻击过主角的角色
  3525. local invisible_list = {} --场景角色列表按距离排序
  3526. local base_dis_offset
  3527. for id, role in pairs(self.role_list) do
  3528. base_dis_offset = 160000 --可操作的偏移距离
  3529. if role ~= self.main_role and (not role:IsModelHiden() or role:HasModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit)) then --除了人数限制的隐藏 其他情况的隐藏不受控制
  3530. --5秒内攻击过我的玩家,先拿出来
  3531. -- if mainRole_defender_list[role.id] and Time.time - mainRole_defender_list[role.id].start_time < 5 then
  3532. -- base_dis_offset = 0
  3533. -- end
  3534. local x1, y1 = role:GetRealPos()
  3535. local x2, y2 = self.main_role:GetRealPos()
  3536. role.dist_to_main_role = GameMath_GetDistance(x1, y1, x2, y2, false) + base_dis_offset
  3537. table_insert(invisible_list, role)
  3538. end
  3539. end
  3540. local sort_func = function (a, b)
  3541. return a.dist_to_main_role < b.dist_to_main_role
  3542. end
  3543. table_sort(invisible_list, sort_func)
  3544. local need_show = false
  3545. local curr_show_player_count = 0 --当前已经显示的玩家数量
  3546. for i = 1, #invisible_list do
  3547. local role = invisible_list[i]
  3548. if curr_show_player_count < player_limit_setting_count then
  3549. need_show = true
  3550. else
  3551. need_show = false
  3552. end
  3553. if need_show then
  3554. -- 需要渲染的人放进渲染列表
  3555. if role:HasModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit) then
  3556. role:SetModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit, false)
  3557. --显示回来的角色,如果死亡就继续躺着
  3558. if not role:IsModelHiden() and role:IsDead() then
  3559. role:PlayDeadNormalized()
  3560. end
  3561. end
  3562. curr_show_player_count = curr_show_player_count + 1
  3563. else
  3564. if not role:HasModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit) then
  3565. role:SetModelHideFlag(SceneObj.ModelHideFlag.RoleNumLimit, true)
  3566. end
  3567. end
  3568. end
  3569. end
  3570. end
  3571. function Scene:ChangeTarget(find_target_type, distance, area, check_invincible)
  3572. find_target_type = find_target_type or Scene.FIND_TARGET_TYPE.all
  3573. area = area or 1000
  3574. local center_pos = co.TableXY(self.main_role:GetRealPos())
  3575. local attack_list, role_list = self:FindTargets(Scene.FIND_TARGET_TYPE.all, 10, distance, area, nil, nil, center_pos, nil, nil, nil, nil, nil, nil, true,nil,false)
  3576. for i,role in ipairs(role_list) do
  3577. table_insert(attack_list,role)
  3578. end
  3579. for k,obj in pairs(attack_list) do
  3580. if obj == self.curr_click_target then
  3581. table.remove(attack_list,k)
  3582. break
  3583. end
  3584. end
  3585. if check_invincible then -- 是否需要检查是否处于无敌状态
  3586. for k,obj in pairs(attack_list) do
  3587. if self:IsMonsterInvincible(obj) then
  3588. table.remove(attack_list,k)
  3589. end
  3590. end
  3591. end
  3592. local num = attack_list and #attack_list or 0
  3593. local target = attack_list and attack_list[math.random(1,num)]
  3594. if target then
  3595. self.manual_target = target
  3596. self:SetClickTarget(target)
  3597. --切换目标头像
  3598. if target:GetType() == SceneBaseType.Role then
  3599. self.scene_mgr:SetAttackHeadVo(target.vo, nil, true)
  3600. elseif target:GetType() == SceneBaseType.Monster then
  3601. self.scene_mgr:ResetAttackHeadVo(true)
  3602. end
  3603. return target
  3604. end
  3605. return nil
  3606. end
  3607. function Scene:SetEnterSceneFlag()
  3608. --[[
  3609. if self.scene_mgr:IsPkBattleScene() then
  3610. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["PkBattleScene"]
  3611. elseif self.scene_mgr:IsGuildWarScene() then
  3612. self.target_auto_fight_cfg = DeepCopy(Config.ConfigTargetAutoFight.Flag["GuildWarScene"])
  3613. elseif self.scene_mgr:IsGuildGuardDungeon() then
  3614. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["GuildGuardDungeon"]
  3615. elseif self.scene_mgr:IsMainCityAndFieldScene() then
  3616. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["MainCityAndFieldScene"]
  3617. elseif self.scene_mgr:IsOnButterflyScene() then
  3618. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["ButterflyScene"]
  3619. elseif self.scene_mgr:IsEquipScene() then
  3620. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["DungeonEquipScene"]
  3621. elseif self.scene_mgr:IsRefineDungeon() then
  3622. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["DungeonRefineScene"]
  3623. elseif self.scene_mgr:IsStarDungeonScene() then
  3624. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["StarDungeonScene"]
  3625. elseif self.scene_mgr:IsKFGuildWarFightScene() then
  3626. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["KFGuildWarFightScene"]
  3627. elseif self.scene_mgr:IsDiamondFightScene() then
  3628. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["DiamonFightScene"]
  3629. elseif self.scene_mgr:IsLoveDungeon() then
  3630. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["DungeonLoveScene"]
  3631. elseif self.scene_mgr:IsOvnFightingScene() then
  3632. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["CSOnevNScene"]
  3633. elseif self.scene_mgr:IsCSPvP() then
  3634. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["Cross3v3"]
  3635. --- 明日项目新增的写在这下面
  3636. elseif self.scene_mgr:IsMaterialDungeon() then
  3637. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["IsMaterialDungeon"]
  3638. elseif self.scene_mgr:IsExpDun() then
  3639. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["IsExpDungeon"]
  3640. else
  3641. self.target_auto_fight_cfg = Config.ConfigTargetAutoFight.Flag["Default"]
  3642. end
  3643. if self.scene_mgr:IsMainCityAndFieldScene() then
  3644. self.pick_drop_distance = 1000
  3645. else
  3646. self.pick_drop_distance = 3000
  3647. end
  3648. if self.scene_mgr:IsGuildBossDungeon() or self.scene_mgr:IsSingleDungeon() or self.scene_mgr:IsBossEvilScene() or
  3649. self.scene_mgr:IsBossHomeScene() or self.scene_mgr:IsBossForbiddenScene() then
  3650. self.only_main_role_pick = true
  3651. else
  3652. self.only_main_role_pick = false
  3653. end
  3654. if self.scene_mgr:IsBossEvilScene() or self.scene_mgr:IsBossHomeScene() or self.scene_mgr:IsBossForbiddenScene() then
  3655. self.need_change_move_speed = true
  3656. else
  3657. self.need_change_move_speed = false
  3658. end
  3659. ]]
  3660. self.target_auto_fight_cfg = {}
  3661. self.target_auto_fight_cfg.distance = 100000
  3662. if self.scene_mgr:IsMainCityAndFieldScene() then
  3663. self.target_auto_fight_cfg.distance = 1000
  3664. end
  3665. self.find_monster_distance = self.target_auto_fight_cfg.distance or 1000
  3666. end
  3667. function Scene:CanOptJoyStick()
  3668. return self.can_opt_joy_stick
  3669. end
  3670. function Scene:UpdateAutoFindTarget(manual_distance)
  3671. if self.main_role and self.main_role:GetIsCollecting() then--已经在采集中就不要去找怪打了
  3672. return
  3673. end
  3674. local distance = manual_distance or self.target_auto_fight_cfg.distance
  3675. local attack_mon, attack_role
  3676. local first_attack = Scene.FIND_TARGET_TYPE.monster --self.auto_fight_mgr:GetTargetFirstAttack() --获取优先攻击类型
  3677. if self.scene_mgr:IsCSPvP() or self.scene_mgr:IsDiamondFightScene()
  3678. or self.scene_mgr:IsEndlessLastScene() or self.scene_mgr:IsWastelandScene()
  3679. then
  3680. first_attack = Scene.FIND_TARGET_TYPE.role
  3681. end
  3682. local attack_list = {}
  3683. if self.scene_mgr:IsFixedPointFightScene() then
  3684. local center_pos = self.auto_fight_mgr:GetFixedPointPos() or co_TableXY(self.main_role:GetRealPos())
  3685. local area = 600
  3686. ------------------------------------------------特殊处理START
  3687. if self.scene_mgr:IsPetDungeon() then--宠物副本改成获取场景出生点,以及扩大索敌范围
  3688. center_pos = co_TableXY(self.scene_mgr:GetSceneBirthPos())
  3689. area = 1000
  3690. end
  3691. ------------------------------------------------特殊处理END
  3692. attack_list = self:FindTargets(Scene.FIND_TARGET_TYPE.monster, 1, nil, area, nil, nil, center_pos)
  3693. if #attack_list == 0 and self.auto_fight_mgr:GetAutoFightState() then
  3694. local rx, ry = self.main_role:GetRealPos()
  3695. ------------------------------------------------特殊处理START
  3696. if self.scene_mgr:IsPetDungeon() then--宠物副本
  3697. --宠物副本挂机逻辑:先杀怪,没怪先捡buff,没buff回原点
  3698. local dun_pet_buff_list = BaseDungeonModel:getInstance():GetBuffPosList()
  3699. if #dun_pet_buff_list ~= 0 then
  3700. self:ClearDunPetTimer()
  3701. local buff_distance = 999999999
  3702. local need_to_buff_pos = nil
  3703. for i,v in ipairs(dun_pet_buff_list) do
  3704. local pos = co_TableXY(v.x,v.y)
  3705. local dis = GameMath_GetDistance(pos.x, pos.y, rx, ry, false)
  3706. if dis<buff_distance then
  3707. buff_distance = dis
  3708. need_to_buff_pos = pos
  3709. end
  3710. end
  3711. if need_to_buff_pos then
  3712. self.main_role:DoMove(need_to_buff_pos)
  3713. end
  3714. else
  3715. local function delay_method( )
  3716. self:ClearDunPetTimer()
  3717. if GameMath_GetDistance(center_pos.x, center_pos.y, rx, ry, false) > area*300 then
  3718. self.main_role:DoMove(center_pos)
  3719. end
  3720. end
  3721. if not self.dun_pet_stand_delay_timer_id then
  3722. self.dun_pet_stand_delay_timer_id = setTimeout(delay_method, 1)
  3723. end
  3724. end
  3725. return
  3726. end
  3727. ------------------------------------------------特殊处理END
  3728. if GameMath_GetDistance(center_pos.x, center_pos.y, rx, ry, false) > area*area then
  3729. self.main_role:DoMove(center_pos)
  3730. end
  3731. return
  3732. end
  3733. else
  3734. ------------------------------------------------特殊处理START
  3735. self:ClearDunPetTimer()--清除宠物副本的定时回家计时器
  3736. ------------------------------------------------特殊处理END
  3737. --除非指明需要优先找人,其他情况都优先找怪
  3738. if first_attack == Scene.FIND_TARGET_TYPE.role then
  3739. attack_role = self:FindNearestRole(nil, distance)
  3740. if not attack_role then
  3741. local need_find_collection = false
  3742. --先杀人 然后去抢箱子
  3743. if self.scene_mgr:IsEndlessLastScene() or self.scene_mgr:IsWastelandScene() then
  3744. need_find_collection = true
  3745. end
  3746. attack_mon = self:FindNearestMonster(nil, distance, need_find_collection)
  3747. end
  3748. else
  3749. attack_mon = self:FindNearestMonster(nil, distance, false)
  3750. if not attack_mon then
  3751. attack_role = self:FindNearestRole(nil, distance)
  3752. end
  3753. end
  3754. end
  3755. local attack_target = nil
  3756. if attack_list and attack_list[1] then
  3757. attack_target = attack_mon or attack_role or attack_list[1]
  3758. else
  3759. attack_target = attack_mon or attack_role
  3760. end
  3761. if attack_target then
  3762. -------------------------
  3763. --自动战斗的选中,也要显示一下头像
  3764. if attack_target:GetType() == SceneBaseType.Role then
  3765. GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, true, attack_target.vo, 1)
  3766. end
  3767. -------------------------
  3768. self:SetClickTarget(attack_target)
  3769. end
  3770. end
  3771. --清除宠物副本的定时回家计时器
  3772. function Scene:ClearDunPetTimer( )
  3773. if self.dun_pet_stand_delay_timer_id then
  3774. GlobalTimerQuest:CancelQuest(self.dun_pet_stand_delay_timer_id)
  3775. self.dun_pet_stand_delay_timer_id = nil
  3776. end
  3777. end
  3778. --是否有掉落可等待拾取
  3779. function Scene:HasDropPick( )
  3780. --背包格子是否满了
  3781. if GoodsModel:getInstance():GetEmptyGrid() <= 0 then
  3782. return false
  3783. end
  3784. local vo = self:FindDropItem(1000)
  3785. if vo and vo[1] and vo[2] then
  3786. local drop = vo[1]
  3787. local dis = vo[2]
  3788. -- if drop and drop:IsCanPickUp() and not drop:IsPicking() and OffLineModel:getInstance():IsDropCanAutoPick(drop.color) then
  3789. if drop and drop:IsCanPickUp() and not drop:IsPicking() then
  3790. return true
  3791. end
  3792. end
  3793. end
  3794. function Scene:OnPick()
  3795. --走过去一个个捡
  3796. local vo = self:FindDropItem(self.pick_drop_distance)
  3797. if vo and vo[1] and vo[2] then
  3798. local drop = vo[1]
  3799. local dis = vo[2]
  3800. if drop and drop:IsCanPickUp() and not drop:IsPicking() then
  3801. if self.need_change_move_speed then
  3802. self.main_role.move_flag = MOVE_TYPE.PICK_DROP
  3803. end
  3804. local x, y = drop:GetRealPos()
  3805. self:MainRoleMove(co.TableXY(x / SceneObj_LogicRealRatio_x, y / SceneObj_LogicRealRatio_y), 0)
  3806. return true
  3807. end
  3808. end
  3809. end
  3810. --守护拾取
  3811. function Scene:OnEvilPick()
  3812. --在一键拾取过程中,不要再去捡东西 is_in_pick_all_state
  3813. --走过去一个个捡
  3814. local vo = self:FindDropItem(self.pick_drop_distance, true)
  3815. if not self.is_in_pick_all_state and vo and vo[1] and vo[2] then
  3816. local drop = vo[1]
  3817. local dis = vo[2]
  3818. if drop and drop:IsCanPickUp() and not drop:IsPicking() and self.main_role and self.main_role.evil then
  3819. local x, y = drop:GetRealPos()
  3820. self.main_role.evil:OnPick(co.TableXY(x, y), drop)
  3821. return false
  3822. end
  3823. end
  3824. if self.main_role and self.main_role.evil then
  3825. self.main_role.evil:CancelPick()
  3826. end
  3827. return false
  3828. end
  3829. function Scene:AutoPick()
  3830. local is_dialogue_is_open = DialogueModel:getInstance().dialogue_is_open
  3831. local is_empty_bag = GoodsModel:getInstance():GetEmptyGrid()==0
  3832. local is_guild_scene = self.scene_mgr:IsGuildScene()
  3833. local is_collecting = self.scene_mgr:GetCollectFlag()
  3834. if is_dialogue_is_open or (is_collecting and not is_guild_scene) or is_empty_bag or self.is_in_pick_all_state then
  3835. return
  3836. end
  3837. --是否穿戴了守护(并且守护已经创建出来了)
  3838. if not self.only_main_role_pick and not SceneManager:getInstance():IsGuildScene() and ItemUseModel:getInstance():HasWearEvil() and self.main_role and self.main_role.evil then
  3839. return self:OnEvilPick()
  3840. else
  3841. return self:OnPick()
  3842. end
  3843. end
  3844. function Scene:UpdateAutoFight()
  3845. if not self.auto_fight_mgr:GetAutoFightState() then
  3846. return
  3847. end
  3848. if not self.auto_fight_mgr.game_running then
  3849. return
  3850. end
  3851. if self.scene_mgr:IsPreChangeSceneState() then
  3852. return
  3853. end
  3854. if not self.load_progress_finished then
  3855. return
  3856. end
  3857. if not UserMsgAdapter:getInstance():IsGameConnected() then
  3858. return
  3859. end
  3860. --过来最小攻击间隔和寻怪间隔
  3861. if (Status.NowTime - self.last_attack_time < self.auto_find_and_attack_interval or Status.NowTime - self.last_find_target_time < self.auto_find_and_attack_interval) then
  3862. return
  3863. end
  3864. if not self.main_role or self.main_role:IsDead() or self.main_role:IsInState(PoseState.TASK_JUMP) or self.mainrole_vo.hp <= 0 or self.mainrole_vo.ghost_mode == 1 or self.main_role:IsInState(PoseState.STORY) then
  3865. return
  3866. end
  3867. -- if self.auto_fight_mgr.go_to_pos and self.auto_fight_mgr.go_to_pos.scene_id == self.scene_mgr:GetSceneId() and self.main_role:CanMove() then
  3868. -- local pos = self.auto_fight_mgr.go_to_pos
  3869. -- if self.scene_mgr:IsBlockXY(pos.x, pos.y) then
  3870. -- pos = co.Vector2(SourceOperateMove.FindNearestPos(co.TableXY(self.main_role.real_pos.x,self.main_role.real_pos.y),pos))
  3871. -- end
  3872. -- local end_function = function ()
  3873. -- self.user_manul_time = Status.NowTime
  3874. -- end
  3875. -- self:ClearLastAttack()
  3876. -- self.auto_fight_mgr:CacheGoToPos()
  3877. -- self.user_manul_time = Status.NowTime + 0.5
  3878. -- self:MainRoleMove(co.TableXY(pos.x / SceneObj_LogicRealRatio_x, pos.y / SceneObj_LogicRealRatio_y), 1, end_function)
  3879. -- return
  3880. -- end
  3881. if Status.NowTime - self.user_manul_time < 0.5 then
  3882. return
  3883. end
  3884. if self.auto_fight_mgr.auto_find_way then
  3885. return
  3886. end
  3887. --是否在施法僵直的过程中
  3888. if self.SkillMgr:GetRigidityLeftTime() > 0.5 then
  3889. return
  3890. end
  3891. --优先自动拾取
  3892. if self:AutoPick() then
  3893. return
  3894. else
  3895. --判断拾取完是否需要触发自动任务, 现在的逻辑就是做任务过程优先拾取掉落
  3896. if self.need_task_after_pick then
  3897. self.need_task_after_pick = false
  3898. GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
  3899. end
  3900. end
  3901. local is_mainrole_in_babydun = self.main_role:GetMainRoleInBabyDunFlag()
  3902. if is_mainrole_in_babydun then -- 宝宝副本需要走另一套自动挂机逻辑
  3903. if not self.SkillMgr:PrepareAutoFightSkillInBabyDun(true) then
  3904. return
  3905. end
  3906. else
  3907. -- print("Saber:Scene [4396] is_mainrole_in_babydun: ",is_mainrole_in_babydun)
  3908. if not self.SkillMgr:PrepareAutoFightSkill(true) then
  3909. return
  3910. end
  3911. end
  3912. if self.curr_click_target and self.curr_click_target:IsDead() == false then
  3913. if self.curr_click_target.obj_type == SceneBaseType.Role then
  3914. self:MainRoleAttackRole(self.curr_click_target)
  3915. elseif self.curr_click_target.obj_type == SceneBaseType.Monster then
  3916. --封印裂隙在次数满了之后禁止自动前往采集选中的采集怪
  3917. if self.curr_click_target:GetVo().type == MonsterType.COLLECT and SceneManager:getInstance():IsGuildScene() then
  3918. if not GuildModel.Instance:CanCollect() and GuildModel.Instance:IsGuildCollectActive() then
  3919. return
  3920. end
  3921. end
  3922. self:MainRoleAttackMonster(self.curr_click_target,nil,true)
  3923. -- local next_skill = self.SkillMgr:GetNextSkill()
  3924. -- self.SkillMgr:AddCacheSkill(next_skill, 2)
  3925. else
  3926. self:UpdateAutoFindTarget()
  3927. end
  3928. else
  3929. self:UpdateAutoFindTarget()
  3930. end
  3931. end
  3932. --获取上次攻击的对象
  3933. function Scene:GetAutoFightLastAttack(obj)
  3934. local target = nil
  3935. if obj == nil then return target end
  3936. if obj:GetType() == SceneBaseType.Monster then
  3937. target = self:GetMonster(obj.id)
  3938. elseif obj:GetType() == SceneBaseType.Role then
  3939. target = self:GetRole(obj.id)
  3940. end
  3941. return target
  3942. end
  3943. function Scene:ClearLastAttack()
  3944. if self.last_ranAttackObj then
  3945. self.last_ranAttackObj = nil
  3946. end
  3947. end
  3948. --手动放技能攻击目标
  3949. function Scene:MainRoleAttackTarget()
  3950. local function on_find_target_to_attack( )
  3951. self:UpdateAutoFindTarget(self.pre_check_distance)
  3952. if self.curr_click_target then
  3953. if self.curr_click_target:GetType() == SceneBaseType.Monster then
  3954. self:MainRoleAttackMonster(self.curr_click_target)
  3955. elseif self.curr_click_target:GetType() == SceneBaseType.Role then
  3956. self:MainRoleAttackRole(self.curr_click_target, nil, true)
  3957. else
  3958. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL)
  3959. end
  3960. else
  3961. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL)
  3962. end
  3963. end
  3964. if self.curr_click_target then
  3965. if self.curr_click_target:GetType() == SceneBaseType.Monster then
  3966. --当前目标为怪物
  3967. self:MainRoleAttackMonster(self.curr_click_target)
  3968. elseif self.curr_click_target:GetType() == SceneBaseType.Role then
  3969. --当前目标为角色
  3970. self:MainRoleAttackRole(self.curr_click_target, nil, true)
  3971. else
  3972. --当前目标为不可攻击对象,要重新预选
  3973. self:CancelClickTarget()
  3974. self.manual_target = false
  3975. on_find_target_to_attack()
  3976. end
  3977. else
  3978. --当前无目标,尝试找个攻击对象
  3979. on_find_target_to_attack()
  3980. end
  3981. end
  3982. --采集怪物
  3983. function Scene:MainRoleCollectMonster(monster,is_auto_fight)
  3984. if monster == nil or monster:IsDead() then
  3985. return
  3986. end
  3987. if self.main_role and self.main_role:IsInState(PoseState.COLLECT) then return end
  3988. local action_func = function()
  3989. if self.mainrole_vo.ghost_mode == 1 and monster:GetVo()
  3990. and(monster:GetVo().type == MonsterType.COLLECT or monster:GetVo().type == MonsterType.TASK_COLLECT or monster:GetVo().type == MonsterType.UD_COLLECT) then
  3991. Message.show("您处于幽灵模式,不能进行采集!")
  3992. return
  3993. end
  3994. if monster:IsDead() then--or (monster.cfg_data and monster.cfg_data.kind == 7) then --塔类怪物不攻击
  3995. return
  3996. end
  3997. --社团采集活动,采集次数满了之后不允许再采集
  3998. if SceneManager:getInstance():IsGuildScene() then
  3999. if not GuildModel.Instance:CanCollect() and GuildModel.Instance:IsGuildCollectActive() then
  4000. local reason = GuildModel.Instance:GetCanNotCollectReason()
  4001. if reason == 1 then
  4002. Message.show("本场封印次数已满!请下场再来")
  4003. elseif reason == 2 then
  4004. Message.show("本日封印次数已满,请明日再来")
  4005. end
  4006. self:CancelClickTarget(nil,true) --把目标清掉
  4007. self.main_role:DoStand(true)
  4008. return
  4009. end
  4010. end
  4011. if monster:GetVo().type == MonsterType.COLLECT or monster:GetVo().type == MonsterType.UD_COLLECT or monster:GetVo().type == MonsterType.MISSION_COLLECT then --普通采集|不死采集|副本采集
  4012. --如果是自动采集,采集同一个采集物,采集成功后,要有300ms 冷却时间,防止跨域中怪物没被删除
  4013. if is_auto_fight then
  4014. local time = TimeUtil:getServerTimeMs()
  4015. if self.last_auto_pick_id and monster.id == self.last_auto_pick_id and time - self.last_auto_pick_time < 300 then
  4016. return
  4017. end
  4018. self.last_auto_pick_id = false
  4019. self.last_auto_pick_time = false
  4020. end
  4021. GlobalEventSystem:Fire(EventName.OPEN_COLLECT_VIEW, monster.id, monster:GetVo().type_id, monster:GetVo().pick_time)
  4022. return
  4023. end
  4024. if monster:GetVo().type == MonsterType.TASK_COLLECT then --任务采集
  4025. local have_task, monster_id = TaskModel:getInstance():HaveCaiJiTask(monster:GetVo().type_id)
  4026. if have_task and monster_id and monster:GetVo().type_id == monster_id then
  4027. local is_fake = false
  4028. if GuideModel.MONSTER_COLLECT[monster_id] then
  4029. is_fake = true
  4030. end
  4031. local call_back = function ( )
  4032. DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30015, TaskTipType.TYPE18, monster_id)
  4033. end
  4034. GlobalEventSystem:Fire(EventName.OPEN_COLLECT_VIEW, monster.id, monster:GetVo().type_id,
  4035. monster:GetVo().pick_time, is_fake, call_back)
  4036. end
  4037. end
  4038. end
  4039. --增加跨服boss增加采集物拾取范围判断
  4040. local attack_range = 150
  4041. if monster:GetVo() and monster:GetVo().type_id then
  4042. if (monster:GetVo().type_id == Config.ConfigTaskEffect.MonsterSakuraTypeID
  4043. or monster:GetVo().type_id == Config.ConfigTaskEffect.MonsterCarouselTypeID) then
  4044. attack_range = 400
  4045. elseif monster:GetVo().type_id == Config.ConfigTaskEffect.MonsterLightTypeID then
  4046. attack_range = 300
  4047. end
  4048. end
  4049. if self.main_role == nil then return end
  4050. local target_obj = monster
  4051. if self.collect_target_start_real_pos == nil then
  4052. self.collect_target_start_real_pos = co_TableXY(self.main_role:GetRealPos())
  4053. else
  4054. self.collect_target_start_real_pos.x = self.main_role.real_pos.x
  4055. self.collect_target_start_real_pos.y = self.main_role.real_pos.y
  4056. end
  4057. if self.collect_target_end_real_pos == nil then
  4058. self.collect_target_end_real_pos = co_TableXY(target_obj:GetRealPos())
  4059. else
  4060. self.collect_target_end_real_pos.x = target_obj.real_pos.x
  4061. self.collect_target_end_real_pos.y = target_obj.real_pos.y
  4062. end
  4063. local distance = GameMath_GetDistance(self.collect_target_start_real_pos.x, self.collect_target_start_real_pos.y, self.collect_target_end_real_pos.x, self.collect_target_end_real_pos.y, false)
  4064. if distance <= attack_range * attack_range then
  4065. if self.main_role:IsInState(PoseState.MOVE) then
  4066. --转向目标,然后站立
  4067. self.main_role:SetDirection(self.collect_target_start_real_pos, self.collect_target_end_real_pos, true, true)
  4068. self.main_role:DoStand()
  4069. end
  4070. action_func()
  4071. elseif self.main_role:CanMove() then
  4072. self.last_find_target_time = Time.time
  4073. OperateManager.Instance:StartTargetAction(monster.compress_id, attack_range, action_func)
  4074. end
  4075. end
  4076. function Scene:MainRoleAttackMonster(monster,not_rush,is_auto_fight)
  4077. if monster == nil or monster:IsDead() then
  4078. return
  4079. end
  4080. if not self.main_role or self.main_role:IsInState(PoseState.RUSH) then
  4081. return
  4082. end
  4083. --采集怪物不走冲刺逻辑
  4084. if monster:GetVo().type == MonsterType.COLLECT or monster:GetVo().type == MonsterType.TASK_COLLECT or monster:GetVo().type == MonsterType.UD_COLLECT then
  4085. self:SetClickTarget(monster)
  4086. self:MainRoleCollectMonster(monster,is_auto_fight)
  4087. return
  4088. end
  4089. local skill_id = self.SkillMgr:getCurrentSkillId()
  4090. local cfg = self.SkillMgr:GetFightSkillMovie(skill_id)
  4091. if not self.SkillMgr:CanAttack(skill_id) then
  4092. return
  4093. end
  4094. --到目标点后放技能
  4095. local function use_skill_func()
  4096. if not self.SkillMgr:isInRigidity() then
  4097. self.last_attack_time = Time.time
  4098. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL, nil, nil, monster.compress_id)
  4099. else
  4100. print("tanar: Scene [4970] =========== isInRigidity")
  4101. end
  4102. end
  4103. local function rush_action_func( )
  4104. if monster:IsDead() then
  4105. return
  4106. end
  4107. if self.need_rush_to_monster then
  4108. local offset = Config.otherFightInfo.rush_to_monster_offset_dis
  4109. if monster.vo and monster.vo.boss_type > 2 then
  4110. offset = 300
  4111. end
  4112. if self.rush_mon_end_pos == nil then
  4113. self.rush_mon_end_pos = co_TableXY(self.attack_mon_end_real_pos.x - self.rush_mon_end_dir.x * offset, self.attack_mon_end_real_pos.y - self.rush_mon_end_dir.y * offset)
  4114. else
  4115. self.rush_mon_end_pos.x = self.attack_mon_end_real_pos.x - self.rush_mon_end_dir.x * offset
  4116. self.rush_mon_end_pos.y = self.attack_mon_end_real_pos.y - self.rush_mon_end_dir.y * offset
  4117. end
  4118. if self.scene_mgr:IsBlockXY(self.rush_mon_end_pos.x / SceneObj_LogicRealRatio_x, self.rush_mon_end_pos.y / SceneObj_LogicRealRatio_y) then
  4119. self.rush_mon_end_pos.x = monster.real_pos.x
  4120. self.rush_mon_end_pos.y = monster.real_pos.y
  4121. end
  4122. local rush_speed = Config.otherFightInfo.rush_to_monster_speed
  4123. self.main_role:DoRush(self.rush_mon_end_pos, rush_speed, use_skill_func)
  4124. else
  4125. use_skill_func()
  4126. end
  4127. end
  4128. --是否需要冲刺
  4129. self.need_rush_to_monster = false
  4130. --设置当前选中目标,避免重复筛选
  4131. self:SetClickTarget(monster)
  4132. --在攻击前如果还没设置技能,就要先设置一个技能,以便进行攻击距离判断
  4133. if self.is_in_babydun then
  4134. if self.SkillMgr:getCurrentSkill() == nil then
  4135. self.SkillMgr:setCurrentSkillId(SkillManager.BabyDunMainRoleBaseSkill)
  4136. end
  4137. else
  4138. if self.SkillMgr:getCurrentSkill() == nil or self.SkillMgr:IsThreeAttackSkill(skill_id) then
  4139. self.SkillMgr:setCurrentSkillId(self.SkillMgr:getBaseSkill())
  4140. end
  4141. end
  4142. local target_obj = monster
  4143. -- local attack_range = self.SkillMgr:GetCurrentAttackRange()
  4144. local attack_range = 350
  4145. if target_obj and self.scene_mgr:IsEscortScene() and target_obj:GetVo().type == MonsterType.ESCORT and target_obj:GetVo().can_attack ~= 1 then
  4146. --如果打的是护送怪,并且不可以被攻击,就提示玩家对应的东西
  4147. --进行严格判断,只会满足上面的判断才会进来,并且两秒才提示一次
  4148. local function callback( )
  4149. local str = "车辆不可伤害,请先击败护送者"
  4150. if target_obj and target_obj:GetVo() and target_obj:GetVo().hp == 1 then
  4151. str = "车辆受损,物资已被夺取"
  4152. end
  4153. Message.show(str)
  4154. end
  4155. TimeManager.GetInstance():StartDalayTime("ShowEscortMessage",2,callback)
  4156. -- elseif target_obj and self.scene_mgr:IsRageWarScene() and target_obj:GetVo().boss_type == BossType.UnDead -- 狂战领域追加了横幅,这个暂时屏蔽
  4157. -- and target_obj:GetBuffVoByBuffTypeAndBuffId(SkillBuffType.UNBEATABLE, 1110000015) then -- 获取无敌buff
  4158. -- -- 狂战领域boss无敌时,主动攻击要弹出飘字,内容由阶段数决定
  4159. -- local event_data = RageWarModel:getInstance():GetRageWarEventData()
  4160. -- if event_data then
  4161. -- local function callback( )
  4162. -- local str = event_data.round >= RageWarModel.EventStatus.Round2 and "吸取分身能量中" or "吸取同伴能量中"
  4163. -- Message.show(str)
  4164. -- end
  4165. -- TimeManager.GetInstance():StartDalayTime("ShowRageWarMessage", 2, callback)
  4166. -- end
  4167. end
  4168. if self.attack_mon_start_real_pos == nil then
  4169. self.attack_mon_start_real_pos = co_TableXY(self.main_role:GetRealPos())
  4170. else
  4171. self.attack_mon_start_real_pos.x = self.main_role.real_pos.x
  4172. self.attack_mon_start_real_pos.y = self.main_role.real_pos.y
  4173. end
  4174. if self.attack_mon_end_real_pos == nil then
  4175. self.attack_mon_end_real_pos = co_TableXY(target_obj:GetRealPos())
  4176. else
  4177. self.attack_mon_end_real_pos.x = target_obj.real_pos.x
  4178. self.attack_mon_end_real_pos.y = target_obj.real_pos.y
  4179. end
  4180. if self.rush_mon_end_dir == nil then
  4181. self.rush_mon_end_dir = co_TableXY(self.attack_mon_end_real_pos.x-self.attack_mon_start_real_pos.x, self.attack_mon_end_real_pos.y-self.attack_mon_start_real_pos.y)
  4182. else
  4183. self.rush_mon_end_dir.x = self.attack_mon_end_real_pos.x - self.attack_mon_start_real_pos.x
  4184. self.rush_mon_end_dir.y = self.attack_mon_end_real_pos.y - self.attack_mon_start_real_pos.y
  4185. end
  4186. self.rush_mon_distance = co_NormaliseXYTable(self.rush_mon_end_dir)
  4187. local max_rush_dis = Config.otherFightInfo.rush_to_monster_max_dis
  4188. if self.rush_mon_distance <= attack_range then
  4189. --在最小范围内,直接放技能
  4190. self.need_rush_to_monster = false
  4191. if self.main_role:IsInState(PoseState.MOVE) then
  4192. --转向目标,然后站立
  4193. self.main_role:SetDirection(self.attack_mon_start_real_pos, self.attack_mon_end_real_pos, true, true)
  4194. self.main_role:DoStand()
  4195. end
  4196. use_skill_func()
  4197. elseif self.rush_mon_distance <= max_rush_dis then
  4198. if target_obj and self.is_in_babydun then -- 宝宝副本内,走过去打
  4199. self.last_find_target_time = Time.time
  4200. OperateManager.Instance:StartTargetAction(monster.compress_id, attack_range, use_skill_func)
  4201. else
  4202. --在冲刺范围内,直接冲刺
  4203. self.need_rush_to_monster = true
  4204. self.last_find_target_time = Time.time
  4205. rush_action_func()
  4206. end
  4207. else
  4208. if target_obj and self.is_in_babydun then -- 宝宝副本内,走过去打
  4209. self.last_find_target_time = Time.time
  4210. OperateManager.Instance:StartTargetAction(monster.compress_id, attack_range, use_skill_func)
  4211. else
  4212. --超过冲刺范围,先移动,再冲刺
  4213. self.need_rush_to_monster = true
  4214. self.last_find_target_time = Time.time
  4215. OperateManager.Instance:StartTargetAction(monster.compress_id, max_rush_dis, rush_action_func)
  4216. end
  4217. end
  4218. end
  4219. function Scene:MainRoleAttackRole(role, not_rush, ignore_check_pk_state)
  4220. if role == nil or role:IsDead() or role == self.main_role then
  4221. return
  4222. end
  4223. --是否需要检查PK状态(手动释放技能不需要检查,就算打不了也要给他放技能)
  4224. if not ignore_check_pk_state and not self.scene_mgr:IsCanAttackByMainRole(role:GetVo()) then
  4225. return
  4226. end
  4227. if self.mainrole_vo.ghost_mode == 1 then
  4228. Message.show("您处于幽灵模式,不能进行攻击")
  4229. return
  4230. end
  4231. if self.main_role and self.main_role:IsInState(PoseState.RUSH) then
  4232. return
  4233. end
  4234. local skill_id = self.SkillMgr:getCurrentSkillId()
  4235. local cfg = self.SkillMgr:GetFightSkillMovie(skill_id)
  4236. if not self.SkillMgr:CanAttack(skill_id) then
  4237. return
  4238. end
  4239. if cfg and cfg.rush_dist and cfg.rush_dist < 0 then--如果是往后跳的技能,就直接放掉而不追踪
  4240. action_func()
  4241. return
  4242. end
  4243. --到目标点发技能
  4244. local use_skill_func = function()
  4245. if not self.SkillMgr:isInRigidity() then
  4246. self.last_attack_time = Time.time
  4247. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL, nil, nil, role.compress_id)
  4248. else
  4249. print("tanar: Scene [5091] =========== isInRigidity")
  4250. end
  4251. end
  4252. --移动完成回调
  4253. local rush_action_func = function()
  4254. if role == nil or role:IsDead() or not role:IsVoValid() then
  4255. return
  4256. end
  4257. if role:IsInProtectTime() then
  4258. Message.show("目标处于无敌状态")
  4259. return
  4260. end
  4261. if self.scene_mgr:IsSafePos(role.real_pos.x, role.real_pos.y) then --如果被攻击的角色在安全区里,提示
  4262. self:CancelClickTarget(nil, true)
  4263. Message.show("对方在安全区中,无法攻击")
  4264. return
  4265. end
  4266. -- if (not self.scene_mgr:IsEscortScene()) and role.vo and role.vo.escort_state>0 then
  4267. -- Message.show("该玩家为护送第一阶段,无法攻击")
  4268. -- return
  4269. -- end
  4270. if self.need_rush_to_role then
  4271. -- local end_pos = co_TableXY(self.attack_role_end_real_pos.x - self.rush_role_end_dir.x * Config.otherFightInfo.rush_to_monster_offset_dis, self.attack_role_end_real_pos.y - self.rush_role_end_dir.y * Config.otherFightInfo.rush_to_monster_offset_dis)
  4272. -- if self.scene_mgr:IsBlockXY(end_pos.x / SceneObj_LogicRealRatio_x, end_pos.y / SceneObj_LogicRealRatio_y) then
  4273. -- end_pos.x = role.real_pos.x
  4274. -- end_pos.y = role.real_pos.y
  4275. -- end
  4276. -- self.main_role:DoRush(end_pos, Config.otherFightInfo.rush_to_monster_speed, use_skill_func)
  4277. local offset = Config.otherFightInfo.rush_to_monster_offset_dis
  4278. if self.rush_role_end_pos == nil then
  4279. self.rush_role_end_pos = co_TableXY(self.attack_role_end_real_pos.x - self.rush_role_end_dir.x * offset, self.attack_role_end_real_pos.y - self.rush_role_end_dir.y * offset)
  4280. else
  4281. self.rush_role_end_pos.x = self.attack_role_end_real_pos.x - self.rush_role_end_dir.x * offset
  4282. self.rush_role_end_pos.y = self.attack_role_end_real_pos.y - self.rush_role_end_dir.y * offset
  4283. end
  4284. if self.scene_mgr:IsBlockXY(self.rush_role_end_pos.x / SceneObj_LogicRealRatio_x, self.rush_role_end_pos.y / SceneObj_LogicRealRatio_y) then
  4285. self.rush_role_end_pos.x = role.real_pos.x
  4286. self.rush_role_end_pos.y = role.real_pos.y
  4287. end
  4288. -- self.main_role:DoRush(self.rush_role_end_pos, Config.otherFightInfo.rush_to_monster_speed, use_skill_func)
  4289. local rush_speed = Config.otherFightInfo.rush_to_monster_speed
  4290. self.main_role:DoRush(self.rush_role_end_pos, rush_speed, use_skill_func)
  4291. else
  4292. use_skill_func()
  4293. end
  4294. end
  4295. self.need_rush_to_role = false
  4296. --保存选中对象
  4297. self:SetClickTarget(role)
  4298. --在攻击前如果还没设置技能,就要先设置一个技能,以便进行攻击距离判断
  4299. if self.SkillMgr:getCurrentSkill() == nil or self.SkillMgr:IsThreeAttackSkill(skill_id) then
  4300. self.SkillMgr:setCurrentSkillId(self.SkillMgr:getBaseSkill())
  4301. end
  4302. local attack_range = self.SkillMgr:GetCurrentAttackRange()
  4303. if attack_range < 50 then
  4304. attack_range = 50
  4305. end
  4306. local target_obj = role
  4307. if self.attack_role_start_real_pos == nil then
  4308. self.attack_role_start_real_pos = co_TableXY(self.main_role:GetRealPos())
  4309. else
  4310. self.attack_role_start_real_pos.x = self.main_role.real_pos.x
  4311. self.attack_role_start_real_pos.y = self.main_role.real_pos.y
  4312. end
  4313. if self.attack_role_end_real_pos == nil then
  4314. self.attack_role_end_real_pos = co_TableXY(target_obj:GetRealPos())
  4315. else
  4316. self.attack_role_end_real_pos.x = target_obj.real_pos.x
  4317. self.attack_role_end_real_pos.y = target_obj.real_pos.y
  4318. end
  4319. if self.rush_role_end_dir == nil then
  4320. self.rush_role_end_dir = co_TableXY(self.attack_role_end_real_pos.x-self.attack_role_start_real_pos.x, self.attack_role_end_real_pos.y-self.attack_role_start_real_pos.y)
  4321. else
  4322. self.rush_role_end_dir.x = self.attack_role_end_real_pos.x - self.attack_role_start_real_pos.x
  4323. self.rush_role_end_dir.y = self.attack_role_end_real_pos.y - self.attack_role_start_real_pos.y
  4324. end
  4325. self.rush_role_distance = co_NormaliseXYTable(self.rush_role_end_dir)
  4326. local max_rush_dis = Config.otherFightInfo.rush_to_monster_max_dis
  4327. if self.rush_role_distance <= attack_range then
  4328. --在最小范围内,直接放技能
  4329. self.need_rush_to_role = false
  4330. if self.main_role:IsInState(PoseState.MOVE) then
  4331. --转向目标,然后站立
  4332. self.main_role:SetDirection(self.attack_role_start_real_pos, self.attack_role_end_real_pos, true, true)
  4333. self.main_role:DoStand()
  4334. end
  4335. if not self.SkillMgr:isInRigidity() then
  4336. self.last_attack_time = Status.NowTime
  4337. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL, nil, nil, role.compress_id)
  4338. end
  4339. elseif self.rush_role_distance <= max_rush_dis then
  4340. --在冲刺范围内,直接冲刺
  4341. self.need_rush_to_role = true
  4342. self.last_find_target_time = Time.time
  4343. rush_action_func()
  4344. else
  4345. --超过冲刺范围,先移动,再冲刺
  4346. self.need_rush_to_role = true
  4347. self.last_find_target_time = Time.time
  4348. OperateManager.Instance:StartTargetAction(role.compress_id, max_rush_dis, rush_action_func)
  4349. end
  4350. end
  4351. --任务寻路,只有个坐标点,也要冲刺
  4352. function Scene:MainRoleRushToPos(mon_pos)
  4353. if not mon_pos then
  4354. return
  4355. end
  4356. self:CancelWaitQuest()
  4357. if self.main_role and not self.main_role:CanMove() then
  4358. local timer_func = function ()
  4359. if self.main_role and self.main_role:CanMove() then
  4360. self:MainRoleRushToPos(mon_pos)
  4361. return
  4362. end
  4363. end
  4364. self.rush_to_pos_timer = GlobalTimerQuest:AddPeriodQuest(timer_func, 0.1, -1)
  4365. return
  4366. end
  4367. --到目标点后放技能
  4368. local function use_skill_func()
  4369. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL)
  4370. GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
  4371. end
  4372. local function rush_action_func( )
  4373. if self.need_rush_to_pos then
  4374. local offset = 250
  4375. if self.rush_end_real_pos == nil then
  4376. self.rush_end_real_pos = co_TableXY(self.orign_rush_end_pos.x - self.rush_pos_end_dir.x * offset, self.orign_rush_end_pos.y - self.rush_pos_end_dir.y * offset)
  4377. else
  4378. self.rush_end_real_pos.x = self.orign_rush_end_pos.x - self.rush_pos_end_dir.x * offset
  4379. self.rush_end_real_pos.y = self.orign_rush_end_pos.y - self.rush_pos_end_dir.y * offset
  4380. end
  4381. if self.scene_mgr:IsBlockXY(self.rush_end_real_pos.x / SceneObj_LogicRealRatio_x, self.rush_end_real_pos.y / SceneObj_LogicRealRatio_y) then
  4382. self.rush_end_real_pos.x = self.orign_rush_end_pos.x
  4383. self.rush_end_real_pos.y = self.orign_rush_end_pos.y
  4384. end
  4385. local rush_speed = Config.otherFightInfo.rush_to_monster_speed
  4386. self.main_role:DoRush(self.rush_end_real_pos, rush_speed, use_skill_func)
  4387. else
  4388. GlobalEventSystem:Fire(FightEvent.RELEASE_MAIN_SKILL)
  4389. GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
  4390. end
  4391. end
  4392. --是否需要冲刺
  4393. self.need_rush_to_pos = false
  4394. local attack_range = 200
  4395. self.orign_rush_end_pos = mon_pos
  4396. if self.rush_start_real_pos == nil then
  4397. self.rush_start_real_pos = co_TableXY(self.main_role:GetRealPos())
  4398. else
  4399. self.rush_start_real_pos.x = self.main_role.real_pos.x
  4400. self.rush_start_real_pos.y = self.main_role.real_pos.y
  4401. end
  4402. if self.rush_pos_end_dir == nil then
  4403. self.rush_pos_end_dir = co_TableXY(mon_pos.x-self.rush_start_real_pos.x, mon_pos.y-self.rush_start_real_pos.y)
  4404. else
  4405. self.rush_pos_end_dir.x = mon_pos.x - self.rush_start_real_pos.x
  4406. self.rush_pos_end_dir.y = mon_pos.y - self.rush_start_real_pos.y
  4407. end
  4408. self.rush_pos_distance = co_NormaliseXYTable(self.rush_pos_end_dir)
  4409. local max_rush_dis = Config.otherFightInfo.rush_to_monster_max_dis
  4410. if self.rush_pos_distance <= attack_range then
  4411. --在最小范围内,直接放技能
  4412. self.need_rush_to_pos = false
  4413. if self.main_role:IsInState(PoseState.MOVE) then
  4414. --转向目标,然后站立
  4415. self.main_role:SetDirection(self.attack_mon_start_real_pos, self.attack_mon_end_real_pos, true, true)
  4416. self.main_role:DoStand()
  4417. end
  4418. use_skill_func()
  4419. elseif self.rush_pos_distance <= max_rush_dis then
  4420. --在冲刺范围内,直接冲刺
  4421. self.need_rush_to_pos = true
  4422. self.last_find_target_time = Time.time
  4423. rush_action_func()
  4424. else
  4425. --超过冲刺范围,先移动,再冲刺
  4426. self.need_rush_to_pos = true
  4427. self.last_find_target_time = Time.time
  4428. if not self.temp_logic_pos then
  4429. self.temp_logic_pos = co_TableXY(mon_pos.x/SceneObj_LogicRealRatio_x, mon_pos.y/SceneObj_LogicRealRatio_y)
  4430. end
  4431. self.temp_logic_pos.x = mon_pos.x/SceneObj_LogicRealRatio_x
  4432. self.temp_logic_pos.y = mon_pos.y/SceneObj_LogicRealRatio_y
  4433. local range = 5
  4434. self:MainRoleMove(self.temp_logic_pos, range, rush_action_func)
  4435. end
  4436. end
  4437. function Scene:GetSceneCenterPos()
  4438. return self.mapView:GetSceneCenterPos()
  4439. end
  4440. function Scene:GetSceneSize()
  4441. return self.mapView:GetMapSize()
  4442. end
  4443. function Scene:GetZoneHeight(logic_x,logic_y)
  4444. local h = self.mapView:GetZoneHeight(logic_x,logic_y)
  4445. if SceneManager.Instance:IsJumpOneScene() then
  4446. h = h + JumpOneModel.SCENE_HEIGHT
  4447. end
  4448. return h
  4449. end
  4450. function Scene:GetMapResID(is_minimap)
  4451. return self.mapView:GetResID(is_minimap)
  4452. end
  4453. function Scene:GetResIDByScene( scene_id, func )
  4454. self.mapView:GetResIDByScene(scene_id, func)
  4455. end
  4456. function Scene:SetDynamicArea(area_id,area_type)
  4457. self.mapView:SetDynamicArea(area_id,area_type)
  4458. end
  4459. function Scene:SetMainRole(main_role)
  4460. self.main_role = main_role
  4461. end
  4462. function Scene:GetMainRole()
  4463. return self.main_role
  4464. end
  4465. function Scene:GetTileSize()
  4466. return self.mapView:GetTileSize()
  4467. end
  4468. --[[
  4469. ObjType和ObjID压缩成一个64位IDScene.CompressObjId的方式调用
  4470. @obj_type: SceneBaseType中定义的Obj类型
  4471. @obj_id: Obj的idObj可能有相同的id
  4472. @Return: 64ID
  4473. ]]
  4474. function Scene.CompressObjId(obj_type, obj_id)
  4475. --lua 位操作不支持64位 所以改成另外一种方式
  4476. -- local t = bit.lshift(obj_type, 60)
  4477. -- local val = bit.bor(t, obj_id or 0)
  4478. -- return val
  4479. return string.format("%d_%.0f",obj_type, obj_id)
  4480. end
  4481. function Scene.DecompressObjId(val)
  4482. --lua 位操作不支持64位 所以改成另外一种方式
  4483. -- local obj_type = bit.rshift(val, 60)
  4484. -- local obj_id = bit.band(val, 0x0fffffffffffffff)
  4485. -- return obj_type, obj_id
  4486. local list = Split(val,"_")
  4487. return tonumber(list[1]),tonumber(list[2])
  4488. end
  4489. function Scene:GetObjByCompressedId( compressed_id, can_get_dead_monster)
  4490. if compressed_id == nil then
  4491. return nil
  4492. end
  4493. local obj_type, obj_id = Scene.DecompressObjId(compressed_id)
  4494. local obj = nil
  4495. if obj_type == SceneBaseType.Role or obj_type == SceneBaseType.Fake_Role then
  4496. obj = self:GetRole(obj_id)
  4497. --主角
  4498. elseif obj_type == SceneBaseType.MainRole then
  4499. obj = self.main_role
  4500. --NPC
  4501. elseif obj_type == SceneBaseType.Npc then
  4502. obj = self:GetNpc(obj_id)
  4503. -- --怪
  4504. elseif obj_type == SceneBaseType.Monster then
  4505. obj = self:GetMonster(obj_id)
  4506. if obj == nil and can_get_dead_monster then
  4507. obj = self:GetMonsterDeadBody(obj_id)
  4508. end
  4509. elseif obj_type == SceneBaseType.Pokemon then
  4510. obj = self:GetPokemon(obj_id)
  4511. --协战宠物 objid不是角色id,是index
  4512. elseif obj_type == SceneBaseType.AssisitPokemon then
  4513. obj = self:GetAssisitPokemonById(RoleManager.Instance.mainRoleInfo.role_id,obj_id)
  4514. -- --AI娘
  4515. elseif obj_type == SceneBaseType.Pet then
  4516. obj = self:GetPet(obj_id)
  4517. -- --其他
  4518. elseif obj_type == SceneBaseType.Other then
  4519. obj = self:GetOther(obj_id)
  4520. -- --传送门
  4521. elseif obj_type == SceneBaseType.Door then
  4522. obj = self:GetDoor(obj_id)
  4523. --掉落物
  4524. elseif obj_type == SceneBaseType.Drop then
  4525. obj = self:GetDropItem(obj_id)
  4526. --宝宝
  4527. elseif obj_type == SceneBaseType.Baby then
  4528. obj = self:GetBaby(obj_id)
  4529. --墓碑
  4530. elseif obj_type == SceneBaseType.Grave then
  4531. obj = self:GetGraveItem(obj_id)
  4532. elseif obj_type == SceneBaseType.HookRole then
  4533. obj = self:GetHookRoleItem(obj_id)
  4534. end
  4535. return obj
  4536. end
  4537. function Scene:GetDoor(id)
  4538. return self.door_list[cid]
  4539. end
  4540. function Scene:GetDropItem(id)
  4541. return self.drop_list[id]
  4542. end
  4543. function Scene:GetNpcList( )
  4544. return self.npc_list
  4545. end
  4546. function Scene:GetNpc(id)
  4547. local npc_obj = self.npc_list[tonumber(id)]
  4548. if not npc_obj then
  4549. local vo = self.scene_mgr:GetNpcVo(tonumber(id))
  4550. if vo then
  4551. npc_obj = self.npc_pool:GetObjFreeList()
  4552. if not npc_obj then
  4553. npc_obj = Npc.New()
  4554. end
  4555. npc_obj:InitNpc(vo)
  4556. self.npc_list[tonumber(id)] = npc_obj
  4557. end
  4558. end
  4559. return npc_obj
  4560. end
  4561. function Scene:GetPartner( ins_id )
  4562. return self.partner_list[ins_id]
  4563. end
  4564. function Scene:GetSprite( ins_id )
  4565. return self.sprite_list[ins_id]
  4566. end
  4567. function Scene:GetPet( ins_id )
  4568. return self.pet_list[ins_id]
  4569. end
  4570. function Scene:GetPokemon(ins_id)
  4571. return self.pokemon_list[ins_id]
  4572. end
  4573. function Scene:GetAssisitPokemon(ins_id,skill_id)
  4574. local index = 0
  4575. if skill_id == 1210001 then
  4576. index = 1
  4577. elseif skill_id == 1210002 then
  4578. index = 2
  4579. elseif skill_id == 1210003 then
  4580. index = 3
  4581. elseif skill_id == 1210004 then
  4582. index = 4
  4583. elseif skill_id == 1210005 then
  4584. index = 5
  4585. end
  4586. if self.assisit_pokemon_list[ins_id] and self.assisit_pokemon_list[ins_id][index] then
  4587. return self.assisit_pokemon_list[ins_id][index]
  4588. end
  4589. return nil
  4590. end
  4591. function Scene:GetAssisitPokemonById(ins_id,index)
  4592. if self.assisit_pokemon_list[ins_id] and self.assisit_pokemon_list[ins_id][index] then
  4593. return self.assisit_pokemon_list[ins_id][index]
  4594. end
  4595. return nil
  4596. end
  4597. function Scene:GetBaby( ins_id )
  4598. return self.baby_list[ins_id]
  4599. end
  4600. function Scene:GetMonster( ins_id )
  4601. return self.monster_list[ins_id]
  4602. end
  4603. function Scene:GetMonsterByTypeId(type_id)
  4604. local monster_vo = self.scene_mgr:GetMonsterVoByTypeId(type_id)
  4605. if monster_vo then
  4606. return self:GetMonster(monster_vo.instance_id)
  4607. end
  4608. end
  4609. --根据typeid获取到距离最近的monster
  4610. function Scene:GetNearestMonsterByTypeId(type_id)
  4611. local monster_vo_list = self.scene_mgr:GetAllMonsterVo()
  4612. local mon_min_distance = 9999999--最短距离
  4613. local monster = nil
  4614. local rx, ry = self:GetMainRole():GetRealPos()
  4615. for k,v in pairs(monster_vo_list) do
  4616. if v.type_id == type_id then
  4617. local monster_temp = self:GetMonster(v.instance_id)
  4618. if monster_temp then
  4619. local dis = GameMath_GetDistance(monster_temp.vo.pos_x,monster_temp.vo.pos_y, rx, ry, false)
  4620. if dis < mon_min_distance then
  4621. mon_min_distance = dis
  4622. monster = monster_temp
  4623. end
  4624. end
  4625. end
  4626. end
  4627. return monster
  4628. end
  4629. --根据typeid获取到距离最近的monster(封印裂隙,本国团战用,找怪时忽略被被人采集中的怪)
  4630. function Scene:GetNearestGuildCollectMonsterByTypeId(type_id)
  4631. local monster_vo_list = self.scene_mgr:GetAllMonsterVo()
  4632. local mon_min_distance = 9999999--最短距离
  4633. local monster = nil
  4634. local rx, ry = self:GetMainRole():GetRealPos()
  4635. for k,v in pairs(monster_vo_list) do
  4636. if not type_id or v.type_id == type_id then
  4637. local monster_temp = self:GetMonster(v.instance_id)
  4638. if monster_temp and not GuildModel:getInstance():IsGuildIgnoreCollection(v.instance_id)
  4639. and (type_id or not type_id and self:MonsterIsCollect(monster_temp.vo.type)) -- 没有传typeid的时候需要判断是否是采集物
  4640. then
  4641. local pos = co.TableXY(monster_temp.vo.pos_x,monster_temp.vo.pos_y)
  4642. local dis = GameMath_GetDistance(pos.x, pos.y, rx, ry, false)
  4643. if dis < mon_min_distance then
  4644. mon_min_distance = dis
  4645. monster = monster_temp
  4646. end
  4647. end
  4648. end
  4649. end
  4650. return monster
  4651. end
  4652. --获取随机一个不等于not_instance_id的怪物, 用于随机采集
  4653. function Scene:GetRandomMonsterByTypeId(type_id, not_instance_id)
  4654. local monster_vo = self.scene_mgr:GetRandomMonsterVoByTypeId(type_id, not_instance_id)
  4655. if monster_vo then
  4656. return self:GetMonster(monster_vo.instance_id)
  4657. end
  4658. end
  4659. function Scene:GetOther( ins_id )
  4660. return self.other_list[ins_id]
  4661. end
  4662. --获取除了角色以外的场景对象
  4663. function Scene:GetSceneObj(instance_id)
  4664. local obj = self:GetMonster(instance_id)
  4665. or self:GetPartner(instance_id)
  4666. or self:GetOther(instance_id)
  4667. or self:GetRole(instance_id)
  4668. return obj
  4669. end
  4670. function Scene:GetMonsterList()
  4671. return self.monster_list
  4672. end
  4673. function Scene:DetectFirstUnblockPoint(pos,dir,max_dist)
  4674. return self.mapView:DetectFirstUnblockPoint(pos,dir,max_dist)
  4675. end
  4676. function Scene:FindWay(pos1,pos2,range)
  4677. return self.mapView:FindWay(pos1,pos2,range)
  4678. end
  4679. function Scene:IsStraightLine(pos1,pos2)
  4680. return self.mapView:IsStraightLine(pos1,pos2)
  4681. end
  4682. function Scene:DetectLastUnblockPoint(pos,dir,dist,jump_state)
  4683. return self.mapView:DetectLastUnblockPoint(pos,dir,dist,jump_state)
  4684. end
  4685. --关闭场景雾效
  4686. function Scene:ChangeFogEnable(bool)
  4687. local render = UnityEngine.RenderSettings
  4688. if render then
  4689. render.fog = bool
  4690. end
  4691. end
  4692. function Scene:FindTargetDir(range, attacker, select_type, hiter_pos_type)
  4693. attacker = attacker or self.main_role
  4694. local range_pow = range and (range * range) or nil
  4695. local mon_min_dist_tar = nil
  4696. local mon_min_dist_pow = 100000000
  4697. local role_min_dist_tar = nil
  4698. local role_min_dist_pow = 100000000
  4699. local x1, y1 = attacker:GetRealPos()
  4700. local war_group1= attacker:GetVo().warGroup
  4701. local special_mon_list = {}
  4702. local at = attacker:GetType()
  4703. if (at == SceneBaseType.FPearl or at == SceneBaseType.Pokemon or at == SceneBaseType.Baby) and attacker.owner then
  4704. attacker = attacker.owner
  4705. war_group1 = attacker:GetVo().warGroup
  4706. end
  4707. local function checkMonster()
  4708. local mon_vo = nil
  4709. for _, mon in pairs(self.monster_list) do
  4710. --第一遍不包含特殊怪物时,特殊怪物就存到另外的表里
  4711. mon_vo = mon:GetVo()
  4712. if mon_vo then
  4713. local war_group2 = mon_vo.warGroup
  4714. local diff_group = (war_group1 == 0 or war_group2 == 0 or war_group2 ~= war_group1)
  4715. local hp_ok = (mon.vo and mon.vo.hp > 0)
  4716. local x2, y2 = mon:GetRealPos()
  4717. if hiter_pos_type == 1 then -- 腰部
  4718. y2 = y2 + mon:GetBodyHeight() * 0.5
  4719. elseif hiter_pos_type == 2 then
  4720. y2 = y2 + mon:GetBodyHeight()
  4721. end
  4722. if not mon:IsDead() and hp_ok and diff_group and mon_vo.can_attack == 1 and mon_vo.guaji_flag == 0
  4723. and not mon.buff_manager:hasUnbeatableBuff() and mon_vo.type ~= MonsterType.COLLECT and mon_vo.type ~= MonsterType.UD_COLLECT
  4724. and mon_vo.type ~= MonsterType.TASK_COLLECT and mon_vo.type ~= MonsterType.PICK
  4725. and not mon:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide) then
  4726. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  4727. if range_pow == nil or range_pow >= dist_pow then
  4728. if dist_pow < mon_min_dist_pow then
  4729. mon_min_dist_pow = dist_pow
  4730. mon_min_dist_tar = mon
  4731. end
  4732. end
  4733. end
  4734. end
  4735. end
  4736. return mon_min_dist_tar, mon_min_dist_pow
  4737. end
  4738. local function checkRole()
  4739. if self.scene_mgr:IsPKScene() then
  4740. for _, role in pairs(self.role_list) do
  4741. local vo = role:GetVo()
  4742. if vo then
  4743. local war_group2 = vo.warGroup
  4744. local same_group = war_group2 == war_group1 and war_group1 > 0
  4745. local canpkByPkStatus = true
  4746. if select_type == 3 then--最近队友 辅助技能给自己队友加属性
  4747. if attacker_vo.team_id == vo.team_id and attacker_vo.team_id > 0 then
  4748. same_group = false
  4749. else
  4750. same_group = true
  4751. end
  4752. elseif war_group1 == 0 and war_group2 == 0 then
  4753. canpkByPkStatus = self.scene_mgr:CanPKByPKStatus(attacker.vo, vo)
  4754. end
  4755. local x2, y2 = role:GetRealPos()
  4756. if hiter_pos_type == 1 then -- 腰部
  4757. y2 = y2 + role:GetBodyHeight() * 0.5
  4758. elseif hiter_pos_type == 2 then
  4759. y2 = y2 + role:GetBodyHeight()
  4760. end
  4761. if role ~= attacker and canpkByPkStatus and not same_group and not role:IsDead()
  4762. and not role.buff_manager:hasUnbeatableBuff() and role.id ~= attacker.id
  4763. and not self.scene_mgr:IsSafeArea(nil, x2, y2) and not role:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide) then
  4764. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  4765. if range_pow == nil or range_pow >= dist_pow then
  4766. if dist_pow < role_min_dist_pow then
  4767. role_min_dist_pow = dist_pow
  4768. role_min_dist_tar = role
  4769. has_mon = true
  4770. end
  4771. end
  4772. end
  4773. end
  4774. end
  4775. end
  4776. return role_min_dist_tar, role_min_dist_pow
  4777. end
  4778. local target_priority = lua_settingM:GetTargetPriority()
  4779. if target_priority == 2 then
  4780. local mon_tar, mon_dist = checkMonster()
  4781. if mon_tar then
  4782. return mon_tar
  4783. else
  4784. local role_tar, role_dist = checkRole()
  4785. if role_tar then
  4786. return role_tar
  4787. end
  4788. end
  4789. elseif target_priority == 3 then
  4790. local role_tar, role_dist = checkRole()
  4791. if role_tar then
  4792. return role_tar
  4793. else
  4794. local mon_tar, mon_dist = checkMonster()
  4795. if mon_tar then
  4796. return mon_tar
  4797. end
  4798. end
  4799. else
  4800. local mon_tar, mon_dist = checkMonster()
  4801. local role_tar, role_dist = checkRole()
  4802. local min_tar = nil
  4803. local min_dist = 100000000
  4804. if mon_dist < min_dist then
  4805. min_dist = mon_dist
  4806. min_tar = mon_tar
  4807. end
  4808. if role_dist < min_dist then
  4809. min_dist = role_dist
  4810. min_tar = role_tar
  4811. end
  4812. if min_tar then
  4813. return min_tar
  4814. end
  4815. end
  4816. end
  4817. --[[
  4818. @param
  4819. dis:, dis可为空
  4820. ]]
  4821. function Scene:FindDropItem(dis, is_evil)
  4822. if TableSize(self.drop_list) == 0 then return nil end
  4823. local ret = {}
  4824. local x1, y1
  4825. if is_evil and self.main_role and self.main_role.evil then
  4826. x1, y1 = self.main_role.evil:GetRealPos()
  4827. else
  4828. x1, y1 = self.main_role:GetRealPos()
  4829. end
  4830. for k,drop_obj in pairs(self.drop_list) do
  4831. local x2, y2 = drop_obj:GetRealPos()
  4832. if drop_obj:IsCanPickUp() and not drop_obj:IsPicking() then
  4833. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  4834. if dis then
  4835. if dist_pw < dis*dis then
  4836. table_insert(ret,{drop_obj,dist_pw})
  4837. end
  4838. else
  4839. table_insert(ret,{drop_obj,dist_pw})
  4840. end
  4841. end
  4842. end
  4843. if #ret > 0 then
  4844. local sort_func = function(t1, t2)
  4845. return t1[2] < t2[2]
  4846. end
  4847. table_sort(ret, sort_func)
  4848. end
  4849. return ret[1]
  4850. end
  4851. function Scene:FindEvilNearbyDropItem(dis)
  4852. if TableSize(self.drop_list) == 0 then return nil end
  4853. -- local ret = {}
  4854. local x1, y1 = self.main_role.evil:GetRealPos()
  4855. local min_dist,drop_vo = -1,nil
  4856. for k,drop_obj in pairs(self.drop_list) do
  4857. local x2, y2 = drop_obj:GetRealPos()
  4858. if drop_obj:IsCanPickUp() and not drop_obj:IsPicking() then
  4859. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  4860. if dis then
  4861. if dist_pw < dis*dis then
  4862. if min_dist == -1 or dist_pw < min_dist then
  4863. drop_vo = drop_obj
  4864. end
  4865. -- table_insert(ret,{drop_obj,dist_pw})
  4866. end
  4867. else
  4868. if min_dist == -1 or dist_pw < min_dist then
  4869. drop_vo = drop_obj
  4870. end
  4871. --table_insert(ret,{drop_obj,dist_pw})
  4872. end
  4873. end
  4874. end
  4875. -- if #ret > 0 then
  4876. -- local sort_func = function(t1, t2)
  4877. -- return t1[2] < t2[2]
  4878. -- end
  4879. -- table_sort(ret, sort_func)
  4880. -- end
  4881. return drop_vo
  4882. end
  4883. --[[
  4884. @param
  4885. dis:, dis可为空
  4886. boss_type: boss_type的掉落
  4887. ]]
  4888. function Scene:FindDropList(dis, boss_type)
  4889. if TableSize(self.drop_list) == 0 then
  4890. return nil
  4891. end
  4892. local ret = {}
  4893. local x1, y1 = self.main_role:GetRealPos()
  4894. for k,drop_obj in pairs(self.drop_list) do
  4895. local x2, y2 = drop_obj:GetRealPos()
  4896. if drop_obj:IsCanPickUp() and (not boss_type or drop_obj.vo.boss_type~=boss_type) then
  4897. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  4898. if dis then
  4899. if dist_pw < dis*dis then
  4900. table_insert(ret,{drop_obj,dist_pw})
  4901. end
  4902. else
  4903. table_insert(ret,{drop_obj,dist_pw})
  4904. end
  4905. end
  4906. end
  4907. if #ret > 0 then
  4908. local sort_func = function(t1, t2)
  4909. return t1[2] < t2[2]
  4910. end
  4911. table_sort(ret, sort_func)
  4912. end
  4913. return ret
  4914. end
  4915. --总的选择目标方法
  4916. function Scene:FindTargets(find_type, find_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select, find_way,contain_collect_type)
  4917. if Scene.FIND_TARGET_TYPE.monster == find_type then
  4918. local monster_list,left_num = self:FindMonsters(find_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select, find_way,contain_collect_type)
  4919. return monster_list, {}
  4920. elseif Scene.FIND_TARGET_TYPE.role == find_type then
  4921. local role_list,left_num = self:FindRoles(find_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4922. return role_list, {}
  4923. elseif Scene.FIND_TARGET_TYPE.all == find_type then
  4924. local role_list,monster_list,left_num = nil
  4925. monster_list,left_num = self:FindMonsters(find_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select, find_way,contain_collect_type)
  4926. role_list,left_num = self:FindRoles(left_num, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4927. return monster_list, role_list
  4928. end
  4929. end
  4930. --总的选择目标方法
  4931. function Scene:FindSkillTargets(find_type, find_role_number, find_monster_num, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4932. if Scene.FIND_TARGET_TYPE.monster == find_type then
  4933. local monster_list,left_num = self:FindMonsters(find_monster_num, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4934. return monster_list, left_num
  4935. elseif Scene.FIND_TARGET_TYPE.role == find_type then
  4936. local role_list,left_num = self:FindRoles(find_role_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4937. return role_list, left_num
  4938. elseif Scene.FIND_TARGET_TYPE.all == find_type then
  4939. local role_list,monster_list, left_num = nil
  4940. monster_list,left_num = self:FindMonsters(find_monster_num, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4941. role_list,left_num = self:FindRoles(find_role_number, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  4942. return monster_list, role_list
  4943. end
  4944. end
  4945. --根据条件检索出符合条件的怪物列表
  4946. --@n: 怪物数量,默认为1
  4947. --@distance: 检索距离 用于直线表示直线的长度
  4948. --@area: 检索范围半径,默认为无限,即全图范围
  4949. --@find_dir: 检索方向
  4950. --@find_radian: 检索角度 用于扇形
  4951. --@center_pos: 检索范围的中心坐标点,默认为主角坐标
  4952. --@find_way == : 寻找目标的方式,1:目标的类型(采集>boss>小怪) 2:血量
  4953. --@contain_collect_type == :包含采集类型
  4954. function Scene:FindMonsters(n, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select, find_way,contain_collect_type)
  4955. if n == 0 then
  4956. return {}, 0
  4957. end
  4958. attacker = attacker or self.main_role
  4959. find_way = find_way or 1
  4960. contain_collect_type = contain_collect_type == nil and true or contain_collect_type
  4961. local area_pw = area and (area * area) or nil
  4962. local war_group1= attacker:GetVo().warGroup
  4963. local my_dir = find_dir or attacker:GetDirection()
  4964. if my_dir then
  4965. my_dir:normalise()
  4966. end
  4967. local dot_min = find_radian and math.cos(find_radian / 2) or nil --左右各一半角度的cos值(dot值)
  4968. local x1, y1 = attacker:GetRealPos()
  4969. if center_pos ~= nil then
  4970. x1, y1 = center_pos.x, center_pos.y
  4971. end
  4972. if (attacker:GetType() == SceneBaseType.FPearl or attacker:GetType() == SceneBaseType.Pokemon or attacker:GetType() == SceneBaseType.Baby) and attacker.owner then
  4973. attacker = attacker.owner
  4974. war_group1= attacker:GetVo().warGroup
  4975. end
  4976. local ret = {}
  4977. --把所有在距离内的、角度范围内的怪物找出来
  4978. local vo = nil
  4979. local at = nil
  4980. local war_group2 = nil
  4981. local same_group = nil
  4982. local x2, y2 = nil
  4983. local sort_type = 0
  4984. local canSelected = true
  4985. for _, monster in pairs(self.monster_list) do
  4986. vo = monster:GetVo()
  4987. if vo then
  4988. at = attacker:GetType()
  4989. war_group2 = vo.warGroup
  4990. same_group = (at == SceneBaseType.Monster and war_group2 == war_group1) or ((at == SceneBaseType.Role or at == SceneBaseType.MainRole) and war_group2 == war_group1 and war_group1 > 0)
  4991. x2, y2 = monster:GetRealPos()
  4992. sort_type = 0
  4993. if find_way == 1 then
  4994. if vo.type == MonsterType.TASK_COLLECT or vo.type == MonsterType.COLLECT or vo.type == MonsterType.UD_COLLECT then
  4995. sort_type = 999
  4996. elseif vo.boss_type > 0 then
  4997. sort_type = 899 + vo.boss_type
  4998. else
  4999. sort_type = 799
  5000. end
  5001. elseif find_way == 2 then
  5002. sort_type = 999 + vo.hp/vo.maxHp
  5003. end
  5004. if monster ~= attacker and not same_group and not monster:IsDead() and vo.guaji_flag == 0 and (vo.can_attack == 1 or vo.type == MonsterType.MISSION_COLLECT)
  5005. and not monster.buff_manager:hasUnbeatableBuff() and vo.type ~= MonsterType.PICK and (vo.type ~= MonsterType.COLLECT or (contain_collect_type and vo.type == MonsterType.COLLECT))
  5006. and (not is_auto_select or not monster:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide)) then
  5007. --计算距离(因为结果要按距离排序,所以必须要算)
  5008. if hiter_pos_type == 1 then -- 腰部
  5009. y2 = y2 + monster:GetBodyHeight() * 0.5
  5010. elseif hiter_pos_type == 2 then
  5011. y2 = y2 + monster:GetBodyHeight()
  5012. end
  5013. canSelected = true
  5014. if movie_cfg and movie_cfg.unselected_by_block then
  5015. local start_logic_pos = Vector2(attacker.real_pos.x / SceneObj_LogicRealRatio_x, attacker.real_pos.y / SceneObj_LogicRealRatio_y)
  5016. local end_logic_pos = Vector2(x2 / SceneObj_LogicRealRatio_x, y2 / SceneObj_LogicRealRatio_y)
  5017. if not self:IsStraightLine(start_logic_pos, end_logic_pos) then
  5018. canSelected = false
  5019. end
  5020. end
  5021. if canSelected then
  5022. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  5023. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  5024. table_insert(ret, {monster, dist_pw,sort_type})
  5025. --进行角度范围判定 攻击距离为半径,攻击范围为角度的扇形
  5026. elseif dot_min ~= nil then
  5027. local dir = co.TempVector2(x2-x1, y2-y1)
  5028. dir:normalise()
  5029. local dot = my_dir:dotProduct(dir) --a·b=|a||b|·cosθ
  5030. if dot >= dot_min then
  5031. if dist_pw <= distance * distance then
  5032. table_insert(ret, {monster, dist_pw,sort_type})
  5033. end
  5034. end
  5035. dir:DeleteV()
  5036. --进行直线范围判定(要算dot值判断是否在前方) 攻击距离为长,攻击范围为宽的长方形
  5037. elseif distance and area then
  5038. if dist_pw <= (distance + area) * (distance + area) then
  5039. local dir = co.TempVector2(x2-x1, y2-y1)
  5040. dir:normalise()
  5041. local dot = my_dir:dotProduct(dir)
  5042. if dot > 0 then --在前方再详细算距离
  5043. local relate_pos = {x=x2-x1, y=y2-y1}
  5044. local d = GameMath.DistancePointToLine(my_dir, relate_pos, false)
  5045. local curr_area = area
  5046. --椭圆处理
  5047. curr_area = curr_area
  5048. if d <= curr_area * curr_area then
  5049. table_insert(ret, {monster, dist_pw, sort_type})
  5050. end
  5051. end
  5052. dir:DeleteV()
  5053. end
  5054. elseif area_pw == nil or dist_pw <= area_pw then --圆形
  5055. table_insert(ret, {monster, dist_pw, sort_type})
  5056. end
  5057. end
  5058. end
  5059. end
  5060. end
  5061. local res = {}
  5062. local left_num = n
  5063. if #ret > 0 then
  5064. if #ret > 1 then
  5065. --对所有范围内的怪物按距离排序,先按(采集怪,boss怪,精英怪,普通怪)的怪物类型排序,如果类型相同,按距离排序
  5066. local sort_func = function(t1, t2)
  5067. if t1[3] == t2[3] then
  5068. return t1[2] < t2[2]
  5069. else
  5070. return t1[3] > t2[3]
  5071. end
  5072. end
  5073. table_sort(ret, sort_func)
  5074. end
  5075. for i = 1, n do
  5076. local t = ret[i]
  5077. if t then
  5078. table_insert(res, t[1])
  5079. left_num = left_num - 1
  5080. end
  5081. end
  5082. end
  5083. return res,left_num
  5084. end
  5085. --根据条件检索出符合条件的怪物列表
  5086. --@n: 怪物数量,默认为1
  5087. --@distance: 检索距离 用于直线表示直线的长度
  5088. --@area: 检索范围半径,默认为无限,即全图范围
  5089. --@find_dir: 检索方向
  5090. --@find_radian: 检索角度 用于扇形
  5091. --@center_pos: 检索范围的中心坐标点,默认为主角坐标
  5092. function Scene:FindPartners(n, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count,not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  5093. if not self.scene_mgr:IsPKScene() then
  5094. return {}, n
  5095. end
  5096. if n == 0 then
  5097. return {}, 0
  5098. end
  5099. attacker = attacker or self.main_role
  5100. local area_pw = area and (area * area) or nil
  5101. local war_group1= attacker:GetVo().warGroup
  5102. local my_dir = find_dir or attacker:GetDirection()
  5103. if my_dir then
  5104. my_dir:normalise()
  5105. end
  5106. local dot_min = find_radian and math.cos(find_radian / 2) or nil --左右各一半角度的cos值(dot值)
  5107. local x1, y1 = attacker:GetRealPos()
  5108. if center_pos ~= nil then
  5109. x1, y1 = center_pos.x, center_pos.y
  5110. end
  5111. local ret = {}
  5112. --把所有在距离内的、角度范围内的伙伴找出来
  5113. for _, partner in pairs(self.partner_list) do
  5114. --只找可以挂机的怪
  5115. local at = attacker:GetType()
  5116. local war_group2 = partner:GetVo().warGroup
  5117. local same_group = war_group2 == war_group1 and war_group1 > 0
  5118. local vo = partner:GetVo()
  5119. local hited_count_by_mainRole = 0
  5120. if attacker == self.main_role and defender_max_attack_count then
  5121. local defender_count_info = SceneManager.Instance.mainRole_attacker_list[partner.id]
  5122. if defender_count_info then
  5123. if defender_max_attack_count > defender_count_info.attack_count then
  5124. hited_count_by_mainRole = defender_count_info.attack_count
  5125. else
  5126. hited_count_by_mainRole = nil
  5127. end
  5128. end
  5129. end
  5130. if partner ~= attacker and not same_group and not partner:IsDead() and not partner.buff_manager:hasUnbeatableBuff()
  5131. and hited_count_by_mainRole then
  5132. --计算距离(因为结果要按距离排序,所以必须要算)
  5133. local x2, y2 = partner:GetRealPos()
  5134. local canSelected = true
  5135. if movie_cfg and movie_cfg.unselected_by_block then
  5136. local start_logic_pos = Vector2(attacker.real_pos.x / SceneObj_LogicRealRatio_x, attacker.real_pos.y / SceneObj_LogicRealRatio_y)
  5137. local end_logic_pos = Vector2(x2 / SceneObj_LogicRealRatio_x, y2 / SceneObj_LogicRealRatio_y)
  5138. if not self:IsStraightLine(start_logic_pos, end_logic_pos) then
  5139. canSelected = false
  5140. end
  5141. end
  5142. if canSelected then
  5143. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  5144. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  5145. table_insert(ret, {partner, dist_pw, hited_count_by_mainRole})
  5146. --进行角度范围判定 攻击距离为半径,攻击范围为角度的扇形
  5147. elseif dot_min ~= nil then
  5148. local dir = co.Vector2(x2-x1, y2-y1)
  5149. dir:normalise()
  5150. local dot = my_dir:dotProduct(dir) --a·b=|a||b|·cosθ
  5151. if dot >= dot_min then
  5152. if dist_pw <= distance * distance then
  5153. table_insert(ret, {partner, dist_pw, hited_count_by_mainRole})
  5154. end
  5155. end
  5156. --进行直线范围判定(要算dot值判断是否在前方) 攻击距离为长,攻击范围为宽的长方形
  5157. elseif distance and area then
  5158. if dist_pw <= (distance * distance) then
  5159. local dir = co.Vector2(x2-x1, y2-y1)
  5160. dir:normalise()
  5161. local dot = my_dir:dotProduct(dir)
  5162. if dot > 0 then --在前方再详细算距离
  5163. local relate_pos = {x=x2-x1, y=y2-y1}
  5164. local d = GameMath.DistancePointToLine(my_dir, relate_pos, false)
  5165. local curr_area = area * 0.5
  5166. if d <= curr_area * curr_area then
  5167. table_insert(ret, {partner, dist_pw, hited_count_by_mainRole})
  5168. end
  5169. end
  5170. end
  5171. elseif area_pw == nil or dist_pw <= area_pw then
  5172. table_insert(ret, {partner, dist_pw, hited_count_by_mainRole})
  5173. end
  5174. end
  5175. end
  5176. end
  5177. if #ret > 1 then
  5178. --对所有范围内的伙伴按距离排序
  5179. local sort_func = function(t1, t2)
  5180. if attacker == self.main_role and defender_max_attack_count then
  5181. if t1[3] == t2[3] then
  5182. return t1[2] < t2[2]
  5183. else
  5184. return t1[3] < t2[3]
  5185. end
  5186. else
  5187. return t1[2] < t2[2]
  5188. end
  5189. end
  5190. table_sort(ret, sort_func)
  5191. end
  5192. local res = {}
  5193. local left_num = n
  5194. for i=1, n do
  5195. local t = ret[i]
  5196. if t == nil then
  5197. break
  5198. else
  5199. table_insert(res, t[1])
  5200. left_num = left_num - 1
  5201. end
  5202. end
  5203. return res, left_num
  5204. end
  5205. --根据条件检索出符合条件的玩家列表
  5206. --@n: 玩家数量,默认为1
  5207. --@distance: 检索距离 用于直线表示直线的长度
  5208. --@area: 检索范围半径,默认为无限,即全图范围
  5209. --@find_dir: 检索方向
  5210. --@find_radian: 检索角度 用于扇形
  5211. --@center_pos: 检索范围的中心坐标点,默认为主角坐标
  5212. --@movie_cfg 客户端技能配置
  5213. --@select_type 目标选取类型 3最近队友
  5214. function Scene:FindRoles(n, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select)
  5215. if not self.scene_mgr:IsPKScene() then
  5216. return {}, n
  5217. end
  5218. if n == 0 then
  5219. return {}, 0
  5220. end
  5221. attacker = attacker or self.main_role
  5222. local attacker_vo = attacker:GetVo()
  5223. local area_pw = area and (area * area) or nil
  5224. local my_dir = find_dir or attacker:GetDirection()
  5225. if my_dir then
  5226. my_dir:normalise()
  5227. end
  5228. local dot_min = find_radian and math.cos(find_radian / 2) or nil --左右各一半角度的cos值(dot值)
  5229. local war_group1= attacker_vo.warGroup
  5230. local x1, y1 = attacker:GetRealPos()
  5231. if center_pos ~= nil then
  5232. x1, y1 = center_pos.x, center_pos.y
  5233. end
  5234. if (attacker:GetType() == SceneBaseType.FPearl or attacker:GetType() == SceneBaseType.Pokemon or attacker:GetType() == SceneBaseType.Baby) and attacker.owner then
  5235. attacker = attacker.owner
  5236. war_group1 = attacker:GetVo().warGroup
  5237. end
  5238. local ret = {}
  5239. local vo = nil
  5240. local war_group2 = nil
  5241. local same_group = nil
  5242. local canpkByPkStatus = true
  5243. local x2, y2 = nil
  5244. local canSelected = true
  5245. for _, role in pairs(self.role_list) do
  5246. vo = role:GetVo()
  5247. if vo and role.id ~= attacker.id then
  5248. war_group2 = vo.warGroup
  5249. same_group = war_group2 == war_group1 and war_group1 > 0
  5250. canpkByPkStatus = true
  5251. if select_type == 3 then--最近队友 辅助技能给自己队友加属性
  5252. if attacker_vo.team_id == vo.team_id and attacker_vo.team_id > 0 then
  5253. same_group = false
  5254. else
  5255. same_group = true
  5256. end
  5257. elseif war_group1 == 0 and war_group2 == 0 then
  5258. if attacker:GetType() == SceneBaseType.Pokemon or attacker:GetType() == SceneBaseType.Baby or attacker:GetType() == SceneBaseType.FPearl then
  5259. if attacker.owner and attacker.owner.vo then
  5260. canpkByPkStatus = self.scene_mgr:CanPKByPKStatus(attacker.owner.vo, vo)
  5261. else
  5262. canpkByPkStatus = false
  5263. end
  5264. else
  5265. canpkByPkStatus = self.scene_mgr:CanPKByPKStatus(attacker.vo, vo)
  5266. end
  5267. end
  5268. canpkByPkStatus = canpkByPkStatus --or self.fight_back_mgr:IsAttacker(vo.role_id)
  5269. x2, y2 = role:GetRealPos()
  5270. if role ~= attacker and canpkByPkStatus and not same_group and not role:IsDead() and not role.buff_manager:hasUnbeatableBuff()
  5271. and not vo.is_virtual_friend and (vo.protect_time - TimeUtil:getServerTime() <= 0) and (not is_auto_select or ( (self.scene_mgr:IsGuildWarScene() or not self.scene_mgr:IsSafeArea(nil, x2, y2)) and not role:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide)))
  5272. and (attacker:GetType() ~= SceneBaseType.FPearl and attacker:GetType() ~= SceneBaseType.Pokemon and attacker:GetType() ~= SceneBaseType.Baby or (attacker.owner and attacker.owner ~= role)) then
  5273. if hiter_pos_type == 1 then -- 腰部
  5274. y2 = y2 + role:GetBodyHeight() * 0.5
  5275. elseif hiter_pos_type == 2 then
  5276. y2 = y2 + role:GetBodyHeight()
  5277. end
  5278. canSelected = true
  5279. if movie_cfg and movie_cfg.unselected_by_block then
  5280. local start_logic_pos = Vector2(attacker.real_pos.x / SceneObj_LogicRealRatio_x, attacker.real_pos.y / SceneObj_LogicRealRatio_y)
  5281. local end_logic_pos = Vector2(x2 / SceneObj_LogicRealRatio_x, y2 / SceneObj_LogicRealRatio_y)
  5282. if not self:IsStraightLine(start_logic_pos, end_logic_pos) then
  5283. canSelected = false
  5284. end
  5285. end
  5286. if canSelected then
  5287. --计算距离(因为结果要按距离排序,所以必须要算)
  5288. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  5289. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  5290. table_insert(ret, {role, dist_pw})
  5291. --进行角度范围判定 攻击距离为半径,攻击范围为角度的扇形
  5292. elseif dot_min ~= nil then
  5293. local dir = co.Vector2(x2-x1, y2-y1)
  5294. dir:normalise()
  5295. local dot = my_dir:dotProduct(dir) --a·b=|a||b|·cosθ
  5296. if dot >= dot_min then
  5297. if dist_pw <= distance * distance then
  5298. table_insert(ret, {role, dist_pw})
  5299. end
  5300. end
  5301. --进行直线范围判定(要算dot值判断是否在前方) 攻击距离为长,攻击范围为宽的长方形
  5302. elseif distance and area then
  5303. if dist_pw <= (distance * distance) then
  5304. local dir = co.Vector2(x2-x1, y2-y1)
  5305. dir:normalise()
  5306. local dot = my_dir:dotProduct(dir)
  5307. if dot > 0 then --在前方再详细算距离
  5308. local relate_pos = {x=x2-x1, y=y2-y1}
  5309. local d = GameMath.DistancePointToLine(my_dir, relate_pos, false)
  5310. local curr_area = area * 0.5
  5311. if d <= curr_area * curr_area then
  5312. table_insert(ret, {role, dist_pw})
  5313. end
  5314. end
  5315. end
  5316. elseif area_pw == nil or dist_pw <= area_pw then
  5317. table_insert(ret, {role, dist_pw})
  5318. end
  5319. end
  5320. end
  5321. end
  5322. end
  5323. local res = {}
  5324. local left_num = n
  5325. if #ret > 0 then
  5326. --超过一个才需要排序
  5327. if #ret > 1 then
  5328. --对所有范围内的怪物按距离排序
  5329. local sort_func = function(t1, t2)
  5330. return t1[2] < t2[2]
  5331. end
  5332. table_sort(ret, sort_func)
  5333. end
  5334. for i=1, n do
  5335. local t = ret[i]
  5336. if t then
  5337. table_insert(res, t[1])
  5338. left_num = left_num - 1
  5339. end
  5340. end
  5341. end
  5342. return res,left_num
  5343. end
  5344. --挂机玩家寻找怪物方法
  5345. --根据条件检索出符合条件的怪物列表
  5346. --@n: 怪物数量,默认为1
  5347. --@distance: 检索距离 用于直线表示直线的长度
  5348. --@area: 检索范围半径,默认为无限,即全图范围
  5349. --@find_dir: 检索方向
  5350. --@find_radian: 检索角度 用于扇形
  5351. --@center_pos: 检索范围的中心坐标点,默认为主角坐标
  5352. --@find_way == : 寻找目标的方式,1:目标的类型(采集>boss>小怪) 2:血量
  5353. function Scene:HookRoleFindMonsters(n, distance, area, find_dir, find_radian, center_pos, attacker, movie_cfg, select_type, defender_max_attack_count, not_use_3d_select_mode, hiter_pos_type, is_auto_select, find_way)
  5354. if self.scene_mgr:IsSafeScene() then
  5355. return {}, n
  5356. end
  5357. if n == 0 then
  5358. return {}, 0
  5359. end
  5360. attacker = attacker or self.main_role
  5361. find_way = find_way or 1
  5362. local area_pw = area and (area * area) or nil
  5363. local war_group1= attacker:GetVo().warGroup
  5364. local my_dir = find_dir or attacker:GetDirection()
  5365. if my_dir then
  5366. my_dir:normalise()
  5367. end
  5368. local dot_min = find_radian and math.cos(find_radian / 2) or nil --左右各一半角度的cos值(dot值)
  5369. local x1, y1 = attacker:GetRealPos()
  5370. if center_pos ~= nil then
  5371. x1, y1 = center_pos.x, center_pos.y
  5372. end
  5373. local ret = {}
  5374. --把所有在距离内的、角度范围内的怪物找出来
  5375. local vo = nil
  5376. local at = nil
  5377. local x2, y2 = nil
  5378. local sort_type = 0
  5379. local canSelected = true
  5380. for _, monster in pairs(self.monster_list) do
  5381. vo = monster:GetVo()
  5382. if vo then
  5383. at = attacker:GetType()
  5384. x2, y2 = monster:GetRealPos()
  5385. sort_type = 0
  5386. if find_way == 1 then
  5387. sort_type = 799
  5388. elseif find_way == 2 then
  5389. sort_type = 999 + vo.hp/vo.maxHp
  5390. end
  5391. if monster ~= attacker and not monster:IsDead() and vo.guaji_flag == 0 and vo.can_attack == 1
  5392. and not monster.buff_manager:hasUnbeatableBuff() and vo.type == MonsterType.NORMAL
  5393. and (not is_auto_select or not monster:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide)) then
  5394. --计算距离(因为结果要按距离排序,所以必须要算)
  5395. if hiter_pos_type == 1 then -- 腰部
  5396. y2 = y2 + monster:GetBodyHeight() * 0.5
  5397. elseif hiter_pos_type == 2 then
  5398. y2 = y2 + monster:GetBodyHeight()
  5399. end
  5400. canSelected = true
  5401. if movie_cfg and movie_cfg.unselected_by_block then
  5402. local start_logic_pos = Vector2(attacker.real_pos.x / SceneObj_LogicRealRatio_x, attacker.real_pos.y / SceneObj_LogicRealRatio_y)
  5403. local end_logic_pos = Vector2(x2 / SceneObj_LogicRealRatio_x, y2 / SceneObj_LogicRealRatio_y)
  5404. if not self:IsStraightLine(start_logic_pos, end_logic_pos) then
  5405. canSelected = false
  5406. end
  5407. end
  5408. if canSelected then
  5409. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  5410. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  5411. table_insert(ret, {monster, dist_pw,sort_type})
  5412. --进行角度范围判定 攻击距离为半径,攻击范围为角度的扇形
  5413. elseif dot_min ~= nil then
  5414. local dir = co.Vector2(x2-x1, y2-y1)
  5415. dir:normalise()
  5416. local dot = my_dir:dotProduct(dir) --a·b=|a||b|·cosθ
  5417. if dot >= dot_min then
  5418. if dist_pw <= distance * distance then
  5419. table_insert(ret, {monster, dist_pw,sort_type})
  5420. end
  5421. end
  5422. --进行直线范围判定(要算dot值判断是否在前方) 攻击距离为长,攻击范围为宽的长方形
  5423. elseif distance and area then
  5424. if dist_pw <= (distance + area) * (distance + area) then
  5425. local dir = co.Vector2(x2-x1, y2-y1)
  5426. dir:normalise()
  5427. local dot = my_dir:dotProduct(dir)
  5428. if dot > 0 then --在前方再详细算距离
  5429. local relate_pos = {x=x2-x1, y=y2-y1}
  5430. local d = GameMath.DistancePointToLine(my_dir, relate_pos, false)
  5431. local curr_area = area
  5432. if d <= curr_area * curr_area then
  5433. table_insert(ret, {monster, dist_pw, sort_type})
  5434. end
  5435. end
  5436. end
  5437. elseif area_pw == nil or dist_pw <= area_pw then --圆形
  5438. table_insert(ret, {monster, dist_pw, sort_type})
  5439. end
  5440. end
  5441. end
  5442. end
  5443. end
  5444. local res = {}
  5445. local left_num = n
  5446. if #ret > 0 then
  5447. --对所有范围内的怪物按距离排序,先按(采集怪,boss怪,精英怪,普通怪)的怪物类型排序,如果类型相同,按距离排序
  5448. local sort_func = function(t1, t2)
  5449. if t1[3] == t2[3] then
  5450. return t1[2] < t2[2]
  5451. else
  5452. return t1[3] > t2[3]
  5453. end
  5454. end
  5455. table_sort(ret, sort_func)
  5456. for i = 1, n do
  5457. local t = ret[i]
  5458. if t then
  5459. table_insert(res, t[1])
  5460. left_num = left_num - 1
  5461. end
  5462. end
  5463. end
  5464. return res,left_num
  5465. end
  5466. -- 取消寻路处理
  5467. function Scene:ClearFindWayParam()
  5468. self:clearFindNextScene()
  5469. end
  5470. function Scene:ClearFindNextScene()
  5471. self.scene_mgr.find_nextvo = nil
  5472. self.find_isAgain = nil
  5473. self.scene_mgr.next_scene_id=0
  5474. end
  5475. function Scene:CancelWaitQuest( )
  5476. if self.timer then
  5477. GlobalTimerQuest:CancelQuest(self.timer)
  5478. self.timer = nil
  5479. end
  5480. if self.rush_to_pos_timer then
  5481. GlobalTimerQuest:CancelQuest(self.rush_to_pos_timer)
  5482. self.rush_to_pos_timer = nil
  5483. end
  5484. end
  5485. function Scene:FindElement(findVo, isAgain)
  5486. if not self.main_role then
  5487. GameError.Instance:SendErrorToPHP("FindElement scene_data_loaded"..(self.scene_data_loaded and "yes" or "no") .." "..debug.traceback())
  5488. return
  5489. end
  5490. if self.main_role:IsFishingState() then
  5491. Message.show("钓鱼中~,请先退出钓鱼状态")
  5492. return
  5493. end
  5494. isAgain = isAgain or false
  5495. if findVo == nil or findVo.type==nil or findVo.sceneId==nil or findVo.id==nil then
  5496. return
  5497. end
  5498. -- 判断目标场景是否开启
  5499. if findVo.sceneId ~= self.scene_mgr:GetSceneId() then
  5500. local vo = {}
  5501. vo.scene_id = findVo.sceneId
  5502. local hasOpen = MapModel:getInstance():CanEnterScene(vo)
  5503. if hasOpen ~= true then
  5504. Message.show("无法进入目标场景")
  5505. logWarn("目标场景尚未开放 场景id" .. findVo.sceneId)
  5506. return
  5507. end
  5508. end
  5509. self:clearGoToData()
  5510. GlobalEventSystem:Fire(EventName.FINDWAY_STARTED)
  5511. -- 寻路NPC要重新计算距离
  5512. if findVo.type == FindVo.NPC then
  5513. local npc = self.scene_mgr:GetNpcVo(findVo.id)
  5514. if npc then
  5515. findVo.x = npc.logic_x
  5516. findVo.y = npc.logic_y
  5517. end
  5518. end
  5519. TaskModel:getInstance().need_check_monster = findVo.need_check_monster
  5520. --跳完后 继续寻路
  5521. OperateManager.Instance.jump_end_not_continue = false
  5522. -----------------设置飞鞋坐标-----------------
  5523. local function callback()
  5524. GlobalEventSystem:Fire(EventName.FIND,findVo)
  5525. end
  5526. AutoFightManager:getInstance():SetFlyData(findVo.sceneId, findVo.x* SceneObj_LogicRealRatio_x, findVo.y* SceneObj_LogicRealRatio_y, callback)
  5527. -----------------是否处于处于CanMove状态------------------
  5528. self:CancelWaitQuest()
  5529. if self.main_role and not self.main_role:CanMove() and not self.main_role:IsInState(PoseState.STORY) then
  5530. local timer_func = function ()
  5531. if self.main_role and self.main_role:CanMove() then
  5532. self:FindElement(findVo)
  5533. return
  5534. end
  5535. end
  5536. self.timer = GlobalTimerQuest:AddPeriodQuest(timer_func, 0.1, -1)
  5537. return
  5538. end
  5539. self.find_vo_cache = findVo
  5540. local myx = self.mainrole_vo.pos_x / SceneObj_LogicRealRatio_x
  5541. local myy = self.mainrole_vo.pos_y / SceneObj_LogicRealRatio_y
  5542. --寻路自动上坐骑
  5543. local limit_dis = Config.otherFightInfo.ride_horse_limit_distance / SceneObj_LogicRealRatio_x
  5544. if SceneManager.Instance:IsShowHorseScene() then
  5545. if findVo.sceneId == self.scene_mgr:GetSceneId() then
  5546. local distance_match = GameMath_GetDistance(myx, myy, findVo.x, findVo.y, false) > limit_dis*limit_dis
  5547. local ride_is_unlock = TaskModel:getInstance():IsTaskFinished(10200)
  5548. local pre_task_match = TaskModel:getInstance():IsTaskFinished(10310)
  5549. local next_task_match = TaskModel:getInstance():IsTaskFinished(10430)
  5550. --新手10310到10430任务期间不要自动上坐骑
  5551. if distance_match and ride_is_unlock and not (pre_task_match and not next_task_match) then
  5552. GlobalEventSystem:Fire(EventName.RIDE_HORSE)
  5553. end
  5554. else
  5555. if not findVo.force_change_scene then
  5556. GlobalEventSystem:Fire(EventName.RIDE_HORSE)
  5557. end
  5558. end
  5559. end
  5560. if findVo.sceneId ~= self.scene_mgr:GetSceneId() then --跨场景
  5561. local door_list = self.scene_mgr.door_vo_list
  5562. local temp_door = false
  5563. local min_door_dis_pow = 0
  5564. for k,v in pairs(door_list) do
  5565. local x1, y1 = v.pixel_x, v.pixel_y
  5566. local x2, y2 = self.main_role:GetRealPos()
  5567. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  5568. if not temp_door or dist_pow < min_door_dis_pow then
  5569. temp_door = v
  5570. min_door_dis_pow = dist_pow
  5571. end
  5572. end
  5573. if temp_door then
  5574. self:MainRoleMoveToDoor(temp_door)
  5575. else
  5576. findVo.force_change_scene = false
  5577. self.scene_mgr.find_nextvo = findVo
  5578. self.find_isAgain = isAgain
  5579. GlobalEventSystem:Fire(SceneEventType.REQUEST_CHANGE_SCENE, findVo.sceneId, findVo.call_type)
  5580. end
  5581. return
  5582. end
  5583. if findVo.type == FindVo.SCENE then
  5584. self:ClearFindNextScene()
  5585. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5586. return
  5587. elseif findVo.type == FindVo.NPC then
  5588. if not SceneManager.Instance:IsHomeBuildScene() then
  5589. self:mainRoleToNpc(findVo.id)
  5590. else
  5591. local lx, ly = self.main_role:GetLogicPos()
  5592. if GameMath_GetDistance(lx, ly, findVo.x, findVo.y) <= 1 then
  5593. self.main_role:DoStand()
  5594. local onDelay = function ()
  5595. if self.delay_timer_id then
  5596. GlobalTimerQuest:CancelQuest(self.delay_timer_id)
  5597. self.delay_timer_id = nil
  5598. end
  5599. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5600. end
  5601. self.delay_timer_id = GlobalTimerQuest:AddDelayQuest(onDelay, 0.5)
  5602. if findVo.call_back then
  5603. findVo.call_back()
  5604. end
  5605. else
  5606. self:MainRoleMoveAndCancel(co.TableXY(findVo.x, findVo.y), 0, findVo.call_back)
  5607. end
  5608. end
  5609. elseif findVo.type == FindVo.MONSTER then --主要采集任务
  5610. local lx, ly = self.main_role:GetLogicPos()
  5611. if (findVo.x > 0 or findVo.y > 0) and GameMath_GetDistance(lx, ly, findVo.x, findVo.y) > 20 then
  5612. if isAgain == false then
  5613. local function findAgain()
  5614. local mon = self:FindNearestMonster(findVo.id, false, true)
  5615. if mon then
  5616. self:MainRoleAttackMonster(mon)
  5617. end
  5618. end
  5619. self:MainRoleMoveAndCancel(co.TableXY(findVo.x, findVo.y), 0, findAgain)
  5620. end
  5621. elseif self.scene_mgr:GetMonsterVoByTypeId(findVo.id) ~= nil then
  5622. if isAgain == false then
  5623. local mon = self:FindNearestMonster(findVo.id, false, true)
  5624. if mon then
  5625. self:MainRoleAttackMonster(mon)
  5626. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5627. end
  5628. end
  5629. else
  5630. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5631. if TaskModel:getInstance().is_auto_task and not AutoFightManager:getInstance().is_temp_mode then --九宫格加载慢,隔1秒去尝试找怪
  5632. local onDelay = function ( )
  5633. if self.scene_mgr:IsMainCityAndFieldScene() then
  5634. GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
  5635. end
  5636. end
  5637. setTimeout(onDelay, 1)
  5638. end
  5639. end
  5640. elseif findVo.type == FindVo.PLAYER then
  5641. local player = self:GetRole(findVo.id)
  5642. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5643. if player ~= nil then
  5644. self:MainRoleAttackRole(player)
  5645. end
  5646. elseif findVo.type == FindVo.POINT then --主要打怪任务
  5647. local lx, ly = self.main_role:GetLogicPos()
  5648. local range = findVo.range or 0
  5649. if GameMath_GetDistance(lx, ly, findVo.x, findVo.y) <= 1 then
  5650. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5651. if findVo.call_back then
  5652. findVo.call_back()
  5653. end
  5654. else
  5655. self:MainRoleMoveAndCancel(co.TableXY(findVo.x, findVo.y), range, findVo.call_back)
  5656. end
  5657. elseif findVo.type == FindVo.Fishing then
  5658. local lx, ly = self.main_role:GetLogicPos()
  5659. if GameMath_GetDistance(lx, ly, findVo.x, findVo.y) <= 1 then
  5660. self.main_role:DoStand()
  5661. local onDelay = function ()
  5662. if self.delay_timer_id then
  5663. GlobalTimerQuest:CancelQuest(self.delay_timer_id)
  5664. self.delay_timer_id = nil
  5665. end
  5666. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5667. end
  5668. self.delay_timer_id = GlobalTimerQuest:AddDelayQuest(onDelay, 0.5)
  5669. if findVo.call_back then
  5670. findVo.call_back()
  5671. end
  5672. else
  5673. self:MainRoleMoveAndCancel(co.TableXY(findVo.x, findVo.y), 0, findVo.call_back)
  5674. end
  5675. elseif findVo.type == FindVo.Figure then
  5676. elseif findVo.type == FindVo.Thinking then
  5677. elseif findVo.type == FindVo.Explore then
  5678. local lx, ly = self.main_role:GetLogicPos()
  5679. local range = findVo.range or 0
  5680. local function on_move_callback( )
  5681. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  5682. local action_time = findVo.time or 0.3
  5683. action_time = action_time > 1 and action_time - 0.5 or action_time
  5684. print("tanar: [Scene 6280]=> action_time: ",action_time)
  5685. if action_time > 0 then
  5686. local call_back = function ( )
  5687. if findVo.call_back then
  5688. findVo.call_back()
  5689. end
  5690. end
  5691. GlobalEventSystem:Fire(EventName.OPEN_COLLECT_VIEW, 0, 0, action_time, true, call_back)
  5692. else
  5693. if findVo.call_back then
  5694. findVo.call_back()
  5695. end
  5696. end
  5697. end
  5698. if GameMath_GetDistance(lx, ly, findVo.x, findVo.y) <= 1 then
  5699. on_move_callback()
  5700. else
  5701. self:MainRoleMoveAndCancel(co.TableXY(findVo.x, findVo.y), range, on_move_callback)
  5702. end
  5703. end
  5704. end
  5705. --[[
  5706. ]]
  5707. function Scene:ToTheDoor()
  5708. local door_vo = self.scene_mgr:GetTheDoorVo()
  5709. if door_vo == nil then
  5710. return false
  5711. end
  5712. self:MainRoleMoveToDoor(door_vo)
  5713. return true
  5714. end
  5715. -- 跨场景,继续寻路
  5716. function Scene:FindContinue()
  5717. if self.scene_mgr.find_nextvo then
  5718. self:FindElement(self.scene_mgr.find_nextvo,self.find_isAgain)
  5719. self.scene_mgr.find_nextvo = nil
  5720. self.find_isAgain = nil
  5721. end
  5722. end
  5723. --[[
  5724. : ()
  5725. ]]
  5726. function Scene:HorseChange(scmd)
  5727. local scene_id = self.scene_mgr:GetSceneId()
  5728. local scenne_action_cfg = Config.otherFightInfo.special_scene_action[scene_id]
  5729. if scenne_action_cfg and scenne_action_cfg.is_hide_horse then
  5730. scmd.is_ride = false
  5731. return
  5732. end
  5733. local role_id = scmd.role_id
  5734. local is_ride = scmd.is_ride
  5735. local horse_id = scmd.figure_id
  5736. local move_speed = scmd.speed
  5737. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5738. if roleVo ~= nil then
  5739. roleVo:ChangeVar("move_speed", move_speed)
  5740. roleVo:ChangeVar("is_ride",is_ride)
  5741. roleVo:ChangeVar("horse_id", horse_id)
  5742. else
  5743. print("warning! can not find a role to handle move response!")
  5744. end
  5745. end
  5746. --[[
  5747. : ()
  5748. ]]
  5749. function Scene:PetChange(scmd)
  5750. local role_id = scmd.role_id
  5751. local pet_id = scmd.figure_id
  5752. local pet_status = scmd.hide_status
  5753. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5754. if roleVo ~= nil then
  5755. roleVo:ChangeVar("pet_id", pet_id)
  5756. roleVo:ChangeVar("pet_status", pet_status)
  5757. else
  5758. print("warning! can not find a role to handle move response!")
  5759. end
  5760. end
  5761. --[[
  5762. : ()
  5763. ]]
  5764. function Scene:BabyChange(scmd)
  5765. local role_id = scmd.role_id
  5766. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5767. if roleVo ~= nil then
  5768. roleVo:ChangeVar("child_follow_status", scmd.child_is_follow)
  5769. roleVo:ChangeVar("child_sex", scmd.child_sex)
  5770. roleVo:ChangeVar("child_ageMonth", scmd.child_age_month)
  5771. --roleVo:ChangeVar("child_heartLinkLevel", scmd.heart_link_level)
  5772. roleVo:ChangeVar("child_vehicle_id", scmd.vehicle_id)
  5773. roleVo:ChangeVar("child_fashion", scmd.fashion_list)
  5774. else
  5775. print("warning! can not find a role to handle move response!")
  5776. end
  5777. end
  5778. --[[
  5779. : ()
  5780. ]]
  5781. function Scene:FashionChange(scmd)
  5782. local role_id = scmd.role_id
  5783. local fashion_model_list = scmd.fashion_equip
  5784. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5785. if roleVo ~= nil then
  5786. --时装变更时,需要清理珍宝和皮肤的数据
  5787. if FosterController.Instance then
  5788. local temp_data = {type_id = scmd.pos, fashion_id = scmd.fashion_id, color_id = scmd.color_id}
  5789. FosterController.Instance:ChangeRoleFashionInfo(temp_data,role_id)
  5790. end
  5791. roleVo.fashion_model_list = fashion_model_list
  5792. roleVo:ChangeVar("fashion_model_list", fashion_model_list, nil, true)
  5793. else
  5794. print("warning! can not find a role to handle move response!")
  5795. end
  5796. end
  5797. --[[
  5798. : ()
  5799. ]]
  5800. function Scene:LightWeaponChange(scmd)
  5801. local role_id = scmd.role_id
  5802. local light_weapon_model = scmd.light_weapon_model
  5803. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5804. if roleVo ~= nil then
  5805. roleVo:ChangeVar("light_weapon_model", light_weapon_model, nil, true)
  5806. else
  5807. print("warning! can not find a role to handle move response!")
  5808. end
  5809. end
  5810. --[[
  5811. : ()
  5812. ]]
  5813. function Scene:SpriteChange(scmd)
  5814. local role_id = scmd.role_id
  5815. local sprite_id = scmd.figure_id
  5816. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5817. if roleVo ~= nil then
  5818. roleVo:ChangeVar("sprite_id", sprite_id)
  5819. else
  5820. print("warning! can not find a role to handle move response!")
  5821. end
  5822. end
  5823. --[[
  5824. : ()
  5825. ]]
  5826. function Scene:GodChange(scmd)
  5827. local role_id = scmd.role_id
  5828. local god_id = scmd.god_id
  5829. local hp = scmd.hp
  5830. local hp_lim = scmd.hp_lim
  5831. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5832. if roleVo ~= nil then
  5833. roleVo.god_max_hp = hp_lim
  5834. roleVo:ChangeVar("god_id", god_id)
  5835. roleVo:ChangeVar("god_hp", hp)
  5836. -- roleVo:ChangeVar("god_max_hp", hp_lim)
  5837. else
  5838. print("warning! can not find a role to handle move response!")
  5839. end
  5840. end
  5841. --[[
  5842. : ()
  5843. ]]
  5844. function Scene:RoleOtherProChange(role_id, scmd)
  5845. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5846. if roleVo ~= nil then
  5847. print("12010--------RoleOtherProChange---------")
  5848. for i,v in ipairs(scmd) do
  5849. if v.style == 1 then --等级衣服模型
  5850. roleVo:UpdateLevelModelList(1, v.value)
  5851. roleVo:ChangeVar("fashion_model_list",roleVo.fashion_model_list, nil, true)
  5852. elseif v.style == 2 then --等级武器模型
  5853. roleVo:UpdateLevelModelList(2, v.value)
  5854. roleVo:ChangeVar("level_model_list",roleVo.level_model_list, nil, true)
  5855. elseif v.style == 3 then --等级头部模型
  5856. roleVo:UpdateLevelModelList(3, v.value)
  5857. roleVo:ChangeVar("fashion_model_list",roleVo.fashion_model_list, nil, true)
  5858. elseif v.style == 4 then --降神变化通知
  5859. roleVo:ChangeVar("god_id", v.value)
  5860. elseif v.style == 5 then
  5861. roleVo:ChangeVar("pokemon_id", v.value)
  5862. elseif v.style == 6 then
  5863. roleVo:ChangeVar("escort_state", v.value)
  5864. elseif v.style == 7 then --活跃度形象
  5865. roleVo:ChangeVar("image_id", v.value)
  5866. elseif v.style == 8 then
  5867. roleVo:ChangeVar("protect_time", v.value)
  5868. elseif v.style == 9 then
  5869. roleVo:ChangeVar("deity_id", v.value)
  5870. elseif v.style == 10 then--羁绊对象名
  5871. roleVo:ChangeVar("mate_name", v.value)
  5872. elseif v.style == 11 then--羁绊称号名
  5873. roleVo:ChangeVar("mate_title", v.value)
  5874. elseif v.style == 12 then--羁绊等级
  5875. roleVo:ChangeVar("mate_lv", tonumber(v.value))
  5876. elseif v.style == 13 then--跟随
  5877. roleVo:ChangeVar("evil_id", tonumber(v.value))
  5878. end
  5879. end
  5880. else
  5881. -- print("warning! can not find a role to handle move response!")
  5882. end
  5883. end
  5884. --改变玩家活动通用标志
  5885. function Scene:FlagChange(role_id, scmd)
  5886. local roleVo = self.scene_mgr:GetRoleVo(role_id)
  5887. -- 获取不到玩家数据的话,检测加载缓存列表的数据
  5888. local is_delay_vo = false
  5889. if not roleVo then
  5890. roleVo = self.scene_mgr:GetDelayRoleVo(role_id)
  5891. is_delay_vo = true
  5892. end
  5893. if roleVo ~= nil and scmd then
  5894. if roleVo.activity_flags == nil then
  5895. roleVo.activity_flags = {}
  5896. end
  5897. for i,v in ipairs(scmd) do
  5898. local find = false
  5899. for j,vo in ipairs(roleVo.activity_flags) do
  5900. if v.key == vo.key then
  5901. vo.value = v.value
  5902. find = true
  5903. break
  5904. end
  5905. end
  5906. if find == false then
  5907. local obj = {}
  5908. obj.key = v.key
  5909. obj.value = v.value
  5910. table_insert(roleVo.activity_flags, obj)
  5911. end
  5912. end
  5913. if not is_delay_vo then
  5914. roleVo:ChangeVar("activity_flags",roleVo.activity_flags, nil, true)
  5915. end
  5916. else
  5917. --print("warning! can not find a role to handle move response!")
  5918. end
  5919. end
  5920. --从列表中获取离主角最近的场景对象
  5921. function Scene:FindNearestSceneObj(src_list)
  5922. if src_list == nil or not self.main_role then return end
  5923. local min_dist_pow = nil
  5924. local min_dist_obj = nil
  5925. local scene_obj = nil
  5926. local x1, y1 = self.main_role:GetRealPos()
  5927. for i, vo in pairs(src_list) do
  5928. if vo.obj_type == SceneBaseType.Role or vo.obj_type == SceneBaseType.Fake_Role then
  5929. scene_obj = self:GetRole(vo.id)
  5930. else
  5931. scene_obj = self:GetSceneObj(vo.id)
  5932. end
  5933. if scene_obj and not scene_obj:IsDead() and self.scene_mgr:IsCanAttackByMainRole(scene_obj:GetVo())then
  5934. local x2, y2 = scene_obj:GetRealPos()
  5935. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  5936. if min_dist_pow == nil or dist_pow < min_dist_pow then
  5937. min_dist_pow = dist_pow
  5938. min_dist_obj = scene_obj
  5939. end
  5940. end
  5941. end
  5942. return min_dist_obj
  5943. end
  5944. function Scene:FindNearestSelectableTargets(find_type, n, find_way, area)
  5945. if Scene.FIND_TARGET_TYPE.monster == find_type then
  5946. local monster_list,left_num = self:FindNearestSelectableMonsters(n, find_way, area)
  5947. return monster_list, left_num
  5948. elseif Scene.FIND_TARGET_TYPE.role == find_type then
  5949. local role_list,left_num = self:FindNearestSelectableRoles(n, find_way, area)
  5950. return role_list, left_num
  5951. elseif Scene.FIND_TARGET_TYPE.all == find_type then
  5952. local role_list, monster_list, left_num = nil,nil,nil
  5953. role_list,left_num = self:FindNearestSelectableRoles(n, find_way, area)
  5954. monster_list,left_num = self:FindNearestSelectableMonsters(left_num,find_way, area)
  5955. return monster_list, role_list
  5956. end
  5957. end
  5958. function Scene:FindNearestSelectableRoles(n, find_way, area)
  5959. if self.scene_mgr:IsSafeScene() then
  5960. return {}, n
  5961. end
  5962. if n == 0 then
  5963. return {}, 0
  5964. end
  5965. local attacker = self.main_role
  5966. if not attacker then
  5967. return {}, n
  5968. end
  5969. local war_group1= attacker:GetVo().warGroup
  5970. local my_dir = attacker:GetDirection()
  5971. if my_dir then
  5972. my_dir:normalise()
  5973. end
  5974. local x1, y1 = attacker:GetRealPos()
  5975. local ret = {}
  5976. for _, role in pairs(self.role_list) do
  5977. local vo = role:GetVo()
  5978. if vo then
  5979. local war_group2 = vo.warGroup
  5980. local same_group = war_group2 == war_group1 and war_group1 > 0
  5981. local canpkByPkStatus = true
  5982. if select_type == 3 then--最近队友 辅助技能给自己队友加属性
  5983. if attacker_vo.team_id == vo.team_id and attacker_vo.team_id > 0 then
  5984. same_group = false
  5985. else
  5986. same_group = true
  5987. end
  5988. elseif war_group1 == 0 and war_group2 == 0 then
  5989. canpkByPkStatus = self.scene_mgr:CanPKByPKStatus(attacker.vo, vo)
  5990. end
  5991. local x2, y2 = role:GetRealPos()
  5992. if role ~= attacker and canpkByPkStatus and not same_group and not role:IsDead() and not role.buff_manager:hasUnbeatableBuff()
  5993. and not vo.is_virtual_friend and ( (self.scene_mgr:IsGuildWarScene() or not self.scene_mgr:IsSafeArea(nil, x2, y2)) and not role:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide)) then
  5994. --计算距离(因为结果要按距离排序,所以必须要算)
  5995. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  5996. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  5997. table_insert(ret, {role, dist_pw})
  5998. else
  5999. table_insert(ret, {role, dist_pw})
  6000. end
  6001. end
  6002. end
  6003. end
  6004. --对所有范围内的怪物按距离排序
  6005. local sort_func = function(t1, t2)
  6006. return t1[2] < t2[2]
  6007. end
  6008. table_sort(ret, sort_func)
  6009. local res = {}
  6010. local left_num = n
  6011. for i=1, n do
  6012. local t = ret[i]
  6013. if t == nil then
  6014. break
  6015. else
  6016. table_insert(res, t[1])
  6017. left_num = left_num - 1
  6018. end
  6019. end
  6020. return res, left_num
  6021. end
  6022. --获取离玩家最近的可选怪物
  6023. --@find_way == : 寻找目标的方式,1:目标的类型(采集>boss>小怪) 2:血量
  6024. function Scene:FindNearestSelectableMonsters(n ,find_way,area)
  6025. if self.scene_mgr:IsSafeScene() then
  6026. return {}, n
  6027. end
  6028. if n == 0 then
  6029. return {}, 0
  6030. end
  6031. local attacker = self.main_role
  6032. if not attacker then
  6033. return {}, n
  6034. end
  6035. find_way = find_way or 1
  6036. local area_pw = area and (area * area) or nil
  6037. local war_group1= attacker:GetVo().warGroup
  6038. local my_dir = find_dir or attacker:GetDirection()
  6039. if my_dir then
  6040. my_dir:normalise()
  6041. end
  6042. local dot_min = find_radian and math.cos(find_radian / 2) or nil --左右各一半角度的cos值(dot值)
  6043. local x1, y1 = attacker:GetRealPos()
  6044. local ret = {}
  6045. --把所有在距离内的、角度范围内的怪物找出来
  6046. for _, monster in pairs(self.monster_list) do
  6047. local vo = monster:GetVo()
  6048. if vo then
  6049. local at = attacker:GetType()
  6050. local war_group2 = vo.warGroup
  6051. local same_group = (at == SceneBaseType.Monster and war_group2 == war_group1) or ((at == SceneBaseType.Role or at == SceneBaseType.MainRole) and war_group2 == war_group1 and war_group1 > 0)
  6052. local is_mine = monster.role_id == RoleManager.Instance.mainRoleInfo.role_id
  6053. local x2, y2 = monster:GetRealPos()
  6054. local sort_type = 0
  6055. if find_way == 1 then
  6056. if vo.type == MonsterType.TASK_COLLECT or vo.type == MonsterType.COLLECT or vo.type == MonsterType.UD_COLLECT then
  6057. sort_type = 999
  6058. elseif vo.boss_type > 0 then
  6059. sort_type = 899 + vo.boss_type
  6060. else
  6061. sort_type = 799
  6062. end
  6063. elseif find_way == 2 then
  6064. sort_type = 999 + vo.hp/vo.maxHp
  6065. end
  6066. if monster ~= attacker and not same_group and not monster:IsDead() and vo.guaji_flag == 0 and vo.can_attack == 1
  6067. and not monster.buff_manager:hasUnbeatableBuff() and vo.type ~= MonsterType.PICK
  6068. and not monster:HasModelHideFlag(SceneObj.ModelHideFlag.ServerHide) and not is_mine then
  6069. --计算距离(因为结果要按距离排序,所以必须要算)
  6070. local dist_pw = GameMath_GetDistance(x1, y1, x2, y2, false)
  6071. if dist_pw <= 2500 then --如果距离在(50,50)之内,就忽略距离判断和角度判断
  6072. table_insert(ret, {monster, dist_pw, sort_type})
  6073. --进行角度范围判定 攻击距离为半径,攻击范围为角度的扇形
  6074. elseif area_pw == nil or dist_pw <= area_pw then --圆形
  6075. table_insert(ret, {monster, dist_pw, sort_type})
  6076. end
  6077. end
  6078. end
  6079. end
  6080. --对所有范围内的怪物排序,先按(采集怪,boss怪,精英怪,普通怪)的怪物类型排序,如果类型相同,按距离排序
  6081. local sort_func = function(t1, t2)
  6082. if t1[3] == t2[3] then
  6083. return t1[2] < t2[2]
  6084. else
  6085. return t1[3] > t2[3]
  6086. end
  6087. end
  6088. table_sort(ret, sort_func)
  6089. local res = {}
  6090. local left_num = n
  6091. for i=1, n do
  6092. local t = ret[i]
  6093. if t == nil then
  6094. break
  6095. else
  6096. table_insert(res, t[1])
  6097. left_num = left_num - 1
  6098. end
  6099. end
  6100. return res, left_num
  6101. end
  6102. --获取离玩家最近的怪物,可指定类型id, (boss怪>普通怪>采集怪)
  6103. function Scene:FindNearestMonster(mon_id, distance, contain_collect_type)
  6104. local distance = distance or self.pre_check_distance --预选目标的距离限制
  6105. local my_group = RoleManager.Instance.mainRoleInfo.warGroup
  6106. local min_dist_mon, min_dist_pow = nil, nil
  6107. -- 幻魔星域场景 没次数时不寻怪
  6108. local is_desert_scene = self.scene_mgr:IsBossDesertedScene() or self.scene_mgr:IsDesertedBossCrossScene()
  6109. local support_boss = GuildModel:getInstance():GetGuildSupportBossId( )--要过滤掉当前协助的进攻对象
  6110. for _, monster in pairs(self.monster_list) do
  6111. local mon_group = monster.vo.warGroup
  6112. local same_group = my_group > 0 and my_group == mon_group --攻击者分组大于0的前提下才需要考虑是否相同分组
  6113. if monster and (not mon_id or monster.vo.type_id == mon_id) and not monster:IsDead() and not same_group then
  6114. --再选类型 采集物 或者 可攻击怪物
  6115. if (contain_collect_type and self:MonsterIsCollect(monster.vo.type))
  6116. or (monster.vo.can_attack ~= 0 and not self:IsMonsterInvincible(monster)) -- 怪物不可攻击或者怪物进入无敌状态
  6117. and (monster.vo.role_id ~= RoleManager.Instance.mainRoleInfo.role_id) then
  6118. if is_desert_scene then
  6119. local rest_boss_time, rest_mon_time = BossModel:GetInstance():GetDesertedBossRestNum( )
  6120. if (support_boss == monster.vo.type_id) or --协助中
  6121. (rest_boss_time <= 0 and rest_mon_time > 0 and -- 仅有精英怪次数 打精英
  6122. monster.vo.boss_type == BossType.DesertedMonster) or
  6123. (rest_boss_time > 0 and rest_mon_time <= 0 and -- 仅有BOSS次数 打BOSS
  6124. monster.vo.boss_type == BossType.DesertedBoss) or
  6125. (rest_boss_time > 0 and rest_mon_time > 0) -- 都有
  6126. then
  6127. local x2, y2 = monster:GetRealPos()
  6128. local x1, y1 = self.main_role:GetRealPos()
  6129. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  6130. if (not distance or dist_pow <= distance*distance) and
  6131. (not min_dist_pow or dist_pow < min_dist_pow)
  6132. then
  6133. min_dist_pow = dist_pow
  6134. min_dist_mon = monster
  6135. end
  6136. end
  6137. else
  6138. local can_check_mon = true
  6139. --社团封印裂隙活动如果没有封印次数了忽略采集怪
  6140. if self:MonsterIsCollect(monster.vo.type) and self.scene_mgr:IsGuildScene() and
  6141. GuildModel:getInstance():IsGuildCollectActive() and not GuildModel.Instance:CanCollect() then can_check_mon = false end
  6142. --社团封印裂隙活动如果是标记了被别人采集中的采集怪,也要忽略掉
  6143. if self:MonsterIsCollect(monster.vo.type) and self.scene_mgr:IsGuildScene() and
  6144. GuildModel:getInstance():IsGuildCollectActive() and GuildModel:getInstance():IsGuildIgnoreCollection(monster.vo.instance_id) then
  6145. can_check_mon = false
  6146. end
  6147. --社团封印裂隙活动如果还有封印次数忽略普通怪
  6148. if not self:MonsterIsCollect(monster.vo.type) and self.scene_mgr:IsGuildScene() and
  6149. GuildModel:getInstance():IsGuildCollectActive() and GuildModel.Instance:CanCollect() then can_check_mon = false end
  6150. if can_check_mon then
  6151. local x2, y2 = monster:GetRealPos()
  6152. local x1, y1 = self.main_role:GetRealPos()
  6153. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  6154. if (not distance or dist_pow <= distance*distance) and (not min_dist_pow or dist_pow < min_dist_pow) then
  6155. min_dist_pow = dist_pow
  6156. min_dist_mon = monster
  6157. end
  6158. end
  6159. end
  6160. end
  6161. end
  6162. end
  6163. return min_dist_mon
  6164. end
  6165. function Scene:MonsterIsCollect( monster_type )
  6166. if monster_type == MonsterType.COLLECT or monster_type == MonsterType.TASK_COLLECT or monster_type == MonsterType.UD_COLLECT then
  6167. return true
  6168. end
  6169. return false
  6170. end
  6171. function Scene:IsMonsterInvincible(mon_obj)
  6172. if mon_obj then
  6173. if self.scene_mgr:IsRageWarScene() and mon_obj:GetVo().boss_type == BossType.UnDead -- 狂战领域追加了横幅,这个暂时屏蔽
  6174. and mon_obj:GetBuffVoByBuffTypeAndBuffId(SkillBuffType.UNBEATABLE, 1110000015) then -- 获取无敌buff
  6175. return true
  6176. end
  6177. end
  6178. return false
  6179. end
  6180. --获取离玩家最近的人物
  6181. function Scene:FindNearestRole(role_id, distance)
  6182. local distance = distance or self.pre_check_distance --预选目标的距离限制
  6183. local min_dist_role, min_dist_pow = nil, nil
  6184. for _, role in pairs(self.role_list) do
  6185. if role and not role:IsDead() and self.scene_mgr:IsCanAttackByMainRole(role:GetVo(), true) then
  6186. local x2, y2 = role:GetRealPos()
  6187. local x1, y1 = self.main_role:GetRealPos()
  6188. local dist_pow = GameMath_GetDistance(x1, y1, x2, y2, false)
  6189. if (not distance or dist_pow <= distance*distance) and (not min_dist_pow or dist_pow < min_dist_pow) then
  6190. min_dist_pow = dist_pow
  6191. min_dist_role = role
  6192. end
  6193. end
  6194. end
  6195. return min_dist_role
  6196. end
  6197. --允许点击屏幕
  6198. function Scene:EnableClickScreen(bool)
  6199. self.enable_click_screen = bool
  6200. end
  6201. -- 是否场景加载完毕
  6202. function Scene:IsSceneProloadFinish()
  6203. if self.sceneLoadView and self.sceneLoadView:HasOpen() then
  6204. return false
  6205. end
  6206. if not self.scene_data_loaded or not self.preload_res_is_loaded then
  6207. return false
  6208. end
  6209. return true
  6210. end
  6211. function Scene:CreateGrave(grave_vo)
  6212. local grave = self.grave_list[grave_vo.instance_id]
  6213. if grave ~= nil then
  6214. self.grave_pool:ReleaseObj(grave)
  6215. self.grave_list[grave_vo.instance_id] = nil
  6216. end
  6217. grave = self.grave_pool:GetObjFreeList()
  6218. if grave == nil then
  6219. grave = Grave.New()
  6220. end
  6221. self.grave_list[grave_vo.instance_id] = grave
  6222. grave:InitGraveVo(grave_vo)
  6223. grave:LoadInfoFromVo()
  6224. return grave, true
  6225. end
  6226. function Scene:DeleteGrave( grave_id )
  6227. local grave = self.grave_list[grave_id]
  6228. if grave ~= nil then
  6229. self.grave_pool:ReleaseObj(grave)
  6230. self.grave_list[grave_id] = nil
  6231. end
  6232. end
  6233. function Scene:GetGraveItem(id)
  6234. return self.grave_list[id]
  6235. end
  6236. function Scene:GetHookRoleItem(id)
  6237. return self.hook_role_list[id]
  6238. end
  6239. function Scene:IsProgressLoadFinish()
  6240. return self.load_progress_finished
  6241. end
  6242. function Scene:IsNpcLoadFinish()
  6243. return self.load_npc_finish
  6244. end
  6245. function Scene:PreLoadMapRes( scene_id,callback )
  6246. self.mapView:PreLoadMapRes( scene_id,callback )
  6247. end
  6248. function Scene:DeletePreLoadMap()
  6249. self.mapView:DeletePreLoadMap()
  6250. end
  6251. function Scene:SetFindMonsterPos(x,y)
  6252. if x == nil or y == nil then
  6253. self.find_monster_pos = false
  6254. else
  6255. self.find_monster_pos = co.TableXY(x,y)
  6256. end
  6257. end
  6258. function Scene:SceneLoadViewOpenState( )
  6259. if self.sceneLoadView then
  6260. return self.sceneLoadView:HasOpen() and not self.sceneLoadView.hide_load_progress
  6261. end
  6262. end
  6263. function Scene:SetFirstLoadBgFinish(bool)
  6264. self.is_first_load_bg_finish = bool
  6265. end
  6266. function Scene:IsFirstLoadBgFinish()
  6267. return self.is_first_load_bg_finish
  6268. end
  6269. function Scene:UpdateRoleListNameBoard()
  6270. for _, v in pairs(self.role_list) do
  6271. v:UpdateNameBoard()
  6272. end
  6273. end
  6274. --玩家手动操作之后,要重置一些缓存状态,避免切场景后继续自动寻路之类的
  6275. function Scene:ResetUserManulState( )
  6276. if self.main_role and self.main_role:IsInState(PoseState.FLY_SHOE_EFFECT) then
  6277. return
  6278. end
  6279. self:CancelWaitQuest()
  6280. self:clearGoToData()
  6281. AutoFightManager:getInstance():SetFlyData(false)
  6282. AutoFightController:getInstance().fly_data = {}
  6283. self:ClearFindNextScene()
  6284. end
  6285. function Scene:CheckBuffBall( )
  6286. local role_vo = RoleManager.Instance.mainRoleInfo
  6287. local ball_list = BaseDungeonModel:getInstance():GetBuffPosList( ) or {}
  6288. local distabce = 0
  6289. if role_vo then
  6290. for k,v in pairs(ball_list) do
  6291. distabce = GameMath_GetDistance((v.x or 0), (v.y or 0), role_vo.pos_x, role_vo.pos_y)
  6292. if distabce < 100*100 then
  6293. --请求拾取
  6294. BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61078,v.buff_id,v.x or 0,v.y or 0)
  6295. end
  6296. end
  6297. end
  6298. end
  6299. function Scene:CheckEscortDistance( )
  6300. do return end
  6301. local role_vo = RoleManager.Instance.mainRoleInfo
  6302. if not self.escort_model then
  6303. self.escort_model = EscortModel:GetInstance()
  6304. end
  6305. if not self.escort_instance_id then
  6306. self.escort_instance_id = self.escort_model:GetMyEscortCarInstanceId()
  6307. end
  6308. -- if not self.escort_car_distance then
  6309. -- self.escort_car_distance = Config.Convoykv["convoy_move_range"].value_content - 100
  6310. -- end
  6311. local distance = 0
  6312. if role_vo then
  6313. local mon_vo = self:GetMonster(self.escort_instance_id)
  6314. if mon_vo then
  6315. local dis = GameMath_GetDistance(mon_vo.vo.pos_x,mon_vo.vo.pos_y, role_vo.pos_x, role_vo.pos_y, false)
  6316. if dis < self.escort_car_distance * self.escort_car_distance then
  6317. if self.is_in_escort_car_distance ~= 1 then--不是1 有可能是还没值 或者是 2(远离车状态)告诉服务端我进来了
  6318. self.is_in_escort_car_distance = 1
  6319. self.escort_model:Fire(EscortConst.REQUEST_SCMD_EVENT, 50010, self.is_in_escort_car_distance)
  6320. self.escort_model:Fire(EscortConst.RUN_NEAR_CAR)
  6321. end
  6322. elseif dis > (self.escort_car_distance + 300) * (self.escort_car_distance + 300) then
  6323. if self.is_in_escort_car_distance == 1 then--必须是1(靠近车推车状态) 才触发告诉服务端我离开了
  6324. self.is_in_escort_car_distance = 2
  6325. self.escort_model:Fire(EscortConst.REQUEST_SCMD_EVENT, 50010, self.is_in_escort_car_distance)
  6326. end
  6327. end
  6328. else
  6329. self.is_in_escort_car_distance = 2--找不到车了 就不是在车旁边了 算离开
  6330. end
  6331. end
  6332. end
  6333. function Scene:CleanEscortInfo( )
  6334. self.escort_model = nil
  6335. self.escort_instance_id = nil
  6336. self.escort_car_distance = nil
  6337. self.is_in_escort_car_distance = nil
  6338. end
  6339. function Scene:ChangeMainRoleScale( force )
  6340. if not self.main_role then
  6341. return
  6342. end
  6343. print('Cat:Scene.lua[6956] data', self.scene_mgr:IsMirrorScene() , self.scene_mgr:IsLastMirrorScene())
  6344. --如果是镜像场景,不会走飞天落地,所以直接设置原大小
  6345. if SceneManager.Instance:NoLoadingViewScene()
  6346. or SceneManager.Instance:IsBabyScene()
  6347. or self.main_role:IsInState(PoseState.FLY_SHOE_EFFECT)
  6348. or force then
  6349. self.main_role:SetScale(1)
  6350. else
  6351. self.main_role:SetScale(0.001)
  6352. end
  6353. end
  6354. function Scene:IsInPickAllDropState()
  6355. return self.is_in_pick_all_state
  6356. end