Skip to content

Commit f8f95c0

Browse files
committed
Fixed several issues with leveling builds for Midnight
1 parent af6d5c9 commit f8f95c0

File tree

2 files changed

+68
-14
lines changed

2 files changed

+68
-14
lines changed

TalentTreeViewer_TWW/TalentViewer.lua

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ local cache = {
5353
[TalentViewer.Enum.TreeType.Spec] = {},
5454
[TalentViewer.Enum.TreeType.SubTree] = {},
5555
},
56+
--- @type table<number, TalentViewer_Enum_TreeType> # [level] = treeType
57+
currencyEarnedOrder = {},
5658
};
5759
TalentViewer.cache = cache;
5860
---@type LibTalentTree-1.0
@@ -320,6 +322,27 @@ function TalentViewer:GetCurrencyAtLevel(level, treeType)
320322
return self.cache.currencyAtLevel[treeType][level] or 0;
321323
end
322324

325+
--- @return table<number, TalentViewer_Enum_TreeType> # [level] = treeType
326+
function TalentViewer:GetCurrencyEarnedOrder()
327+
local order = self.cache.currencyEarnedOrder;
328+
if not next(order) then
329+
for i = 1, ns.MAX_LEVEL_CLASS_CURRENCY_CAP do
330+
local level = self:GetRequiredLevelForCurrencySpent(i, self.Enum.TreeType.Class);
331+
order[level] = self.Enum.TreeType.Class;
332+
end
333+
for i = 1, ns.MAX_LEVEL_SPEC_CURRENCY_CAP do
334+
local level = self:GetRequiredLevelForCurrencySpent(i, self.Enum.TreeType.Spec);
335+
order[level] = self.Enum.TreeType.Spec;
336+
end
337+
for i = 1, ns.MAX_LEVEL_SUBTREE_CURRENCY_CAP do
338+
local level = self:GetRequiredLevelForCurrencySpent(i, self.Enum.TreeType.SubTree);
339+
order[level] = self.Enum.TreeType.SubTree;
340+
end
341+
end
342+
343+
return CopyTable(order);
344+
end
345+
323346
----------------------
324347
--- UI Interaction ---
325348
----------------------

TalentTreeViewer_TWW/mixins/TalentViewerUIMixin.lua

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ end
148148
--- Various checks are disabled when the restrictions are disabled, improving performance of bulk actions substantially
149149
function TalentViewerUIMixin:RunWithRestrictionsDisabled(func)
150150
local backup = TalentViewer.db.ignoreRestrictions;
151+
RunNextFrame(function() TalentViewer.db.ignoreRestrictions = backup end);
151152
TalentViewer.db.ignoreRestrictions = true;
152153
securecallfunction(func);
153154
TalentViewer.db.ignoreRestrictions = backup;
@@ -245,10 +246,22 @@ function TalentViewerUIMixin:GetAndCacheNodeInfo(nodeID)
245246

246247
local meetsEdgeRequirements = TalentViewer.db.ignoreRestrictions or self:MeetsEdgeRequirements(nodeID);
247248
local meetsGateRequirements = true;
248-
if not TalentViewer.db.ignoreRestrictions then
249+
local isRecordingLevelingBuild = TalentViewer:IsRecordingLevelingBuild();
250+
if isRecordingLevelingBuild and nodeInfo.requiredPlayerLevel and not nodeInfo.type == Enum.TraitNodeType.SubTreeSelection then
251+
local treeType = nodeInfo.subTreeID and TalentViewer.Enum.TreeType.SubTree or (nodeInfo.isClassNode and TalentViewer.Enum.TreeType.Class or TalentViewer.Enum.TreeType.Spec);
252+
local currentSpending = self.treeTypeSpending[treeType] or 0;
253+
local level = TalentViewer:GetRequiredLevelForCurrencySpent(currentSpending + 1, treeType);
254+
if level < nodeInfo.requiredPlayerLevel then
255+
meetsGateRequirements = false;
256+
end
257+
end
258+
if meetsGateRequirements and not TalentViewer.db.ignoreRestrictions then
249259
for _, conditionId in ipairs(nodeInfo.conditionIDs) do
250260
local condInfo = self:GetAndCacheCondInfo(conditionId);
251-
if condInfo.isGate and not condInfo.isMet then meetsGateRequirements = false; end
261+
if condInfo.isGate and not condInfo.isMet then
262+
meetsGateRequirements = false;
263+
break;
264+
end
252265
end
253266
end
254267

