require("game.autoFight.AutoFightManager") require("game.autoFight.AutoFightTips") require("game.autoFight.BufferTipsItem") AutoFightController = AutoFightController or BaseClass(BaseController) AutoFightController.AutoStateType = { AUTO_FIGHT = 1, AUTO_FINDWAY = 2, NONE = 0, } function AutoFightController:__init() AutoFightController.Instance = self self.ask_automf_view = nil self.auto_state_tip_view = nil --在屏幕中间显示“正在挂机”和正在寻路的图片 self:AddAllEvents() self.model = AutoFightManager:getInstance() self.model.auto_state = AutoFightController.AutoStateType.NONE self.show_alert_wait_time = 40 self.last_show_alert_time = 0 self.fly_data = {} end function AutoFightController:getInstance() if AutoFightController.Instance == nil then AutoFightController.New() end return AutoFightController.Instance end function AutoFightController:__delete() end function AutoFightController:AddAllEvents() local function findway_ended_func() self.model:SetAutoFindWayState(false) end local function findway_started_func() --发起寻路要取消自动战斗 GlobalEventSystem:Fire(EventName.STOPAUTOFIGHT) self.model:SetAutoFindWayState(true) end GlobalEventSystem:Bind(EventName.FINDWAY_ENDED, findway_ended_func) GlobalEventSystem:Bind(EventName.FINDWAY_STARTED, findway_started_func) local function game_start_func() self.model.game_running = true end local function game_stoped() self.model.game_running = false end GlobalEventSystem:Bind(EventName.GAME_START, game_start_func) GlobalEventSystem:Bind(EventName.GAME_SERVER_DISCONNECTED, game_stoped) local function open_tips_view() self:OpenAutoFightTipsView() end GlobalEventSystem:Bind(EventName.OPEN_FIGHT_TIPS_VIEW, open_tips_view) local function close_tips_view() if self.autoFightTips and self.autoFightTips:HasOpen() then self.autoFightTips:Close() end end GlobalEventSystem:Bind(EventName.CLOSE_FIGHT_TIPS_VIEW, close_tips_view) --监听玩家摇杆和键盘操作 local function joy_stick_dragend() if Scene.Instance.main_role and self.model.auto_fight_state then self.model:CacheAutoFightPos() self.model:CacheGoToPos() findway_ended_func() end end GlobalEventSystem:Bind(UIJoyStick.EVENT_TOUCH_END, joy_stick_dragend) local function onSceneStart() --切换地图后,新地图的初始位置为新的挂机点 if self.model:GetAutoFightState() then self.model:CacheAutoFightPos() end end GlobalEventSystem:Bind(SceneManager.START,onSceneStart) local function onSceneStart2() --切换地图后,新地图的初始位置为新的挂机点 if self.model:GetAutoFightState() then self.model:CacheAutoFightPos() end local main_role = Scene.Instance:GetMainRole() if not main_role then return end if SceneManager.Instance:IsDungeonScene() then self.model.next_fly_pos = main_role.real_pos if SceneManager.Instance:IsGuildGuardDungeon() then self.fly_data.callback = function() GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT) end else self.fly_data.callback = function() if BaseDungeonModel:getInstance().wait_load_find_way_fun then local main_role = Scene.Instance:GetMainRole() main_role.is_shoe_flying = false BaseDungeonModel:getInstance().wait_load_find_way_fun() BaseDungeonModel:getInstance().wait_load_find_way_fun = nil end --GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT, false, true) end end elseif SceneManager.Instance:IsDungeonScene(SceneManager.Instance:GetLastSceneId()) then self.model.next_fly_pos = main_role.real_pos self.fly_data.callback = nil else self.model.next_fly_pos = main_role.real_pos -- self.fly_data.callback = nil end --要先把坐骑下了 if self.model.next_fly_pos then if self.model.next_fly_pos.x == 0 and self.model.next_fly_pos.y == 0 then self.model.next_fly_pos.x = main_role.vo.pos_x self.model.next_fly_pos.y = main_role.vo.pos_y end -- --main_role:SetModelHideFlag(SceneObj.ModelHideFlag.Fly, false) print("-+-------场景开始,fly down-------:", SceneManager:getInstance():IsBlockXY(self.model.next_fly_pos.x / SceneObj.LogicRealRatio.x, self.model.next_fly_pos.y / SceneObj.LogicRealRatio.y), self.model.next_fly_pos.x / SceneObj.LogicRealRatio.x, self.model.next_fly_pos.y / SceneObj.LogicRealRatio.y) if SceneManager:getInstance():IsBlockXY(self.model.next_fly_pos.x / SceneObj.LogicRealRatio.x, self.model.next_fly_pos.y / SceneObj.LogicRealRatio.y) then local sceneInfo = SceneManager:getInstance():GetSceneInfo() if sceneInfo and sceneInfo.x and sceneInfo.y then self.model.next_fly_pos.x, self.model.next_fly_pos.y = SourceOperateMove.FindNearestPos(co.TableXY(self.model.next_fly_pos.x, self.model.next_fly_pos.y), co.TableXY(tonumber(sceneInfo.x), tonumber(sceneInfo.y))) end end --判断是无缝切换则直接触发 if SceneManager.Instance:NoLoadingViewScene() then --服务端限制了不能连续触发2次,在12002后修正位置就行了 -- main_role:SetRealPos(self.model.next_fly_pos.x, self.model.next_fly_pos.y, true) -- GlobalEventSystem:Fire(SceneEventType.MOVEREQUEST, self.model.next_fly_pos.x, self.model.next_fly_pos.y, MOVE_TYPE.BLINK) -- if self.fly_data.callback then -- self.fly_data.callback() -- self.fly_data.callback = nil -- end else --新手进入游戏要做落地表现 if RoleManager and RoleManager.Instance and RoleManager.Instance.mainRoleInfo.level == 1 then self.fly_data.callback = function() GlobalEventSystem:Fire(EventName.PLAY_ENTER_GUIDE_START_VIEW) end end local need_delay = false local delay_time = nil local playerLv = RoleManager:getInstance():GetMainRoleVo().level if playerLv <= 120 and SceneManager.Instance:IsMission() then delay_time = 0.2 need_delay = true end --通过传送门切场景 -- if self.model.is_transfer_out then -- self.model.is_transfer_out = false -- if need_delay then -- setTimeout(function () -- local main_role = Scene.Instance:GetMainRole() -- if not main_role then -- return -- end -- self.model:SetChangeSceneFlyTime(Status.NowTime) -- main_role:DoTransfer(self.model.next_fly_pos, 1,self.fly_data.callback) -- end,delay_time) -- else -- self.model:SetChangeSceneFlyTime(Status.NowTime) -- main_role:DoTransfer(self.model.next_fly_pos, 1,self.fly_data.callback) -- end -- else if need_delay then main_role:SetModelHideFlag(SceneObj.ModelHideFlag.ServerHide, true) setTimeout(function () local main_role = Scene.Instance:GetMainRole() if not main_role then return end self.model:SetChangeSceneFlyTime(Status.NowTime) main_role:SetModelHideFlag(SceneObj.ModelHideFlag.ServerHide, false) main_role:DoFlyShoeEffect(self.model.next_fly_pos, 1,self.fly_data.callback) end,delay_time) else self.model:SetChangeSceneFlyTime(Status.NowTime) main_role:DoFlyShoeEffect(self.model.next_fly_pos, 1,self.fly_data.callback) end -- end end self.model.next_fly_pos = nil end end GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE,onSceneStart2) local function click_fly_shoe() if not AutoFightManager:getInstance().fly_shoe_data then return end local fly_data = AutoFightManager:getInstance().fly_shoe_data -- PrintTable(fly_data) GlobalEventSystem:Fire(EventName.USE_FLY_SHOE,fly_data.scene_id,fly_data.x,fly_data.y,fly_data.callback) end GlobalEventSystem:Bind(EventName.CLICK_FLY_SHOE_BTN, click_fly_shoe) local function use_fly_shoe(scene_id,x,y,callback,is_free,not_check_door,is_task, auto_find) self:FlyToPos(scene_id, x, y,callback,is_free,not_check_door,is_task, auto_find) end GlobalEventSystem:Bind(EventName.USE_FLY_SHOE,use_fly_shoe) local success_return = function () self:MainRoleFly() end GlobalEventSystem:Bind(SceneEventType.REQUEST_USE_FLY_SHOE_RETURN, success_return) end --自动挂机时间,经验状态tips function AutoFightController:OpenAutoFightTipsView() if self.autoFightTips == nil then self.autoFightTips = AutoFightTips.New() end self.autoFightTips:Open() end --飞鞋请求 --is_free 是否免费使用飞鞋(某些玩法可以免费飞) function AutoFightController:FlyToPos(scene_id,x,y,callback,is_free,not_check_door,is_task, auto_find) local main_role = Scene.Instance:GetMainRole() if not main_role then return end local vo = {} vo.scene_id = scene_id if MapModel:getInstance():CanEnterScene(vo) == false then Message.show("场景暂未开放") return end if main_role:IsInState(PoseState.FLY_SHOE) then Message.show("使用飞鞋中") return end if not SceneManager:getInstance():IsCanUseFlyShoeScene() then Message.show("非主城和野外安全区,不能使用飞鞋") return end if main_role then local main_role_buff = main_role.buff_manager if main_role_buff:HasBuffControl() then Message.show("当前状态不能传送") return end end --三秒都没返回 才可以重新请求 if Status.NowTime - self.model.fly_require_time < 0.5 and not is_free then Message.show("飞鞋使用太频繁,请稍后再试") return end if not not_check_door then local door = Scene.Instance:GetExitByPoint(Scene.Instance:GetMainRole():GetLogicPos()) if door then Message.show("已经在传送点附近") return end end self.fly_data.scene_id = scene_id self.fly_data.x = x self.fly_data.y = y self.fly_data.callback = callback --如果数免费,就直接过去,不走后面的小飞鞋判断 if is_free then self:MainRoleFly(is_task, is_free, auto_find) return end local main_role_info = RoleManager.Instance.mainRoleInfo local number = GoodsModel.Instance:GetTypeGoodsNum(AutoFightManager.FlyGoodsID) if number <= 0 and (not VipModel:getInstance():CanFreeUseShoe()) then Message.show("小飞鞋不足,成为特权可免费传送哦!") return end -- GlobalEventSystem:Fire(SceneEventType.USE_FLY_SHOE) -- GlobalEventSystem:Fire(SceneEventType.USE_FLY_SHOE,scene_id,x,y) print("tanar: AutoFightController [285] =========== REQUEST_USE_FLY_SHOE", scene_id,x,y) GlobalEventSystem:Fire(SceneEventType.REQUEST_USE_FLY_SHOE, scene_id,x,y) -- GlobalEventSystem:Fire(SceneEventType.REQUEST_USE_FLY_SHOE_RETURN) end function AutoFightController:MainRoleFly(is_task, is_free, auto_find) if SceneManager:getInstance():IsRefineDungeon() then return end if not auto_find then OperateManager.Instance:StopMove(true) GlobalEventSystem:Fire(EventName.FINDWAY_ENDED) GlobalEventSystem:Fire(EventName.CLOSE_MAPPANEL_VIEW) end -- GlobalEventSystem:Fire(EventName.CLOSE_WORLD_MAP_VIEW) --开始飞 需要关掉的界面侦听该事件 -- GlobalEventSystem:Fire(EventName.SHOE_START_FLY) self.model.fly_require_time = Status.NowTime local scene_id = SceneManager.Instance:GetSceneId() local main_role = Scene.Instance:GetMainRole() if main_role:IsInState(PoseState.FLY_SHOE_EFFECT) then return end if not self.fly_data or not self.fly_data.x or not self.fly_data.y then return end local pos = co.Vector2(self.fly_data.x, self.fly_data.y) local distance = GameMath.GetDistance(pos.x, pos.y, main_role.real_pos.x, main_role.real_pos.y, true) print('Ych:AutoFightController.lua[382] data', distance) self.model.next_fly_pos = nil self.model.is_flying_shoe = true if self.fly_data.scene_id == scene_id then local start_height = Scene.Instance:GetZoneHeight(main_role.real_pos.x / SceneObj.LogicRealRatio.x,main_role.real_pos.y / SceneObj.LogicRealRatio.y) --起跳点的高度 local end_height = Scene.Instance:GetZoneHeight(pos.x / SceneObj.LogicRealRatio.x, pos.y / SceneObj.LogicRealRatio.y) --落地点的高度 if distance > FLY_SHOE_DISTANCE.ThreeJumpDistance or (end_height - start_height) > 5 or (start_height - end_height ) > 5 then ------------------------- --请注意SceneController.lua的SceneEventType.REQUEST_USE_FLY_SHOE事件绑定里面有同样的条件判断 --改这里注意顺便改SceneController.lua ------------------------- self.last_fly_pos = pos local second_callback = function( ... ) if pos.x == self.last_fly_pos.x and pos.y == self.last_fly_pos.y then if self.fly_data.callback then self.fly_data.callback() end local main_role = Scene.Instance:GetMainRole() if main_role and main_role.need_dead_after_fly_shoe then setTimeout(function () local main_role = Scene.Instance:GetMainRole() if main_role then main_role.need_dead_after_fly_shoe = false --这里需要重置下is_dead 因为之前可能变为true 导致进不去死亡状态 main_role.is_dead = false main_role:ForceDoDead() end end,0.1) end if TaskModel:getInstance().fly_end_need_task then TaskModel:getInstance().fly_end_need_task = nil GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK, true) end end end local first_callback = function() main_role:DoFlyShoeEffect(pos, 1, second_callback) setTimeout(function () local main_role = Scene.Instance:GetMainRole() if main_role then local x,y = main_role:GetRealPos() main_role:SetFollowObjShowState(true,SceneObj.ModelHideFlag.IndependentHide) end end,0.5) end main_role:SetFollowObjShowState(false,SceneObj.ModelHideFlag.IndependentHide) main_role:DoFlyShoeEffect(pos, 2, first_callback) else if distance < FLY_SHOE_DISTANCE.NormalMoveDistance then local findVo = FindVo.New() findVo.type = FindVo.POINT findVo.sceneId = self.fly_data.scene_id findVo.x = self.fly_data.x/ SceneObj.LogicRealRatio.x findVo.y = self.fly_data.y/ SceneObj.LogicRealRatio.y findVo.call_back = self.fly_data.callback GlobalEventSystem:Fire(EventName.FIND, findVo) else GlobalEventSystem:Fire(SceneEventType.TASK_MUL_JUMP, pos, self.fly_data.callback, nil, nil, true) end end else --传送类型(0服务端传送 1使用小飞鞋(包括免费)2场景出生点(不走传送门坐标) 3任务小飞鞋完全免费) local scene_id = self.fly_data.scene_id if scene_id ~= 0 then if is_free then --飞鞋类型3:完全免费 SceneController.Instance:requestChangeScene(scene_id, 0, 3, pos.x, pos.y) self.model.next_fly_pos = pos return end if is_task then --飞鞋类型3:完全免费 SceneController.Instance:requestChangeScene(scene_id, 0, 3, pos.x, pos.y) else SceneController.Instance:requestChangeScene(scene_id, 0, 1, pos.x, pos.y) end self.model.next_fly_pos = pos end end end function AutoFightController:GetFlyData( ) return self.fly_data end