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.
248 lines
8.9 KiB
248 lines
8.9 KiB
local _, addon = ...
|
|
local AchievementAlertUtil = addon.AchievementAlertUtil;
|
|
|
|
local GetAchievementInfo = GetAchievementInfo;
|
|
local GetParentAchievementID = NarciAPI.GetParentAchievementID;
|
|
|
|
local strsub = strsub;
|
|
local strsplit = strsplit;
|
|
|
|
local IS_TOOLTIP_HOOKED = false;
|
|
local ENABLE_TOOLTIP = false;
|
|
local tooltipButtons = {};
|
|
|
|
local function InsertTooltipButton(tooltipFrame, buttonIndex, achievementID, completed, topLine)
|
|
--Called after adding new line
|
|
local line;
|
|
if topLine then
|
|
line = 1;
|
|
else
|
|
line = tooltipFrame:NumLines();
|
|
end
|
|
if not tooltipButtons[buttonIndex] then
|
|
tooltipButtons[buttonIndex] = CreateFrame("Button", nil, nil, "NarciAchievementTooltipButtonTemplate");
|
|
end
|
|
local button = tooltipButtons[buttonIndex];
|
|
button:ClearAllPoints();
|
|
button:SetParent(tooltipFrame);
|
|
button.achievementID = achievementID;
|
|
button:SetPoint("TOPLEFT", tooltipFrame:GetName().."TextLeft"..line, "TOPLEFT", 0, 2);
|
|
if topLine then
|
|
button:SetPoint("BOTTOMLEFT", tooltipFrame:GetName().."TextLeft"..line, "BOTTOMLEFT", 0, -2);
|
|
button:SetWidth(tooltipFrame:GetWidth() - 16);
|
|
button.closeFrame = true;
|
|
else
|
|
button:SetPoint("BOTTOMRIGHT", tooltipFrame:GetName().."TextLeft"..line, "BOTTOMRIGHT", 0, -2);
|
|
button.closeFrame = false;
|
|
end
|
|
if completed then
|
|
button.Highlight:SetVertexColor(0.251, 0.753, 0.251);
|
|
else
|
|
button.Highlight:SetVertexColor(1, 0.82, 0);
|
|
end
|
|
button:Show();
|
|
if not tooltipFrame.insertedFrames then
|
|
tooltipFrame.insertedFrames = {};
|
|
end
|
|
tinsert(tooltipFrame.insertedFrames, button);
|
|
end
|
|
|
|
local function HookAchievementTooltip()
|
|
if IS_TOOLTIP_HOOKED then return end;
|
|
IS_TOOLTIP_HOOKED = true;
|
|
|
|
hooksecurefunc(ItemRefTooltip, "SetHyperlink", function(self, link)
|
|
if not ENABLE_TOOLTIP then return end;
|
|
|
|
if strsub(link, 1, 11) == "achievement" then
|
|
local _, achievementID = strsplit(":", link);
|
|
achievementID = tonumber(achievementID);
|
|
local id, name, _, completed = GetAchievementInfo(achievementID);
|
|
InsertTooltipButton(self, 1, achievementID, completed, true)
|
|
local parentAchievementID1, parentAchievementID2 = GetParentAchievementID(achievementID, true);
|
|
if parentAchievementID1 then
|
|
self:AddLine(" ");
|
|
local id, name, _, completed = GetAchievementInfo(parentAchievementID1);
|
|
local colorString;
|
|
if completed then
|
|
colorString = "|cff40c040";
|
|
else
|
|
colorString = "|cFFFFD100";
|
|
end
|
|
--self:AddDoubleLine("|cFF808080> |r"..colorString..name.."|r", id, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, true);
|
|
self:AddLine("|cFF808080> |r"..colorString..name.."|r", 0.5, 0.5, 0.5, true);
|
|
InsertTooltipButton(self, 2, parentAchievementID1, completed);
|
|
if parentAchievementID2 then
|
|
id, name, _, completed = GetAchievementInfo(parentAchievementID2);
|
|
if completed then
|
|
colorString = "|cff40c040";
|
|
else
|
|
colorString = "|cFFFFD100";
|
|
end
|
|
--self:AddDoubleLine("|cFF808080>> |r"..colorString..name.."|r", id, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, true);
|
|
self:AddLine("|cFF808080>> |r"..colorString..name.."|r", 0.5, 0.5, 0.5, true);
|
|
InsertTooltipButton(self, 3, parentAchievementID2, completed);
|
|
end
|
|
self:Show();
|
|
end
|
|
end
|
|
end);
|
|
end
|
|
|
|
|
|
local function AttemptToOpenAchievement(achievementID, clickAgainToClose)
|
|
if Narci_AchievementFrame then
|
|
Narci_AchievementFrame:LocateAchievement(achievementID, clickAgainToClose);
|
|
else
|
|
Narci.LoadAchievementPanel(achievementID, clickAgainToClose);
|
|
end
|
|
end
|
|
|
|
|
|
NarciAchievementExtraTooltipMixin = {};
|
|
|
|
function NarciAchievementExtraTooltipMixin:OnLoad()
|
|
self:RegisterForDrag("LeftButton");
|
|
end
|
|
|
|
function NarciAchievementExtraTooltipMixin:OnDragStart()
|
|
local parent = self:GetParent();
|
|
if parent and parent.OnDragStart then
|
|
parent:OnDragStart();
|
|
end
|
|
end
|
|
|
|
function NarciAchievementExtraTooltipMixin:OnDragStop()
|
|
local parent = self:GetParent();
|
|
if parent and parent.OnDragStop then
|
|
parent:OnDragStop();
|
|
end
|
|
end
|
|
|
|
function NarciAchievementExtraTooltipMixin:OnClick(button)
|
|
if self.achievementID then
|
|
AttemptToOpenAchievement(self.achievementID);
|
|
if button == "RightButton" or self.closeFrame then
|
|
self:GetParent():Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------
|
|
--Redirect Blizzard Achievement to Narcissus Achievement Frame
|
|
--Temporarily disabled due to taint in Dragonflight
|
|
|
|
--[[
|
|
local Original_OnBlockHeaderClick = ACHIEVEMENT_TRACKER_MODULE.OnBlockHeaderClick;
|
|
local Original_OpenAchievementFrameToAchievement = OpenAchievementFrameToAchievement;
|
|
local Original_AchievementAlertFrame_OnClick = AchievementAlertFrame_OnClick;
|
|
|
|
local function New_OnBlockHeaderClick(_, block, mouseButton)
|
|
if ( IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() ) then
|
|
local achievementLink = GetAchievementLink(block.id);
|
|
if ( achievementLink ) then
|
|
ChatEdit_InsertLink(achievementLink);
|
|
end
|
|
elseif ( mouseButton ~= "RightButton" ) then
|
|
if ( IsModifiedClick("QUESTWATCHTOGGLE") ) then
|
|
RemoveTrackedAchievement(block.id);
|
|
else
|
|
local clickAgainToClose = true;
|
|
AttemptToOpenAchievement(block.id, clickAgainToClose);
|
|
end
|
|
else
|
|
ObjectiveTracker_ToggleDropDown(block, AchievementObjectiveTracker_OnOpenDropDown);
|
|
end
|
|
end
|
|
|
|
local RedirectFrame = {};
|
|
RedirectFrame.hasOverwritten = false;
|
|
|
|
function RedirectFrame:RestoreFunctions()
|
|
if self.hasOverwritten then
|
|
self.hasOverwritten = false;
|
|
OpenAchievementFrameToAchievement = Original_OpenAchievementFrameToAchievement;
|
|
AchievementAlertFrame_OnClick = Original_AchievementAlertFrame_OnClick;
|
|
ACHIEVEMENT_TRACKER_MODULE.OnBlockHeaderClick = Original_OnBlockHeaderClick;
|
|
end
|
|
end
|
|
|
|
function RedirectFrame:OverrideFunctions()
|
|
if not self.hasOverwritten then
|
|
self.hasOverwritten = true;
|
|
function OpenAchievementFrameToAchievement(achievementID)
|
|
AttemptToOpenAchievement(achievementID);
|
|
end
|
|
ACHIEVEMENT_TRACKER_MODULE.OnBlockHeaderClick = New_OnBlockHeaderClick;
|
|
end
|
|
end
|
|
|
|
local function UpdateAchievementSettings()
|
|
if NarciAchievementOptions.UseAsDefault then
|
|
RedirectFrame:OverrideFunctions();
|
|
HookAchievementTooltip()
|
|
ENABLE_TOOLTIP = true;
|
|
if NarciAchievementOptions.ReplaceToast then
|
|
AchievementAlertUtil:Enable();
|
|
AchievementAlertFrame_OnClick = AchievementAlertUtil.AlertFrame_OnClick;
|
|
else
|
|
AchievementAlertUtil:Disable();
|
|
AchievementAlertFrame_OnClick = Original_AchievementAlertFrame_OnClick;
|
|
end
|
|
else
|
|
RedirectFrame:RestoreFunctions();
|
|
ENABLE_TOOLTIP = false;
|
|
AchievementAlertUtil:Disable();
|
|
end
|
|
end
|
|
--]]
|
|
|
|
local function UpdateAchievementSettings()
|
|
end
|
|
|
|
Narci.UpdateAchievementSettings = UpdateAchievementSettings;
|
|
|
|
|
|
|
|
local MODULE_NAME = "Narcissus_Achievements";
|
|
|
|
local Loader = CreateFrame("Frame");
|
|
Loader:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
|
|
Loader:SetScript("OnEvent", function(self, event, ...)
|
|
if event == "ADDON_LOADED" then
|
|
local name = ...
|
|
if name == MODULE_NAME then
|
|
self:UnregisterEvent(event);
|
|
self:OnAddOnLoaded();
|
|
end
|
|
elseif event == "PLAYER_ENTERING_WORLD" then
|
|
self:UnregisterEvent(event);
|
|
UpdateAchievementSettings();
|
|
end
|
|
end)
|
|
|
|
function Loader:LoadAchievementPanel()
|
|
Loader:RegisterEvent("ADDON_LOADED");
|
|
EnableAddOn(MODULE_NAME); --Forced Enable
|
|
local loaded, reason = LoadAddOn(MODULE_NAME);
|
|
end
|
|
|
|
function Loader:OnAddOnLoaded()
|
|
local frame = Narci_AchievementFrame;
|
|
if frame then
|
|
frame:Init();
|
|
if self.pendingAchievementID then
|
|
C_Timer.After(0.5, function()
|
|
frame:LocateAchievement(self.pendingAchievementID, self.clickAgainToClose);
|
|
self.pendingAchievementID = nil;
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
|
|
Narci.LoadAchievementPanel = function(achievementID, clickAgainToClose)
|
|
Loader.pendingAchievementID = achievementID; --Load panel then go to this achievement
|
|
Loader.clickAgainToClose = clickAgainToClose;
|
|
Loader:LoadAchievementPanel();
|
|
end
|