|
--[[
|
|
@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
|