源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

1705 rader
64 KiB

--[[
@description:任务模块
]]
require("game.task.TaskModel")
require("game.task.TaskNewBaseView")
require("game.task.TaskSubMainView")
require("game.task.TaskSubExtensionView")
require("game.task.TaskVerTabSubBtn")
require("game.task.TaskSubCommonView")
require("game.task.vo.TaskVo")
require("game.task.vo.TaskTipsVo")
require("game.task.TaskEvent")
require("game.task.TaskLang")
require("game.task.TaskFinishTipView")
require("game.task.TaskDailyView")
require("game.task.TaskDailyItem")
require("game.task.TaskBountyRewardView")
-------------------------
--新的
require("game.task.TaskCircleBuyTip")
require("game.task.FlyShoeBuyTip")
-------------------------
TaskController = TaskController or BaseClass(BaseController)
local TaskController = TaskController
local table_insert = table.insert
function TaskController:__init()
TaskController.Instance = self
self.taskModel = TaskModel:getInstance()
self.taskModel.after_scene_start = false
self:RegisterAllProtocals()
self:EnableCheckoutClear()
self:InitEvent()
end
function TaskController:RegisterAllProtocals()
self:RegisterProtocal(30000, "handler30000")--可接任务和已接任务列表
self:RegisterProtocal(30001, "handler30001")--完成任务某环节
self:RegisterProtocal(30005, "handler30005")--放弃任务
self:RegisterProtocal(30017, "handler30017")--已完成任务列表
self:RegisterProtocal(30018, "handler30018")--快速完成任务
self:RegisterProtocal(30019, "handler30019")--领取跑环额外奖励
end
function TaskController:InitEvent()
local open_task_view = function (index,task_id,parent_index,sub_index)
self:OpenTaskView(index,task_id,parent_index,sub_index)
end
GlobalEventSystem:Bind(EventName.OPEN_TASK_VIEW, open_task_view)
--场景开始了
local function loginComplete()
if self.taskModel.game_start_request == true then
self.taskModel.game_start_request = false
self.taskModel:HideRoleWeapon() --可能30000第一次返回的时候主角还没创建,场景开始后,主角一定创建了,这里再判断是否隐藏武器
end
end
GlobalEventSystem:Bind(SceneManager.START,loginComplete)
local game_start_fun = function ()
self.main_line_break_wait = nil
self.not_guide_wait_accept_main_task = nil
self.mark_main_line_list = nil
self.first_call_new_tip = nil
self.taskModel:ClearData()
setTimeout(
function()
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30012)
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30010, 6)
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30010, 7)
self:request30000()
end,0.6)
if self.auto_check_do_task_timer then
GlobalTimerQuest:CancelQuest(self.auto_check_do_task_timer)
self.auto_check_do_task_timer = nil
end
if self.can_move_timer_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.can_move_timer_id)
self.can_move_timer_id = false
end
self:ClearBreakLevelTimer()
end
GlobalEventSystem:Bind(EventName.GAME_START, game_start_fun)
local function onRequeseTaskData( )
self:request30000()
end
GlobalEventSystem:Bind(EventName.REQUEST_TASK_DATA, onRequeseTaskData)
local function CIRCLE_TASK_QUICK_FINISH( id )
self:request30018(id)
end
GlobalEventSystem:Bind(TaskEventType.CIRCLE_TASK_QUICK_FINISH, CIRCLE_TASK_QUICK_FINISH)
--@force_use_shoe:点击任务栏飞鞋按钮时强制使用飞鞋
local find_way_fun = function (params, use_shoe,force_use_shoe)
self:findElement(params,use_shoe,force_use_shoe)
end
GlobalEventSystem:Bind(EventName.WAYFINDING, find_way_fun)--寻路
local function loadComplete()
--必须npc加载完, 场景加载完,才能继续做任务
self.taskModel.proto_count = self.taskModel.proto_count + 1
self.delay_fly_down_to_do_task = false
if self.taskModel.proto_count >= 2 then
self.taskModel.proto_count = 0
self:ClearAutoDoTaskTimer()
if SceneManager:getInstance():IsMainCityorYieldScene() then
--切场景后自动寻路
print("tanar: [TaskController 117]=> self.taskModel.need_task: ",self.taskModel.need_task)
print("tanar: [TaskController 118]=> guide_force_do_task: ",guide_force_do_task)
local guide_force_do_task = GuideModel:getInstance().need_force_do_task --引导触发的自动任务
if self.taskModel.need_task or guide_force_do_task then
if guide_force_do_task then
GuideModel:getInstance().need_force_do_task = false
end
self.taskModel:SetNeedTaskFlag(false)
self.taskModel:SetTaskAutoFlag(false)
local onDelay = function( )
local mainRole = Scene.Instance:GetMainRole()
if mainRole and mainRole:IsInState(PoseState.FLY_SHOE_EFFECT) then
self.delay_fly_down_to_do_task = true
else
GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK, true)
end
end
setTimeout(onDelay, 1.1)
end
end
GlobalEventSystem:Fire(EventName.CAN_FIND_NPC)
end
end
GlobalEventSystem:Bind(EventName.NPC_LOAD_FINISH, loadComplete)
local function scene_load_view_complete( )
loadComplete()
--需要清掉标志,不然副本挂机会找不到怪
TaskModel:getInstance().need_check_monster = false
--如果不在安全场景或者也要,停止做任务 寻路也停掉,避免无法挂机
if not SceneManager:getInstance():IsMainCityorYieldScene() then
GlobalEventSystem:Fire(EventName.FORCE_STOP_DO_TASK)
else
if self.taskModel.need_show_circle_tip then
GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS,self.taskModel.need_show_circle_tip)
self.taskModel.need_show_circle_tip = false
end
if self.taskModel.wait_circle_show_award_data then
-- GlobalEventSystem:Fire(NatureModel.OPEN_AWARD_RESULT_VIEW, self.taskModel.wait_circle_show_award_data)
GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS, self.taskModel.wait_circle_show_award_data)
self.taskModel.wait_circle_show_award_data = false
end
end
if self.auto_check_do_task_timer then
GlobalTimerQuest:CancelQuest(self.auto_check_do_task_timer)
self.auto_check_do_task_timer = nil
end
end
GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, scene_load_view_complete)
local function doFlyShoeEffectFinishDown()
if self.delay_fly_down_to_do_task then
GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK, true)
self.delay_fly_down_to_do_task = false
end
end
GlobalEventSystem:Bind(SceneEventType.DO_FLYSHOE_EFFECT_FINISH_DOWN,doFlyShoeEffectFinishDown)
local function main_role_move_end()
self:CreateAutoDoTaskTimer()
end
GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_MOVE_END, main_role_move_end)
GlobalEventSystem:Bind(EventName.CREATE_MAIN_TASK_TIP, main_role_move_end)
--是否继续开始任务
local function reopen_fun(now)
print("-------START_AUTO-------------", self.taskModel.now_task_id, self.taskModel.is_stop)
-- local mainrole = Scene:getInstance():GetMainRole()
-- if mainrole and mainrole:IsInState(PoseState.FLY) or mainrole:IsInState(PoseState.FLY_SHOE_EFFECT) or mainrole:IsInState(PoseState.FLY_SHOE) then
-- -- Message.show("请落地后重试~")
-- if self.taskModel.is_auto_task and self.taskModel.is_stop then
-- local function task_load_scene_func( ... )
-- GlobalEventSystem:Fire(EventName.START_AUTO_DO_TASK)
-- end
-- self.task_load_scene_func = task_load_scene_func--任务场景加载完后调什么
-- self.task_load_scene_func_time = TimeUtil:getServerTime( )--事件时间
-- end
-- return
-- end--飞鞋状态下开始任务
if self.taskModel.is_auto_task and self.taskModel.is_stop then
local delay_fun = function ()
self.taskModel.is_stop = false
-- GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
self:AutoDoTask()
end
if now then
delay_fun()
else
self.later_time_id = GlobalTimerQuest:AddDelayQuest(delay_fun, 0.6)
end
end
end
GlobalEventSystem:Bind(EventName.START_AUTO_DO_TASK, reopen_fun)
--暂停自动寻路
local function close_fun()
-- local mainrole = Scene:getInstance():GetMainRole()
-- if mainrole and mainrole:IsInState(PoseState.FLY) or mainrole:IsInState(PoseState.FLY_SHOE_EFFECT) or mainrole:IsInState(PoseState.FLY_SHOE) then
-- -- Message.show("请落地后重试~")
-- if self.taskModel.is_auto_task and self.taskModel.is_stop then
-- if self.task_load_scene_func_time and self.task_load_scene_func_time <= TimeUtil:getServerTime( ) then--时间要满足先后顺序
-- self.task_load_scene_func = nil--任务场景加载完后调什么
-- self.task_load_scene_func_time = nil--事件时间
-- end
-- end
-- end--飞鞋状态下停止任务
self:ClearAutoDoTaskTimer()
self.taskModel.is_stop = true--停止任务标记
if not EscortModel:getInstance():IsEscortState() then--护送状态接着护送
OperateManager.Instance:StopMove(true) --先清掉当前场景的操作包,避免继续移动寻路
end
if self.later_time_id then
GlobalTimerQuest:CancelQuest(self.later_time_id)
self.later_time_id = nil
end
end
GlobalEventSystem:Bind(EventName.STOP_AUTO_DO_TASK, close_fun)
--不再做任务
local function stop_fun()
self:ClearAutoDoTaskTimer()
-- print("---------NOT_TASK---------:", self.taskModel.now_task_id, self.taskModel.is_stop)
TaskModel:getInstance():SetTaskAutoFlag(false)
local is_fire_evt = OperateManager.Instance:StopMove(true) --先清掉当前场景的操作包,避免继续移动寻路
if not is_fire_evt then
GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
end
end
GlobalEventSystem:Bind(EventName.FORCE_STOP_DO_TASK, stop_fun)
local do_first_task = function (force, is_force_main_line)
TaskModel:getInstance():SetTaskAutoFlag(true)
self.taskModel.is_stop = false
self:AutoDoTask(force, is_force_main_line)
end
GlobalEventSystem:Bind(EventName.FORCE_TO_DO_TASK, do_first_task)
local function onOpenTaskFinishView(show, task_type, task_id)
if show then
if self.TaskFinishTipView == nil then
self.TaskFinishTipView = TaskFinishTipView.New()
end
self.TaskFinishTipView:Open(task_type, task_id)
else
if self.TaskFinishTipView and self.TaskFinishTipView:HasOpen() then
self.TaskFinishTipView:Close()
end
end
end
GlobalEventSystem:Bind(EventName.OPEN_TASK_FINISH_TIP_VIEW, onOpenTaskFinishView)
local function onOpenTaskDailyView(show)
if show then
if self.TaskDailyView == nil then
self.TaskDailyView = TaskDailyView.New()
end
self.TaskDailyView:Open()
else
if self.TaskDailyView and self.TaskDailyView:HasOpen() then
self.TaskDailyView:Close()
end
end
end
GlobalEventSystem:Bind(EventName.OPEN_TASK_DAILY_VIEW, onOpenTaskDailyView)
local function onOpenTaskBountyRewardView(circle_num,is_close)
if is_close then
if self.TaskBountyRewardView and self.TaskBountyRewardView:HasOpen() then
self.TaskBountyRewardView:Close()
end
else
if GuideModel:getInstance():IsPromptViewOpen() or GuideModel:getInstance():IsHideSmallUI() then
return
end
if self.TaskBountyRewardView == nil then
self.TaskBountyRewardView = TaskBountyRewardView.New()
end
self.TaskBountyRewardView:Open(circle_num)
end
end
GlobalEventSystem:Bind(EventName.OPEN_TASK_BOUNTY_REWARD_VIEW, onOpenTaskBountyRewardView)
local function change_account()
if self.auto_check_do_task_timer then
GlobalTimerQuest:CancelQuest(self.auto_check_do_task_timer)
self.auto_check_do_task_timer = nil
end
self:ClearBreakLevelTimer()
end
GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT,change_account)
GlobalEventSystem:Bind(EventName.CHANGE_ROLE,change_account)
local function onShowBreakLevelTimer()
self:ClearBreakLevelTimer()
if SceneManager:getInstance():IsMainCityorYieldScene() then
local function onTimer()
local main_role = Scene.Instance.main_role
if main_role and main_role.stand_init_time > 25 then
if self.taskModel.showExtendTip then
GuideModel:getInstance():TriggerBreakLevelGuide()
self:ClearBreakLevelTimer()
end
end
end
self.show_break_level_timer = GlobalTimerQuest:AddPeriodQuest(onTimer,30)
end
end
self.taskModel:Bind(TaskEvent.SHOW_BREAK_LEVEL_TIMER, onShowBreakLevelTimer)
local function CONTINUE_TASK( task_type )
local circle_data = self.taskModel:GetCircleTaskInfo(task_type)
local task_data = self.taskModel:GetTaskByType( task_type )
if circle_data and (not task_data) then
if circle_data.task_type == TaskType.GUILD_LINE then
task_data = self.taskModel:GetGuildTipTask()
elseif circle_data.task_type == TaskType.BOUNTY_LINE then
task_data = self.taskModel:GetBountyTipTask()
end
end
-------------------------
if task_data then
local vip = RoleManager.Instance.mainRoleInfo.vip_flag
if vip > 0 and self.taskModel:IsShowFlyShoe(task_data) then
self.taskModel:TaskClickFun(task_data,true)
else
self.taskModel:TaskClickFun(task_data)
end
if task_type == TaskType.BOUNTY_LINE or task_type == TaskType.GUILD_LINE then
GlobalEventSystem:Fire(KfActivityModel.OPEN_ACTIVITY_BASE_VIEW,nil,nil,true)--触发任务关闭活动界面
end
else
if task_type == TaskType.GUILD_LINE then
local guild_id = RoleManager.Instance.mainRoleInfo.guild_id
if not guild_id or guild_id == 0 then
Message.show("请先加入社团")
end
end
end
end
self.taskModel:Bind(TaskEvent.CONTINUE_TASK, CONTINUE_TASK)
local function OPEN_QUICK_CIRCLE_TIPS( data )
self.taskcirclebuytip = self.taskcirclebuytip or TaskCircleBuyTip.New()
self.taskcirclebuytip:Open(data)
end
self.taskModel:Bind(TaskEvent.OPEN_QUICK_CIRCLE_TIPS,OPEN_QUICK_CIRCLE_TIPS)
local function OPEN_BUY_SHOE_TIPS( buy_call )
self.flyshoebuytip = self.flyshoebuytip or FlyShoeBuyTip.New()
self.flyshoebuytip:Open(buy_call)
end
self.taskModel:Bind(TaskEvent.OPEN_BUY_SHOE_TIPS,OPEN_BUY_SHOE_TIPS)
local function onGuildChange()
self:DoTaskNotify()
end
RoleManager:getInstance():GetMainRoleVo():BindOne("guild_id", onGuildChange)
end
function TaskController:ClearBreakLevelTimer()
if self.show_break_level_timer then
GlobalTimerQuest:CancelQuest(self.show_break_level_timer)
self.show_break_level_timer = nil
end
end
function TaskController:CheckAutoDoTaskTimer()
do return end
-- if self.auto_check_do_task_timer then
-- GlobalTimerQuest:CancelQuest(self.auto_check_do_task_timer)
-- self.auto_check_do_task_timer = nil
-- end
-- local playerLv = RoleManager:getInstance():GetMainRoleVo().level
-- if playerLv <= 120 and SceneManager:getInstance():IsMainCityorYieldScene() then
-- local function onTimer()
-- local playerLv = RoleManager:getInstance():GetMainRoleVo().level
-- if playerLv > 1 and playerLv <= 120 then
-- local main_role = Scene.Instance.main_role
-- if main_role and main_role.stand_init_time > 35 and lua_viewM.main_cancas_last_visible then
-- local taskVo = TaskModel:getInstance():GetTaskByType(TaskType.MAIN_LINE) or TaskModel:getInstance():GetTaskByType(TaskType.BOUNTY_LINE) or TaskModel:getInstance():GetBountyTipTask()
-- if taskVo then
-- TaskModel:getInstance().need_do_task_type = 0
-- TaskModel:getInstance().last_task_type_cache = false
-- TaskModel:getInstance().now_task_id = taskVo.id
-- GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK, true)
-- end
-- end
-- end
-- end
-- self.auto_check_do_task_timer = GlobalTimerQuest:AddPeriodQuest(onTimer,40)
-- end
end
--创建自动开始任务定时器
function TaskController:CreateAutoDoTaskTimer()
do return end
self:ClearAutoDoTaskTimer()
if self.taskModel.is_auto_task then
local playerLv = RoleManager:getInstance():GetMainRoleVo().level
if playerLv <= 120 then
local function func()
if self.taskModel.is_auto_task and Scene.Instance.main_role and Scene.Instance.main_role:IsInState(PoseState.STAND) then
if Scene.Instance.main_role.stand_init_time and Scene.Instance.main_role.stand_init_time > 4 then
self:AutoDoTask()
end
end
end
self.auto_do_timer = GlobalTimerQuest:AddDelayQuest(func, 5)
end
end
end
--自动开始任务 force 30000返回的时候,可能是接完支线,就算是打开界面的任务类型, 也自动做
function TaskController:AutoDoTask(force, is_force_main_line)
--if ClientConfig.alpha_mode then return end
self:ClearAutoDoTaskTimer()
self.taskModel.guild_kill_monster_num = 0
if Scene.Instance:IsSceneProloadFinish() then
if SceneManager.Instance:IsMainCityorYieldScene() then
local cur_task
if is_force_main_line then
cur_task = self.taskModel:GetMainTask()
else
cur_task = self.taskModel:GetCurTask()
end
print("Saber:TaskController [413] cur_task: ",cur_task)
print("tanar: [TaskController 419]=> is_force_main_line: ",is_force_main_line)
print("tanar: TaskController [386] ====== AutoDoTask parms: force = ", force)
print("not self.taskModel:IsWaitProto(): ",not self.taskModel:IsWaitProto())
print("self.taskModel:IsAutoDoTask(cur_task): ",self.taskModel:IsAutoDoTask(cur_task))
print("cur_task and cur_task.mainTip == false: ",cur_task and cur_task.mainTip == false)
print("self.taskModel.is_stop == false: ",self.taskModel.is_stop == false)
print("self.taskModel.now_task_id: ",self.taskModel.now_task_id)
print("not DialogueModel:getInstance().dialogue_is_open: ",not DialogueModel:getInstance().dialogue_is_open)
print("not GuideModel:getInstance():IsNeedFinishGuideFirst(): ", not GuideModel:getInstance():IsNeedFinishGuideFirst())
print("tanar: TaskController [395] ====== parms end")
if not self.taskModel:IsWaitProto() and (self.taskModel:IsAutoDoTask(cur_task) or force) and cur_task and cur_task.mainTip == false and self.taskModel.is_stop == false
and UserMsgAdapter:getInstance().is_game_connected and not DialogueModel:getInstance().dialogue_is_open and not GuideModel:getInstance():IsNeedFinishGuideFirst() then
--主线在等待升级的时候,不做任务,避免升级前去找开始npc,这个看网络
print("tanar: [TaskController 413]=> cur_task.type: ",cur_task.type)
if cur_task.type==TaskType.MAIN_LINE and TaskModel:getInstance().need_accept then
print("tanar: [TaskController 417]=> TaskModel:getInstance().need_accept: ",TaskModel:getInstance().need_accept)
return
end
if force and cur_task.tipParam and cur_task.tipParam[1] == TaskTipType.TYPE43 then
--主线强制force参数会绕过TaskModel:getInstance()IsAutoDoTask的判断,引起部分界面类任务和引导重叠,这边特殊处理掉
return
end
if cur_task.type == TaskType.TRUN_LINE then
local last_is_main_yield_scene = SceneManager.Instance:IsMainCityorYieldScene(SceneManager.Instance:GetLastSceneId())
local turn_task_needs_auto = self.taskModel:NeedAutoDoTurnTask(cur_task)
-- local rein_task_finished = cur_task.taskTips and cur_task.taskTips[1] and cur_task.taskTips[1].isFinish == 1
if ((self.delay_fly_down_to_do_task and not last_is_main_yield_scene) -- 防止在大世界切大世界场景也弹
or (not self.delay_fly_down_to_do_task)) and not turn_task_needs_auto then -- 不能自动进行的任务需要弹出任务窗口确认
-- and rein_task_finished then -- 转职任务不会自动执行,但切换场景进来的已完成转职任务的情况除外
local turn = ReincarnationModel:getInstance():GetCurTurn()
ReincarnationModel:getInstance():Fire(ReincarnationModel.OPEN_REIN_MAIN_TASK_VIEW, true, turn)
return
end
end
-- 从副本里出来后(失败或者主动退出),自动任务又要重新进这个副本,那就不要再进去了,改到61003控制
self.taskModel:TaskClickFun(cur_task)
end
end
else
self.taskModel.after_scene_start = true
end
end
--清除自动开始任务定时器
function TaskController:ClearAutoDoTaskTimer()
-- print("--------清除自动开始任务定时器-----")
if self.auto_do_timer then
GlobalTimerQuest:CancelQuest(self.auto_do_timer)
self.auto_do_timer = nil
end
end
-----------------协议相关---------------------
function TaskController:request30000()
self:Clear30000Timer()
self:SendFmtToGame(30000,"")
end
function TaskController:handler30000()
self.taskModel.notMain = true --没接有主线任务
local task_type = self:ReadFmt("c")
if task_type == 0 then
self.taskModel._canTaskList={}
self.taskModel._receivedTaskList={}
self.taskModel.all_task_list = {}
else
local list = self.taskModel._canTaskList
for i = #list, 1, -1 do
if list[i].type == task_type then
table.remove(list,i)
end
end
list = self.taskModel._receivedTaskList
for i = #list, 1, -1 do
if list[i].type == task_type then
table.remove(list,i)
end
end
list = self.taskModel.all_task_list
for i = #list, 1, -1 do
if list[i].type == task_type then
table.remove(list,i)
end
end
end
local len = self:ReadFmt("h")
for index = 1, len do
local taskVO=TaskVo.New(true, false)
taskVO.acceptType = 1
if taskVO.level and taskVO.level <= RoleManager.Instance.mainRoleInfo.level then
if not ClientConfig.alpha_mode or taskVO.type~=TaskType.EXTENSION_LINE then
self.taskModel:MakeTaskTip(taskVO)
table_insert(self.taskModel._canTaskList,taskVO)--保存可接任务vo
table_insert(self.taskModel.all_task_list, taskVO)
-------------------------
--非新手流程的时候,有可接取的主线,就不要等了,直接接
if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
if taskVO.type == TaskType.MAIN_LINE then
print('Ych:TaskController.lua[552] data', taskVO.id)
--GlobalEventSystem:Fire(TaskEventType.SEND_TASK_ACCEPT, taskVO.id)
if self.main_line_break_wait then
if not self.taskModel.sign_mask_not_guide_wait_accept_main_task then--完成任务导致升级的时候会从重合导致当前自动任务流程停止,用30004的标记处理掉
self.not_guide_wait_accept_main_task = true--非新手流程等主线任务更新,这次更新不要自动进行任务
end
self.auto_accept_main_id = taskVO.id--保存一下自动接的任务id,给30003协议返回用
else
--如果已经不是断层任务了,这个就不用了
self.not_guide_wait_accept_main_task = false
end
end
end
-------------------------
end
end
if taskVO.type == TaskType.MAIN_LINE and ((RoleManager.Instance.mainRoleInfo.level == 0) or (taskVO.level<=RoleManager.Instance.mainRoleInfo.level)) then
--20000比13001还快,这时候人物等级都木有
self.taskModel.notMain=false
end
end
local need_refresh_monster_name
local len4 = self:ReadFmt("h")
for index = 1, len4 do
local taskVO = TaskVo.New(true, true)
if not ClientConfig.alpha_mode or taskVO.type~=TaskType.EXTENSION_LINE then
taskVO.acceptType=0
self.taskModel:MakeTaskTip(taskVO)
table_insert(self.taskModel._receivedTaskList,taskVO)--保存已接任务vo
table_insert(self.taskModel.all_task_list, taskVO)
if taskVO.task_kind == TaskKind.CAI_JI_KIND then --采集任务,刷新采集怪的名字面板,有任务时才显示名字
need_refresh_monster_name = true
self.monster_content_id = taskVO.content_id
end
if taskVO.type == TaskType.MAIN_LINE then
self.taskModel.notMain = false
end
end
end
--可能只发了某个类型的过来。所以要全部判断下
if task_type > 0 then
local list = self.taskModel.all_task_list
for index,taskVO in pairs(list) do
if taskVO.type == TaskType.MAIN_LINE then
if taskVO.acceptType == 1 then
if ((RoleManager.Instance.mainRoleInfo.level == 0) or (taskVO.level <= RoleManager.Instance.mainRoleInfo.level)) then
self.taskModel.notMain = false
break
end
elseif taskVO.acceptType == 0 then
self.taskModel.notMain = false
break
end
end
end
end
self.taskModel.showExtendTip = self.taskModel:NeedShowExtendTip()
--当前任务做完后,马上做下一个主线任务
if RoleManager.Instance.mainRoleInfo.level <= TaskModel.AutoDoNewMainTaskLv then
local task_data = self.taskModel:GetMainUITaskData()
if not self.taskModel.now_task_id and task_data and task_data[1] and task_data[1].mainTip == false then
if task_data[1].id ~= self.taskModel.last_task_id_cache and task_data[1].type==TaskType.MAIN_LINE then --马上继续下一个任务
self.taskModel.now_task_id = task_data[1].id
end
end
end
if self.taskModel.need_do_task_type~=0 then
--马上做赏金或社团任务
local taskVo = self.taskModel:GetTaskByType(self.taskModel.need_do_task_type)
if taskVo then
TaskModel:getInstance():SetTaskAutoFlag(true)
TaskModel:getInstance().now_task_id = taskVo.id
end
self.taskModel.need_do_task_type = 0
else
if self.taskModel.last_task_type_cache then
if self.taskModel.last_task_type_cache==TaskType.BOUNTY_LINE then
--自动做
local taskVo = self.taskModel:GetTaskByType(TaskType.BOUNTY_LINE)
if taskVo then
self.taskModel.now_task_id = taskVo.id
end
--请求进度
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30010, TaskType.BOUNTY_LINE)
elseif self.taskModel.last_task_type_cache==TaskType.GUILD_LINE then
if RoleManager.Instance.mainRoleInfo.vip_flag >= Config.ConfigTaskEffect.guildAutoTaskVip then
local taskVo = self.taskModel:GetTaskByType(TaskType.GUILD_LINE)
if taskVo then
self.taskModel.now_task_id = taskVo.id
end
else
--vip不足,停止做任务
GlobalEventSystem:Fire(EventName.FORCE_STOP_DO_TASK)
end
--请求进度
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30010, TaskType.GUILD_LINE)
elseif self.taskModel.last_task_type_cache==TaskType.TRUN_LINE then
local taskVo = self.taskModel:GetTaskByType(TaskType.TRUN_LINE)
if taskVo then -- 存在任务时,根据上次完成转职任务的等级判断玩家是否处于卡级阶段,是则不自动进行转职任务
local is_in_turn_task_limit = self.taskModel:IsNewTurnTaskInLimitLv()
self.taskModel.now_task_id = not is_in_turn_task_limit and taskVo.id or false
else
self.taskModel.now_task_id = false
end
-- 2021年7月27日修改 转职任务转阶段不自动进行下一阶段
-- self.taskModel.now_task_id = false
end
end
end
if need_refresh_monster_name then
self.taskModel:RefreshCollectMonsterName(self.monster_content_id)
elseif self.monster_content_id then
local temp_content_id = self.monster_content_id
self.monster_content_id = false
self.taskModel:RefreshCollectMonsterName(temp_content_id)
end
self:HandleTask()
-------------------------
--self:CheckNewMainLineTip()--检查是否需要显示新主线
self:CheckWaitNewMainLineAccept()
-------------------------
end
function TaskController:HandleTask( )
self:ClearAutoDoTaskTimer()
self:Clear30000Timer()
local delay_fun = function()
if self.delay_id then
GlobalTimerQuest:CancelQuest(self.delay_id)
self.delay_id = nil
end
local function func()
local task = self.taskModel:GetTaskById(self.taskModel.now_task_id)
-------------------------
--96级之后不用主动优先主线
local auto_main_line = RoleManager.Instance.mainRoleInfo.level <= TaskModel.AutoDoNewMainTaskLv
-------------------------
if self.taskModel.notMain==true then
self.taskModel:DefaultTask()
if self.taskModel._nextMain then
table_insert(self.taskModel._canTaskList, self.taskModel._nextMain )
table_insert(self.taskModel.all_task_list, self.taskModel._nextMain)
end
end
-- self.taskModel:Fire(TaskEvent.TASK_LIST_INIT)
self:DoTaskNotify()
GlobalEventSystem:Fire(EventName.UPDATE_TASK_STATE)
local curTipType = 0 --当前环的任务类型
local lastTipType = 0 --上一环的任务类型
local task_id = 0
if task then
curTipType = task.tipType
lastTipType = task:GetLastTaskTipsType()
if curTipType == TaskTipType.TYPE59 then
self.taskModel.accept_power_task_id = task.id
end
if lastTipType == TaskTipType.TYPE59 then
--如果满足,则说明,战力任务领取的时候直接满足战力需求,继续做任务
if self.taskModel.accept_power_task_id ~= task.id then
lastTipType = 0
end
end
end
--当前环任务是战力引导任务,不自动做
--上一环任务是战力引导任务,不自动做(但是如果如果领到任务,已经满足战力引导任务,则需要自动做)
local can_do_task = curTipType ~= TaskTipType.TYPE59 and lastTipType ~= TaskTipType.TYPE59
--如果这次次战力提升的任务,要重置 断层做主线的标志
if not can_do_task and task and task.type == TaskType.MAIN_LINE and self.not_guide_wait_accept_main_task then
self.not_guide_wait_accept_main_task = false
end
if self.taskModel.first_receive and can_do_task then
--主线任务从无到有,需要自动做任务
if auto_main_line and self.taskModel.last_notMain and not self.taskModel.notMain then
self.not_guide_wait_accept_main_task = false
self:AutoDoTask(true, true)
return
elseif task and task.type ~= TaskType.LIMIT_LINE
and task.type ~= TaskType.PSIONIC_LINE then
if self.not_guide_wait_accept_main_task then
--非新手流程等主线任务更新,这次更新不要自动进行任务
self.not_guide_wait_accept_main_task = false
return
end
--限时任务不自动做 2020/5/9新增:圣物任务不自动做
-- 这里需要特殊处理转职任务,由于转职任务触发下面的函数会打开界面,因此要自动打开界面的前提必须是任务可完成
-- if task.type ~= TaskType.TRUN_LINE or
-- (task.type == TaskType.TRUN_LINE and task.taskTips and task.taskTips[1] and task.taskTips[1].isFinish == 1) then
-- (task.type == TaskType.TRUN_LINE and self.taskModel:NeedAutoDoTurnTask(task)) then
self:AutoDoTask(true)
-- end
else
self.not_guide_wait_accept_main_task = false
end
end
--登陆不自动任务
self.taskModel.first_receive = true
--记录一下之前是否没有主线,是的话,接取了新的主线之后就要自动做主线
self.taskModel.last_notMain = self.taskModel.notMain
end
func()
end
if not self.taskModel:IsWaitProto() then
self.delay_id = GlobalTimerQuest:AddDelayQuest(delay_fun, 0.2)
end
-- GlobalEventSystem:Fire(EventName.SET_REINCARNATION_ICON)
end
--延时做任务,让流程不那么急,但是接任务和完成任务要取消掉,避免延时出问题
function TaskController:Clear30000Timer()
if self.delay_time_id then
GlobalTimerQuest:CancelQuest(self.delay_time_id)
self.delay_time_id = nil
end
if self.delay_id then
GlobalTimerQuest:CancelQuest(self.delay_id)
self.delay_id = nil
end
if self.break_timer_id then
GlobalTimerQuest:CancelQuest(self.break_timer_id)
self.break_timer_id = nil
end
end
function TaskController:handler30001()
if self.timer_id then
GlobalTimerQuest:CancelQuest(self.timer_id)
self.timer_id = nil
end
if self.event_id then
GlobalEventSystem:UnBind(self.event_id)
self.event_id = nil
end
local a_taskId = self:ReadFmt("i")
local len = self:ReadFmt("h")
local ttable={}
local obj = nil
for index = 1, len do
obj = {
type = self:ReadFmt("h"),
isFinish = self:ReadFmt("h"),
id = self:ReadFmt("i"),
name = self:ReadFmt("s"),
count = self:ReadFmt("i"),
nowCount = self:ReadFmt("i"),
sceneId = self:ReadFmt("i"),
sceneName = self:ReadFmt("c"),
scene_x = self:ReadFmt("h"),
scene_y =self:ReadFmt("h"),
need_find_way = self:ReadFmt("c"),
additionalProperty = self:ReadFmt("s"),
stage = self:ReadFmt("c"),
}
ttable[index] = obj
end
local cur_stage = self:ReadFmt("c")
local target_num = self:ReadFmt("i")
local cur_num = self:ReadFmt("i")
local isComplete=false
local recData=self.taskModel._receivedTaskList
local need_req_task_list = true
for key, var in ipairs(recData) do
local taskVO=var
if taskVO.id == a_taskId then
local type = ttable[1] and ttable[1].type
if type == TaskTipType.TYPE0
or (type == TaskTipType.TYPE1 and (taskVO.type == TaskType.BOUNTY_LINE or taskVO.type == TaskType.GUILD_LINE or taskVO.type == TaskType.MAIN_LINE)) --支线不算完成,让玩家手动点击
or type == TaskTipType.TYPE2
or type == TaskTipType.TYPE9
or type == TaskTipType.TYPE16
or type == TaskTipType.TYPE18 then --杀怪或者采集
isComplete = cur_num==target_num --数量达到就是完成
print('Ych:TaskController.lua[844] data', isComplete)
end
--支线进度引导触发
if taskVO.id == 3150001 and cur_num == target_num then
GlobalEventSystem:Fire(EventName.TEST_HELP_STEP,HelpType.EXTENSION_LINE_TASK_FINISH)
end
--如果是社团的送新任务,则判读是否是都完成了
if taskVO.type == TaskType.GUILD_LINE and not isComplete and type == TaskTipType.TYPE7 then
local is_complete = true
for i,v in ipairs(ttable) do
if v.isFinish == 0 then
is_complete = false
break
end
end
isComplete = is_complete
print('Ych:TaskController.lua[861] data', isComplete)
end
--未完成的话就别请求新的任务列表
if not isComplete then
need_req_task_list = false
end
taskVO.taskTips=ttable
taskVO.cur_num = cur_num
taskVO.target_num = target_num
taskVO.cur_stage = cur_stage
-- self.taskModel:Fire(TaskEvent.TASK_LIST_INIT, false)
-- self.taskModel:Fire(TaskEvent.REFRESH_TASK_DATA, taskVO.id)
for i,v in ipairs(ttable) do
if v.type == TaskTipType.TYPE9 then --要结束采集,(以结束对话来结束)
GlobalEventSystem:Fire(EventName.CANCEL_NEXT_COLLECT)
end
end
--处理副本任务偶然的bug
if need_req_task_list and TaskModel:getInstance().need_task then
self:request30000()
need_req_task_list = false
end
print('Ych:TaskController.lua[888] data', isComplete)
if isComplete==true then
--重置状态
self.taskModel:ResetFlag()
if need_req_task_list and not TaskModel:getInstance().need_task then
self:request30000()
need_req_task_list = false
end
if taskVO.type == TaskType.BOUNTY_LINE then
GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS, TaskType.BOUNTY_LINE)
elseif taskVO.type == TaskType.GUILD_LINE then
print('Ych:TaskController.lua[887] data', cur_num, target_num, cur_stage)
PrintTable(taskVO)
if not ((type == TaskTipType.TYPE18 or type == TaskTipType.TYPE16) and cur_num == 0) then
GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS, TaskType.GUILD_LINE)
end
end
local is_turn_task_and_need_auto = false
-- 更新的是转职任务,则弹出任务窗口
if taskVO.type == TaskType.TRUN_LINE then
is_turn_task_and_need_auto = self.taskModel:NeedAutoDoTurnTask(taskVO)
-- if SceneManager.Instance:IsMainCityorYieldScene() and not is_turn_task_and_need_auto then -- 转职界面涉及到副本,副本内不要弹出界面
-- local turn = ReincarnationModel:getInstance():GetCurTurn()
-- ReincarnationModel:getInstance():Fire(ReincarnationModel.OPEN_REIN_MAIN_TASK_VIEW, true, turn)
-- end
end
--自动寻路
local _play_action = function()
if taskVO.type ~= TaskType.LIMIT_LINE -- 限时任务不自动做
and (taskVO.type ~= TaskType.TRUN_LINE or taskVO.type == TaskType.TRUN_LINE and is_turn_task_and_need_auto -- 非需自动的转职任务不自动做
) then
GlobalEventSystem:Fire(SceneEventType.SHOW_TASK, tonumber(taskVO.tipParam[3]))
end
if self.timer_id then
GlobalTimerQuest:CancelQuest(self.timer_id)
self.timer_id = nil
end
end
if isComplete == true and taskVO.need_find_way == 1 and taskVO.tipParam[2] and taskVO.tipParam[3] then
elseif taskVO.tipParam[1] and (taskVO.tipParam[1] == TaskTipType.TYPE7 or taskVO.tipParam[1] == TaskTipType.TYPE8
or taskVO.tipParam[1] == TaskTipType.TYPE9) then --不需要寻路完成的对话任务
if SceneManager:getInstance():IsSceneStart() then
local delay_call = function ()
_play_action()
end
if not self.timer_id then
self.timer_id = GlobalTimerQuest:AddDelayQuest(delay_call, 0.1)
end
else
local function complete_fun()
_play_action()
if self.event_id then
GlobalEventSystem:UnBind(self.event_id)
self.event_id = nil
end
end
if not self.event_id then
self.event_id = GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, complete_fun)
end
end
end
end
end
end
self:DoTaskNotify()
end
function TaskController:DoTaskNotify( )
--分时刷新
local function callback()
self.taskModel:Fire(TaskEvent.TASK_LIST_INIT)
end
local is_limit = false
if RoleManager.Instance.mainRoleInfo.level > 70 then
is_limit = true
end
if is_limit then
TimeManager.GetInstance():StartTime("TaskController_UpdateTaskProgress", 0.6, callback)
else
callback()
end
end
function TaskController:request30005(id)
self:SendFmtToGame(30005,"i", id)
end
function TaskController:handler30005()
local code = self:ReadFmt("i")
if code > 0 then
self:request30000()
end
end
function TaskController:handler30017( )
local len = UserMsgAdapter.ReadFmt("h")
local temp_list = {}
for i=1,len do
local id = UserMsgAdapter.ReadFmt("i")
temp_list[id] = id
end
self.taskModel:SetFinishTaskList(temp_list)
if ServerTimeController.Instance and ServerTimeController.Instance.open_init_eveny_can_fire then--是否可以发送任务完成列表协议
ServerTimeController.Instance.open_init_eveny_can_fire = false
GlobalEventSystem:Fire(EventName.OPEN_DAY_INIT)
end
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.ON_FINISHED_TASK_DATA_RECEIVED)
end
function TaskController:request30018(id)
self:SendFmtToGame(30018,"i", id)
end
function TaskController:handler30018( )
local code = self:ReadFmt("i")
if code == 3000008 then
-- if self.taskModel.opening_circle_buy_tip then
-- self.taskModel.wait_circle_buy_tip_close = true
-- end
self:request30000()
else
ErrorCodeShow(code)
end
end
function TaskController:handler30019( )
local code = self:ReadFmt("i")
local task_type = self:ReadFmt("c")
local reward_progress = self:ReadFmt("c")
if code == 1 then
local info = DeepCopy(TaskModel:getInstance():GetCircleTaskInfo(task_type))
if info then
info.reward_progress = reward_progress
self.taskModel:SetCircleTaskInfo( info )
--改需求了,直接关界面
-- GlobalEventSystem:Fire(EventName.REFRESH_TASK_CIRCLE_TIPS)
-- self:DoTaskNotify()
else
DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30010, task_type)
end
GlobalEventSystem:Fire(EventName.CLOSE_TASK_CIRCLE_TIPS)
else
ErrorCodeShow(code)
end
end
--任务寻路
--2020年2月19日调整修改--force_use_shoe:点击任务栏飞鞋按钮时强制使用飞鞋
function TaskController:findElement(param, use_shoe, force_use_shoe)
local use_shoe = false
local level = RoleManager.Instance.mainRoleInfo.level
if level >= Config.ConfigTaskEffect.GuideLevel then
if VipModel:getInstance():CanFreeUseShoe() then
use_shoe = true
else
local is_auto_use_shoe = lua_settingM:GetAutoFlyShoeSet()
if force_use_shoe or is_auto_use_shoe then
local num = GoodsModel:getInstance():GetTypeGoodsNum(AutoFightManager.FlyGoodsID)
use_shoe = num > 0
end
end
end
if self.can_move_timer_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.can_move_timer_id)
self.can_move_timer_id = false
end
if self.fly_timer_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.fly_timer_id)
self.fly_timer_id = false
end
local array=Split(param,",")
if Config.ConfigTaskEffect.NeedClickTaskType[tonumber(array[1])] then
--点击判断是否已经完成任务,是的话发协议完成任务
local task = TaskModel:getInstance():GetTaskById(tonumber(array[4]))
if self.taskModel:IsNeedClickTask(task) then
local tip = self.taskModel:GetExtendSpecialTip(task)
if tip and tip.isFinish==1 then
GlobalEventSystem:Fire(TaskEventType.SEND_TASK_FINISH, task.id)
return
end
end
end
-- if array and #array > 0 and self.taskModel:NeedFindWayTask(tonumber(array[1])) then
-- local main_role = Scene.Instance:GetMainRole()
-- if main_role and main_role:CanMove() then
-- print("Saber:TaskController [start:814] ------------------------------------------")
-- else
-- local timer_func = function ()
-- local main_role = Scene.Instance:GetMainRole()
-- if main_role and main_role:CanMove() then
-- if self.can_move_timer_id then
-- TimerQuest.CancelQuest(GlobalTimerQuest, self.can_move_timer_id)
-- self.can_move_timer_id = false
-- end
-- self:findElement(param,use_shoe)
-- local task = self.taskModel:GetTaskById(tonumber(array[4]))
-- if self.taskModel:IsAutoDoTask(task) then
-- GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT,false,true)
-- end
-- return
-- end
-- end
-- self.can_move_timer_id = TimerQuest.AddPeriodQuest(GlobalTimerQuest, timer_func, 0.01, -1)
-- return
-- end
-- end
if Scene.Instance:HasDropPick() and AutoFightManager:getInstance():GetAutoFightState()
and not use_shoe then
Scene.Instance.need_task_after_pick = true
return
end
local params={}
if #array>0 then
self.taskModel.need_check_monster = false
local findVo = FindVo.New()
findVo.type = -1
local type=tonumber(array[1])
findVo.sceneId = tonumber(array[2])
local sceneId=tonumber(array[2])
local npcId=0
if type == TaskTipType.TYPE0 or type == TaskTipType.TYPE7 or type == TaskTipType.TYPE8 or type == TaskTipType.TYPE9 or type == TaskTipType.TYPE35 or type == TaskTipType.TYPE38 then --NPC
if tonumber(array[3]) == 0 then --自言自语
GlobalEventSystem:Fire(SceneEventType.SHOW_TASK, tonumber(array[3]))
return
else
findVo.type = FindVo.NPC
findVo.id = tonumber(array[3])
local scene_info = SceneManager.Instance:GetSceneInfo(findVo.sceneId)
print("---------find npc-------:", findVo.id, findVo.sceneId, scene_info)
if scene_info == nil then
print("tanar: TaskController [949] npc scene_info is nil")
return
end
--用小飞鞋,查找数据库获得npc坐标, 如果不需要用则不查数据库
if use_shoe or findVo.sceneId ~= SceneManager.Instance:GetSceneId() then
local item = ConfigItemMgr.Instance:GetSceneItem(findVo.sceneId)
if item and item.Npcs then
local npc = item.Npcs[findVo.id]
if npc then
findVo.x = npc.x/ SceneObj.LogicRealRatio.x
findVo.y = npc.y/ SceneObj.LogicRealRatio.y
end
end
else
local npc = SceneManager.Instance:GetNpcVo(findVo.id) --npc寻路,只有npc和主角在同一场景才有位置值
print("---------npc-is nil ?------:", npc)
if npc then
findVo.x = npc.logic_x
findVo.y = npc.logic_y
else
print("找不到npc", findVo.id)
end
end
end
elseif type == TaskTipType.TYPE1 or type == TaskTipType.TYPE18 then --怪物/采集/收集任务
findVo.type = FindVo.MONSTER
findVo.id = tonumber(array[3])
local task_id = tonumber(array[4])
findVo.need_check_monster = true
if #array == 6 or #array == 7 then
findVo.x=tonumber(array[5]) / SceneObj.LogicRealRatio.x
findVo.y=tonumber(array[6]) / SceneObj.LogicRealRatio.y
end
if TaskModel:getInstance().now_task_id then
--(注意,一般采集任务不会进这里,因为采集物没有配置random_pos,会走到FindVo.MONSTER)
local random_logic_pos, random_real_pos, ignore_rush = TaskModel:getInstance():GetTaskMonsterRandomPos(findVo.id, sceneId)
if random_logic_pos then --随机一堆怪物,解决玩家分流问题
--没有飞鞋的时候,打怪任务要走冲刺逻辑
if not ignore_rush and not use_shoe and type == TaskTipType.TYPE1 then
local monster = Scene.Instance:FindNearestMonster(findVo.id, false, false)
if monster then
Scene.Instance:MainRoleAttackMonster(monster)
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
return
else
if findVo.sceneId == SceneManager.Instance:GetSceneId() then
GlobalEventSystem:Fire(EventName.STOPAUTOFIGHT)
Scene.Instance:MainRoleRushToPos(random_real_pos)
return
end
end
end
local function point_call_back( )
self.taskModel.task_cache_pos = nil
--打怪任务
if type == TaskTipType.TYPE1 then
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
--采集任务
elseif type == TaskTipType.TYPE18 then
self.try_collect_left_num = 6--采集物未创建的话,每隔一段时间尝试一下,6次就够了
local try_to_collect = nil--必须这么写
try_to_collect = function ( )
local monster = Scene.Instance:FindNearestMonster(findVo.id, false, true)
if monster then
local main_role = Scene.Instance.main_role
if main_role then
if self.task_collect_start_real_pos == nil then
self.task_collect_start_real_pos = co.TableXY(main_role:GetRealPos())
else
self.task_collect_start_real_pos.x = main_role.real_pos.x
self.task_collect_start_real_pos.y = main_role.real_pos.y
end
if self.task_collect_end_real_pos == nil then
self.task_collect_end_real_pos = co.TableXY(monster:GetRealPos())
else
self.task_collect_end_real_pos.x = monster.real_pos.x
self.task_collect_end_real_pos.y = monster.real_pos.y
end
main_role:SetDirection(self.task_collect_start_real_pos, self.task_collect_end_real_pos, true , true)
end
EventSystem.Fire(GlobalEventSystem,EventName.OPEN_COLLECT_VIEW, monster.id, monster:GetVo().type_id, monster:GetVo().pick_time)
else
self.try_collect_left_num = self.try_collect_left_num - 1
--此时采集物可能还未创建,所以延迟一段时间再尝试
if not self.delay_collect_id and self.try_collect_left_num >= 0 then
self.delay_collect_id = GlobalTimerQuest:AddPeriodQuest(try_to_collect, 0.5, 1)
end
end
end
try_to_collect()
end
end
findVo.find_range = 0
-- findVo.find_range = 1
-- if type == TaskTipType.TYPE1 then
-- findVo.find_range = 3
-- end
findVo.x = random_logic_pos.x
findVo.y = random_logic_pos.y
findVo.type = FindVo.POINT
findVo.call_back = point_call_back
end
end
elseif type == TaskTipType.TYPE6 then --收集任务配置的是物品id,直接打怪就行了
local function call_back( )
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
end
findVo.type = FindVo.POINT
local task_id = tonumber(array[4])
if task_id and Config.ConfigWorldMon.CollectTask[task_id] then
local collect_task_id = self.taskModel:GetCollectTaskId()
if collect_task_id and collect_task_id == task_id then
findVo.x = self.collect_task_pos.x
findVo.y = self.collect_task_pos.y
self.taskModel:ClearCollectTaskId()
else
local data = Config.ConfigWorldMon.CollectTask[task_id]
local index = math.random(1,#data.way_point)
local pos = data.way_point[index]
findVo.x = pos.x / SceneObj.LogicRealRatio.x
findVo.y = pos.y / SceneObj.LogicRealRatio.y
self.taskModel:SetCollectTaskId(task_id)
self.collect_task_pos = {x = findVo.x,y = findVo.y}
end
else
findVo.x=tonumber(array[5]) / SceneObj.LogicRealRatio.x
findVo.y=tonumber(array[6]) / SceneObj.LogicRealRatio.y
end
findVo.call_back = call_back
elseif type == TaskTipType.TYPE16 then --探索场景
findVo.type = FindVo.Explore
findVo.sceneId = tonumber(sceneId)
local x = tonumber(array[3])
local y = tonumber(array[4])
findVo.x = x / SceneObj.LogicRealRatio.x
findVo.y = y / SceneObj.LogicRealRatio.y
findVo.time = tonumber(array[5])
findVo.call_back = function ()
GlobalEventSystem:Fire(TaskEventType.TASK_QUEST)
end
elseif type == TaskTipType.TYPE2 or type == TaskTipType.TYPE37 or type == TaskTipType.TYPE29 then --通关副本
local task_id = tonumber(array[4])
if task_id and task_id == BossModel.FAKE_MONEY_BOSS_TASK_ID then
GlobalEventSystem:Fire(EventName.OPEN_BOSS_VIEW,Config.ConfigBoss.ModuleId.Money)
return
end
local config = Config.Dungeoncfg[tonumber(array[3])]
if config and config.type == BaseDungeonModel.DUN_TYPE.PersonBoss then
--专属幻魔
local boss_id = false
for k,v in pairs(Config.Personalbossinfo) do
if v.dun_id == tonumber(array[3]) then
boss_id = v.boss_id
end
end
GlobalEventSystem:Fire(EventName.OPEN_BOSS_VIEW,Config.ConfigBoss.ModuleId.Person,boss_id)
return
end
local task = TaskModel:getInstance():GetTaskById(task_id)
if task then
local open_ui_task = Config.ConfigTaskEffect.OpenUITask[task_id]
if task.type == TaskType.EXTENSION_LINE or open_ui_task then
--支线特殊处理
local is_open_view = tonumber(array[2])==0
if is_open_view or open_ui_task then
--打开副本界面 根据副本id
local cfg = Config.Dungeoncfg[tonumber(array[3])]
if cfg then
if tonumber(cfg.type) == BaseDungeonModel.DUN_TYPE.PersonBoss then
OpenFun.Open(460,1)
else
local dungeon_type = tonumber(cfg.type)
if BaseDungeonModel.DungeonSingleType[dungeon_type] then
if dungeon_type == BaseDungeonModel.DUN_TYPE.MATERIAL then
local open_key = cfg.id - 900 --没有字段区分是哪一个进阶副本,先写死id
if open_key and open_key >= 101 and open_key <= 108 then
OpenFun.Open(610, open_key)
else
OpenFun.Open(610, dungeon_type)
end
else
OpenFun.Open(610, dungeon_type)
end
else
OpenFun.Open(215, BaseDungeonModel.DungeonTeamType[dungeon_type])
end
end
return
end
else
--直接进入副本
setTimeout(
function()
local config = Config.Dungeoncfg[tonumber(array[3])]
if config and config.enter_type == 1 then
local main_role = Scene.Instance.main_role
if main_role then
local enter_dir_angle = main_role:GetDirectionAngle()
RoleManager:getInstance():SetEnterDirAngle(enter_dir_angle)
end
end
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61001, tonumber(array[3])) end,0.3)
return
end
else
local dun_id = tonumber(array[3])
local time = 0.3
if dun_id == GuideModel.CHANGE_GOD_SCENE_ID then
time = 1
end
local function on_delay_enter_dungeon()
local config = Config.Dungeoncfg[tonumber(array[3])]
if config and config.enter_type == 1 then
local main_role = Scene.Instance.main_role
if main_role then
local enter_dir_angle = main_role:GetDirectionAngle()
RoleManager:getInstance():SetEnterDirAngle(enter_dir_angle)
end
end
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61001, dun_id)
end
--主线任务无缝加载,距离太远的话要校正一下坐标,先走到策划配置的点再进入副本
local temp_limit_cfg = Config.ConfigChangeSceneEffect.DungeonLimit[dun_id]
local need_reset_pos = false
if temp_limit_cfg then
local target_pos = temp_limit_cfg.enter_pos
local cur_scene_id = SceneManager:getInstance():GetSceneId()
local dun_scene_id = Config.Dungeoncfg[dun_id].scene_id
if dun_scene_id == cur_scene_id then
--已经在副本场景里了,则自动战斗
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT,false,true)
return
else
--走小飞鞋寻路
findVo.type = FindVo.POINT
findVo.dunSceneId = dun_scene_id
findVo.sceneId = tonumber(temp_limit_cfg.enter_scene_id)
local x = tonumber(target_pos.x)
local y = tonumber(target_pos.y)
findVo.x = x / SceneObj.LogicRealRatio.x
findVo.y = y / SceneObj.LogicRealRatio.y
local range = temp_limit_cfg.work_min_distance/100
range = range > 1 and range or 0
findVo.range = range
findVo.call_back = on_delay_enter_dungeon
end
else
--正常情况是这里进入副本
setTimeout(on_delay_enter_dungeon, time)
--自动做的任务, 打完回来要继续
TaskModel:getInstance():SetNeedTaskFlag(true)
return
end
end
end
-- elseif type == TaskTipType.TYPE25 then --五转 点亮星格
-- GlobalEventSystem:Fire(EventName.OPEN_REINCARNATION_VIEW)
-- return
elseif type == TaskTipType.TYPE51 then --解锁地狱摩托
OpenFun.Open(114, 0)
return
elseif type == TaskTipType.TYPE100 then --击杀BOSS
GlobalEventSystem:Fire(EventName.OPEN_BOSS_VIEW, tonumber(array[3]))
return
elseif type == TaskTipType.TYPE101 then --强化装备
OpenFun.Open(152, 1)
return
elseif type == TaskTipType.TYPE102 then --完成某类型副本
if tonumber(array[3]) == BaseDungeonModel.DUN_TYPE.PersonBoss then
OpenFun.Open(460,1)
elseif BaseDungeonModel.DungeonTeamType[tonumber(array[3])] then
DunManyModel:getInstance():Fire(DunManyModel.OPEN_DUN_MANY_HALL_VIEW,tonumber(array[3]))
else
BaseDungeonModel:GetInstance():Fire(BaseDungeonModel.OPEN_HALL_VIEW,tonumber(array[3]))
end
return
elseif type == TaskTipType.TYPE103 then --单次副本获得x经验
BaseDungeonModel:getInstance():OpenViewByDunType(tonumber(array[3]))
return
elseif type == TaskTipType.TYPE104 then --添加好友
GlobalEventSystem:Fire(EventName.OPEN_SOCIALITY_VIEW)
setTimeout(function ()
GlobalEventSystem:Fire(EventName.OPEN_SOCIALITY_VIEW, 2)
end,0.15)
return
elseif type == TaskTipType.TYPE105 then --加入社团
OpenFun.Open(400, 0)
-- GlobalEventSystem:Fire(EventName.OPEN_GUILD_APPLY_VIEW)
return
elseif type == TaskTipType.TYPE106 then --社团装备回收
if RoleManager.Instance.mainRoleInfo.level >= Config.ConfigOpenLv.EquipSwallow then
GlobalEventSystem:Fire(EventName.OPEN_PET_SWALLOW_VIEW)
else
Message.show("熔炼功能" .. Config.ConfigOpenLv.EquipSwallow .."级开启哦")
end
return
elseif type == TaskTipType.TYPE107 then --完成社团活动
if RoleManager.Instance.mainRoleInfo.guild_id>0 then
local contentId = tonumber(array[3])
OpenFun.Open(402, contentId)
else
Message.show("请先加入一个社团")
end
return
elseif type == TaskTipType.TYPE108 then --捐献一件装备到社团仓库
-- if RoleManager.Instance.mainRoleInfo.guild_id>0 then
-- if GuildModel:getInstance():GetGuildBuildLvInfo(GuildModel.GUILD_DEPOT) == 0 then
-- Message.show("暂时未开启此建筑")
-- else
-- GlobalEventSystem:Fire(EventName.OPEN_GUILD_MAIN_VIEW, 3)
-- end
-- else
-- Message.show("请先加入一个社团")
-- end
return
elseif type == TaskTipType.TYPE109 then --在市场上购买1个商品
GlobalEventSystem:Fire(EventName.OPEN_MARKET_VIEW, 1)
return
elseif type == TaskTipType.TYPE110 then --在市场上架1个物品
GlobalEventSystem:Fire(EventName.OPEN_MARKET_VIEW, 3)
return
elseif type == TaskTipType.TYPE23 then --合成物品
--合成按钮跳转
local type_id = tonumber(array[3])
ComposeModel.Instance:TryComposeJump(type_id)
return
elseif type == TaskTipType.TYPE24 then --活跃度
GlobalEventSystem:Fire(ActivityIconManager.SHOW_LEAD_EFFECT,157)
return
elseif type == TaskTipType.TYPE26 then --吞噬
if RoleManager.Instance.mainRoleInfo.level >= Config.ConfigOpenLv.EquipSwallow then
GlobalEventSystem:Fire(EventName.OPEN_PET_SWALLOW_VIEW)
else
Message.show("熔炼功能" .. Config.ConfigOpenLv.EquipSwallow .."级开启哦")
end
return
elseif type == TaskTipType.TYPE27 then --击杀首领
local kill_type = tonumber(array[2])
local monster_id = tonumber(array[3])
if monster_id and kill_type then
local boss_type = TaskModel.TYPE27_KILL_TYPE[kill_type]
GlobalEventSystem:Fire(EventName.OPEN_BOSS_VIEW, boss_type, monster_id)
end
return
elseif type == TaskTipType.TYPE28 then --钓鱼之路
GlobalEventSystem:Fire(EventName.OPEN_SKILL_VIEW,4,1,true)
return
elseif type == TaskTipType.TYPE111 then --击杀首领
local dun_id = tonumber(array[3])
if dun_id then
local config = Config.Dungeoncfg[dun_id]
if config then
if config.type == 20 then --"宝石副本"
OpenFun.Open(610,37)
elseif config.type == 21 then -- "神格副本"
OpenFun.Open(610,23)
elseif config.type == 5 then -- "装备副本"
OpenFun.Open(610,32)
end
end
end
return
elseif type == TaskTipType.TYPE36 then --装备附能
OpenFun.Open(152,5)
return
elseif type == TaskTipType.TYPE39 then --装备升星
OpenFun.Open(152,2)
return
elseif type == TaskTipType.TYPE31 then --竞技场次数
OpenFun.Open(280,0)
return
elseif type == TaskTipType.TYPE40 then --商城购买
local shop_key_id = tonumber(array[2])
local temp_cfg = Config.Shop[shop_key_id]
local show_open_effect = true--针对一些特别的显示特效不显示tip
if show_open_effect then
GlobalEventSystem:Fire(EventName.OPEN_SHOP_VIEW, temp_cfg.shop_type, temp_cfg.sub_type, temp_cfg.goods_id, nil,true)
else
GlobalEventSystem:Fire(EventName.OPEN_SHOP_VIEW, temp_cfg.shop_type, temp_cfg.sub_type, temp_cfg.goods_id, true)
end
return
elseif type == TaskTipType.TYPE34 then --进入某类副本
local dungeon_type = tonumber(array[3])
if BaseDungeonModel.DungeonSingleType[dungeon_type] then
OpenFun.Open(610, dungeon_type)
else
OpenFun.Open(215, BaseDungeonModel.DungeonTeamType[dungeon_type])
end
return
elseif type == TaskTipType.TYPE41 or type == TaskTipType.TYPE42 then --好友送礼/好友亲密度
OpenFun.Open(140, 1)
return
elseif type == TaskTipType.TYPE43 then --进阶系统升级
OpenFun.Open(146,tonumber(array[3]))
return
elseif type == TaskTipType.TYPE56 then --进阶目标(进阶到一定阶数)
OpenFun.Open(146,tonumber(array[3]))
return
elseif type == TaskTipType.TYPE44 then --升品之路
OpenFun.Open(414, 0)
return
elseif type == TaskTipType.TYPE45 then --唤神升级
OpenFun.Open(173, 1)
return
elseif type == TaskTipType.TYPE46 then --星辰升级
OpenFun.Open(148,1)
return
elseif type == TaskTipType.TYPE47 then --宠物升级
OpenFun.Open(163,1)
return
elseif type == TaskTipType.TYPE48 then --晒娃
OpenFun.Open(165,1)
return
elseif type == TaskTipType.TYPE49 then --装备圣物
OpenFun.Open(139,2)
return
elseif type == TaskTipType.TYPE50 then --圣物寻宝
OpenFun.Open(139,7)
return
elseif type == TaskTipType.TYPE52 then --转职目标
GlobalEventSystem:Fire(EventName.OPEN_NEW_MAIN_ROLE_VIEW, NewMainRoleModel.TabId.REIN)
return
elseif type == TaskTipType.TYPE53 then --龙神抽奖
OpenFun.Open(170,1)
return
elseif type == TaskTipType.TYPE54 then --装备套装
local dai_num = tonumber(array[3])
local color = tonumber(array[2])
EquipCollectModel:getInstance():Fire(EquipCollectConst.OPEN_EC_MAIN_VIEW,true, EquipCollectConst.TAB_ID.COLLECT, dai_num, color, color)
return
elseif type == TaskTipType.TYPE55 then --战魂强化
OpenFun.Open(143,5)
return
elseif type == TaskTipType.TYPE57 then --完成预期任务
self:AutoDoTask(true, true)--直接做主线
return
elseif type == TaskTipType.TYPE58 then --宝宝同心值
OpenFun.Open(165,0)
return
elseif type == TaskTipType.TYPE59 then --战力
--这里不做任何处理,放到item点击处
return
elseif type == TaskTipType.TYPE60 then --任意主动技能升级次数
OpenFun.Open(210,1)
return
elseif type == TaskTipType.TYPE61 then --指定商店购买技能书
local temp_cfg = Config.Shop[10317] --指定第一本技能书的商店配置
local career = RoleManager.Instance.mainRoleInfo.career
local goods_table =
{
[1] = 210101,
[2] = 210201,
[3] = 210301,
[4] = 210401,
}
GlobalEventSystem:Fire(EventName.OPEN_SHOP_VIEW, temp_cfg.shop_type, temp_cfg.sub_type, goods_table[career], nil, true)
return
elseif type == TaskTipType.TYPE62 then --任意商店技能书购买
GlobalEventSystem:Fire(EventName.SHOW_MAIN_GET_SKILL_TASK_TIPS_VIEW, true)
return
end
--跨服主城场景id校正
if findVo.sceneId and (findVo.sceneId == KfWorldConst.BFCitySceneId or findVo.sceneId == KfWorldConst.KFCitySceneId) then
if KfWorldModel:GetInstance():IsKFCityOpen() then
findVo.sceneId = KfWorldConst.KFCitySceneId
else
findVo.sceneId = KfWorldConst.BFCitySceneId
end
end
local function on_find_vo_func()
Scene.Instance:ResetUserManulState() --到了执行寻路回调这里,就可以重置寻路缓存状态了
local cur_scene_id = SceneManager.Instance:GetSceneId()
if findVo.dunSceneId and findVo.dunSceneId == cur_scene_id then
--进入镜像副本之后,就不要再切场景了
GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT,false,true)
elseif (findVo.sceneId == cur_scene_id) or SceneManager:getInstance():IsMappingToSameScene(cur_scene_id, findVo.sceneId) then
--已经是目标场景了,开始寻路,这里要兼容一下主城跟跨服主城
GlobalEventSystem:Fire(EventName.FIND, findVo)
else
--如果不在同场景, 先切场景
TaskModel:getInstance():SetNeedTaskFlag(true)
GlobalEventSystem:Fire(SceneEventType.REQUEST_CHANGE_SCENE, findVo.sceneId, nil, SceneTransType.GateAny, findVo.x, findVo.y)
end
end
if use_shoe then --使用小飞鞋
TaskModel:getInstance():SetChangeSceneType(false, false)
if findVo.sceneId ~= SceneManager.Instance:GetSceneId() then
TaskModel:getInstance():SetNeedTaskFlag(true)
end
local end_pos = GameMath.GetPosByCeterPoint(findVo.x * SceneObj.LogicRealRatio.x,findVo.y * SceneObj.LogicRealRatio.y, 100)
local fly_shoe_scene_id = SceneManager.Instance:GetSceneId()
local call_back = function ( )
if findVo.sceneId == fly_shoe_scene_id then
on_find_vo_func()
else
self.fly_timer_id = setTimeout(on_find_vo_func,0.5)
end
end
GlobalEventSystem:Fire(EventName.USE_FLY_SHOE, findVo.sceneId, end_pos.x,end_pos.y, call_back)
else
TaskModel:getInstance():SetChangeSceneType(SceneTransType.GateAny, findVo)
if findVo.sceneId ~= SceneManager.Instance:GetSceneId() then
TaskModel:getInstance():SetNeedTaskFlag(true)
end
GlobalEventSystem:Fire(EventName.FIND, findVo, change_scene_type)
end
end
end
-----------------界面相关-----------------
function TaskController:OpenTaskView(index,task_id,parent_index,sub_index)
if self.TaskNewBaseView == nil then
self.TaskNewBaseView = TaskNewBaseView.New()
end
self.TaskNewBaseView:Open(index, task_id,parent_index,sub_index)
end
function TaskController:CheckNewMainLineTip( )
local level = RoleManager.Instance.mainRoleInfo.level
if level < Config.ConfigTaskEffect.NewMainLineTipLvMin or Config.ConfigTaskEffect.NewMainLineTipLvMax < level then
return
end
local cur_task = self.taskModel:GetMainTask()
if not self.mark_main_line_list then
self.mark_main_line_list = {[0] = true}
end
if cur_task then
if not self.mark_main_line_list[cur_task.id] then
--新任务,标记起来
self.mark_main_line_list[cur_task.id] = true
if self.next_need_new_main_tip or (not self.first_call_new_tip) then
self.taskModel.tip_new_main_line = cur_task.id
GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
end
end
end
--上一次是无主线,下一次才需要,或者第一次调用
self.next_need_new_main_tip = (not (cur_task and cur_task.id > 0))-- or (not self.first_call_new_tip)
if not self.first_call_new_tip then
self.first_call_new_tip = true
end
end
function TaskController:CheckWaitNewMainLineAccept( )
--等待断级主线的接取,那次30000协议返回不用自动任务
if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
local cur_task = self.taskModel:GetMainTask()
local b = (not (cur_task and cur_task.id > 0 and cur_task.id ~= Config.ConfigTaskEffect.DefaultTaskId))
--如果当前卡主线了,等级达到一定程度,如果当前有跑环任务,就去跑环
if b == true and self.main_line_break_wait == false and RoleManager.Instance.mainRoleInfo.level >= Config.ConfigTaskEffect.WhenBreakMainLineGotoDoDailyTaskLevel then
self.taskModel:JustDoDailyCircleTask()
end
self.main_line_break_wait = b
end
end