916 lines
26 KiB
Plaintext
916 lines
26 KiB
Plaintext
FunctionVisitNpc = class("FunctionVisitNpc")
|
||
|
||
AccessCustomType = {
|
||
Quest = 1,
|
||
Follow = 2,
|
||
|
||
ReviveBySkill = 4,
|
||
UseItem = 5,
|
||
CatchPet = 6,
|
||
UseSkill = 7;
|
||
}
|
||
|
||
AutoTriggerQuestMap = {
|
||
[QuestDataType.QuestDataType_MAIN] = 1,
|
||
[QuestDataType.QuestDataType_BRANCH] = 1,
|
||
[QuestDataType.QuestDataType_WANTED] = 1,
|
||
[QuestDataType.QUESTDATATYPE_SATISFACTION] = 1,
|
||
[QuestDataType.QuestDataType_ELITE] = 1,
|
||
[QuestDataType.QuestDataType_Raid_Talk] = 1,
|
||
[QuestDataType.QuestDataType_CCRASTEHAM] = 1,
|
||
|
||
[QuestDataType.QuestDataType_CHILD] = 1,
|
||
}
|
||
|
||
local tempV3 = LuaVector3();
|
||
|
||
local _tutorMatchStatus = TutorProxy.TutorMatchStatus
|
||
|
||
function FunctionVisitNpc.Me()
|
||
if nil == FunctionVisitNpc.me then
|
||
FunctionVisitNpc.me = FunctionVisitNpc.new()
|
||
end
|
||
return FunctionVisitNpc.me
|
||
end
|
||
|
||
function FunctionVisitNpc:ctor()
|
||
self.visitRef = 0;
|
||
end
|
||
|
||
function FunctionVisitNpc:GetTargetId()
|
||
return self.targetId;
|
||
end
|
||
|
||
function FunctionVisitNpc:GetTarget()
|
||
return SceneCreatureProxy.FindCreature(self.targetId);
|
||
end
|
||
|
||
function FunctionVisitNpc.AccessGuildFlag(flagid, trans)
|
||
if(GameConfig.SystemForbid.GVG)then
|
||
return;
|
||
end
|
||
if(trans == nil)then
|
||
return;
|
||
end
|
||
|
||
tempV3:Set( LuaGameObject.GetPosition(trans) );
|
||
|
||
local myPos = Game.Myself:GetPosition();
|
||
local distance = LuaVector3.Distance(tempV3, myPos);
|
||
if(distance > 0.1)then
|
||
Game.Myself:Client_MoveTo(tempV3, nil, FunctionVisitNpc._AccessGuildFlag, self, flagid, 1);
|
||
else
|
||
FunctionVisitNpc.Me():_AccessGuildFlag(flagid);
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc:_AccessGuildFlag(flagid)
|
||
GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.GvgLandInfoPopUp, viewdata = {flagid = flagid}});
|
||
end
|
||
|
||
function FunctionVisitNpc:AccessCatchingPet(target)
|
||
if(self.canShowCatchPetMsg)then
|
||
self.canShowCatchPetMsg = false;
|
||
MsgManager.ShowMsgByIDTable(9016)
|
||
end
|
||
|
||
if(self.cd_LT)then
|
||
self.cd_LT:cancel();
|
||
self.cd_LT = nil;
|
||
end
|
||
self.cd_LT = LeanTween.delayedCall(1, function ()
|
||
self.canShowCatchPetMsg = true;
|
||
self.cd_LT = nil;
|
||
end);
|
||
end
|
||
|
||
local tempArgs = {};
|
||
function FunctionVisitNpc:AccessTarget(target, custom, customType)
|
||
if(nil == target)then
|
||
self.targetId = 0;
|
||
return;
|
||
end
|
||
|
||
self.targetId = target.data.id;
|
||
local targetStaticID = 0
|
||
if target.data and target.data.staticData then
|
||
targetStaticID = target.data.staticData.id
|
||
end
|
||
local bossStepQuest = QuestProxy.Instance.worldbossQuest
|
||
if targetStaticID == bossStepQuest["npcid"] then
|
||
local dlist
|
||
redlog("bossStepQuest[dialog_select]",bossStepQuest["dialog_select"])
|
||
redlog(type(bossStepQuest["dialog_select"]))
|
||
if bossStepQuest["dialog_select"] == 1 then -- yes
|
||
redlog("yes")
|
||
printData(bossStepQuest["yes_dialogs"])
|
||
dlist = bossStepQuest["yes_dialogs"]
|
||
elseif bossStepQuest["dialog_select"] == 2 then
|
||
redlog("no")
|
||
dlist = bossStepQuest["no_dialogs"]
|
||
printData(bossStepQuest["no_dialogs"])
|
||
end
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
dialoglist = dlist,
|
||
npcinfo = target,
|
||
callback = self.callNextBossStep,
|
||
};
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
return
|
||
end
|
||
|
||
local target = self:GetTarget();
|
||
if(not target)then
|
||
return;
|
||
end
|
||
|
||
local myself = Game.Myself;
|
||
local handed,handowner = myself:IsHandInHand();
|
||
if(handed and not handowner)then
|
||
MsgManager.ShowMsgByIDTable(824);
|
||
return;
|
||
end
|
||
|
||
if Game.Myself:IsInBooth() then
|
||
MsgManager.ShowMsgByID(25710)
|
||
return
|
||
end
|
||
|
||
if(target.data)then
|
||
if(Game.MapManager:IsPVPMode_TeamPws())then
|
||
if(target.data.IsElementNpc_Mid and target.data:IsElementNpc_Mid())then
|
||
if(not Game.Myself:GetTeamPwsBall())then
|
||
MsgManager.ShowMsgByIDTable(25928);
|
||
return;
|
||
end
|
||
local elementSkillID = GameConfig.PvpTeamRaid.BuffCollectSkillID;
|
||
Game.Myself:Client_UseSkill(elementSkillID, target, nil, nil, true);
|
||
return;
|
||
end
|
||
if(target.data.IsElementNpc and target.data:IsElementNpc())then
|
||
local elementSkillID = GameConfig.PvpTeamRaid.ElementCollectSkillID;
|
||
Game.Myself:Client_UseSkill(elementSkillID, target, nil, nil, true);
|
||
return;
|
||
end
|
||
end
|
||
end
|
||
|
||
if(custom)then
|
||
if(not customType)then
|
||
errorLog("customType Is Nil");
|
||
customType = AccessCustomType.Quest;
|
||
end
|
||
else
|
||
customType = nil;
|
||
end
|
||
|
||
if(customType == AccessCustomType.ReviveBySkill)then
|
||
MsgManager.ConfirmMsgByID(2513,function ()
|
||
Game.Myself:Client_UseSkill(custom, target, nil, nil , true);
|
||
end , nil , nil, target.data.name);
|
||
return;
|
||
elseif(customType == AccessCustomType.UseItem)then
|
||
FunctionItemFunc.TryUseItem(custom, target)
|
||
return;
|
||
elseif(customType == AccessCustomType.CatchPet)then
|
||
ServiceScenePetProxy.Instance:CallCatchPetPetCmd(custom, false)
|
||
return;
|
||
elseif(customType == AccessCustomType.UseSkill)then
|
||
Game.Myself:Client_UseSkill(custom, target, nil, nil , true);
|
||
return;
|
||
end
|
||
|
||
-- 訪問目標為NPC
|
||
if(target:GetCreatureType() == Creature_Type.Npc)then
|
||
local npcData = target.data.staticData;
|
||
if(not npcData)then
|
||
return;
|
||
end
|
||
local ntype = npcData.Type;
|
||
if(ntype == NpcData.NpcDetailedType.SealNPC)then
|
||
FunctionRepairSeal.Me():AccessTarget(target)
|
||
return;
|
||
end
|
||
if(ntype == NpcData.NpcDetailedType.FoodNpc)then
|
||
FunctionFood.Me():AccessFoodNpc(target)
|
||
return;
|
||
end
|
||
if(ntype == NpcData.NpcDetailedType.PetNpc)then
|
||
return;
|
||
end
|
||
if(ntype == NpcData.NpcDetailedType.CatchNpc)then
|
||
return;
|
||
end
|
||
|
||
local npcfunc = npcData.NpcFunction;
|
||
-- 是否通知伺服器訪問npc
|
||
ServiceQuestProxy.Instance:CallVisitNpcUserCmd(target.data.id);
|
||
-- 先處理任務追蹤
|
||
if(customType == AccessCustomType.Quest)then
|
||
local questData = QuestProxy.Instance:getQuestDataByIdAndType( custom );
|
||
if(not questData)then
|
||
helplog("No QuestData !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||
return;
|
||
end
|
||
local questParama = questData.staticData.Params;
|
||
local npc = questParama.npc;
|
||
if(type(npc)=="table")then
|
||
npc = npc[1];
|
||
end
|
||
if(npcData.id == npc)then
|
||
self:ExcuteQuestEvent(target, questData);
|
||
return;
|
||
end
|
||
-- 處理跟隨訪問
|
||
elseif(customType == AccessCustomType.Follow)then
|
||
local triggerQuest, branchlsts = self:CheckNpcQuest(npcData.id, target.data.uniqueid);
|
||
if(self:HandleFollowTransfer(triggerQuest, branchlsts, custom))then
|
||
return;
|
||
end
|
||
end
|
||
|
||
-- 其次處理主動觸發的任務
|
||
local triggerQuest, branchlsts = self:CheckNpcQuest(npcData.id, target.data.uniqueid);
|
||
if(triggerQuest)then
|
||
self:ExcuteQuestEvent(target, triggerQuest);
|
||
else
|
||
-- 陷阱npc不處理
|
||
for _,trapId in pairs(GameConfig.TrapNpcID)do
|
||
if(npcData.id == trapId)then
|
||
return;
|
||
end
|
||
end
|
||
self:ExcuteDefaultDialog(target, branchlsts)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 處理玩家處於跟隨狀態 並且任務是傳送任務 則自動傳送到目標玩家的地圖
|
||
function FunctionVisitNpc._HelpDoFollowTransfer( quest, toMapId )
|
||
local params = quest.staticData.Params;
|
||
if(params.telePath)then
|
||
for i=1,#params.telePath do
|
||
if(params.telePath[i][1] == toMapId)then
|
||
local optionid;
|
||
if(params.telePath[i][2] and params.telePath[i][2]~=0)then
|
||
optionid = params.telePath[i][2];
|
||
end
|
||
FunctionVisitNpc._DialogEndCall(quest.id, optionid, true);
|
||
return true;
|
||
end
|
||
end
|
||
elseif(params.teleMap)then
|
||
for i=1,#params.teleMap do
|
||
if(params.teleMap[i] == toMapId)then
|
||
FunctionVisitNpc._DialogEndCall(quest.id, nil, true);
|
||
return true;
|
||
end
|
||
end
|
||
end
|
||
return false;
|
||
end
|
||
|
||
function FunctionVisitNpc:HandleFollowTransfer(triggerQuest, branchlsts, followTargetMap)
|
||
if(not followTargetMap)then
|
||
return false;
|
||
end
|
||
|
||
if(followTargetMap == Game.MapManager:GetMapID())then
|
||
return false;
|
||
end
|
||
|
||
if(triggerQuest)then
|
||
if(FunctionVisitNpc._HelpDoFollowTransfer( triggerQuest, followTargetMap ))then
|
||
return true;
|
||
end
|
||
end
|
||
if(branchlsts)then
|
||
for k=1,#branchlsts do
|
||
if(FunctionVisitNpc._HelpDoFollowTransfer( branchlsts[k], followTargetMap ))then
|
||
return true;
|
||
end
|
||
end
|
||
end
|
||
FunctionSystem.InterruptMyFollow()
|
||
return false;
|
||
end
|
||
|
||
-- 執行任務事件
|
||
function FunctionVisitNpc:ExcuteQuestEvent(target, questData)
|
||
local stepType = questData.questDataStepType;
|
||
if(not questData.staticData)then
|
||
errorLog("QUEST ERROR ~!~");
|
||
return ;
|
||
end
|
||
local isValid = false;
|
||
local params = questData.staticData.Params;
|
||
|
||
-- 處理訪問任務
|
||
if(params.uniqueid)then
|
||
isValid = target.data.uniqueid == params.uniqueid;
|
||
elseif(type(params.npc)=="number")then
|
||
isValid = target.data.staticData.id == params.npc;
|
||
elseif(type(params.npc)=="table")then
|
||
for _,npcid in pairs(params.npc)do
|
||
if(npcid == target.data.staticData.id)then
|
||
isValid = true;
|
||
break;
|
||
end
|
||
end
|
||
elseif(params.monster == target.data.staticData.id)then
|
||
isValid = true;
|
||
end
|
||
if(isValid)then
|
||
-- 處理採集任務
|
||
if(stepType == QuestDataStepType.QuestDataStepType_COLLECT)then
|
||
local collectSkillId = GameConfig.NewRole.riskskill[1];
|
||
Game.Myself:Client_UseSkill(collectSkillId, target, nil, nil, true);
|
||
|
||
elseif(stepType == QuestDataStepType.QuestDataStepType_VISIT)then
|
||
self:ExcuteDialogEvent(target, questData);
|
||
end
|
||
else
|
||
errorLog("Visit Npc is illegal");
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc._SortQuest(a, b)
|
||
local aPriority, bPriority = 1, 1;
|
||
if(a.type ~= b.type)then
|
||
if(a.scope == QuestDataScopeType.QuestDataScopeType_FUBEN)then
|
||
aPriority = 1;
|
||
else
|
||
if(a.type == QuestDataType.QuestDataType_MAIN)then
|
||
aPriority = 2;
|
||
elseif(a.type == QuestDataType.QuestDataType_WANTED)then
|
||
aPriority = 3;
|
||
elseif(a.type == QuestDataType.QuestDataType_BRANCH)then
|
||
aPriority = 4;
|
||
else
|
||
aPriority = 5;
|
||
end
|
||
end
|
||
|
||
if(b.scope == QuestDataScopeType.QuestDataScopeType_FUBEN)then
|
||
bPriority = 1;
|
||
else
|
||
if(b.type == QuestDataType.QuestDataType_MAIN)then
|
||
bPriority = 2;
|
||
elseif(b.type == QuestDataType.QuestDataType_WANTED)then
|
||
bPriority = 3;
|
||
elseif(b.type == QuestDataType.QuestDataType_BRANCH)then
|
||
bPriority = 4;
|
||
else
|
||
bPriority = 5;
|
||
end
|
||
end
|
||
end
|
||
if(aPriority ~= bPriority)then
|
||
return aPriority < bPriority;
|
||
end
|
||
return a.id < b.id;
|
||
end
|
||
|
||
-- 檢查NPC身上的任務 返回可觸發的任務和其他掛載任務
|
||
function FunctionVisitNpc:CheckNpcQuest(npcid, uniqueid)
|
||
local triggerlsts,branchlsts = {},{};
|
||
local questlst = QuestProxy.Instance:getDialogQuestListByNpcId(npcid, uniqueid) or {};
|
||
for i = 1,#questlst do
|
||
local d = questlst[i];
|
||
if(AutoTriggerQuestMap[d.type] or d.scope == QuestDataScopeType.QuestDataScopeType_FUBEN)then
|
||
if(d.staticData.Params.ManualTrigger ~= 1)then
|
||
table.insert(triggerlsts, d);
|
||
end
|
||
end
|
||
table.insert(branchlsts, d);
|
||
end
|
||
|
||
local triggerQuest = nil;
|
||
-- 如果只有一個主線任務 自動觸發
|
||
if(#triggerlsts==1)then
|
||
triggerQuest = triggerlsts[1];
|
||
-- 檢測採集任務
|
||
else
|
||
local collectlst = QuestProxy.Instance:getCollectQuestListByNpcId(npcid);
|
||
triggerQuest = collectlst and collectlst[1];
|
||
end
|
||
-- 排序
|
||
table.sort(branchlsts, FunctionVisitNpc._SortQuest);
|
||
return triggerQuest, branchlsts;
|
||
end
|
||
|
||
-- 通知伺服器對話結束 進行下一段對話
|
||
function FunctionVisitNpc._DialogEndCall( questId, optionid, isSuccess )
|
||
if(isSuccess and questId)then
|
||
LogUtility.Info(string.format("NotifyQuestState: questId:%s optionId:%s ",
|
||
tostring(questId), tostring(optionid)) );
|
||
|
||
QuestProxy.Instance:notifyQuestState(questId, optionid);
|
||
end
|
||
end
|
||
|
||
-- 執行對話
|
||
function FunctionVisitNpc:ExcuteDialogEvent(target, questData)
|
||
local questParama = questData.staticData.Params;
|
||
|
||
local ifAccessFc = questParama.ifAccessFc;
|
||
local questId = questData.id;
|
||
-- 任務步驟中訪問npc預設功能時 此任務步驟完成,而不是QUEST中的對話
|
||
if(ifAccessFc)then
|
||
QuestProxy.Instance:notifyQuestState(questData.id);
|
||
self:ExcuteDefaultDialog(target);
|
||
return;
|
||
end
|
||
-- 執行任務對話
|
||
local dialoglist = questParama.dialog or {};
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
dialoglist = dialoglist,
|
||
dialognpcs = questParama.npc,
|
||
npcinfo = target,
|
||
camera = questParama.camera,
|
||
wait = questParama.finish_wait,
|
||
questId = questId,
|
||
|
||
callback = FunctionVisitNpc._DialogEndCall,
|
||
callbackData = questId,
|
||
};
|
||
-- 如果對話為空 直接向伺服器發送對話結束
|
||
if(type(viewdata.dialoglist)=="table" and #viewdata.dialoglist == 0)then
|
||
FunctionVisitNpc._DialogEndCall(questId, nil, true);
|
||
else
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
end
|
||
end
|
||
|
||
-- 執行預設對話
|
||
function FunctionVisitNpc:ExcuteDefaultDialog(target, events)
|
||
target = target or self:GetTarget();
|
||
if(target)then
|
||
local npcData = target.data.staticData;
|
||
local npcfunc = npcData.NpcFunction;
|
||
-- 八音盒
|
||
if(npcData.id == GameConfig.System.musicboxnpc)then
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, {viewname = "SoundBoxView", npcInfo = target, viewdata = {isNpcFuncView = true}});
|
||
return;
|
||
-- 無限塔
|
||
elseif(npcData.id == 1200)then
|
||
FunctionVisitNpc.VisitEndLessTower(target, events);
|
||
return;
|
||
elseif(npcfunc)then
|
||
for i=1,#npcfunc do
|
||
local single = npcfunc[i];
|
||
if(single.type)then
|
||
local funcCfg = Table_NpcFunction and Table_NpcFunction[single.type];
|
||
if(funcCfg and funcCfg.Type)then
|
||
local configFunc = FunctionVisitNpc.SNpcFuncMap[funcCfg.Type]
|
||
if(configFunc and configFunc(npcfunc, target, events))then
|
||
return;
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local defaultDialogId = FunctionVisitNpc.GetDefaultDialog(target);
|
||
if(npcData.DefaultDialog == nil)then
|
||
return;
|
||
end
|
||
|
||
local needRequireNpcFunc = npcData.NeedRequireNpcFunction;
|
||
if(needRequireNpcFunc and needRequireNpcFunc == 1)then
|
||
ServiceNUserProxy.Instance:CallRequireNpcFuncUserCmd(npcData.id);
|
||
end
|
||
-- Npc預設對話
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
tasks = events,
|
||
npcinfo = target,
|
||
defaultDialogId = defaultDialogId,
|
||
};
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
else
|
||
printRed("找不到該Npc 或者 該Npc不在配置表之內");
|
||
end
|
||
end
|
||
|
||
-- DefaultDialog Begin
|
||
function FunctionVisitNpc.GetDefaultDialog(npc)
|
||
if(npc == nil)then
|
||
return;
|
||
end
|
||
|
||
local npcData = npc.data.staticData;
|
||
|
||
local activity_defaultDlg = Activity_NpcDefaultDialog;
|
||
if(activity_defaultDlg ~= nil)then
|
||
local cfg = activity_defaultDlg[npcData.id];
|
||
if(cfg)then
|
||
local choose_did = nil;
|
||
|
||
local closeest_time = nil;
|
||
for aid, dialogid in pairs(cfg)do
|
||
local adata = FunctionActivity.Me():GetActivityData( aid );
|
||
if(adata ~= nil)then
|
||
if(closeest_time == nil)then
|
||
closeest_time = adata.starttime;
|
||
choose_did = dialogid;
|
||
else
|
||
if(adata.starttime > closeest_time)then
|
||
closeest_time = adata.starttime;
|
||
choose_did = dialogid;
|
||
end
|
||
end
|
||
end
|
||
end
|
||
if(choose_did ~= nil)then
|
||
return choose_did;
|
||
end
|
||
end
|
||
end
|
||
|
||
local gameconfig_wedding = GameConfig.Wedding;
|
||
if(gameconfig_wedding)then
|
||
local engage_Npc = gameconfig_wedding and gameconfig_wedding.Engage_Npc;
|
||
local weddingCememony_ID = gameconfig_wedding and gameconfig_wedding.Cememony_Npc
|
||
-- 結婚大主教
|
||
if(npcData.id == weddingCememony_ID)then
|
||
if(WeddingProxy.Instance:IsSelfInWeddingTime())then
|
||
return gameconfig_wedding.Cememony_Dialog;
|
||
end
|
||
-- 訂婚Npc
|
||
elseif(npcData.id == engage_Npc)then
|
||
if(WeddingProxy.Instance:IsSelfMarried())then
|
||
return gameconfig_wedding.married;
|
||
elseif(WeddingProxy.Instance:IsSelfEngage())then
|
||
return gameconfig_wedding.engaged;
|
||
elseif(WeddingProxy.Instance:IsSelfSingle())then
|
||
return gameconfig_wedding.single;
|
||
end
|
||
end
|
||
end
|
||
|
||
return npcData.DefaultDialog;
|
||
end
|
||
-- DefaultDialog End
|
||
|
||
|
||
|
||
autoImport("EndLessTowerCountDownInfo");
|
||
function FunctionVisitNpc.VisitEndLessTower(target, events)
|
||
ServiceUserEventProxy.Instance:CallQueryResetTimeEventCmd(AERewardType.Tower);
|
||
|
||
-- Npc預設對話
|
||
local midShowFuncParam;
|
||
local hideFunc = function (gameObject)
|
||
midShowFuncParam:OnExit();
|
||
end
|
||
local midShowFunc = function (gameObject)
|
||
local top = GameObjectUtil.Instance:DeepFind(gameObject, "Anchor_Top")
|
||
midShowFuncParam = EndLessTowerCountDownInfo.new(top);
|
||
midShowFuncParam:CreateSelf();
|
||
midShowFuncParam:OnEnter();
|
||
return hideFunc;
|
||
end
|
||
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
tasks = events,
|
||
npcinfo = target,
|
||
midShowFunc = midShowFunc,
|
||
midShowFuncParam = midShowFuncParam,
|
||
};
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
end
|
||
|
||
function FunctionVisitNpc:AddVisitRef()
|
||
self.visitRef = self.visitRef + 1;
|
||
if(self.visitRef == 1)then
|
||
self:PreVisit();
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc:RemoveVisitRef()
|
||
self.visitRef = self.visitRef - 1;
|
||
if(self.visitRef == 0)then
|
||
self:EndVisit();
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc:PreVisit()
|
||
Game.Myself:Client_PauseIdleAI();
|
||
FunctionSystem.WeakInterruptMyself(true);
|
||
|
||
local lnpc = self:GetTarget();
|
||
if(lnpc and lnpc.data and lnpc.data.staticData)then
|
||
if(lnpc.data.staticData.IsVeer == 1)then
|
||
self:NpcTurnToMe(lnpc);
|
||
end
|
||
|
||
local visitVocal = lnpc.data.staticData.VisitVocal;
|
||
if(visitVocal~='')then
|
||
AudioUtil.PlayNpcVisitVocal(visitVocal);
|
||
end
|
||
|
||
local sceneUI = lnpc:GetSceneUI();
|
||
if(sceneUI)then
|
||
sceneUI.roleTopUI:ActiveQuestSymbolEffect(false);
|
||
end
|
||
|
||
------------------------一些特定的NPC 請求特定的訊息------------------------------
|
||
if(lnpc.data.staticData.id == 2160)then
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_Summer)
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_Autumn)
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_Charge)
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_CodeBW)
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_CodeMX)
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_MonthCard)
|
||
elseif(lnpc.data.staticData.id == 2186)then
|
||
local activityData = FunctionActivity.Me():GetActivityData( ACTIVITYTYPE.EACTIVITYTYPE_READBAG );
|
||
if(activityData)then
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_RedBag);
|
||
end
|
||
elseif(lnpc.data.staticData.id == 4285)then
|
||
ServiceSessionSocialityProxy.Instance:CallOperateQuerySocialCmd(SessionSociality_pb.EOperateType_Phone);
|
||
elseif(lnpc.data.staticData.id == 5668)then
|
||
local tutorMatchStatus = TutorProxy.Instance:GetTutorMatStatus()
|
||
local check = not tutorMatchStatus or _tutorMatchStatus.Stop == tutorMatchStatus or _tutorMatchStatus.Restart == tutorMatchStatus
|
||
local isFindTutor = TutorProxy.Instance:CanAsStudent()
|
||
if not check then
|
||
if isFindTutor then
|
||
MsgManager.ShowMsgByIDTable(25453,ZhString.Tutor_Title)
|
||
else
|
||
MsgManager.ShowMsgByIDTable(25453,ZhString.Tutor_Student)
|
||
end
|
||
return
|
||
end
|
||
end
|
||
-------------------------------------------------------------------------------
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc:EndVisit()
|
||
Game.Myself:Client_ResumeIdleAI();
|
||
|
||
local lnpc = self:GetTarget();
|
||
if(lnpc and lnpc.data and lnpc.data.staticData)then
|
||
|
||
self:NpcTurnBack(lnpc);
|
||
|
||
local endVocal = lnpc.data.staticData.EndVocal;
|
||
if(endVocal~="")then
|
||
AudioUtil.PlayNpcVisitVocal(endVocal);
|
||
end
|
||
|
||
local sceneUI = lnpc:GetSceneUI();
|
||
if(sceneUI)then
|
||
sceneUI.roleTopUI:ActiveQuestSymbolEffect(true);
|
||
end
|
||
end
|
||
|
||
self:AccessTarget(nil);
|
||
end
|
||
|
||
function FunctionVisitNpc:NpcTurnToMe(lnpc)
|
||
if(lnpc)then
|
||
lnpc:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.LookAtCreature, Game.Myself.data.id);
|
||
Game.Myself:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.LookAtCreature, lnpc.data.id);
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc:NpcTurnBack(lnpc)
|
||
if(lnpc)then
|
||
local originalRotY = lnpc.originalRotation;
|
||
lnpc:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY, originalRotY);
|
||
end
|
||
end
|
||
|
||
function FunctionVisitNpc.openWantedQuestPanel( wantedid, target)
|
||
-- body
|
||
local isInWantedQuestActivity = QuestProxy.Instance:isInWantedQuestInActivity()
|
||
if(isInWantedQuestActivity)then
|
||
GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view=PanelConfig.AnnounceQuestActivityPanel, viewdata ={wanted =
|
||
wantedid, npcTarget = target, isNpcFuncView = true}});
|
||
else
|
||
GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view=PanelConfig.AnnounceQuestPanel, viewdata ={wanted =
|
||
wantedid, npcTarget = target, isNpcFuncView = true}});
|
||
end
|
||
end
|
||
|
||
-- 一些特殊的NPC相應功能配置和處理
|
||
FunctionVisitNpc.SNpcFuncMap = {};
|
||
|
||
-- 封印任務接取的NPC(需求改動 待優化)
|
||
FunctionVisitNpc.SNpcFuncMap.seal = function (npcfunction, target)
|
||
local funcID = 0;
|
||
for i=1,#npcfunction do
|
||
local type = npcfunction[i].type;
|
||
local funcData = type and Table_NpcFunction[type];
|
||
if(funcData.NameEn == "seal")then
|
||
funcID = type;
|
||
end
|
||
end
|
||
if(FunctionUnLockFunc.Me():CheckCanOpenByPanelId(funcID))then
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
dialoglist = {5},
|
||
npcinfo = target,
|
||
addconfig = npcfunction,
|
||
};
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
return true;
|
||
end
|
||
|
||
return false;
|
||
end
|
||
|
||
-- 副本資訊面板
|
||
FunctionVisitNpc.SNpcFuncMap.Raid = function (npcfunction, target)
|
||
local canOpen = FunctionUnLockFunc.Me():CheckCanOpenByPanelId(PanelConfig.RaidInfoPopUp.id);
|
||
if(canOpen)then
|
||
local single = npcfunction[1];
|
||
GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view=PanelConfig.RaidInfoPopUp,
|
||
viewdata = {raidid = single.param}});
|
||
return true;
|
||
end
|
||
return false;
|
||
end
|
||
|
||
-- 懸賞任務面板
|
||
FunctionVisitNpc.SNpcFuncMap.wanted = function (npcfunction, target)
|
||
local canOpen = FunctionUnLockFunc.Me():CheckCanOpenByPanelId(PanelConfig.AnnounceQuestPanel.id);
|
||
if(canOpen)then
|
||
-- 如果檢測到面板上有可接的賞金任務 通知伺服器
|
||
-- local triggerQuest, branchlsts = FunctionVisitNpc.Me():CheckNpcQuest(target.data.staticData.id, target.data.uniqueid);
|
||
local questlst = QuestProxy.Instance:getDialogQuestListByNpcId(target.data.staticData.id, target.data.uniqueid);
|
||
if(questlst)then
|
||
local triggerQuest = nil;
|
||
local triggerWanted = nil;
|
||
for i=1,#questlst do
|
||
local d = questlst[i];
|
||
if(AutoTriggerQuestMap[d.type])then
|
||
if(d.type == QuestDataType.QuestDataType_WANTED)then
|
||
triggerWanted = d;
|
||
else
|
||
triggerQuest = d;
|
||
end
|
||
end
|
||
end
|
||
triggerQuest = triggerQuest or triggerWanted;
|
||
if(triggerQuest)then
|
||
local finishJump = triggerQuest.staticData.FinishJump;
|
||
QuestProxy.Instance:notifyQuestState(triggerQuest.id, finishJump);
|
||
end
|
||
end
|
||
|
||
local wantedid = npcfunction[1] and npcfunction[1].param;
|
||
FunctionVisitNpc.openWantedQuestPanel(wantedid,target)
|
||
else
|
||
-- Npc預設對話
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, {viewname = "DialogView", npcinfo = target});
|
||
end
|
||
return true;
|
||
end
|
||
|
||
-- 公會設施提交材料
|
||
FunctionVisitNpc.SNpcFuncMap.GuildBuildingSubmit = function (npcfunction,target)
|
||
local typeID = npcfunction[1] and npcfunction[1].param;
|
||
if(typeID)then
|
||
local buildingData = GuildBuildingProxy.Instance:GetCurBuilding(typeID)
|
||
if(buildingData)then
|
||
if(buildingData.isbuilding and 0==buildingData.level)then
|
||
GuildBuildingProxy.Instance:InitBuilding(target,typeID)
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, {viewname = "GuildBuildingMatSubmitView", npcinfo = target});
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 公會
|
||
FunctionVisitNpc.SNpcFuncMap.Guild = function (npcfunction, target)
|
||
FunctionGuild.Me():ShowGuildDialog(target);
|
||
return true;
|
||
end
|
||
|
||
FunctionVisitNpc.SNpcFuncMap.Common_GuildRaid = function (npcfunction, target)
|
||
FunctionGuild.Me():ShowGuildRaidDialog(target);
|
||
return true;
|
||
end
|
||
|
||
-- 尋寶
|
||
FunctionVisitNpc.SNpcFuncMap.ShakeTree = function (npcfunction, target)
|
||
FunctionShakeTree.Me():TryShakeTree(target);
|
||
return true;
|
||
end
|
||
|
||
-- 主動切線
|
||
FunctionVisitNpc.SNpcFuncMap.ChangeLine = function (npcfunction, target)
|
||
|
||
ServiceNUserProxy.Instance:CallQueryZoneStatusUserCmd()
|
||
|
||
local ChangeLine = {
|
||
event = function (npcinfo)
|
||
FunctionNpcFunc.JumpPanel(PanelConfig.ChangeZoneView, npcinfo)
|
||
end,
|
||
closeDialog = true,
|
||
NameZh = ZhString.ChangeZone_ChangeLine
|
||
}
|
||
|
||
local BackGuildLine = {
|
||
event = function (npcinfo)
|
||
if GuildProxy.Instance:IHaveGuild() then
|
||
local zoneid = GuildProxy.Instance.myGuildData.zoneid
|
||
ServiceNUserProxy.Instance:CallJumpZoneUserCmd( npcinfo.data.id , zoneid)
|
||
end
|
||
end,
|
||
closeDialog = true,
|
||
NameZh = ZhString.ChangeZone_BackGuildLine
|
||
}
|
||
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
dialoglist = {1312545},
|
||
npcinfo = target,
|
||
addfunc = {ChangeLine},
|
||
}
|
||
|
||
if GuildProxy.Instance:IHaveGuild() then
|
||
if MyselfProxy.Instance:GetZoneId() ~= GuildProxy.Instance.myGuildData.zoneid then
|
||
viewdata.addfunc[#viewdata.addfunc + 1] = BackGuildLine
|
||
end
|
||
end
|
||
|
||
FunctionNpcFunc.ShowUI(viewdata)
|
||
return true
|
||
end
|
||
|
||
FunctionVisitNpc.SNpcFuncMap.EquipReplace = function (npcfunction, target)
|
||
FunctionSecurity.Me():HoleEquip(function ()
|
||
FunctionDialogEvent.SetDialogEventEnter( DialogEventType.EquipReplace, target )
|
||
end);
|
||
return true;
|
||
end
|
||
|
||
-- 裝備升級
|
||
FunctionVisitNpc.SNpcFuncMap.EquipUpgrade = function (npcfunction, target)
|
||
FunctionSecurity.Me():LevelUpEquip(function ()
|
||
FunctionDialogEvent.SetDialogEventEnter( DialogEventType.EquipUpgrade, target )
|
||
end)
|
||
return true;
|
||
end
|
||
|
||
function FunctionVisitNpc.UpdateAuctionDialog(npcid)
|
||
local time = AuctionProxy.Instance:GetAuctionTime() or 0;
|
||
local nowtime = ServerTime.CurServerTime()/1000;
|
||
if(time < nowtime)then
|
||
local npcData = Table_Npc[npcid];
|
||
local defaultDialogId = npcData.DefaultDialog or 417;
|
||
return true, DialogUtil.GetDialogData(defaultDialogId).Text
|
||
end
|
||
|
||
local timeInfo = os.date("*t", time);
|
||
local nowInfo = os.date("*t", nowtime);
|
||
|
||
local openText = "";
|
||
local count = 0;
|
||
if(timeInfo.month > nowInfo.month)then
|
||
count = count + 1;
|
||
openText = timeInfo.month .. ZhString.FunctionVisitNpc_AuctionDialog_Month;
|
||
end
|
||
|
||
count = count + 1;
|
||
openText = openText .. timeInfo.day .. ZhString.FunctionVisitNpc_AuctionDialog_Day;
|
||
|
||
if(count < 2)then
|
||
openText = openText .. timeInfo.hour .. ZhString.FunctionVisitNpc_AuctionDialog_Hour;
|
||
end
|
||
|
||
return false, string.format(ZhString.FunctionVisitNpc_AuctionDialog_OpenTip, openText);
|
||
end
|
||
FunctionVisitNpc.SNpcFuncMap.Auction = function (npcfunction, target, events)
|
||
for k,v in pairs(npcfunction)do
|
||
helplog(k,v);
|
||
end
|
||
local viewdata = {
|
||
viewname = "DialogView",
|
||
tasks = events,
|
||
npcinfo = target,
|
||
};
|
||
GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata);
|
||
GameFacade.Instance:sendNotification(DialogEvent.AddUpdateSetTextCall, {FunctionVisitNpc.UpdateAuctionDialog, target.data.staticData.id});
|
||
return true;
|
||
end
|
||
|
||
function FunctionVisitNpc:callNextBossStep()
|
||
local bossStepQuest = QuestProxy.Instance.worldbossQuest
|
||
if bossStepQuest["dialog_select"] and bossStepQuest["dialog_select"] == 1 then
|
||
ServiceBossCmdProxy.Instance:CallStepSyncBossCmd(nil)
|
||
end
|
||
return
|
||
end |