源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

491 行
15 KiB

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