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

937 lines
34 KiB

--[[
@description:对话模块
]]
require("game.dialogue.DialogueModel")
require("game.dialogue.DialogueViewNew")
require("game.dialogue.DialogueEvent")
require("game.dialogue.vo.NpcDialogVo")
require("game.dialogue.vo.DialogueNodeVo")
-- require("game.dialogue.vo.DialogueTaskVo")
require("game.dialogue.DialogueTypeConst")
require("game.dialogue.DialogLang")
require("game.dialogue.DialogueTaskBtnItem") -- 对话界面的任务item
require("game.dialogue.DialogueChooseMessage") -- 对话选项提示
DialogueController=DialogueController or BaseClass(BaseController)
function DialogueController:__init()
DialogueController.Instance=self
self.dialogueView = nil
self.dialogueModel = DialogueModel:getInstance()
self.taskModel = TaskModel:getInstance()
self.dialogueModel.autoIntoCopy = 0
self:registerAllProtocals()
self:addAllEvents()
end
function DialogueController:__delete()
end
function DialogueController:registerAllProtocals()
self:RegisterProtocal(12101, "response12101") --获取指定npc关联的任务列表
self:RegisterProtocal(12102, "response12102") --获取指定任务的对话列表
self:RegisterProtocal(30003, "response30003") --接受任务
self:RegisterProtocal(30004, "response30004") --完成任务
self:RegisterProtocal(30007, "response30007") --任务对话事件
self:RegisterProtocal(30008, "response30008")--任务探索事件件
self:RegisterProtocal(30009, "response30009")--触发悬赏任务和社团周任务
self:RegisterProtocal(30010, "response30010")--悬赏任务和社团周任务进度
self:RegisterProtocal(30011, "response30011")--请求赏金和社团任务奖励,奖励是规则算出来的,所以不读配置
self:RegisterProtocal(30012, "response30012")--上一个完成的任务id
self:RegisterProtocal(30015, "response30015")--任务请求完成进度
--切换活动镜像场景
local function onSceneLoadViewComplete( )
--如果是在副本里面,则等待
if not self.dialogueModel.is_show_main_task_tips_flag and not SceneManager:getInstance():IsMirrorScene() and self.dialogueModel.is_delay_show_main_task_tips then
local task_id = self.dialogueModel.is_delay_show_main_task_tips
self.taskModel.now_task_id = nil
GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
local function ok_callback()
GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
self.taskModel.tip_new_main_line = task_id
GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
end
local function cancle_callback()
local next_task = self.taskModel:GetTaskByType(TaskType.BOUNTY_LINE)
if next_task then
self.taskModel.now_task_id = next_task.id
else
self.taskModel.now_task_id = task_id
end
self.taskModel:SetTaskAutoFlag(true)
GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
end
local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
self.dialogueModel.is_show_main_task_tips_flag = true
self.dialogueModel.is_delay_show_main_task_tips = false
end
end
GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, onSceneLoadViewComplete)
--新手期,跑环任务时升级,触发主线推荐
local function onChangeLevel(level)
if not self.dialogueModel.is_show_main_task_tips_flag and Config.ConfigTaskEffect.NewMainLineTipLvMin <= level and RoleManager.Instance.mainRoleInfo.level <= level then
local cur_task = self.taskModel:GetCurTask()
if cur_task and cur_task.type == TaskType.BOUNTY_LINE then
local cur_main_task = self.taskModel:GetMainTask()
if cur_main_task and level >= cur_main_task.level then
self.taskModel.now_task_id = false
GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
--如果是在副本里面,则等待
if not SceneManager:getInstance():IsMirrorScene() then
local function ok_callback()
if cur_main_task then
GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
self.taskModel.tip_new_main_line = cur_main_task.id
GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
end
end
local function cancle_callback()
self.taskModel:SetTaskAutoFlag(true)
GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
end
local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
self.dialogueModel.is_show_main_task_tips_flag = true
else
self.dialogueModel.is_delay_show_main_task_tips = cur_main_task.id
end
end
end
end
end
RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL, onChangeLevel)
end
function DialogueController:showDialogue(npcDialogVo)
if self.dialogueView == nil then
self.dialogueView = DialogueViewNew.New()
end
if self:IsShowCircleView(npcDialogVo) then
local cfg1 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.BOUNTY_LINE)
local cfg2 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.GUILD_LINE)
--判断是否可领取奖励
local task_type = false
if npcDialogVo.npc_id == cfg1.npc_id then
task_type = TaskType.BOUNTY_LINE
elseif npcDialogVo.npc_id == cfg2.npc_id then
task_type = TaskType.GUILD_LINE
end
GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS, task_type, nil, npcDialogVo)
return
end
if npcDialogVo and npcDialogVo.dialogList then
self.dialogueView:Open(npcDialogVo)
else
if self.dialogueView:HasOpen() == true then
self.dialogueView:Close()
end
end
end
function DialogueController:CloseDialoueView()
if self.dialogueView and self.dialogueView:HasOpen() == true then
self.dialogueView:Close()
end
end
function DialogueController:addAllEvents()
local function onRequestHandler(...)
local args_list = {...}
if args_list[1] == 30009 then
self:SendFmtToGame(args_list[1], "c", args_list[2])
elseif args_list[1] == 30010 or args_list[1] == 30019 then
self:SendFmtToGame(args_list[1], "c", args_list[2])
elseif args_list[1] == 30015 then
self:SendFmtToGame(args_list[1], "cli", args_list[2], args_list[3], args_list[4])
elseif args_list[1] == 30011 then
self:SendFmtToGame(args_list[1], "i", args_list[2])
else
self:SendFmtToGame(args_list[1])
end
end
self.dialogueModel:Bind(DialogueModel.REQUEST_CCMD_EVENT,onRequestHandler)
local function taskFun(npcId, taskId, state)
self:request12102(npcId, taskId, state)
end
self:Bind(DialogueModel.SELECT_TASK, taskFun )
local function answer_fun(dialogueVo, dialogueNodeVo, selected,double)
self:clickAnswerHandler(dialogueVo, dialogueNodeVo, selected,double)
end
self:Bind(DialogueModel.CLICK_ANSWER, answer_fun)
local function showTask1(id)
local level = RoleManager.Instance.mainRoleInfo.level
-- if id == GuildModel.FEAST_NPC then
-- --社团宴席npc, 请求是否可以采集
-- GuildModel:getInstance():Fire(GuildModel.REQUEST_CCMD_EVENT, 40219)
-- else
if GetModuleIsOpen(500) and (id == EscortConst.START_NPC or id == EscortConst.KF_START_NPC) then --护送领取npc
GlobalEventSystem:Fire(EscortConst.OPEN_ESCORT_VIEW, true)
elseif GetModuleIsOpen(500) and (id == EscortConst.END_NPC or id == EscortConst.KF_END_NPC) and EscortModel:getInstance():IsEscortState( ) then --护送结算npc
EscortModel:getInstance():Fire(EscortConst.REQUEST_SCMD_EVENT, 50003, 2)
else
self.dialogueModel.changeSceneClose=false
self.dialogueModel.isAuto = false --发事件过来的要重置一下auto状态
self:request12101(id)
end
end
self:Bind(SceneEventType.SHOW_TASK, showTask1 )
local function acceptTask1(id)
self.dialogueModel.changeSceneClose=false
self:acceptTask(id)
end
self:Bind(TaskEventType.SEND_TASK_ACCEPT, acceptTask1 )
local function finishTask1(id, arr)
self.dialogueModel.changeSceneClose=false
self:finishTask(id, arr)
end
self:Bind(TaskEventType.SEND_TASK_FINISH, finishTask1 )
local function taskQuest()
self:request30008()
end
self:Bind(TaskEventType.TASK_QUEST, taskQuest)
-- 超级强硬的关闭对话框
local function OutCloseDialog()
self:CloseDialoueView()
self.dialogueModel.changeSceneClose=true
self.taskModel.last_circle_tip_type = false
--清理剧情软对话
self.dialogueModel:CancelTaskTalkTimer()
end
GlobalEventSystem:Bind(SceneEventType.SCENE_CHANGED, OutCloseDialog)
local close_fun = function ()
self:CloseDialoueView()
end
GlobalEventSystem:Bind(SceneEventType.CLOSE_DIALOGUE_VIEW, close_fun)
local game_start = function()
setTimeout(function()
if not self.preload_dialogue_view then
local playerLv = RoleManager:getInstance():GetMainRoleVo().level
if playerLv <= 120 then
self.preload_dialogue_view = true
if self.dialogueView == nil then
self.dialogueView = DialogueViewNew.New()
end
self.dialogueView:Open()
self.dialogueView:Hide()
end
end
end,1.6)
end
GlobalEventSystem:Bind(EventName.GAME_START,game_start)
local function on_choose_message( choose_type, choose_value )
if not self.choose_message then
self.choose_message = DialogueChooseMessage.New()
end
if self.choose_message:HasOpen() then
self.choose_message:SetData(choose_type, choose_value)
else
self.choose_message:Open(choose_type, choose_value)
end
end
GlobalEventSystem:Bind(DialogueModel.CHOOSE_MESSAGE_EVENT, on_choose_message)
local function playerLevelUp()
local task_id = TaskModel:getInstance().need_accept
if task_id and task_id~=0 then
--先判断等级
local cfg = ConfigItemMgr.Instance:GetTaskData(task_id)
if cfg then
if RoleManager.Instance.mainRoleInfo.level >= cfg.level then
self:acceptTask(task_id)
TaskModel:getInstance().need_accept = nil
end
end
end
end
RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL,playerLevelUp)
end
function DialogueController:request12101(id)
self.taskModel.scmd12101Send = true
self:SendFmtToGame(12101, "i", id)
end
function DialogueController:response12101()
if not self.taskModel.scmd12101Send then
return
end
self.taskModel.scmd12101Send = false
local scmd12101 = SCMD12101.New(true)
-- print("Saber:DialogueController [start:178] scmd12101 ------------------------------------------")
-- PrintTable(scmd12101)
scmd12101.task_id = 0
self.dialogueModel.npcDialogVo = scmd12101
local dialogid = self.dialogueModel:GetDialogueId(scmd12101.npc_id)
local task = TaskModel:getInstance():GetTaskById(self.taskModel.now_task_id)
if task and task.task_kind==TaskKind.DUN_KIND and task.content_id~=0 and task.acceptType==0 then
--副本类型的任务,如果已经接过就做一个假任务对话
if task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE then
--赏金和社团任务要判断是否已经进行了任务对话 副本失败后,taskTips列表就只有副本步骤了
self:showNpcTalk(dialogid,#scmd12101.task_list)
return
else
--主线或者支线,就做一个假任务对话
for k,v in pairs(task.taskTips) do
if v.type==TaskTipType.TYPE2 and v.isFinish==0
and scmd12101.npc_id==task.start_npc then
local scmd12102 = SCMD12102.New()
scmd12102.npc_id = task.start_npc
scmd12102.task_id = task.id
scmd12102.talk_id = task.start_talk
self.dialogueModel.npcDialogVo = scmd12102
self.dialogueModel.npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(self.dialogueModel.npcDialogVo.talk_id)
self.dialogueModel.npcDialogVo.task_list = {}
self:showDialogue(self.dialogueModel.npcDialogVo)
return
end
end
end
end
self:showNpcTalk(dialogid,#scmd12101.task_list)
--如果没有任务,则播放声音
if #scmd12101.task_list == 0 then
SoundModel:getInstance():PlayNpcSound(scmd12101.npc_id)
end
end
--[[
* 显示对话
* @param npcId NPCID
* @param taskId 任务ID
* @param state 任务状态
*
]]
function DialogueController:request12102(npcId, taskId, state)
self:SendFmtToGame(12102, "ii", npcId, taskId)
self.dialogueModel.isAuto = false
end
function DialogueController:response12102()
if self.dialogueModel.changeSceneClose==true then
-- 过滤掉延时的返回
return
end
local scmd12102 = SCMD12102.New(true)
-- print("Saber:DialogueController [start:261] scmd12102 ------------------------------------------")
-- PrintTable(scmd12102)
self.dialogueModel.npcDialogVo = scmd12102
-- print("response12102:",self.dialogueModel.npcDialogVo.npc_id,self.dialogueModel.npcDialogVo.task_id,self.dialogueModel.npcDialogVo.talk_id)
self.dialogueModel.npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(self.dialogueModel.npcDialogVo.talk_id)
self.dialogueModel.npcDialogVo.task_list = {}
--奖励这里获取
self.dialogueModel.npcDialogVo.award = nil
local temp = TaskModel.Instance:GetCanTaskById(self.dialogueModel.npcDialogVo.task_id);
if temp == nil then
temp = TaskModel.Instance:GetReceivedTaskById(self.dialogueModel.npcDialogVo.task_id);
if temp then
self.dialogueModel.npcDialogVo.award = temp.award_list
end
else
self.dialogueModel.npcDialogVo.award = temp.award_list
end
if self.dialogueModel.npcDialogVo.dialogList and self.dialogueModel.npcDialogVo.dialogList.content then
for k,v in ipairs(self.dialogueModel.npcDialogVo.dialogList.content) do
for _,vo in ipairs(v.list) do
if vo.type==0 and Trim(vo.text)=="" then
--对话内容为空字符串,直接接受任务或者完成任务
local data = TaskModel:getInstance():GetTaskById(scmd12102.task_id)
if data then
if data.acceptType==0 then
self:finishTask(scmd12102.task_id)
elseif data.acceptType==1 then
-- 如果是转职任务,则记录接受任务时的玩家等级
if self.taskModel:IsTurnTask(flag) then
self.taskModel:RecordProcessingTurnTaskLevel()
end
self:acceptTask(scmd12102.task_id)
end
end
return
end
end
end
end
self:showDialogue(self.dialogueModel.npcDialogVo)
SoundModel:getInstance():PlayTaskAcceptSound(scmd12102.task_id)
end
-- 接受任务
function DialogueController:acceptTask(id)
TaskController.Instance:Clear30000Timer()
id = tonumber(id)
local task = TaskModel:getInstance():GetTaskById(id)
if task and task.task_kind==TaskKind.DUN_KIND and task.content_id~=0 then
--副本类型的任务,如果已经接过就直接进入副本(特殊处理,副本失败是要重新接任务的)
-- GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK)
local need_go_dun = true
if task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE then
self.taskModel.last_circle_tip_type = false--接任务的时候重置一下任务类型
if self.dialogueModel.npcDialogVo and self.dialogueModel.npcDialogVo.npc_id then
self:talkToNPC(self.dialogueModel.npcDialogVo.npc_id, task.id)
--30007发送后会推送30001, 但是进度未完成,不会自动任务,这里手动请求30000
TaskController.Instance:request30000()
need_go_dun = false
end
else
if task.acceptType==1 then
TaskModel:getInstance().wait_30003 = true
self:SendFmtToGame(30003, "i", id)
-- 转职任务需要记录接受任务时的等级,判断断级
end
end
if need_go_dun then
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61001, task.content_id)
end
TaskModel:getInstance():SetNeedTaskFlag(true)
else
if task and (task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE) then
self:talkToNPC(self.dialogueModel.npcDialogVo.npc_id, task.id)
self.dialogueModel.isAuto = true
--30007发送后会推送30001, 但是进度未完成,不会自动任务,这里手动请求30000
TaskController.Instance:request30000()
else
TaskModel:getInstance().wait_30003 = true
self:SendFmtToGame(30003, "i", id)
self.dialogueModel.isAuto = true
end
end
end
function DialogueController:response30003()
TaskModel:getInstance().wait_30003 = false
local flag, msg = self:ReadFmt("ii")
if flag==0 then
-- if msg ~= TaskLang.TASK_STR81 then
-- Message.show(Language.substitute(TaskLang.TASK_STR82, msg));
-- end
ErrorCodeShow(msg)
else
print('Ych:DialogueController.lua[436] data', TaskController.Instance.auto_accept_main_id , flag)
if TaskController.Instance.auto_accept_main_id == flag then
--当前这次不要主动做主线,所以自动接完任务也不要主动切换当前任务
TaskController.Instance.auto_accept_main_id = nil
else
if self.taskModel:IsTurnTask(flag) then -- 转职任务需要特殊处理,接取到任务时需要判断是否时断级接取
self.taskModel.now_task_id = not self.taskModel:IsNewTurnTaskInLimitLv() and flag or self.taskModel.now_task_id
else
self.taskModel.now_task_id = flag
end
end
self.dialogueModel:CheckTaskTalkEvent(flag)
-- Message.show("成功接受任务")
-------接受任务mainui表现
local data = {
type = SceneSpecialTipType.task,
isAccept = true,
}
CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
SoundModel:getInstance():PlayTaskSound(flag)
end
-- print("30003============:", self.dialogueModel.isAuto, self.dialogueModel.npcDialogVo, flag, msg)
-- if self.dialogueModel.isAuto == true and self.dialogueModel.npcDialogVo ~= nil then
-- -- print("接受了任务后,这里又打开了对话==", self.dialogueModel.npcDialogVo.npc_id)
-- self:request12101(self.dialogueModel.npcDialogVo.npc_id)
-- end
TaskController.Instance:HandleTask()
end
--double: 0是默认 1是双倍
function DialogueController:finishTask(id, arr,double)
TaskController.Instance:Clear30000Timer()
self.dialogueModel.isAuto = true
TaskModel:getInstance().wait_30004 = true
arr = arr or {}
double = double or 0
local len = #arr
self:WriteBegin(30004)
self:WriteFMT("i", id)
self:WriteFMT("c", double)
self:WriteFMT("h", len)
for i = 1, len do
self:WriteFMT("i", arr[i])
end
self:SendToGame()
-- self:Fire(EventName.TASK_CHANGE, id, 2)
end
function DialogueController:response30004()
TaskModel:getInstance().wait_30004 = false
local flag, code = self:ReadFmt("ii")
local len = self:ReadFmt("h")
local goods_list = {}
local goods_list_2 = {}
for i = 1, len do
local obj = {
style = self:ReadFmt("c"),
typeId = self:ReadFmt("i"),
count = self:ReadFmt("i"),
}
table.insert(goods_list, obj)
-------------------------
if obj.style == 5 then
local have = false
local goods_id = Config.ConfigNotNormalGoods[obj.style].goods_id
for k,v in pairs(goods_list_2) do
have = have or (v == goods_id)
end
if not have then
goods_list_2[#goods_list_2+1] = goods_id
end
end
end
if flag == 0 then
ErrorCodeShow(code)
else
-------完成任务mainui表现
local data = {
type = SceneSpecialTipType.task,
isAccept = false,
}
CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
--添加任务完成标识
self.taskModel:AddFinishTask( flag )
--如果是触发引导的任务, 就停止自动任务
-- if Config.ConfigHelper.Task[flag] and not Config.ConfigHelper.NotStopList[flag] then
-- GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK)
-- end
--如果是主线
if TaskModel:getInstance():IsMainTask(flag) then
TaskModel:getInstance().last_finish_task_id = flag
end
-- 如果是转职任务,则记录完成任务时的玩家等级
if self.taskModel:IsTurnTask(flag) then
self.taskModel:RecordProcessingTurnTaskLevel()
end
--在副本里面出来
-- if Config.ConfigHelper.NeedDelayExecute[flag] then
-- GuideModel:getInstance():SetNeedDelayExecuteGuide(true)
-- end
print("完成任务, id====:", flag)
if flag == self.taskModel.tip_new_main_line then
--清掉继续主线提示
self.taskModel.tip_new_main_line = false
end
-------------------------
if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
if TaskModel:getInstance():IsCircleTask(flag) then--(非主线)只有跑环类会做完一个任务,自动衔接下一个同类任务的
--起一个计时器,1s内收到30000协议并主动接主线任务的时候,不会停止自动任务
TaskModel:getInstance().sign_mask_not_guide_wait_accept_main_task = true
local function delay( )
TaskModel:getInstance().sign_mask_not_guide_wait_accept_main_task = nil
end
setTimeout(delay,1)
end
end
-------------------------
local taskVo = TaskModel:getInstance():GetTaskById(flag)
GlobalEventSystem:Fire(TaskEventType.TASK_SUCCESS, flag)
self.taskModel.last_task_id_cache = flag
self.taskModel.now_task_id = nil
--如果是支线或者限时, 就不处理,避免中断其他任务
-- if taskVo and taskVo.type~=TaskType.EXTENSION_LINE and taskVo.type~=TaskType.LIMIT_LINE then
if taskVo then
self.taskModel.last_task_type_cache = taskVo.type
end
-- end
if taskVo and taskVo.type == TaskType.EXTENSION_LINE then
--支线任务完成增加表现效果
lua_soundM:PlayEffect(self, "extension_line_success", false, LuaSoundManager.SOUND_TYPE.ROLE)
else
SoundModel:getInstance():PlayTaskSound(flag)
SoundModel:getInstance():PlayTaskCompleteSound(flag)
end
if taskVo and taskVo.type == TaskType.BOUNTY_LINE then
--日常任务飘经验获得
MainUIModel:getInstance():PlayGoodsFlyList(goods_list_2)
self.dialogueModel.is_delay_show_main_task_tips = false
self.dialogueModel.is_show_main_task_tips_flag = false
--完成经验跑环时,会提示要不要做主线
if Config.ConfigTaskEffect.NewMainLineTipLvMin <= RoleManager.Instance.mainRoleInfo.level and RoleManager.Instance.mainRoleInfo.level <= Config.ConfigTaskEffect.NewMainLineTipLvMax then
local cur_main_task = self.taskModel:GetMainTask()
if cur_main_task and RoleManager.Instance.mainRoleInfo.level >= cur_main_task.level then
self.taskModel.now_task_id = nil
GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
--如果是在副本里面,则等待
if not SceneManager:getInstance():IsMirrorScene() then
local function ok_callback()
if cur_main_task then
GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
self.taskModel.tip_new_main_line = cur_main_task.id
GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
end
end
local function cancle_callback()
self.taskModel:SetTaskAutoFlag(true)
GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
end
local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
self.dialogueModel.is_show_main_task_tips_flag = true
else
self.dialogueModel.is_delay_show_main_task_tips = cur_main_task.id
end
end
end
end
--判断是否配置了自动接下个任务
if taskVo and taskVo.next~=0 then
if taskVo.type ~= TaskType.EXTENSION_LINE then --支线不需要自动触发下一个
--先判断等级
local cfg = ConfigItemMgr.Instance:GetTaskData(taskVo.next)
if cfg then
if RoleManager.Instance.mainRoleInfo.level >= cfg.level then
self:acceptTask(taskVo.next)
else
-- if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
-- if TaskModel:getInstance():IsMainTask(flag) then
-- --如果是非新手期,而且是完成主线,那就不用记录了,30000返回的时候主线就会被自动接掉
-- return
-- end
-- end
--升级了就触发
TaskModel:getInstance().need_accept = taskVo.next
end
end
end
end
end
end
--[[
* 任务对话事件
* @param npcId NPCID
* @param taskId 任务ID
*
]]
function DialogueController:talkToNPC(npcId, taskId)
self:SendFmtToGame(30007, "ii", taskId, npcId)
self.dialogueModel.isAuto=true;
end
function DialogueController:response30007()
end
--任务探索事件
function DialogueController:request30008()
self:SendFmtToGame(30008)
end
function DialogueController:response30008()
end
function DialogueController:response30009()
local code = self:ReadFmt("i")
if code==1 then
--Message.show("成功接受任务")
-------接受任务mainui表现
local data = {
type = SceneSpecialTipType.task,
isAccept = true,
}
TaskModel.getInstance():Fire(TaskEvent.SHOW_SCROLL_TO_ITEM, 1) --领取任务后,置顶任务栏
CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
else
ErrorCodeShow(code)
end
end
function DialogueController:response30010()
local info = {}
info.task_type = self:ReadFmt("c")
info.cur_progress = self:ReadFmt("c")
info.total_progress = self:ReadFmt("c")
info.reward_progress = self:ReadFmt("c")
TaskModel:getInstance():SetCircleTaskInfo(info)
end
function DialogueController:response30011( )
local info = {}
info.task_id = self:ReadFmt("i")
local basedata=ConfigItemMgr.Instance:GetTaskData(info.task_id)
--奖励
local len0 = UserMsgAdapter.ReadFmt("h") or 0
info.reward = info.reward or {}
local vo0 = nil
for i = 1,len0 do
vo0 = {
UserMsgAdapter.ReadFmt("c") or 0,
UserMsgAdapter.ReadFmt("i") or 0,
UserMsgAdapter.ReadFmt("l") or 0
}
table.insert(info.reward,vo0)
end
--额外奖励
info.extra_reward = info.extra_reward or {}
local len1 = UserMsgAdapter.ReadFmt("h") or 0
local vo1 = nil
for i = 1,len1 do
vo1 = {
UserMsgAdapter.ReadFmt("c") or 0,
UserMsgAdapter.ReadFmt("i") or 0,
UserMsgAdapter.ReadFmt("l") or 0
}
table.insert(info.extra_reward,vo1)
end
self.taskModel.circle_cache_reward = info
GlobalEventSystem:Fire(EventName.UPDATE_TASK_BOUNTY_REWARD, info)
-------------------------
TaskModel:getInstance():Fire(TaskEvent.TASK_LIST_INIT)
end
function DialogueController:response30012()
local task_id = self:ReadFmt("i")
TaskModel:getInstance().last_finish_task_id = task_id
GlobalEventSystem:Fire(EventName.REFRESH_CALL_STAR_MODEL)
GlobalEventSystem:Fire(EventName.TASK_DATA_INIT)
end
function DialogueController:response30015()
local code = self:ReadFmt("i")
ErrorCodeShow(code)
end
--选择npc功能对话框
function DialogueController:showNpcFunctionSelectTalk(talkid,taskCount)
local dialogid = talkid
local npcDialogVo = self.dialogueModel.npcDialogVo
npcDialogVo.dialogId = dialogid
npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(dialogid)
if npcDialogVo.dialogList==nil then
-- print("~~选择npc功能对话框~~~对话id is nil, 显示默认对话:",dialogid)
npcDialogVo.dialogList=DialogueModel.DEFAULT_TALK
if npcDialogVo.dialogList.content[1] then
npcDialogVo.dialogList.content[1].id = npcDialogVo.npc_id
end
end
-- 跳过空对话
-- print("---------showNpcFunctionSelectTalk--------:", self.dialogueModel.isAuto, taskCount)
if self.dialogueModel.isAuto == true and taskCount==0 then
self.dialogueModel.isAuto = false
return
end
self:showDialogue(npcDialogVo)
end
function DialogueController:showNpcTalk(talkid,taskCount)
local dialogid = talkid
local npcDialogVo = self.dialogueModel.npcDialogVo --12101
local is_default_talk = false
--[[
同个npc下面可能同时会有主线和支线任务,12101协议任务数据可能会有2条,
这样客户端就不知道应该选择哪个任务来触发相关操作, 所以在开始任务前,客户端先记下当前任务id,
这里判断12101协议里面的任务数据是不是存在当前客户端保存的当前任务id,存在的话就把非当前任务的数据删掉
]]
-- 2019年11月6日修改:增加多任务过滤筛选出第一个要处理的任务
-- 17:45分,天气晴,飒爽的秋风带来了冬季的寒意,窗外的阳光似乎没有了温度,而我心中只记得策划大佬突然又要改需求了(╯‵□′)╯︵┻━┻
-- if self.taskModel.now_task_id and self.dialogueModel.npcDialogVo and #self.dialogueModel.npcDialogVo.task_list > 1 then
if self.dialogueModel.mult_select_task_id and self.dialogueModel.npcDialogVo and #self.dialogueModel.npcDialogVo.task_list > 1 then
local find = false
for i,v in ipairs(self.dialogueModel.npcDialogVo.task_list) do
if v.task_id == self.dialogueModel.mult_select_task_id then
find = true
break
end
end
if find then
local delete_index={}
for i,v in ipairs(self.dialogueModel.npcDialogVo.task_list) do
if v.task_id ~= self.taskModel.now_task_id then
table.insert(delete_index,i)
end
end
local del_num=0
for i,v in ipairs(delete_index) do
local index = v - del_num
table.remove(self.dialogueModel.npcDialogVo.task_list, index)
del_num = del_num + 1
end
-- else
-- -- 对多任务进行排序,然后根据排好的顺序只选择第一个任务
-- self.dialogueModel:SortMultTaskList(self.dialogueModel.npcDialogVo.task_list)
-- for k = #self.dialogueModel.npcDialogVo.task_list , 1 do
-- if k > 1 then
-- table.remove(self.dialogueModel.npcDialogVo.task_list, k)
-- end
-- end
end
taskCount = 1
end
-- 每次走完多任务的判断都要保证多任务选择的任务id置空
self.dialogueModel:SetMultSelectTaskID(nil)
-- dialogid是目标npc默认的对话内容,如果为空则显示通用默认npc的对话,一般是npcid为0或者空的时候会出现
npcDialogVo.dialogId = dialogid
npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(dialogid)
if npcDialogVo.dialogList==nil then
print("~~~~~db里面找不到该对话id, 显示默认对话:",dialogid)
npcDialogVo.dialogList=DialogueModel.DEFAULT_TALK
is_default_talk = true
if npcDialogVo.dialogList.content[1] then
npcDialogVo.dialogList.content[1].id = npcDialogVo.npc_id
end
end
-- 跳过空对话
if self.dialogueModel.isAuto == true and taskCount==0 then
self.dialogueModel.isAuto = false
return
end
-- 判断是否是可选任务,是则不请求12102协议获取对话内容(仅需在只有一条任务数据的时候判断)
local is_optional_task = false
if taskCount == 1 and npcDialogVo.task_list and npcDialogVo.task_list[1] and npcDialogVo.task_list[1].task_id then
local task_vo = TaskModel:getInstance():GetTaskById(npcDialogVo.task_list[1].task_id) or {}
if task_vo.tipType then
is_optional_task = is_optional_task or task_vo.tipType == TaskTipType.TYPE35
local is_target_npc = task_vo.tipParam and task_vo.tipParam[3] == npcDialogVo.npc_id
if is_optional_task and is_target_npc then
npcDialogVo.task_id = npcDialogVo.task_list[1].task_id
end
end
end
--(task_state 0:无 1:有可接任务 2:有未完成的任务 3:有可提交的任务 4:有任务对话)
local is_cur_select = npcDialogVo and npcDialogVo.task_list and npcDialogVo.task_list[1] and
((TaskModel:getInstance().now_task_id or 0) == 0 or TaskModel:getInstance().now_task_id == npcDialogVo.task_list[1].task_id)
if is_cur_select and npcDialogVo.dialogList.total_content == 1 and npcDialogVo.dialogList.content[1].total_list == 1
and taskCount == 1 and npcDialogVo.task_list[1].task_state~=2 and not is_optional_task then
self:request12102(npcDialogVo.npc_id, npcDialogVo.task_list[1].task_id, npcDialogVo.task_list[1].task_state)
else
if npcDialogVo.npc_id == 0 and is_default_talk then --当npc_id 是0 ,而且是默认对话的时候,对话框就不显示出来了
return
end
if self.dialogueModel.isAuto == false then
self:showDialogue(npcDialogVo)
elseif #npcDialogVo.task_list > 0 then
-- self.model:SortMultTaskList(npcDialogVo.task_list)
local isShow=false
for _, taskNodeVo in pairs(npcDialogVo.task_list) do
if taskNodeVo.task_state ~= 2 then
isShow=true
break
end
end
if isShow==true and npcDialogVo.dialogId and npcDialogVo.dialogId ~= 0 then
self:showDialogue(npcDialogVo)
end
end
end
self.dialogueModel.isAuto=false
end
--[[
* 点击NPC对话框确定按钮
* @param e
*
]]
function DialogueController:clickAnswerHandler(dialogueVo, dialogueNodeVo, selected,double)
selected = selected or false
local typeId = 0
--任务的操作
self.dialogueModel.andTriggerTask = nil
if dialogueNodeVo.type == DialogueTypeConst.FINISH_AND_TRIGGER then
self.dialogueModel.andTriggerTask = dialogueNodeVo
self:finishTask(dialogueVo.task_id,false,double);
elseif dialogueNodeVo.type == DialogueTypeConst.TRIGGER then
self:acceptTask(dialogueVo.task_id);
elseif dialogueNodeVo.type == DialogueTypeConst.FINISH then
self:finishTask(dialogueVo.task_id,false,double);
elseif dialogueNodeVo.type == DialogueTypeConst.TRIGGER_AND_FINISH then
elseif dialogueNodeVo.type == DialogueTypeConst.TALK_EVENT then
self:talkToNPC(dialogueVo.npcId, dialogueVo.task_id)
end
end
-- 是否是显示跑环界面
function DialogueController:IsShowCircleView( npcDialogVo )
-------------------------
local cfg1 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.BOUNTY_LINE)
local cfg2 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.GUILD_LINE)
if not (npcDialogVo.npc_id == cfg1.npc_id or npcDialogVo.npc_id == cfg2.npc_id) then
--当前不是跑环npc
return false
end
-------------------------
--判断是否可领取奖励
local task_type = false
if npcDialogVo.npc_id == cfg1.npc_id then
task_type = TaskType.BOUNTY_LINE
elseif npcDialogVo.npc_id == cfg2.npc_id then
task_type = TaskType.GUILD_LINE
end
local reward_data = self.taskModel:CanCircleReward(task_type)
if reward_data then
return true
end
-------------------------
if npcDialogVo.task_id == 0 then
--身上没任务,首次接任务用对话框
return false
end
local task = TaskModel:getInstance():GetTaskById(npcDialogVo.task_id)
if not task then return false end
local is_circle_line = task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE
if is_circle_line then
if task.tipType == TaskTipType.TYPE35 and self.taskModel.last_circle_tip_type == task.tipType then
--多选任务,而且上一次跑环tip显示的是多选类,那就显示普通对话
return false
end
if task.acceptType==0 and self.taskModel:IsTaskProgressFinish(task) then
--任务已完成等结束
return false
end
if task.taskTips and task.taskTips[1] and task.taskTips[1].isFinish == 0 then
--第一步改成弹界面
return true
end
end
return false
end