@@ -797,6 +810,7 @@ function TalentViewerUIMixin:OnLoad()
797810
self.edgeRequirementsCache = {};
798811
self.nodeCostCache = {};
799812
self.treeCurrencyInfoCache = {};
813+
self.treeTypeSpending = {}
800814

801815
local outerSelf = self;
802816

@@ -826,6 +840,7 @@ function TalentViewerUIMixin:OnLoad()
826840
end
827841
end
828842
local requiredLevel = math.max(minimumLevel, TalentViewer:GetRequiredLevelForCurrencySpent(spent, self.treeType));
843+
outerSelf.treeTypeSpending[self.treeType] = spent;
829844

830845
local text = string.format(L['%d (level %d)'], amount, requiredLevel);
831846

@@ -904,24 +919,29 @@ function TalentViewerUIMixin:GetLevelingBuildInfo(buildID)
904919
return TalentViewer:GetLevelingBuild(buildID);
905920
end
906921

922+
--- @return nil|number nodeID
923+
--- @return nil|number entryID
924+
--- @return nil|boolean isFreePick
907925
function TalentViewerUIMixin:GetNextLevelingBuildPurchase(buildID)
908926
local info = self:GetLevelingBuildInfo(buildID);
909927
if not info then return; end
910928

929+
local currencyOrder = TalentViewer:GetCurrencyEarnedOrder();
930+
911931
for level = 10, ns.MAX_LEVEL do
912-
local targetTree;
913-
if level < 71 then
914-
targetTree = (level % 2) + 1;
915-
else
932+
local targetTree = currencyOrder[level];
933+
if targetTree == TalentViewer.Enum.TreeType.SubTree then
916934
targetTree = self:GetActiveSubTreeID();
917935
if not targetTree and info.selectedSubTreeID then
918-
return LibTalentTree:GetSubTreeSelectionNodeIDAndEntryIDBySpecID(self:GetSpecID(), info.selectedSubTreeID);
936+
local nodeID, entryID = LibTalentTree:GetSubTreeSelectionNodeIDAndEntryIDBySpecID(self:GetSpecID(), info.selectedSubTreeID);
937+
938+
return nodeID, entryID, true;
919939
end
920940
end
921941
local entryInfo = info.entries[targetTree] and info.entries[targetTree][level];
922942
local nodeInfo = entryInfo and self:GetAndCacheNodeInfo(entryInfo.nodeID);
923943
if nodeInfo and nodeInfo.ranksPurchased < entryInfo.targetRank then
924-
return entryInfo.nodeID, entryInfo.entryID;
944+
return entryInfo.nodeID, entryInfo.entryID, false;
925945
end
926946
end
927947
end
@@ -951,16 +971,27 @@ function TalentViewerUIMixin:ApplyLevelingBuild(level, lockLevelingBuild)
951971
local info = buildID and self:GetLevelingBuildInfo(buildID);
952972
if not info then return; end
953973

974+
local function purchaseNext()
975+
local nodeID, entryID, isFreePick = self:GetNextLevelingBuildPurchase(buildID);
976+
if not nodeID then return false; end
977+
if entryID then
978+
self:SetSelection(nodeID, entryID);
979+
else
980+
self:PurchaseRank(nodeID);
981+
end
982+
if isFreePick then
983+
purchaseNext()
984+
end
985+
986+
return true;
987+
end
988+
954989
self:RunWithRestrictionsDisabled(function()
955990
self:ResetTree(lockLevelingBuild);
956991
if level >= 10 then
957992
for _ = 10, level do
958-
local nodeID, entryID = self:GetNextLevelingBuildPurchase(buildID);
959-
if not nodeID then break; end
960-
if entryID then
961-
self:SetSelection(nodeID, entryID);
962-
else
963-
self:PurchaseRank(nodeID);
993+
if not purchaseNext() then
994+
break;
964995
end
965996
end
966997
end

0 commit comments

Comments
 (0)