AutoFightManager= AutoFightManager or BaseClass(EventDispatcher)
|
|
|
|
local AutoFightManager = AutoFightManager
|
|
local math_random = math.random
|
|
|
|
AutoFightManager.CHANGE_AUTO_FIGHT_STATE = "CHANGE_AUTO_FIGHT_STATE"
|
|
AutoFightManager.CHANGE_AUTO_FIND_WAY_STATE = "CHANGE_AUTO_FIND_WAY_STATE"
|
|
AutoFightManager.UPDATE_EXPERIENCE_DATA = "UPDATE_EXPERIENCE_DATA" --更新自动挂机数据,历练经验时间
|
|
AutoFightManager.CLOSE_AUTO_FIGHT_TIP = "CLOSE_AUTO_FIGHT_TIP" --关闭挂机buff tips界面
|
|
|
|
|
|
|
|
AutoFightManager.TIME_GOODS = 240402 --时光卷轴
|
|
AutoFightManager.KAO_ROU = 230201 --神秘烤肉
|
|
|
|
AutoFightManager.FlyGoodsID = 102602 --飞鞋物品
|
|
|
|
function AutoFightManager:__init()
|
|
AutoFightManager.Instance=self
|
|
|
|
self.auto_fight_state = false--是否开启自动打怪
|
|
self.auto_find_way_state = false --是否在自动寻路状态,在挂机的过程中,自动寻路优先
|
|
|
|
-- 怪物列表
|
|
self.monsterList = nil
|
|
self.is_temp_mode = false --是否临时手动中
|
|
self.now_auto_fight_buff = nil --挂机buff数据
|
|
self.auto_fight_cache_pos = {x = 0, y = 0} --开启自动挂机的时候记录下位置
|
|
self.not_show_buy_alert = false --不提示购买烤肉
|
|
self.game_running = false
|
|
self.go_to_pos = nil --技能技能后摇没结束前的移动坐标
|
|
self.not_show_alert = false --本次登录是否不在显示开启10倍经验提醒界面
|
|
self.last_show_alert_bone_fire_id = nil --上次弹提醒界面对应的篝火id
|
|
self.auto_begin_x = 0 --记录开始挂机前的坐标
|
|
self.auto_begin_y = 0
|
|
|
|
self.next_fly_pos = nil --飞鞋位置
|
|
self.fly_require_time = 0 --上次使用飞鞋时间
|
|
self.fly_shoe_data = nil --飞鞋寻路数据
|
|
self.is_flying_shoe = false -- 正在使用小飞鞋
|
|
self.change_scene_fly_time = 0 --切场景使用飞鞋的时间
|
|
|
|
self.is_transfer_out = false --是否通过传送门传送走
|
|
end
|
|
|
|
function AutoFightManager:__delete()
|
|
|
|
end
|
|
|
|
function AutoFightManager:getInstance()
|
|
if AutoFightManager.Instance==nil then
|
|
AutoFightManager.New()
|
|
end
|
|
return AutoFightManager.Instance
|
|
end
|
|
|
|
function AutoFightManager:GetBeginAutoPos( )
|
|
return self.auto_begin_x, self.auto_begin_y
|
|
end
|
|
|
|
function AutoFightManager:SetBeginAutoPos( x, y )
|
|
self.auto_begin_x = x
|
|
self.auto_begin_y = y
|
|
end
|
|
|
|
--设置挂机配置里面选定的怪物
|
|
function AutoFightManager:SetMonsterList(val)
|
|
self.monsterList = val
|
|
end
|
|
|
|
--获取挂机配置的里面设定的怪物
|
|
function AutoFightManager:GetmonsterList()
|
|
return self.monsterList
|
|
end
|
|
|
|
--自动挂机状态,开启之后停止寻路
|
|
function AutoFightManager:SetAutoFightState(value)
|
|
if value ~= self.auto_fight_state then
|
|
self.auto_fight_state = value
|
|
GlobalEventSystem:Fire(AutoFightManager.CHANGE_AUTO_FIGHT_STATE)
|
|
end
|
|
end
|
|
|
|
--获取是否在自动挂机的状态值
|
|
function AutoFightManager:GetAutoFightState()
|
|
return self.auto_fight_state
|
|
end
|
|
|
|
--自动寻路状态,开启之后停止挂机
|
|
function AutoFightManager:SetAutoFindWayState(value)
|
|
if self.auto_find_way_state ~= value then
|
|
self.auto_find_way_state = value
|
|
GlobalEventSystem:Fire(AutoFightManager.CHANGE_AUTO_FIND_WAY_STATE)
|
|
end
|
|
end
|
|
|
|
--获取自动寻路状态值
|
|
function AutoFightManager:GetAutoFindWayState( )
|
|
return self.auto_find_way_state
|
|
end
|
|
|
|
--开始自动战斗
|
|
function AutoFightManager:StartAutoFight(not_save_cookies)
|
|
self:SetAutoFightState(true) -- 设置自动战斗状态为true
|
|
-- if not_save_cookies == nil or not_save_cookies == false then
|
|
-- self:SetAutoFightStateCookie(true)
|
|
-- end
|
|
end
|
|
|
|
-- 停止自动战斗
|
|
function AutoFightManager:StopAutoFight(not_save_cookies)
|
|
self:SetAutoFightState(false)
|
|
-- if not_save_cookies == nil or not_save_cookies == false then
|
|
-- self:SetAutoFightStateCookie(false)
|
|
-- end
|
|
end
|
|
|
|
--设置挂机cookie
|
|
function AutoFightManager:SetAutoFightStateCookie(bool)
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.AUTO_FIGHT_STATE, bool)
|
|
end
|
|
|
|
--获取挂机cookie
|
|
function AutoFightManager:GetAutoFightStateCookie()
|
|
return CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.AUTO_FIGHT_STATE)
|
|
end
|
|
|
|
--把挂机攻击优先状态保存入cookies
|
|
function AutoFightManager:SetAttackFirstCookies(_unLimit, _npcFirst, _roleFirst)
|
|
local list = {unLimit = _unLimit, npcFirst = _npcFirst, roleFirst = _roleFirst}
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.AUTO_FIGHT_ATTACK_FIRST_STATE, list)
|
|
end
|
|
|
|
--从cookies中获取挂机攻击优先状态
|
|
function AutoFightManager:GetAttackFirstCookies()
|
|
local state_list = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.AUTO_FIGHT_ATTACK_FIRST_STATE)
|
|
if state_list == nil then
|
|
return false, true, false
|
|
else
|
|
return state_list.unLimit, state_list.npcFirst, state_list.roleFirst
|
|
end
|
|
end
|
|
|
|
--把挂机中吃烤肉状态保存入cookies
|
|
function AutoFightManager:SetAutoEatCookies(_autoEat, _autoBuy)
|
|
local list = {autoEat = _autoEat, autoBuy = _autoBuy}
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.AUTO_EAT_STATE, list)
|
|
end
|
|
|
|
--从cookies中获取挂机中吃烤肉状态
|
|
function AutoFightManager:GetAutoEatCookies()
|
|
local state_list = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.AUTO_EAT_STATE)
|
|
if state_list == nil then
|
|
return true, false
|
|
else
|
|
return state_list.autoEat, state_list.autoBuy
|
|
end
|
|
end
|
|
|
|
function AutoFightManager:SetAutoFightBuff(data)
|
|
self.now_auto_fight_buff = data
|
|
self:Fire(AutoFightManager.UPDATE_EXPERIENCE_DATA)
|
|
|
|
self:ShowExperienceIcon(self.now_auto_fight_buff.time)
|
|
end
|
|
|
|
--是否吃了烤肉
|
|
function AutoFightManager:HaveBuff(buff_list)
|
|
if buff_list then
|
|
if #buff_list > 0 then
|
|
self:ShowExperienceIcon()
|
|
end
|
|
end
|
|
end
|
|
|
|
function AutoFightManager:ShowExperienceIcon(time)
|
|
GlobalEventSystem:Fire(EventName.UPDATE_BUFF_VIEW)
|
|
end
|
|
|
|
--保存下开始自动挂机的位置
|
|
function AutoFightManager:CacheAutoFightPos(x, y)
|
|
if Scene.Instance:GetMainRole() then
|
|
local real_x, real_y = Scene.Instance:GetMainRole():GetRealPos()
|
|
if real_x ~= 0 and real_y ~= 0 then
|
|
local x = x
|
|
local y = y
|
|
if x == nil or y == nil then
|
|
x = real_x
|
|
y = real_y
|
|
end
|
|
self.auto_fight_cache_pos.x = x
|
|
self.auto_fight_cache_pos.y = y
|
|
-- print("自动挂机记录下的坐标是==========:", x, y)
|
|
end
|
|
Scene.Instance:ClearLastAttack()
|
|
end
|
|
end
|
|
|
|
|
|
--判断技能是否是允许自动释放状态,默认是允许
|
|
function AutoFightManager:FindSkillIsAuto(id)
|
|
local is_auto = true
|
|
if self.auto_skill_list then
|
|
local result = self.auto_skill_list[id]
|
|
--只有手动取消勾选过的,才剔除
|
|
if result and result == 0 then
|
|
is_auto = false
|
|
end
|
|
return is_auto
|
|
end
|
|
|
|
self.auto_skill_list = self.auto_skill_list or {}
|
|
local is_auto = true
|
|
if SkillManager:getInstance():GetHitSkillVo() and id == SkillManager:getInstance():GetHitSkillVo().id and is_auto then --羁绊技能默认不自动勾选
|
|
is_auto = true
|
|
end
|
|
local auto_skill_list = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.AUTO_FIAGHT_SKILL_LIST)
|
|
|
|
if auto_skill_list then
|
|
for i,v in ipairs(auto_skill_list) do
|
|
self.auto_skill_list[v.id] = v.state and 1 or 0
|
|
if v.id == id then
|
|
is_auto = v.state
|
|
end
|
|
end
|
|
end
|
|
return is_auto
|
|
end
|
|
|
|
--保存自动挂机的技能设置
|
|
function AutoFightManager:SetAutoFightSkillList(id, state)
|
|
self.auto_skill_list = self.auto_skill_list or {}
|
|
if id then
|
|
local result = state and 1 or 0
|
|
self.auto_skill_list[id] = result
|
|
end
|
|
|
|
local auto_skill_list = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.AUTO_FIAGHT_SKILL_LIST)
|
|
local find = false
|
|
if auto_skill_list then
|
|
for i,v in ipairs(auto_skill_list) do
|
|
if v.id == id then
|
|
find = true
|
|
v.state = state
|
|
break
|
|
end
|
|
end
|
|
else
|
|
auto_skill_list = {}
|
|
end
|
|
if find == false then
|
|
local list = {}
|
|
list.id = id
|
|
list.state = state
|
|
table.insert(auto_skill_list, list)
|
|
end
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.AUTO_FIAGHT_SKILL_LIST, auto_skill_list)
|
|
CookieWrapper.Instance:WriteAll()
|
|
end
|
|
|
|
|
|
--获取优先攻击哪类目标
|
|
function AutoFightManager:GetTargetFirstAttack()
|
|
local unLimit, npcFirst, roleFirst = self:GetAttackFirstCookies()
|
|
if unLimit then
|
|
return Scene.FIND_TARGET_TYPE.all
|
|
end
|
|
if npcFirst then
|
|
return Scene.FIND_TARGET_TYPE.monster
|
|
end
|
|
if roleFirst then
|
|
return Scene.FIND_TARGET_TYPE.role
|
|
end
|
|
return Scene.FIND_TARGET_TYPE.all
|
|
end
|
|
|
|
--登录后设置为上次挂机状态
|
|
function AutoFightManager:SceneStartRestoreAutoState()
|
|
local state = self:GetAutoFightStateCookie()
|
|
if state == nil or state == false then
|
|
return false
|
|
end
|
|
return state
|
|
end
|
|
|
|
--挂机过程中,玩家点击地图或地面,保存下坐标,技能后摇结束后,前往该坐标
|
|
function AutoFightManager:CacheGoToPos(x, y, scene_id)
|
|
if x == nil and y == nil then
|
|
self.go_to_pos = false
|
|
else
|
|
self.go_to_pos = {x = x, y = y, scene_id = scene_id}
|
|
end
|
|
end
|
|
|
|
--根据玩家等级获取自动挂机的场景和怪物堆
|
|
function AutoFightManager:GetAutoFightSceneAndMonster(role_lv,scene_Id)
|
|
local target_cfg = nil
|
|
for i,v in ipairs(Config.ConfigWorldMon.AutoFightAera) do
|
|
if role_lv >= v.role_lv then
|
|
target_cfg = v
|
|
-- break
|
|
end
|
|
end
|
|
local scene_id = nil
|
|
local monster_id = nil
|
|
local pos = nil
|
|
if target_cfg then
|
|
if target_cfg.scene and #target_cfg.scene > 0 then
|
|
local rmd = scene_Id or target_cfg.scene[math_random(1, #target_cfg.scene)]
|
|
local cfg = Config.ConfigWorldMon.SceneMons[rmd]
|
|
local len = TableSize(cfg.mon_list)
|
|
if cfg and len > 0 then
|
|
scene_id = cfg.scene_id
|
|
local obj = {}
|
|
for k,v in pairs(cfg.mon_list) do
|
|
local tmp = {}
|
|
tmp.id = v.id
|
|
table.insert(obj, tmp)
|
|
end
|
|
local random_id = obj[math_random(1, len)].id
|
|
if random_id then
|
|
local heap_cfg = cfg.mon_list[random_id]
|
|
if heap_cfg and #heap_cfg.way_point > 0 then
|
|
monster_id = heap_cfg.id
|
|
pos = heap_cfg.way_point[math_random(1, #heap_cfg.way_point)]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return scene_id, monster_id, pos
|
|
end
|
|
|
|
--大多数活动,需要在安全区域和主城洛兰王国才能报名、参加活动,进入到活动场景
|
|
--在野外场景需要寻路到安全区
|
|
function AutoFightManager:FindSafePosAndGoActivity(call_back)
|
|
local real_pos_x, real_pos_y = Scene.Instance:GetMainRole():GetRealPos()
|
|
if SceneManager:getInstance():IsOutdoorScene() and not SceneManager:getInstance():IsSafePos(real_pos_x, real_pos_y) then
|
|
local birth_x, birth_y = SceneManager.Instance:GetSceneBirthPos()
|
|
if birth_x and birth_y then
|
|
Message.show("战斗状态不可参加,正寻路到安全区")
|
|
GlobalEventSystem:Fire(EventName.STOPAUTOFIGHT, false, true)--寻路要先切换掉自动挂机状态
|
|
if self.timer then
|
|
GlobalTimerQuest:CancelQuest(self.timer)
|
|
self.timer = nil
|
|
end
|
|
local main_role = Scene.Instance:GetMainRole()
|
|
if main_role and main_role:CanMove() then
|
|
self:GoFun(birth_x, birth_y, call_back)
|
|
else
|
|
local timer_func = function ()
|
|
if main_role and main_role:CanMove() then
|
|
self:GoFun(birth_x, birth_y, call_back)
|
|
if self.timer then
|
|
GlobalTimerQuest:CancelQuest(self.timer)
|
|
self.timer = nil
|
|
end
|
|
end
|
|
end
|
|
self.timer = GlobalTimerQuest:AddPeriodQuest(timer_func, 0.1, -1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function AutoFightManager:GoFun(birth_x, birth_y, call_back)
|
|
if birth_x and birth_y then
|
|
local findVo = FindVo.New()
|
|
findVo.type = FindVo.POINT
|
|
findVo.sceneId = SceneManager.Instance:GetSceneId()
|
|
findVo.id = 0
|
|
findVo.x = birth_x / SceneObj.LogicRealRatio.x
|
|
findVo.y = birth_y / SceneObj.LogicRealRatio.y
|
|
findVo.call_back = call_back
|
|
print("------野外场景的安全区-------", findVo.sceneId, findVo.x, findVo.y)
|
|
GlobalEventSystem:Fire(EventName.FIND,findVo)
|
|
|
|
if self.event_id then
|
|
GlobalEventSystem:UnBind(self.event_id)
|
|
self.event_id = nil
|
|
end
|
|
--脱离战斗状态5秒,允许进入活动
|
|
local quit_fun = function ()
|
|
if call_back then
|
|
call_back()
|
|
if self.event_id then
|
|
GlobalEventSystem:UnBind(self.event_id)
|
|
self.event_id = nil
|
|
end
|
|
call_back = nil
|
|
if findVo then
|
|
findVo.call_back = nil
|
|
end
|
|
end
|
|
end
|
|
self.event_id = GlobalEventSystem:Bind(EventName.QUIT_FIGHT_STATE, quit_fun)
|
|
end
|
|
end
|
|
|
|
|
|
function AutoFightManager:StartOutdoorXiuLian(scene_Id,monster_Id,position)
|
|
local scene_id, monster_id, pos = nil,nil,nil
|
|
|
|
if scene_Id and monster_Id and position then
|
|
scene_id, monster_id, pos = scene_Id,monster_Id,position
|
|
else
|
|
scene_id, monster_id, pos = AutoFightManager:getInstance():GetAutoFightSceneAndMonster(RoleManager.Instance.mainRoleInfo.level)
|
|
end
|
|
|
|
if scene_id and monster_id and pos then
|
|
local findVo = FindVo.New()
|
|
-- findVo.type = FindVo.MONSTER
|
|
findVo.type = FindVo.POINT
|
|
findVo.sceneId = scene_id
|
|
findVo.id = monster_id
|
|
findVo.x = pos.x / SceneObj.LogicRealRatio.x
|
|
findVo.y = pos.y / SceneObj.LogicRealRatio.y
|
|
findVo.call_type = FindVo.CallType.FiledGuaJi
|
|
print("-------随机挂机点-------", findVo.sceneId, findVo.id, findVo.x, findVo.y)
|
|
findVo.call_back = function ()
|
|
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
|
|
if RoleManager.Instance.mainRoleInfo.team_id == 0 then
|
|
local function ok()
|
|
GlobalEventSystem:Fire(EventName.OPEN_AROUND_TEAM_VIEW)
|
|
end
|
|
Alert.show("是否查看附近队伍加入挂机?",Alert.Type.One,ok)
|
|
end
|
|
end
|
|
if self.timer then
|
|
GlobalTimerQuest:CancelQuest(self.timer)
|
|
self.timer = nil
|
|
end
|
|
local main_role = Scene.Instance:GetMainRole()
|
|
if main_role and main_role:CanMove() then
|
|
GlobalEventSystem:Fire(EventName.FIND,findVo)
|
|
else
|
|
local timer_func = function ()
|
|
if main_role and main_role:CanMove() then
|
|
GlobalEventSystem:Fire(EventName.FIND,findVo)
|
|
if self.timer then
|
|
GlobalTimerQuest:CancelQuest(self.timer)
|
|
self.timer = nil
|
|
end
|
|
end
|
|
end
|
|
self.timer = GlobalTimerQuest:AddPeriodQuest(timer_func, 0.1, -1)
|
|
end
|
|
else
|
|
Message.show("您等级太高了,找不到合适的挂机区域")
|
|
end
|
|
end
|
|
|
|
--寻路的过程中,在战斗状态下不能切场景,
|
|
function AutoFightManager:FindVoCallTypeFun(_type)
|
|
if _type == FindVo.CallType.FiledGuaJi then --野外挂机
|
|
local call = function ()
|
|
self:StartOutdoorXiuLian()
|
|
end
|
|
self:FindSafePosAndGoActivity(call)
|
|
end
|
|
end
|
|
|
|
function AutoFightManager:SetFlyData(scene_id,x,y,callback)
|
|
if scene_id then
|
|
self.fly_shoe_data = {}
|
|
self.fly_shoe_data.scene_id = scene_id
|
|
self.fly_shoe_data.x = x
|
|
self.fly_shoe_data.y = y
|
|
self.fly_shoe_data.callback = callback
|
|
else
|
|
self.fly_shoe_data = nil
|
|
end
|
|
end
|
|
|
|
function AutoFightManager:SetChangeSceneFlyTime(time)
|
|
self.change_scene_fly_time = time
|
|
end
|
|
|
|
function AutoFightManager:GetChangeSceneFlyTime()
|
|
return self.change_scene_fly_time
|
|
end
|
|
|
|
--定点挂机指定坐标,否则取人物当前坐标为定点坐标
|
|
function AutoFightManager:SetFixedPointPos( tablexy )
|
|
self.fixed_point = tablexy
|
|
end
|
|
|
|
function AutoFightManager:GetFixedPointPos( )
|
|
return self.fixed_point
|
|
end
|
|
|