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

411 regels
15 KiB

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