From 724239c4dfcde6eadc7440ff1881ecb48bcd1396 Mon Sep 17 00:00:00 2001 From: Kevin Lyles Date: Thu, 29 Oct 2009 23:51:14 -0500 Subject: [PATCH] Added caching --- WeightsWatcher.lua | 127 +++++++++++++++++++++++++++++++++++++++------------- config.lua | 23 ++++++++++ 2 files changed, 120 insertions(+), 30 deletions(-) diff --git a/WeightsWatcher.lua b/WeightsWatcher.lua index e726d79..17c92cd 100644 --- a/WeightsWatcher.lua +++ b/WeightsWatcher.lua @@ -2,6 +2,11 @@ if not WeightsWatcher then WeightsWatcher = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.1") end +ww_itemCache = {} +ww_bareItemCache = {} +ww_weightCache = {} +ww_weightIdealCache = {} + function WeightsWatcher:OnInitialize() local tempVars @@ -74,24 +79,25 @@ function WeightsWatcher:OnDisable() end end -function WeightsWatcher:displayItemStats(tooltip, ttname) - local itemType, stat, name, value - -- Item link fields - local itemId, gemId1, gemId2, gemId3, gemId4, suffixId, uniqueId, linkLevel +function WeightsWatcher:cacheItemStats(link) -- Stats: normal stats, sockets, socket bonus, gem-given stats, whether the socket bonus is active, ideal gems, ideal gems ignoring socket bonuses - local normalStats, sockets, socketBonusStat, gemStats, socketBonusActive, bestGems, bestGemsIgnoreSocket - local _, link = tooltip:GetItem() + local normalStats, sockets, socketBonusStat, socketBonusActive, gemStats, bestGems, bestGemsIgnoreSocket - if link == nil then - return + _, itemId, _, gemId1, gemId2, gemId3, gemId4, suffixId, uniqueId, linkLevel = strsplit(":", link) + -- Strip color codes + linkLevel = strsplit("|", linkLevel) + bareLink = strjoin(":", "item", itemId, "0:0:0:0:0", suffixId, uniqueId, linkLevel) + + if ww_bareItemCache[bareLink] then + normalStats, sockets, socketBonusStat = unpack(ww_bareItemCache[bareLink]) + else + normalStats, sockets, socketBonusStat = WeightsWatcher:getItemStats(bareLink) + ww_bareItemCache[bareLink] = {normalStats, sockets, socketBonusStat} end - _, _, _, _, _, itemType, _, stackSize = GetItemInfo(link) - if (IsEquippableItem(link) and itemType ~= "Container" and itemType ~= "Quiver") or (itemType == "Gem" and stackSize == 1) or (itemType == "Consumable") or (itemType == "Recipe") then - _, itemId, _, gemId1, gemId2, gemId3, gemId4, suffixId, uniqueId, linkLevel = strsplit(":", link) - -- Strip color codes - linkLevel = strsplit("|", linkLevel) - normalStats, sockets, socketBonusStat = WeightsWatcher:getItemStats(strjoin(":", "item", itemId, "0:0:0:0:0", suffixId, uniqueId, linkLevel)) + if ww_itemCache[link] then + socketBonusActive, gemStats = unpack(ww_itemCache[link]) + else gemStats = WeightsWatcher:getGemStats({gemId1, gemId2, gemId3, gemId4}) -- Removes gems in crafted sockets from consideration @@ -111,24 +117,42 @@ function WeightsWatcher:displayItemStats(tooltip, ttname) socketBonusActive = false end - tooltip:AddLine("Current Weights:") - for _, class in ipairs(ww_charVars.activeWeights) do - if ww_vars.weightsList[class] then - for _, weight in pairs(ww_charVars.activeWeights[class]) do - if ww_vars.weightsList[class][weight] then - tooltip:AddDoubleLine(" " .. weight, string.format("%.3f", WeightsWatcher:calculateWeight(normalStats, socketBonusActive, socketBonusStat, gemStats, ww_vars.weightsList[class][weight]))) + ww_itemCache[link] = {socketBonusActive, gemStats} + end + + for _, class in ipairs(ww_charVars.activeWeights) do + if ww_vars.weightsList[class] then + if not ww_weightCache[class] then + ww_weightCache[class] = {} + end + for _, weight in pairs(ww_charVars.activeWeights[class]) do + if ww_vars.weightsList[class][weight] then + if not ww_weightCache[class][weight] then + ww_weightCache[class][weight] = {} + end + if not ww_weightCache[class][weight][link] then + ww_weightCache[class][weight][link] = WeightsWatcher:calculateWeight(normalStats, socketBonusActive, socketBonusStat, gemStats, ww_vars.weightsList[class][weight]) end end end end + end + + if #(sockets) > 0 then + for _, class in ipairs(ww_charVars.activeWeights) do + if ww_vars.weightsList[class] then + if not ww_weightIdealCache[class] then + ww_weightIdealCache[class] = {} + end + for _, weight in pairs(ww_charVars.activeWeights[class]) do + if ww_vars.weightsList[class][weight] then + if not ww_weightIdealCache[class][weight] then + ww_weightIdealCache[class][weight] = {} + end + + if not ww_weightIdealCache[class][weight][bareLink] then + ww_weightIdealCache[class][weight][bareLink] = {} - -- TODO: move this inline (put it in parentheses?)? - if #(sockets) > 0 then - tooltip:AddLine("Ideally Gemmed Weights:") - for _, class in ipairs(ww_charVars.activeWeights) do - if ww_vars.weightsList[class] then - for _, weight in pairs(ww_charVars.activeWeights[class]) do - if ww_vars.weightsList[class][weight] then bestGems = {} bestGemsIgnoreSocket = {} socketBonusActive = true @@ -151,11 +175,54 @@ function WeightsWatcher:displayItemStats(tooltip, ttname) weightValIgnoreSockets = WeightsWatcher:calculateWeight(normalStats, socketBonusActive, socketBonusStat, gemStatsIgnoreSockets, ww_vars.weightsList[class][weight]) if weightVal < weightValIgnoreSockets then + weightVal = weightValIgnoreSockets gemStats = gemStatsIgnoreSockets - else - socketBonusActive = true end - tooltip:AddDoubleLine(" " .. weight, string.format("%.3f", WeightsWatcher:calculateWeight(normalStats, socketBonusActive, socketBonusStat, gemStats, ww_vars.weightsList[class][weight]))) + ww_weightIdealCache[class][weight][bareLink].gemStats = gemStats + ww_weightIdealCache[class][weight][bareLink].score = weightVal + end + end + end + end + end + end + + return bareLink +end + +function WeightsWatcher:displayItemStats(tooltip, ttname) + local link, bareLink, itemType, stackSize, sockets, gemStats + + _, link = tooltip:GetItem() + if link == nil then + return + end + + _, _, _, _, _, itemType, _, stackSize = GetItemInfo(link) + if (IsEquippableItem(link) and itemType ~= "Container" and itemType ~= "Quiver") or (itemType == "Gem" and stackSize == 1) or (itemType == "Consumable") or (itemType == "Recipe") then + bareLink = WeightsWatcher:cacheItemStats(link) + + tooltip:AddLine("Current Weights:") + for _, class in ipairs(ww_charVars.activeWeights) do + if ww_vars.weightsList[class] then + for _, weight in pairs(ww_charVars.activeWeights[class]) do + if ww_vars.weightsList[class][weight] then + tooltip:AddDoubleLine(" " .. weight, string.format("%.3f", ww_weightCache[class][weight][link])) + end + end + end + end + + _, sockets, _ = unpack(ww_bareItemCache[bareLink]) + + if #(sockets) > 0 then + tooltip:AddLine("Ideally Gemmed Weights:") + for _, class in ipairs(ww_charVars.activeWeights) do + if ww_vars.weightsList[class] then + for _, weight in pairs(ww_charVars.activeWeights[class]) do + if ww_vars.weightsList[class][weight] then + tooltip:AddDoubleLine(" " .. weight, string.format("%.3f", ww_weightIdealCache[class][weight][bareLink].score)) + gemStats = ww_weightIdealCache[class][weight][bareLink].gemStats for _, stat in ipairs(gemStats) do tooltip:AddLine(" Using " .. stat[2] .. " (" .. stat[1] .. ")") end diff --git a/config.lua b/config.lua index 7aaf2ee..21efe2c 100644 --- a/config.lua +++ b/config.lua @@ -23,6 +23,12 @@ StaticPopupDialogs["WW_CONFIRM_RESTORE_DEFAULTS"] = { for _, class in ipairs(defaultVars.weightsList) do for _, weight in ipairs(defaultVars.weightsList[class]) do setWeight(class, weight, defaultVars.weightsList[class][weight]) + if ww_weightCache[class] then + ww_weightCache[class][weight] = {} + end + if ww_weightIdealCache[class] then + ww_weightIdealCache[class][weight] = {} + end end end if ww_config.rightPanel:IsShown() then @@ -198,6 +204,15 @@ end function configSaveWeight() local number + local weightFrame = ww_config.rightPanel.weightFrame + + -- The weight is changing, clear any cached info + if ww_weightCache[weightFrame.category.class] then + ww_weightCache[weightFrame.category.class][weightFrame.name] = {} + end + if ww_weightIdealCache[weightFrame.category.class] then + ww_weightIdealCache[weightFrame.category.class][weightFrame.name] = {} + end for _, frame in pairs(ww_config.rightPanel.scrollFrame.stats) do if frame.statName then @@ -214,6 +229,14 @@ function deleteWeight() local point, relativeTo, relativePoint, xOffset, yOffset, removed local weight = ww_config.rightPanel.weightFrame + -- The weight is being deleted, clear any cached info + if ww_weightCache[weight.category.class] then + ww_weightCache[weight.category.class][weight.name] = nil + end + if ww_weightIdealCache[weight.category.class] then + ww_weightIdealCache[weight.category.class][weight.name] = nil + end + weight.category.length = weight.category.length - 1 for _, weightFrame in ipairs({weight.category:GetChildren()}) do if weightFrame.position and weightFrame.position > weight.position then -- 1.7.9.5