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.

309 lines
11 KiB

local _, addon = ...
local OnEnterDelay = addon.TalentTreeOnEnterDelay;
local ClassTalentTooltipUtil = addon.ClassTalentTooltipUtil;
local GetDefinitionInfo = C_Traits.GetDefinitionInfo;
local GetSpellInfo = addon.TransitionAPI.GetSpellInfo;
local GetPvpTalentInfoByID = GetPvpTalentInfoByID;
local IsSpellPassive = addon.TransitionAPI.IsSpellPassive;
local select = select;
local Handler;
local NodeUtil = {};
addon.TalentTreeNodeUtil = NodeUtil;
function NodeUtil:SetModeNormal()
self.clickable = false;
end
NodeUtil:SetModeNormal();
function NodeUtil:SetModePickIcon()
self.clickable = true;
end
function NodeUtil:AssignHandler(frame)
Handler = frame;
end
NarciTalentTreeNodeMixin = {};
local function SetNodeIcon(node, definitionInfo, overrideSpellID)
if definitionInfo then
local overrideIcon = definitionInfo.overrideIcon;
if not overrideIcon then
local spellID = overrideSpellID or definitionInfo.spellID;
if spellID then
overrideIcon = select(8, GetSpellInfo(spellID));
end
end
node.Icon:SetTexture(overrideIcon);
node.Icon:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375);
else
node.Icon:SetTexture(nil);
end
end
function NarciTalentTreeNodeMixin:SetNodeType(typeID, ranksPurchased)
--typeID: this is custom value 0:Square 1:Circle 2:Octagon
if typeID ~= self.typeID then
self.typeID = typeID;
if typeID == 0 then
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskSquare");
self.IconBorder:SetTexCoord(0, 0.25, 0, 0.5);
--self.Symbol:SetTexCoord(0, 0.25, 0, 0.25);
self.Symbol:SetTexCoord(0.75, 1, 0.25, 0.5); --DEBUG:Invisible
elseif typeID == 1 then
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskCircle");
self.IconBorder:SetTexCoord(0.25, 0.5, 0, 0.5);
self.Symbol:SetTexCoord(0, 0.25, 0.25, 0.5);
else --2
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskOctagon");
self.Symbol:SetTexCoord(0.75, 1, 0, 0.25);
self.IconBorder:SetTexCoord(0, 0.25, 0.5, 1);
end
end
if ranksPurchased ~= self.points then
self.points = ranksPurchased;
if typeID == 1 then
if ranksPurchased == 1 then
--1/2, 1/3
self.IconBorder:SetTexCoord(0.5, 0.75, 0, 0.5);
self.Symbol:SetTexCoord(0, 0.25, 0.5, 0.75);
elseif ranksPurchased == 2 then
--2/3
self.IconBorder:SetTexCoord(0.75, 1, 0, 0.5);
self.Symbol:SetTexCoord(0.25, 0.5, 0.75, 1);
else
--don't show number for fully purchased talent (1/1, 2/2, 3/3)
self.IconBorder:SetTexCoord(0.25, 0.5, 0, 0.5);
self.Symbol:SetTexCoord(0, 0.25, 0.25, 0.5);
end
self.Symbol:SetTexCoord(0.75, 1, 0.25, 0.5); --DEBUG:Invisible
elseif typeID == 2 then
if ranksPurchased == 0 then
--no slecion
self.IconBorder:SetTexCoord(0, 0.25, 0.5, 1);
self.Symbol:SetTexCoord(0.75, 1, 0, 0.25);
elseif ranksPurchased == 1 then
--select left
self.IconBorder:SetTexCoord(0.25, 0.5, 0.5, 1);
self.Symbol:SetTexCoord(0.25, 0.5, 0, 0.25);
else
--select right
self.IconBorder:SetTexCoord(0.5, 0.75, 0.5, 1);
self.Symbol:SetTexCoord(0.5, 0.75, 0, 0.25);
end
else
self.IconBorder:SetTexCoord(0, 0.25, 0, 0.5);
end
end
end
function NarciTalentTreeNodeMixin:SetDefinitionID(definitionID)
if not definitionID then return end;
local info = GetDefinitionInfo(definitionID);
self.definitionID = definitionID;
SetNodeIcon(self, info);
end
function NarciTalentTreeNodeMixin:SetActive(state)
if state or state == nil then
if not self.isActive then
self.isActive = true;
self.Icon:SetVertexColor(1, 1, 1);
self.Icon:SetDesaturated(false);
self.IconBorder:SetVertexColor(1, 1, 1);
self.IconBorder:SetDesaturated(false);
end
else
if self.isActive or self.isActive == nil then
self.isActive = nil;
self.Icon:SetVertexColor(0.400, 0.400, 0.400);
self.Icon:SetDesaturated(true);
self.IconBorder:SetVertexColor(0.400, 0.400, 0.400);
self.IconBorder:SetDesaturated(true);
end
end
end
function NarciTalentTreeNodeMixin:SetBorderColor(index)
if index == self.colorIndex then return end;
self.colorIndex = index;
if index == 1 then
self.IconBorder:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeIconBorderYellow");
elseif index == 2 then
self.IconBorder:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeIconBorderCyan");
elseif index == 3 then
self.IconBorder:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeIconBorderComparison");
end
end
function NarciTalentTreeNodeMixin:OnEnter()
if NodeUtil.clickable then
Handler:HighlightButton(self);
return
end
OnEnterDelay:WatchButton(self);
ClassTalentTooltipUtil:UpdateCursorDelta();
end
function NarciTalentTreeNodeMixin:OnEnterCallback()
if self.isPvp then
ClassTalentTooltipUtil.SetFromPvPButton(self);
else
ClassTalentTooltipUtil.SetFromNode(self);
end
end
function NarciTalentTreeNodeMixin:OnLeave()
if NodeUtil.clickable then
Handler:HighlightButton();
end
OnEnterDelay:ClearWatch();
ClassTalentTooltipUtil.HideTooltip();
end
function NarciTalentTreeNodeMixin:OnMouseDown()
if NodeUtil.clickable then
Handler:SetSecondaryIcon(self.Icon:GetTexture(), true);
end
end
function NarciTalentTreeNodeMixin:SetPvPTalent(talentID)
self.talentID = talentID;
if talentID then
local _, _, icon, _, _, spellID = GetPvpTalentInfoByID(talentID);
self.Icon:SetTexture(icon);
self:SetActive(true);
if IsSpellPassive(spellID) then
self:SetNodeType(1);
else
self:SetNodeType(0);
end
else
self.Icon:SetTexture(nil);
self:SetActive(false);
self:SetNodeType(2, 0);
end
end
function NarciTalentTreeNodeMixin:SetComparison(typeID, targetRank, playerRank)
--typeID: this is custom value 0:Square 1:Circle 2:Octagon
self.points = nil;
self.currentRank = targetRank;
if typeID ~= self.typeID then
self.typeID = typeID;
if typeID == 0 then
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskSquare");
self.Symbol:SetTexCoord(0, 0.25, 0, 0.25);
elseif typeID == 1 then
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskCircle");
self.Symbol:SetTexCoord(0, 0.25, 0.25, 0.5);
else
self.IconMask:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\NodeMaskOctagon");
self.Symbol:SetTexCoord(0.75, 1, 0, 0.25);
end
end
if typeID == 0 then
if targetRank < playerRank then
self.IconBorder:SetTexCoord(0, 0.125, 0, 0.25);
else
self.IconBorder:SetTexCoord(0, 0.125, 0.5, 0.75);
end
elseif typeID == 1 then
if targetRank < playerRank then
if targetRank == 0 then
if playerRank == 1 then --0:1
self.IconBorder:SetTexCoord(0.5, 0.625, 0.75, 1);
elseif playerRank == 2 then --0:2
self.IconBorder:SetTexCoord(0.625, 0.75, 0.75, 1);
elseif playerRank == 3 then --0:3
self.IconBorder:SetTexCoord(0.75, 0.875, 0.75, 1);
else
self.IconBorder:SetTexCoord(0.125, 0.25, 0, 0.25);
end
elseif targetRank == 1 then
if playerRank == 2 then --1:2
self.IconBorder:SetTexCoord(0.5, 0.625, 0, 0.25);
elseif playerRank == 3 then --1:3
self.IconBorder:SetTexCoord(0.625, 0.75, 0, 0.25);
else
self.IconBorder:SetTexCoord(0.125, 0.25, 0, 0.25);
end
else --2:3
self.IconBorder:SetTexCoord(0.825, 1, 0.25, 0.5);
end
elseif targetRank > playerRank then
if playerRank == 0 then
if targetRank == 1 then --1:0
self.IconBorder:SetTexCoord(0.5, 0.625, 0.5, 0.75);
elseif targetRank == 2 then --2:0
self.IconBorder:SetTexCoord(0.625, 0.75, 0.5, 0.75);
elseif targetRank == 3 then --3:0
self.IconBorder:SetTexCoord(0.75, 0.875, 0.5, 0.75);
else
self.IconBorder:SetTexCoord(0.125, 0.25, 0.5, 0.75);
end
elseif playerRank == 1 then
if targetRank == 2 then --2:1
self.IconBorder:SetTexCoord(0.75, 0.875, 0, 0.25);
elseif targetRank == 3 then --3:1
self.IconBorder:SetTexCoord(0.875, 1, 0, 0.25);
else
self.IconBorder:SetTexCoord(0.125, 0.25, 0.5, 0.75);
end
else --3:2
self.IconBorder:SetTexCoord(0.875, 1, 0.25, 0.5);
end
else
self.IconBorder:SetTexCoord(0.125, 0.25, 0.5, 0.75);
end
elseif typeID == 2 then
if targetRank == playerRank then
if targetRank == 0 then
self.IconBorder:SetTexCoord(0, 0.125, 0.75, 1);
elseif targetRank == 1 then
self.IconBorder:SetTexCoord(0.125, 0.25, 0.75, 1);
else
self.IconBorder:SetTexCoord(0.25, 0.375, 0.75, 1);
end
else
if targetRank == 0 then
if playerRank == 1 then --left
self.IconBorder:SetTexCoord(0, 0.125, 0.25, 0.5);
else --right
self.IconBorder:SetTexCoord(0.125, 0.25, 0.25, 0.5);
end
elseif targetRank == 1 then
if playerRank == 0 then
self.IconBorder:SetTexCoord(0.125, 0.25, 0.75, 1);
else --left,right
self.IconBorder:SetTexCoord(0.5, 0.625, 0.25, 0.5);
end
else
if playerRank == 0 then
self.IconBorder:SetTexCoord(0.25, 0.375, 0.75, 1);
else --left,right
self.IconBorder:SetTexCoord(0.625, 0.75, 0.25, 0.5);
end
end
end
end
end