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.
289 lines
9.0 KiB
289 lines
9.0 KiB
local _, addon = ...
|
|
local API = addon.API;
|
|
local MainFrame = addon.DialogueUI;
|
|
local IsInteractingWithDialogNPC = API.IsInteractingWithDialogNPC;
|
|
local CancelClosingGossipInteraction = API.CancelClosingGossipInteraction;
|
|
local QuestIsFromAreaTrigger = API.QuestIsFromAreaTrigger;
|
|
local GossipDataProvider = addon.GossipDataProvider;
|
|
local QuestGetAutoAccept = API.QuestGetAutoAccept;
|
|
local CloseQuest = CloseQuest;
|
|
|
|
|
|
local EVENT_PROCESS_DELAY = 0.017; --Affected by CameraMovement
|
|
|
|
local EL = CreateFrame("Frame");
|
|
|
|
local GossipEvents = {
|
|
"GOSSIP_SHOW", "GOSSIP_CLOSED",
|
|
"CONFIRM_TALENT_WIPE", --Classic
|
|
};
|
|
|
|
local QuestEvents = {
|
|
"QUEST_PROGRESS",
|
|
"QUEST_DETAIL",
|
|
"QUEST_FINISHED", --Close QuestFrame
|
|
"QUEST_GREETING", --Offer several quests
|
|
"QUEST_COMPLETE", --Talk to turn in quest
|
|
};
|
|
|
|
local CloseDialogEvents = {};
|
|
|
|
if not addon.IsToCVersionEqualOrNewerThan(50000) then
|
|
local ClassicEvents = {
|
|
"CONFIRM_TALENT_WIPE", "CONFIRM_TALENT_WIPE",
|
|
};
|
|
|
|
for _, event in ipairs(ClassicEvents) do
|
|
table.insert(GossipEvents, event);
|
|
CloseDialogEvents[event] = true;
|
|
end
|
|
end
|
|
|
|
|
|
function EL:OnManualEvent(event, ...)
|
|
self:SetScript("OnUpdate", nil);
|
|
|
|
if event == "QUEST_FINISHED" then
|
|
if not IsInteractingWithDialogNPC() then
|
|
MainFrame:HideUI();
|
|
end
|
|
elseif event == "GOSSIP_SHOW" then
|
|
MainFrame:ShowUI(event);
|
|
elseif event == "GOSSIP_CLOSED" then
|
|
self:OnGossipClosed(...);
|
|
end
|
|
end
|
|
|
|
function EL:OnGossipClosed(interactionIsContinuing)
|
|
if self.customFrame then
|
|
local f = self.customFrame;
|
|
self.customFrame = nil;
|
|
HideUIPanel(f);
|
|
return
|
|
end
|
|
|
|
if not IsInteractingWithDialogNPC() then
|
|
if not MainFrame:IsGossipCloseConsumed() then
|
|
--MainFrame:SetInteractionIsContinuing(interactionIsContinuing);
|
|
MainFrame:HideUI();
|
|
end
|
|
GossipDataProvider:OnInteractStopped();
|
|
end
|
|
end
|
|
|
|
function EL:NegateLastEvent(event)
|
|
if event == self.lastEvent then
|
|
self.lastEvent = nil;
|
|
end
|
|
end
|
|
|
|
function EL:OnEvent(event, ...)
|
|
self.lastEvent = event;
|
|
|
|
if event == "GOSSIP_SHOW" then
|
|
local handler = self:GetHandler(...);
|
|
if handler then
|
|
self.customFrame = handler(...);
|
|
else
|
|
if self:ThrottleGossipEvent() then
|
|
MainFrame:ShowUI(event); --Depends on the options, we may select the non-gossip one directly without openning the UI
|
|
GossipDataProvider:OnInteractWithNPC();
|
|
CancelClosingGossipInteraction();
|
|
end
|
|
end
|
|
|
|
self:NegateLastEvent(event);
|
|
|
|
elseif event == "GOSSIP_CLOSED" then
|
|
self:ProcessEventNextUpdate(0.1);
|
|
--self:OnGossipClosed(...);
|
|
|
|
elseif event == "QUEST_FINISHED" then
|
|
--When the quest giver has more than one quest
|
|
--sometimes there is a delay between QUEST_FINISHED and GOSSIP_SHOW (presumably depends on various of factors including latency)
|
|
--the game determinates interaction then re-engage, messing up ActionCam and gossip info
|
|
--our workaround is setting s delay to this event
|
|
|
|
self:ProcessEventNextUpdate(MainFrame:GetQuestFinishedDelay());
|
|
|
|
elseif event == "QUEST_DETAIL" then
|
|
if ( QuestGetAutoAccept() and QuestIsFromAreaTrigger() ) then
|
|
CloseQuest();
|
|
else
|
|
MainFrame:ShowUI(event);
|
|
end
|
|
|
|
elseif event == "QUEST_PROGRESS" or event == "QUEST_COMPLETE" or event == "QUEST_GREETING" then
|
|
MainFrame:ShowUI(event);
|
|
|
|
elseif CloseDialogEvents[event] then
|
|
MainFrame:HideUI();
|
|
end
|
|
|
|
--print(event, GetTimePreciseSec());
|
|
end
|
|
|
|
|
|
function EL:ListenEvent(state)
|
|
local method;
|
|
|
|
if state then
|
|
method = "RegisterEvent";
|
|
self:SetScript("OnEvent", self.OnEvent);
|
|
else
|
|
method= "UnregisterEvent";
|
|
self:SetScript("OnEvent", nil);
|
|
end
|
|
|
|
for _, event in ipairs(GossipEvents) do
|
|
self[method](self, event);
|
|
end
|
|
|
|
for _, event in ipairs(QuestEvents) do
|
|
self[method](self, event);
|
|
end
|
|
end
|
|
|
|
function EL:OnUpdate(elapsed)
|
|
if self.processEvent then
|
|
self.t = self.t + elapsed;
|
|
if self.t > EVENT_PROCESS_DELAY then
|
|
self.t = 0;
|
|
self.processEvent = nil;
|
|
if self.lastEvent then
|
|
--print("LAST EVENT", self.lastEvent)
|
|
self:OnManualEvent(self.lastEvent);
|
|
self.lastEvent = nil;
|
|
end
|
|
end
|
|
end
|
|
|
|
if self.pauseGossip then
|
|
self.pauseGossip = self.pauseGossip + elapsed;
|
|
if self.pauseGossip >= 0 then
|
|
self.pauseGossip = nil;
|
|
end
|
|
end
|
|
|
|
if not (self.processEvent or self.pauseGossip) then
|
|
self:SetScript("OnUpdate", nil);
|
|
end
|
|
end
|
|
|
|
function EL:ThrottleGossipEvent()
|
|
if not self.pauseGossip then
|
|
self.pauseGossip = 0.016;
|
|
self:SetScript("OnUpdate", self.OnUpdate);
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function EL:ProcessEventNextUpdate(customDelay)
|
|
customDelay = customDelay or 0;
|
|
self.t = -customDelay;
|
|
self.processEvent = true;
|
|
self:SetScript("OnUpdate", self.OnUpdate);
|
|
end
|
|
|
|
|
|
EL:ListenEvent(true);
|
|
|
|
do
|
|
local DEFAULT_CAMERA_MODE = 1;
|
|
local MAINTAIN_CAMERA_POSITION = false;
|
|
|
|
local function OnCameraModeChanged(_, mode)
|
|
if mode == 0 then --0: No Zoom
|
|
EVENT_PROCESS_DELAY = 0.017;
|
|
elseif mode == 1 then --1: Zoom to NPC
|
|
if MAINTAIN_CAMERA_POSITION then
|
|
EVENT_PROCESS_DELAY = 0.5;
|
|
else
|
|
EVENT_PROCESS_DELAY = 0.017;
|
|
end
|
|
elseif mode == 2 then --2: Shift camear horizontally
|
|
EVENT_PROCESS_DELAY = 0.5;
|
|
end
|
|
DEFAULT_CAMERA_MODE = mode;
|
|
end
|
|
|
|
addon.CallbackRegistry:Register("Camera.ModeChanged", OnCameraModeChanged, EL);
|
|
|
|
local function Settings_CameraMovement1MaintainPosition(dbValue)
|
|
MAINTAIN_CAMERA_POSITION = dbValue == true;
|
|
if DEFAULT_CAMERA_MODE then
|
|
OnCameraModeChanged(nil, DEFAULT_CAMERA_MODE);
|
|
end
|
|
end
|
|
addon.CallbackRegistry:Register("SettingChanged.CameraMovement1MaintainPosition", Settings_CameraMovement1MaintainPosition);
|
|
end
|
|
|
|
do --Unlisten events from default UI
|
|
--CustomGossipFrameManager:
|
|
--We need to mute this so HideUI doesn't trigger CloseGossip
|
|
--It handle NPE (Be A Guide) and Torghast Floor Selection
|
|
if CustomGossipFrameManager then --CustomGossipFrameBase.lua (Retail)
|
|
CustomGossipFrameManager:UnregisterEvent("GOSSIP_SHOW");
|
|
CustomGossipFrameManager:UnregisterEvent("GOSSIP_CLOSED");
|
|
end
|
|
|
|
if GossipFrame then --Classic
|
|
GossipFrame:UnregisterEvent("GOSSIP_SHOW");
|
|
GossipFrame:UnregisterEvent("GOSSIP_CLOSED");
|
|
GossipFrame:UnregisterEvent("QUEST_LOG_UPDATE");
|
|
end
|
|
|
|
local hideQuestFrame = true --not addon.IsToCVersionEqualOrNewerThan(110000); --TWW
|
|
if hideQuestFrame then
|
|
QuestFrame:UnregisterAllEvents();
|
|
else
|
|
QuestFrame:SetParent(nil);
|
|
QuestFrame:SetScale(2/3);
|
|
end
|
|
end
|
|
|
|
do
|
|
local function HandleNPEGuideGossipShow(textureKit)
|
|
C_AddOns.LoadAddOn("Blizzard_NewPlayerExperienceGuide");
|
|
ShowUIPanel(GuideFrame);
|
|
return GuideFrame
|
|
end
|
|
|
|
local function HandleTorghastLevelPickerGossipShow(textureKit)
|
|
C_AddOns.LoadAddOn("Blizzard_TorghastLevelPicker");
|
|
TorghastLevelPickerFrame:TryShow(textureKit)
|
|
return TorghastLevelPickerFrame
|
|
end
|
|
|
|
local function HandleDelvesDifficultyPickerGossipShow(textureKit) --TWW
|
|
C_AddOns.LoadAddOn("Blizzard_DelvesDifficultyPicker");
|
|
DelvesDifficultyPickerFrame:TryShow(textureKit);
|
|
return DelvesDifficultyPickerFrame
|
|
end
|
|
|
|
EL.handlers = {};
|
|
|
|
function EL:RegisterHandler(textureKit, func)
|
|
self.handlers[textureKit] = func;
|
|
end
|
|
|
|
function EL:GetHandler(textureKit)
|
|
--print("textureKit", textureKit)
|
|
return textureKit and self.handlers[textureKit]
|
|
end
|
|
|
|
function EL:RegisterCustomGossipFrames()
|
|
self:RegisterHandler("npe-guide", HandleNPEGuideGossipShow);
|
|
self:RegisterHandler("skoldushall", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("mortregar", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("coldheartinterstitia", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("fracturechambers", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("soulforges", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("theupperreaches", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("twistingcorridors", HandleTorghastLevelPickerGossipShow);
|
|
self:RegisterHandler("delves-difficulty-picker", HandleDelvesDifficultyPickerGossipShow); --For some reason this textureKit is sometimes nil, causing issue
|
|
end
|
|
EL:RegisterCustomGossipFrames();
|
|
end
|