diff --git a/Upgrade.lua b/Upgrade.lua index 057e209..aeb4967 100644 --- a/Upgrade.lua +++ b/Upgrade.lua @@ -135,6 +135,59 @@ function noop_major_up(vars) return vars end +function upgradeAccountToTriggers(vars) + if vars.savedTriggers then + for _, class in ipairs(vars.savedTriggers) do + for _, weight in ipairs(vars.savedTriggers[class]) do + if vars.weightsList[class] and vars.weightsList[class][weight] then + vars.weightsList[class][weight].triggers = vars.savedTriggers[class][weight] + end + end + end + end + vars.savedTriggers = nil + for _, class in ipairs(vars.weightsList) do + for _, weight in ipairs(vars.weightsList[class]) do + if not vars.weightsList[class][weight].triggers then + vars.weightsList[class][weight].triggers = {} + if vars.weightsList[class][weight]["dps"] or (vars.weightsList[class][weight]["attack power"] and not vars.weightsList[class][weight]["ranged attack power"]) then + vars.weightsList[class][weight].triggers.meleeDamage = true + end + if vars.weightsList[class][weight]["ranged dps"] or vars.weightsList[class][weight]["ranged attack power"] then + vars.weightsList[class][weight].triggers.rangedDamage = true + end + if vars.weightsList[class][weight]["spell power"] and vars.weightsList[class][weight]["hit rating"] then + vars.weightsList[class][weight].triggers.harmfulSpell = true + end + if vars.weightsList[class][weight]["spell power"] and not vars.weightsList[class][weight]["hit rating"] then + vars.weightsList[class][weight].triggers.helpfulSpell = true + end + end + end + end + + vars.dataMinorVersion = 12 + return vars +end + +downgradeAccountFromTriggers = [[ + return function(vars) + vars.savedTriggers = {} + for i, class in ipairs(vars.weightsList) do + vars.savedTriggers[i] = class + vars.savedTriggers[class] = {} + for j, weight in ipairs(vars.weightsList[class]) do + vars.savedTriggers[class][j] = weight + vars.savedTriggers[class][weight] = vars.weightsList[class][weight].triggers + vars.weightsList[class][weight].triggers = nil + end + end + + vars.dataMinorVersion = 11 + return vars + end +]] + function upgradeAccountToUseEffectRatio(vars) if not vars.options.useEffects then vars.options.useEffects = {} @@ -805,6 +858,7 @@ upgradeAccountFunctions = { [8] = upgradeAccountToWorkingResistances, [9] = upgradeAccountToWorkingMeleeDamage, [10] = upgradeAccountToUseEffectRatio, + [11] = upgradeAccountToTriggers, }, } @@ -833,6 +887,7 @@ downgradeAccountFunctions = { [9] = noop_down, [10] = noop_down, [11] = noop_down, + [12] = downgradeAccountFromTriggers, }, } diff --git a/WeightsWatcher.lua b/WeightsWatcher.lua index 261906b..2cbe294 100644 --- a/WeightsWatcher.lua +++ b/WeightsWatcher.lua @@ -887,11 +887,23 @@ function WeightsWatcher.calculateWeight(bareItemStats, itemStats, weightsScale) weight = weight + WeightsWatcher.getWeight(useEffect.stat, useEffect.value * useEffect.duration / useEffect.cooldown * ww_vars.options.useEffects.uptimeRatio, weightsScale) end end + if bareItemStats.stackingEquipEffects then + for _, effect in ipairs(bareItemStats.stackingEquipEffects) do + for trigger in pairs(effect.triggers) do + if weightsScale.triggers[trigger] then + weight = weight + WeightsWatcher.getWeight(effect.stat, effect.value * effect.numStacks, weightsScale) + break + end + end + end + end if ww_vars.options.tooltip.normalizeWeights == true then local total = 0 for _, value in pairs(weightsScale) do - total = total + abs(value) + if type(value) == "number" then + total = total + abs(value) + end end if total == 0 then -- Avoids a divide by zero diff --git a/defaults.lua b/defaults.lua index b576b9c..c1e0822 100644 --- a/defaults.lua +++ b/defaults.lua @@ -5,6 +5,7 @@ trackedStats = { [4] = "Caster", [5] = "Meta Gem Stats", [6] = "Resistances", + [7] = "Triggers", ["General"] = { "Stamina", "Critical Strike Rating", @@ -89,6 +90,7 @@ trackedStats = { ["Nature"] = "nature resistance", ["Shadow"] = "shadow resistance", }, + ["Triggers"] = {} } triggerGroups = { @@ -102,6 +104,17 @@ triggerGroups = { ["helpfulSpellCast"] = {"helpfulSpell"}, } +triggerNames = { + [1] = "meleeDamage", + [2] = "rangedDamage", + [3] = "harmfulSpell", + [4] = "helpfulSpell", + ["meleeDamage"] = "Melee damage dealt", + ["rangedDamage"] = "Ranged damage dealt", + ["harmfulSpell"] = "Harmful spell cast", + ["helpfulSpell"] = "Helpful spell cast", +} + classNames = { ["DEATHKNIGHT"] = "Death Knight", ["DRUID"] = "Druid", @@ -219,7 +232,7 @@ classNameOptions = { defaultVars = { dataMajorVersion = 1, - dataMinorVersion = 11, + dataMinorVersion = 12, weightsList = { [1] = "DEATHKNIGHT", [2] = "DRUID", @@ -246,6 +259,9 @@ defaultVars = { ["haste rating"] = 55, ["attack power"] = 36, ["armor"] = 1, + triggers = { + meleeDamage = true, + } }, ["Frost DPS"] = { ["dps"] = 337, @@ -257,6 +273,9 @@ defaultVars = { ["attack power"] = 35, ["haste rating"] = 28, ["armor"] = 1, + triggers = { + meleeDamage = true, + } }, ["Unholy DPS"] = { ["dps"] = 209, @@ -268,6 +287,9 @@ defaultVars = { ["attack power"] = 34, ["armor penetration rating"] = 32, ["armor"] = 1, + triggers = { + meleeDamage = true, + } }, ["Tank"] = { ["dps"] = 419, @@ -283,6 +305,9 @@ defaultVars = { ["attack power"] = 41, ["armor penetration rating"] = 31, ["armor"] = 5, + triggers = { + meleeDamage = true, + } }, }, ["DRUID"] = { @@ -297,6 +322,9 @@ defaultVars = { ["critical strike rating"] = 43, ["spirit"] = 22, ["intellect"] = 22, + triggers = { + harmfulSpell = true, + } }, ["Feral DPS"] = { ["agility"] = 100, @@ -308,6 +336,9 @@ defaultVars = { ["feral attack power"] = 40, ["attack power"] = 40, ["haste rating"] = 35, + triggers = { + meleeDamage = true, + } }, ["Feral Tank"] = { ["agility"] = 100, @@ -322,6 +353,9 @@ defaultVars = { ["feral attack power"] = 4, ["attack power"] = 4, ["critical strike rating"] = 3, + triggers = { + meleeDamage = true, + } }, ["Restoration"] = { ["spell power"] = 100, @@ -330,6 +364,9 @@ defaultVars = { ["intellect"] = 51, ["spirit"] = 32, ["critical strike rating"] = 11, + triggers = { + helpfulSpell = true, + } }, }, ["HUNTER"] = { @@ -346,6 +383,9 @@ defaultVars = { ["ranged attack power"] = 30, ["armor penetration rating"] = 28, ["haste rating"] = 21, + triggers = { + rangedDamage = true, + } }, ["Marksmanship"] = { ["ranged dps"] = 379, @@ -357,6 +397,9 @@ defaultVars = { ["attack power"] = 32, ["ranged attack power"] = 32, ["haste rating"] = 24, + triggers = { + rangedDamage = true, + } }, ["Survival"] = { ["ranged dps"] = 181, @@ -368,6 +411,9 @@ defaultVars = { ["attack power"] = 29, ["ranged attack power"] = 29, ["armor penetration rating"] = 26, + triggers = { + rangedDamage = true, + } }, }, ["MAGE"] = { @@ -384,6 +430,9 @@ defaultVars = { ["frost spell damage"] = 49, ["fire spell damage"] = 49, ["spirit"] = 14, + triggers = { + harmfulSpell = true, + } }, ["Fire"] = { ["hit rating"] = 100, @@ -394,6 +443,9 @@ defaultVars = { ["frost spell damage"] = 23, ["arcane spell damage"] = 23, ["intellect"] = 13, + triggers = { + harmfulSpell = true, + } }, ["Frost"] = { ["hit rating"] = 100, @@ -404,6 +456,9 @@ defaultVars = { ["fire spell damage"] = 19, ["critical strike rating"] = 19, ["intellect"] = 6, + triggers = { + harmfulSpell = true, + } }, }, ["PALADIN"] = { @@ -416,6 +471,9 @@ defaultVars = { ["spell power"] = 58, ["critical strike rating"] = 46, ["haste rating"] = 35, + triggers = { + helpfulSpell = true, + } }, ["Protection"] = { ["stamina"] = 100, @@ -432,6 +490,10 @@ defaultVars = { ["attack power"] = 6, ["spell power"] = 4, ["critical strike rating"] = 3, + triggers = { + harmfulSpell = true, + meleeDamage = true, + } }, ["Retribution"] = { ["dps"] = 470, @@ -444,6 +506,10 @@ defaultVars = { ["haste rating"] = 30, ["armor penetration rating"] = 22, ["spell power"] = 9, + triggers = { + harmfulSpell = true, + meleeDamage = true, + } }, }, ["PRIEST"] = { @@ -457,6 +523,9 @@ defaultVars = { ["haste rating"] = 59, ["critical strike rating"] = 48, ["spirit"] = 22, + triggers = { + helpfulSpell = true, + } }, ["Holy"] = { ["mp5"] = 100, @@ -465,6 +534,9 @@ defaultVars = { ["spirit"] = 52, ["critical strike rating"] = 38, ["haste rating"] = 31, + triggers = { + helpfulSpell = true, + } }, ["Shadow"] = { ["hit rating"] = 100, @@ -474,6 +546,9 @@ defaultVars = { ["haste rating"] = 50, ["spirit"] = 16, ["intellect"] = 16, + triggers = { + harmfulSpell = true, + } }, }, ["ROGUE"] = { @@ -490,6 +565,9 @@ defaultVars = { ["armor penetration rating"] = 65, ["haste rating"] = 64, ["strength"] = 55, + triggers = { + meleeDamage = true, + } }, ["Combat"] = { ["dps"] = 220, @@ -501,6 +579,9 @@ defaultVars = { ["haste rating"] = 73, ["strength"] = 55, ["attack power"] = 50, + triggers = { + meleeDamage = true, + } }, ["Subtlety"] = { ["dps"] = 228, @@ -512,6 +593,9 @@ defaultVars = { ["haste rating"] = 75, ["strength"] = 55, ["attack power"] = 50, + triggers = { + meleeDamage = true, + } }, }, ["SHAMAN"] = { @@ -524,6 +608,9 @@ defaultVars = { ["haste rating"] = 56, ["critical strike rating"] = 40, ["intellect"] = 11, + triggers = { + harmfulSpell = true, + } }, ["Enhancement"] = { ["dps"] = 135, @@ -537,6 +624,10 @@ defaultVars = { ["attack power"] = 32, ["spell power"] = 29, ["armor penetration rating"] = 26, + triggers = { + harmfulSpell = true, + meleeDamage = true, + } }, ["Restoration"] = { ["mp5"] = 100, @@ -544,6 +635,9 @@ defaultVars = { ["spell power"] = 77, ["critical strike rating"] = 62, ["haste rating"] = 35, + triggers = { + helpfulSpell = true, + } }, }, ["WARLOCK"] = { @@ -559,6 +653,9 @@ defaultVars = { ["fire spell damage"] = 36, ["spirit"] = 34, ["intellect"] = 15, + triggers = { + harmfulSpell = true, + } }, ["Demonology"] = { ["hit rating"] = 100, @@ -569,6 +666,9 @@ defaultVars = { ["critical strike rating"] = 31, ["spirit"] = 29, ["intellect"] = 13, + triggers = { + harmfulSpell = true, + } }, ["Destruction"] = { ["hit rating"] = 100, @@ -579,6 +679,9 @@ defaultVars = { ["shadow spell damage"] = 23, ["critical strike rating"] = 16, ["intellect"] = 13, + triggers = { + harmfulSpell = true, + } }, }, ["WARRIOR"] = { @@ -594,6 +697,9 @@ defaultVars = { ["haste rating"] = 36, ["attack power"] = 31, ["armor"] = 5, + triggers = { + meleeDamage = true, + } }, ["Protection"] = { ["stamina"] = 100, @@ -611,6 +717,9 @@ defaultVars = { ["armor"] = 6, ["haste rating"] = 1, ["attack power"] = 1, + triggers = { + meleeDamage = true, + } }, }, }, diff --git a/weights.lua b/weights.lua index 4055f99..1ba78e4 100644 --- a/weights.lua +++ b/weights.lua @@ -188,17 +188,29 @@ function configSelectWeight(weightFrame) ww_weights.rightPanel.weightFrame = weightFrame ww_weights.rightPanel.statList = ww_vars.weightsList[weightFrame.category.class][weightFrame.name] ww_weights.rightPanel.changedStats = {} + ww_weights.rightPanel.changedTriggers = {} -- Fills the right panel with the current weight's stats configResetWeight() for _, categoryFrame in ipairs(ww_weights.rightPanel.scrollFrame.categories) do local empty = true - for _, statFrame in ipairs({categoryFrame:GetChildren()}) do - if statFrame.statName then - if statFrame.statValue:GetText() ~= "" then - empty = false - break + if categoryFrame.name == "Triggers" then + for _, triggerFrame in ipairs({categoryFrame:GetChildren()}) do + if triggerFrame.active then + if triggerFrame.active:GetChecked() then + empty = false + break + end + end + end + else + for _, statFrame in ipairs({categoryFrame:GetChildren()}) do + if statFrame.statName then + if statFrame.statValue:GetText() ~= "" then + empty = false + break + end end end end @@ -225,6 +237,12 @@ function configResetWeight() statValue:SetText(value) end end + if ww_weights.rightPanel.changedTriggers then + for triggerCheckButton, trigger in pairs(ww_weights.rightPanel.changedTriggers) do + changed = true + triggerCheckButton:SetChecked(ww_weights.rightPanel.statList.triggers[trigger]) + end + end if not changed then for _, frame in pairs(ww_weights.rightPanel.scrollFrame.stats) do if frame.statName then @@ -235,9 +253,19 @@ function configResetWeight() frame.statValue:SetText(value) end end + for _, categoryFrame in pairs(ww_weights.rightPanel.scrollFrame.categories) do + if categoryFrame.name == "Triggers" then + for _, triggerFrame in ipairs({categoryFrame:GetChildren()}) do + if triggerFrame.active then + triggerFrame.active:SetChecked(ww_weights.rightPanel.statList.triggers[triggerFrame.active:GetText()]) + end + end + end + end end ww_weights.rightPanel.changedStats = {} + ww_weights.rightPanel.changedTriggers = {} ww_weights.rightPanel.saveButton:Disable() ww_weights.rightPanel.resetButton:Disable() end @@ -254,15 +282,27 @@ function configSaveWeight() ww_weightCache[weightFrame.category.class][weightFrame.name] = nil ww_weightIdealCache[weightFrame.category.class][weightFrame.name] = nil - for statValue, statName in pairs(ww_weights.rightPanel.changedStats) do - number = statValue:GetNumber() - if number == 0 then - number = nil + if ww_weights.rightPanel.changedStats then + for statValue, statName in pairs(ww_weights.rightPanel.changedStats) do + number = statValue:GetNumber() + if number == 0 then + number = nil + end + ww_weights.rightPanel.statList[statName] = number + end + end + if ww_weights.rightPanel.changedTriggers then + for triggerCheckButton, trigger in pairs(ww_weights.rightPanel.changedTriggers) do + if triggerCheckButton:GetChecked() then + ww_weights.rightPanel.statList.triggers[trigger] = true + else + ww_weights.rightPanel.statList.triggers[trigger] = nil + end end - ww_weights.rightPanel.statList[statName] = number end ww_weights.rightPanel.changedStats = {} + ww_weights.rightPanel.changedTriggers = {} ww_weights.rightPanel.saveButton:Disable() ww_weights.rightPanel.resetButton:Disable() end @@ -437,11 +477,27 @@ function loadStatButtons() createScrollableTieredList(trackedStats, ww_weights.rightPanel.scrollFrame, ww_weights.rightPanel.scrollContainer, "ww_statFrame", 22) for _, categoryFrame in ipairs(ww_weights.rightPanel.scrollFrame.categories) do - local children = {categoryFrame:GetChildren()} - for i, statFrame in ipairs(children) do - if statFrame.name then - table.insert(stats, statFrame) - statFrame.statName = string.lower(statFrame.name) + if categoryFrame.name == "Triggers" then + for i, trigger in ipairs(triggerNames) do + local triggerFrame = CreateFrame("Frame", "WW_" .. trigger, categoryFrame, "ww_triggerFrame") + triggerFrame.position = i + triggerFrame.category = categoryFrame + triggerFrame.text:SetText(triggerNames[trigger]) + triggerFrame.active:SetText(trigger) + triggerFrame.name = trigger + triggerFrame:SetPoint("TOPLEFT", 0, -ww_weights.rightPanel.scrollFrame.elementHeight * i) + table.insert(ww_weights.rightPanel.scrollFrame.shown, triggerFrame) + categoryFrame.length = categoryFrame.length + 1 + end + categoryFrame:SetHeight(ww_weights.rightPanel.scrollFrame.elementHeight * categoryFrame.length) + categoryFrame.collapsed = false + else + local children = {categoryFrame:GetChildren()} + for i, statFrame in ipairs(children) do + if statFrame.name then + table.insert(stats, statFrame) + statFrame.statName = string.lower(statFrame.name) + end end end end diff --git a/weights.xml b/weights.xml index 725e243..8bd7f33 100644 --- a/weights.xml +++ b/weights.xml @@ -197,6 +197,10 @@ changed = true break end + for _ in pairs(ww_weights.rightPanel.changedTriggers) do + changed = true + break + end if not changed then ww_weights.rightPanel.saveButton:Disable() ww_weights.rightPanel.resetButton:Disable() @@ -234,6 +238,73 @@ </EditBox> </Frames> </Frame> + <!--virtual frame used to allow for script generated frames with trigger information--> + <Frame name="ww_triggerFrame" virtual="true"> + <Size> + <AbsDimension y="22"/> + </Size> + <Anchors> + <Anchor point="RIGHT"> + <Offset> + <AbsDimension x="-5"/> + </Offset> + </Anchor> + </Anchors> + <Layers> + <Layer level="OVERLAY"> + <FontString name="$parentText" parentKey="text" inherits="GameFontNormal"> + <Size> + <AbsDimension y="20"/> + </Size> + <Anchors> + <Anchor point="LEFT"> + <Offset> + <AbsDimension x="40"/> + </Offset> + </Anchor> + </Anchors> + </FontString> + </Layer> + </Layers> + <Frames> + <CheckButton name="$parentActive" parentKey="active" inherits="UICheckButtonTemplate"> + <Size> + <AbsDimension x="20" y="20"/> + </Size> + <Anchors> + <Anchor point="LEFT"> + <Offset> + <AbsDimension x="20"/> + </Offset> + </Anchor> + </Anchors> + <Scripts> + <OnClick> + if self:GetChecked() == ww_weights.rightPanel.statList.triggers[self:GetText()] then + ww_weights.rightPanel.changedTriggers[self] = nil + local changed = false + for _ in pairs(ww_weights.rightPanel.changedStats) do + changed = true + break + end + for _ in pairs(ww_weights.rightPanel.changedTriggers) do + changed = true + break + end + if not changed then + ww_weights.rightPanel.saveButton:Disable() + ww_weights.rightPanel.resetButton:Disable() + end + else + ww_weights.rightPanel.changedTriggers[self] = self:GetText() + ww_weights.rightPanel.saveButton:Enable() + ww_weights.rightPanel.resetButton:Enable() + end + </OnClick> + </Scripts> + </CheckButton> + </Frames> + </Frame> <!--virtual frame used to allow for script generated frames with stat information--> <Frame name="ww_weightFrame" virtual="true"> <Size>