|
148 | 148 | --- Various checks are disabled when the restrictions are disabled, improving performance of bulk actions substantially |
149 | 149 | function TalentViewerUIMixin:RunWithRestrictionsDisabled(func) |
150 | 150 | local backup = TalentViewer.db.ignoreRestrictions; |
| 151 | + RunNextFrame(function() TalentViewer.db.ignoreRestrictions = backup end); |
151 | 152 | TalentViewer.db.ignoreRestrictions = true; |
152 | 153 | securecallfunction(func); |
153 | 154 | TalentViewer.db.ignoreRestrictions = backup; |
@@ -245,10 +246,22 @@ function TalentViewerUIMixin:GetAndCacheNodeInfo(nodeID) |
245 | 246 |
|
246 | 247 | local meetsEdgeRequirements = TalentViewer.db.ignoreRestrictions or self:MeetsEdgeRequirements(nodeID); |
247 | 248 | 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 |
249 | 259 | for _, conditionId in ipairs(nodeInfo.conditionIDs) do |
250 | 260 | 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 |
252 | 265 | end |
253 | 266 | end |
254 | 267 |
|
@@ -797,6 +810,7 @@ function TalentViewerUIMixin:OnLoad() |
797 | 810 | self.edgeRequirementsCache = {}; |
798 | 811 | self.nodeCostCache = {}; |
799 | 812 | self.treeCurrencyInfoCache = {}; |
| 813 | + self.treeTypeSpending = {} |
800 | 814 |
|
801 | 815 | local outerSelf = self; |
802 | 816 |
|
@@ -826,6 +840,7 @@ function TalentViewerUIMixin:OnLoad() |
826 | 840 | end |
827 | 841 | end |
828 | 842 | local requiredLevel = math.max(minimumLevel, TalentViewer:GetRequiredLevelForCurrencySpent(spent, self.treeType)); |
| 843 | + outerSelf.treeTypeSpending[self.treeType] = spent; |
829 | 844 |
|
830 | 845 | local text = string.format(L['%d (level %d)'], amount, requiredLevel); |
831 | 846 |
|
@@ -904,24 +919,29 @@ function TalentViewerUIMixin:GetLevelingBuildInfo(buildID) |
904 | 919 | return TalentViewer:GetLevelingBuild(buildID); |
905 | 920 | end |
906 | 921 |
|
| 922 | +--- @return nil|number nodeID |
| 923 | +--- @return nil|number entryID |
| 924 | +--- @return nil|boolean isFreePick |
907 | 925 | function TalentViewerUIMixin:GetNextLevelingBuildPurchase(buildID) |
908 | 926 | local info = self:GetLevelingBuildInfo(buildID); |
909 | 927 | if not info then return; end |
910 | 928 |
|
| 929 | + local currencyOrder = TalentViewer:GetCurrencyEarnedOrder(); |
| 930 | + |
911 | 931 | 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 |
916 | 934 | targetTree = self:GetActiveSubTreeID(); |
917 | 935 | 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; |
919 | 939 | end |
920 | 940 | end |
921 | 941 | local entryInfo = info.entries[targetTree] and info.entries[targetTree][level]; |
922 | 942 | local nodeInfo = entryInfo and self:GetAndCacheNodeInfo(entryInfo.nodeID); |
923 | 943 | if nodeInfo and nodeInfo.ranksPurchased < entryInfo.targetRank then |
924 | | - return entryInfo.nodeID, entryInfo.entryID; |
| 944 | + return entryInfo.nodeID, entryInfo.entryID, false; |
925 | 945 | end |
926 | 946 | end |
927 | 947 | end |
@@ -951,16 +971,27 @@ function TalentViewerUIMixin:ApplyLevelingBuild(level, lockLevelingBuild) |
951 | 971 | local info = buildID and self:GetLevelingBuildInfo(buildID); |
952 | 972 | if not info then return; end |
953 | 973 |
|
| 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 | + |
954 | 989 | self:RunWithRestrictionsDisabled(function() |
955 | 990 | self:ResetTree(lockLevelingBuild); |
956 | 991 | if level >= 10 then |
957 | 992 | 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; |
964 | 995 | end |
965 | 996 | end |
966 | 997 | end |
|
0 commit comments