From bf4418760186f7a621cd8a6cca2bbe63e46d4048 Mon Sep 17 00:00:00 2001 From: Eric Nickell Date: Sun, 23 Jan 2011 01:50:57 -0800 Subject: [PATCH] stable --- SageGearLevelTooltip.lua | 127 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 18 deletions(-) diff --git a/SageGearLevelTooltip.lua b/SageGearLevelTooltip.lua index fe06b1f..7d252dc 100644 --- a/SageGearLevelTooltip.lua +++ b/SageGearLevelTooltip.lua @@ -23,6 +23,10 @@ local CachingEvaluator do instance.cacheHitCount = 0 instance.cacheMissCount = 0 end + + function class:Name() + return self.delegate:Name() + end function class:Evaluate(itemLink) -- TODO: normalize link first? @@ -199,8 +203,13 @@ local BestReforgedEvaluator do local reforging = reforgings:Find(itemLink) return Item:New(itemLink):GetItemStats() end + + function class:Name() + return self.label and self.label.label or "" + end function class:Evaluate(itemLink) +-- self:Debug("BestReforgedEvaluator:Evaluate") if not itemLink then return end itemLink = Item:New(itemLink):WithoutMods():ItemString() local stats = GetItemStats(itemLink) -- baseline w/o reforging @@ -213,7 +222,9 @@ local BestReforgedEvaluator do end local evaluation = self:_EvalStats(stats) - return evaluation, self.label, rightValue, rightLabel + if evaluation and (evaluation > 0) then + return evaluation, self.label, rightValue, rightLabel + end end function class:_FindOptimalReforging(stats) @@ -262,13 +273,23 @@ local EvaluatorToLineAdderAdaptor do -- NOTE: tooltip is not guaranteed to be an actual tooltip, or support other methods function class:Comment(itemLink, tooltip) local left, leftLabel, right, rightLabel = self.evaluator:Evaluate(itemLink) - if left and leftLabel and right and rightLabel then - tooltip:AddDoubleLine( - leftLabel.label .. ": " .. left, - rightLabel.label .. ": " .. right, + local leftText = left and leftLabel and (leftLabel.label .. ": " .. left) + local rightText = right and rightLabel and (rightLabel.label .. ": " .. right) + if leftText and rightText then +-- self:Debug("left [" .. tostring(leftText) .. "] right [" .. tostring(rightText) .. "] tooltip " .. tostring(tooltip)) +-- ChatFrame1:AddMessage("left [" .. tostring(leftText) .. "] right [" .. tostring(rightText) .. "] tooltip " .. tostring(tooltip)) +-- self:Debug("r=" .. leftLabel.r .. " g=" .. leftLabel.g .. " b=" .. leftLabel.b) +-- print(tooltip == GameTooltip, "L <", leftText, ">", leftLabel.r, leftLabel.g, leftLabel.b) +-- print(tooltip == GameTooltip, "R <", rightText, ">", rightLabel.r, rightLabel.g, rightLabel.b) + tooltip:AddDoubleLine(leftText, rightText, leftLabel.r, leftLabel.g, leftLabel.b, rightLabel.r, rightLabel.g, rightLabel.b) - elseif left and leftLabel then +-- tooltip:Show() + elseif leftText then +-- self:Debug("left [" .. tostring(leftText) .. "] right [" .. tostring(rightText) .. "] tooltip " .. tostring(tooltip)) +-- ChatFrame1:AddMessage("left [" .. tostring(leftText) .. "] right [" .. tostring(rightText) .. "] tooltip " .. tostring(tooltip)) +-- self:Debug("r=" .. leftLabel.r .. " g=" .. leftLabel.g .. " b=" .. leftLabel.b) +-- print(tooltip == GameTooltip, "L <", leftText, ">", leftLabel.r, leftLabel.g, leftLabel.b) tooltip:AddLine(leftLabel.label .. ": " .. left, leftLabel.r, leftLabel.g, leftLabel.b) end end @@ -276,6 +297,9 @@ local EvaluatorToLineAdderAdaptor do EvaluatorToLineAdderAdaptor = class end +--[[ +/run function qz(...) local t,i,v={...}; if (#t)==0 then return end i=math.random(#t); v=table.remove(t, i); return v, qz(unpack(t)) end + ]] ---------------------------------------------------------------------------------------------------- local SageGearLevelTooltipUpdater do local class = newClass{name="TooltipUpdater"} @@ -291,9 +315,19 @@ local SageGearLevelTooltipUpdater do -- Updates the tooltip with all the comments from the item commenters -- @param tooltip A "tooltip" support :AddLine and :AddDoubleLine *only* function class:UpdateTooltip(tooltip) +-- self:Debug("Updating tooltip " .. tostring(tooltip)) local _,itemLink = tooltip:GetItem() + local tooltipAdapter = { + mustShow = false, +-- Show = function(adapter, ...) tooltip:Show(...) end, + AddLine = function(adapter, ...) adapter.mustShow = true; tooltip:AddLine(...) end, + AddDoubleLine = function(adapter, ...) adapter.mustShow = true; tooltip:AddDoubleLine(...) end + } for _,commenter in ipairs(self.commenters) do - commenter:Comment(itemLink, tooltip) + commenter:Comment(itemLink, tooltipAdapter) + end + if tooltipAdapter.mustShow then + tooltip:Show() end end @@ -311,17 +345,28 @@ local SageGearLevelTooltipUpdater do function(tooltip, ...) self:UpdateTooltip(tooltip) end + local methodCount = 0 for _, method in ipairs(methods) do -- self:Debug((tooltip and tooltipName or "whoops") .. "/" .. type(tooltip) .. "+" .. method .. "/" .. type(method)) - hooksecurefunc(tooltip, method, update) + local hasMethodToHook = tooltip[method] + if hasMethodToHook then + hooksecurefunc(tooltip, method, update) + methodCount = methodCount + 1 + else + self:Debug("Tooltip " .. tostring(tooltipName) .. " is missing method " .. method) + end end + self:Debug("Tooltip " .. tostring(tooltipName) .. "(" .. tostring(tooltip) .. ") has " .. methodCount .. " methods hooked.") return self; end function class:AddSelfEvaluator(className, e) - return (className == select(2, UnitClass('player'))) - and self:AddEvaluator(e) - or self + local playerClassLocal, playerClass = UnitClass('player') + if className == playerClass then + self:Debug("Installing evaluator for " .. playerClassLocal .. ": " .. (e:Name())) + return self:AddEvaluator(e) + end + return self end function class:AddEvaluator(e) @@ -348,14 +393,17 @@ end -- ShoppingTooltip2 = {"SetHyperlinkCompareItem"}} SageGearLevelTooltipUpdater:New(methodsToHook) - :HookTooltip("GameTooltip", {"SetBagItem", "SetInventoryItem", "SetHyperlink", "SetAuctionItem", - "SetQuestItem", "SetQuestLogItem"}) + :HookTooltip("GameTooltip", {"SetAuctionItem", "SetAuctionSellItem", "SetBagItem", "SetBuybackItem", + "SetExistingSocketGem", "SetGuildBankItem", "SetInboxItem", "SetInventoryItem", "SetHyperlink", + "SetLootItem", "SetLootRollItem", "SetMerchantItem", "SetQuestItem", "SetQuestLogItem", + "SetSendMailItem", "SetSocketGem", "SetTradePlayerItem", "SetTradeSkillItem", + "SetTradeTargetItem", "SetTrainerService" }) :HookTooltip("ItemRefTooltip", {"SetHyperlink", "Show", "Hide"}) :HookTooltip("ShoppingTooltip1", {"SetHyperlinkCompareItem"}) :HookTooltip("ShoppingTooltip2", {"SetHyperlinkCompareItem"}) - :AddItemCommenter(ItemLevelIdCommenter:New()) +-- :AddItemCommenter(ItemLevelIdCommenter:New()) --DK :AddSelfEvaluator("DEATHKNIGHT", BestReforgedEvaluator:New({label = "Blood DK", r=1.0, g=0.2, b=0.4}, @@ -368,7 +416,7 @@ SageGearLevelTooltipUpdater:New(methodsToHook) :AddSelfEvaluator("DEATHKNIGHT", BestReforgedEvaluator:New({label = "Unholy DK", r=0.6, g=0.6, b=0.6}, {Strength=100, MeleeDPS=100, Hit=43, Expertise=41, Haste=37, Mastery=35, AP=32, Crit=26}) :Cache()) - + --Druid :AddSelfEvaluator("DRUID", BestReforgedEvaluator:New({label = "Moonkin", r=0.3, g=0.3, b=1.0}, {Hit=100, Master=100, SP=66, Haste=54, Crit=43, Intellect=22, Spirit=22}) @@ -413,10 +461,44 @@ SageGearLevelTooltipUpdater:New(methodsToHook) :AddSelfEvaluator("PALADIN", BestReforgedEvaluator:New({label = "Prot Paladin", r=1.0, g=0.4, b=0.4}, {Mastery=100, Stamina=100, Agility=60, Expertise=59, Dodge=55, Parry=30, Strength=16, Armor=8}) :Cache()) - :AddSelfEvaluator("PALADIN", BestReforgedEvaluator:New({label = "Ret Paladin", r=0.3, g=0.3, b=1.0}, + :AddSelfEvaluator("PALADIN", BestReforgedEvaluator:New({label = "Ret Paladin", r=1.0, g=1.0, b=0.5}, {MeleeDPS=470, Mastery=100, Hit=100, Strength=80, Expertise=66, Crit=40, Agility=32, Haste=30, SP=9}) :Cache()) + --Priest + :AddSelfEvaluator("PRIEST", BestReforgedEvaluator:New({label = "Disc Priest", r=0.3, g=0.3, b=1.0}, + {SP=100, Mastery=100, Intellect=65, Haste=59, Crit=48, Spirit=22}) + :Cache()) + :AddSelfEvaluator("PRIEST", BestReforgedEvaluator:New({label = "Holy Priest", r=0.3, g=1.0, b=0.3}, + {Mastery=100, Intellect=69, SP=60, Spirit=52, Crit=38, Haste=31}) + :Cache()) + :AddSelfEvaluator("PRIEST", BestReforgedEvaluator:New({label = "Shadow Priest", r=0.5, g=0.5, b=0.5}, + {Hit=100, Mastery=100, SP=76, Crit=54, Haste=50, Intellect=16, Spirit=16}) + :Cache()) + + --Rogue + :AddSelfEvaluator("ROGUE", BestReforgedEvaluator:New({label = "Assassin", r=0.8, g=1.0, b=0.5}, + {MeleeDPS=100, Agility=100, Hit=67, Mastery=50, Haste=46, Expertise=42, Crit=35}) + :Cache()) + :AddSelfEvaluator("ROGUE", BestReforgedEvaluator:New({label = "Combat Rogue", r=1.0, g=0.8, b=0.5}, + {MeleeDPS=100, Agility=100, Hit=70, Expertise=59, Haste=56, Crit=35, Mastery=33}) + :Cache()) + :AddSelfEvaluator("ROGUE", BestReforgedEvaluator:New({label = "Subtlety", r=1.0, g=1.0, b=0.3}, + {MeleeDPS=100, Agility=100, Hit=40, Haste=37, Expertise=33, Crit=31, Mastery=20}) + :Cache()) + + --Shaman + :AddSelfEvaluator("SHAMAN", BestReforgedEvaluator:New({label = "Ele Shaman", r=0.5, g=0.5, b=1.0}, + {Mastery=100, Hit=100, SP=60, Haste=56, Crit=40, Intellect=11}) + :Cache()) + :AddSelfEvaluator("SHAMAN", BestReforgedEvaluator:New({label = "Enh Shaman", r=1.0, g=1.0, b=0.5}, + {MeleeDPS=124, Agility=100, Hit=60, Expertise=48, Mastery=44, Strength=42, AP=40, + Intellect=36, SP=36, Crit=28, Haste=16}) + :Cache()) + :AddSelfEvaluator("SHAMAN", BestReforgedEvaluator:New({label = "Resto Shaman", r=0.3, g=1.0, b=0.3}, + {Intellect=100, SP=83, Spriti=75, Haste=67, Crit=58, Mastery=42, Stamina=8}) + :Cache()) + --Warlock :AddSelfEvaluator("WARLOCK", BestReforgedEvaluator:New({label = "Aff Warlock", r=1.0, g=0.2, b=1.0}, {Hit=100, Master=100, SP=72, Haste=61, Crit=38, Spirit=34, Intellect=15}) @@ -424,10 +506,19 @@ SageGearLevelTooltipUpdater:New(methodsToHook) :AddSelfEvaluator("WARLOCK", BestReforgedEvaluator:New({label = "Dem Warlock", r=0.8, g=0.2, b=1.0}, {Hit=100, Master=100, Haste=50, SP=45, Crit=31, Spirit=29, Intellect=13}) :Cache()) + :AddSelfEvaluator("WARLOCK", BestReforgedEvaluator:New({label = "Destro Warlock", r=1.0, g=0.6, b=0.0}, + {Mastery=100, Hit=100, SP=47, Haste=46, Spirit=26, Crit=16, Intellect=13}) + :Cache()) -- Warrior - :AddSelfEvaluator("WARRIOR", BestReforgedEvaluator:New({label = "Prot Warrior", r=0.8, g=0.8, b=1.0}, - {Strength=48, Agility=67, Stamina=100, Hit=10, Crit=7, Haste=1, AP=1, Expertise=19, Armor=6, Dodge=90, Parry=67}) + :AddSelfEvaluator("WARRIOR", BestReforgedEvaluator:New({label = "Arms Warrior", r=0.8, g=0.8, b=1.0}, + {Mastery=100, Strength=100, Hit=90, Expertise=85, Crit=80, Agility=65, Haste=50, Armor=1}) + :Cache()) + :AddSelfEvaluator("WARRIOR", BestReforgedEvaluator:New({label = "Fury Warrior", r=0.8, g=0.8, b=0.2}, + {Mastery=100, Expertise=100, Strength=82, Crit=66, Agility=53, Hit=48, Haste=36, Armor=5}) + :Cache()) + :AddSelfEvaluator("WARRIOR", BestReforgedEvaluator:New({label = "Prot Warrior", r=1.0, g=0.4, b=0.4}, + {Stamina=100, Mastery=100, Dodge=90, Parry=67, Agility=67, Strength=48, Expertise=19, Hit=10, Crit=7, Armor=6, Haste=1}) :Cache()) -- :AddEvaluator(SimplePawnEvaluator:New({label = "W.Simple", r=0.8, g=0.8, b=1.0}, -- 1.7.9.5