diff --git a/Interface/AddOns/BtWLoadouts/ActionBars.lua b/Interface/AddOns/BtWLoadouts/ActionBars.lua
index 1a01b89a6..fb5f6503f 100644
--- a/Interface/AddOns/BtWLoadouts/ActionBars.lua
+++ b/Interface/AddOns/BtWLoadouts/ActionBars.lua
@@ -532,7 +532,7 @@ local function PickupActionTable(tbl, test, settings, activating)
end
end
elseif tbl.subType == "spell" then
- if IsSpellKnown(tbl.id, false) then
+ if IsSpellKnown(tbl.id, false) or IsPlayerSpell(tbl.id) then
success = true
if not test then
PickupSpell(tbl.id)
diff --git a/Interface/AddOns/BtWLoadouts/BtWLoadouts.toc b/Interface/AddOns/BtWLoadouts/BtWLoadouts.toc
index 487c80a2a..cb9a5a52a 100644
--- a/Interface/AddOns/BtWLoadouts/BtWLoadouts.toc
+++ b/Interface/AddOns/BtWLoadouts/BtWLoadouts.toc
@@ -1,6 +1,6 @@
## Interface: 100000
## Title: BtWLoadouts
-## Version: v1.8.6
+## Version: v1.8.7
## Notes: Change your characters spec, talents, equipment, essences, and action bars all at once
## Author: Breen
## SavedVariables: BtWLoadoutsSets, BtWLoadoutsSpecInfo, BtWLoadoutsRoleInfo, BtWLoadoutsEssenceInfo, BtWLoadoutsCharacterInfo, BtWLoadoutsHelpTipFlags, BtWLoadoutsSettings, BtWLoadoutsTraitsInfo
diff --git a/Interface/AddOns/BtWLoadouts/CHANGELOG.md b/Interface/AddOns/BtWLoadouts/CHANGELOG.md
index 6e7b57e02..d07d0ba04 100644
--- a/Interface/AddOns/BtWLoadouts/CHANGELOG.md
+++ b/Interface/AddOns/BtWLoadouts/CHANGELOG.md
@@ -1,3 +1,9 @@
+# v1.8.7
+
+- Fixed a bug where the Blizzard talent tree may not always update correctly after activating a talent set
+- Fixed treating some spells as unknown even though they are available
+- Fixed error updating equipement manager sets when an item link is unavailable
+
# v1.8.6
- Fixed some errors reading talent trees for some specs
diff --git a/Interface/AddOns/BtWLoadouts/DFTalents.lua b/Interface/AddOns/BtWLoadouts/DFTalents.lua
index c0796760c..10d86cb30 100644
--- a/Interface/AddOns/BtWLoadouts/DFTalents.lua
+++ b/Interface/AddOns/BtWLoadouts/DFTalents.lua
@@ -341,9 +341,10 @@ local function ActivateSet(set, state)
end
if complete then
- C_ClassTalents.UpdateLastSelectedSavedConfigID(260, nil) -- Set active loadout to "Default Loadout"
+ local specID = GetSpecializationInfo(GetSpecialization());
+ C_ClassTalents.UpdateLastSelectedSavedConfigID(specID, nil) -- Set active loadout to "Default Loadout"
if ClassTalentFrame then
- ClassTalentFrame.TalentsTab.LoadoutDropDown:ClearSelection() -- Make the loadout dropdown show "Default Loadout" if its already loaded
+ ClassTalentFrame.TalentsTab:ClearLastSelectedConfigID();
ClassTalentFrame.TalentsTab:MarkTreeDirty();
end
end
diff --git a/Interface/AddOns/BtWLoadouts/Events.lua b/Interface/AddOns/BtWLoadouts/Events.lua
index 607deeefa..f7646236f 100644
--- a/Interface/AddOns/BtWLoadouts/Events.lua
+++ b/Interface/AddOns/BtWLoadouts/Events.lua
@@ -454,9 +454,12 @@ function frame:EQUIPMENT_SETS_CHANGED(...)
local previousLocation = set.locations[inventorySlotId]
set.locations[inventorySlotId] = locations[inventorySlotId] -- Only update if the item has a location
- set.equipment[inventorySlotId] = Internal.GetItemLinkByLocation(location)
- set.extras[inventorySlotId] = Internal.GetExtrasForLocation(location, set.extras[inventorySlotId] or {})
- set.data[inventorySlotId] = Internal.EncodeItemData(set.equipment[inventorySlotId], set.extras[inventorySlotId] and set.extras[inventorySlotId].azerite)
+ local itemLink = Internal.GetItemLinkByLocation(location)
+ if itemLink then
+ set.equipment[inventorySlotId] = itemLink
+ set.extras[inventorySlotId] = Internal.GetExtrasForLocation(location, set.extras[inventorySlotId] or {})
+ set.data[inventorySlotId] = Internal.EncodeItemData(itemLink, set.extras[inventorySlotId] and set.extras[inventorySlotId].azerite)
+ end
if not isNewSet then
-- We force update because the blizzard manager should be correct
diff --git a/Interface/AddOns/ElvUI/Classic/Libs.xml b/Interface/AddOns/ElvUI/Classic/Libs.xml
index 5327cd70e..913f95842 100644
--- a/Interface/AddOns/ElvUI/Classic/Libs.xml
+++ b/Interface/AddOns/ElvUI/Classic/Libs.xml
@@ -18,9 +18,9 @@
-
-
-
+
+
+
diff --git a/Interface/AddOns/ElvUI/Core/Defaults/Profile.lua b/Interface/AddOns/ElvUI/Core/Defaults/Profile.lua
index 60f722d2a..ce31a6197 100644
--- a/Interface/AddOns/ElvUI/Core/Defaults/Profile.lua
+++ b/Interface/AddOns/ElvUI/Core/Defaults/Profile.lua
@@ -2675,7 +2675,7 @@ P.actionbar.bar1.visibility = E.Retail and '[petbattle] hide; show' or 'show'
P.actionbar.bar1.paging.ROGUE = '[bonusbar:1] 7;'..(E.Wrath and ' [bonusbar:2] 8;' or '')
P.actionbar.bar1.paging.WARLOCK = E.Wrath and '[form:1] 7;' or nil
-P.actionbar.bar1.paging.DRUID = format('[bonusbar:1,nostealth] 7; [bonusbar:1,stealth] 8; [bonusbar:2] %d; [bonusbar:3] 9; [bonusbar:4] 10;', E.Retail and 10 or 8) -- No idea why tho
+P.actionbar.bar1.paging.DRUID = '[bonusbar:1,nostealth] 7; [bonusbar:1,stealth] 8; [bonusbar:2] 10; [bonusbar:3] 9; [bonusbar:4] 10;'
P.actionbar.bar1.paging.EVOKER = '[bonusbar:1] 7;'
P.actionbar.bar1.paging.PRIEST = '[bonusbar:1] 7;'
P.actionbar.bar1.paging.WARRIOR = '[bonusbar:1] 7; [bonusbar:2] 8; [bonusbar:3] 9;'
diff --git a/Interface/AddOns/ElvUI/Core/General/API.lua b/Interface/AddOns/ElvUI/Core/General/API.lua
index 6481ee91a..d6c88179f 100644
--- a/Interface/AddOns/ElvUI/Core/General/API.lua
+++ b/Interface/AddOns/ElvUI/Core/General/API.lua
@@ -14,8 +14,8 @@ local GetAddOnEnableState = GetAddOnEnableState
local GetBattlefieldArenaFaction = GetBattlefieldArenaFaction
local GetInstanceInfo = GetInstanceInfo
local GetNumGroupMembers = GetNumGroupMembers
-local GetSpecialization = (E.Classic or E.TBC or E.Wrath and LCS.GetSpecialization) or GetSpecialization
-local GetSpecializationRole = (E.Classic or E.TBC or E.Wrath and LCS.GetSpecializationRole) or GetSpecializationRole
+local GetSpecialization = (E.Classic or E.Wrath and LCS.GetSpecialization) or GetSpecialization
+local GetSpecializationRole = (E.Classic or E.Wrath and LCS.GetSpecializationRole) or GetSpecializationRole
local hooksecurefunc = hooksecurefunc
local InCombatLockdown = InCombatLockdown
local IsAddOnLoaded = IsAddOnLoaded
diff --git a/Interface/AddOns/ElvUI/Core/General/Core.lua b/Interface/AddOns/ElvUI/Core/General/Core.lua
index 06d3b8f24..f6e2876dc 100644
--- a/Interface/AddOns/ElvUI/Core/General/Core.lua
+++ b/Interface/AddOns/ElvUI/Core/General/Core.lua
@@ -27,7 +27,7 @@ local GetBindingKey = GetBindingKey
local SetBinding = SetBinding
local SaveBindings = SaveBindings
local GetCurrentBindingSet = GetCurrentBindingSet
-local GetSpecialization = (E.Classic or E.TBC or E.Wrath and LCS.GetSpecialization) or GetSpecialization
+local GetSpecialization = (E.Classic or E.Wrath and LCS.GetSpecialization) or GetSpecialization
local ERR_NOT_IN_COMBAT = ERR_NOT_IN_COMBAT
local LE_PARTY_CATEGORY_HOME = LE_PARTY_CATEGORY_HOME
@@ -1524,8 +1524,6 @@ function E:UpdateMisc(skipCallback)
TotemTracker:PositionAndSize()
elseif E.Wrath then
ActionBars:PositionAndSizeTotemBar()
- elseif E.TBC then
- TotemTracker:PositionAndSize()
end
if not skipCallback then
diff --git a/Interface/AddOns/ElvUI/Core/General/Tags.lua b/Interface/AddOns/ElvUI/Core/General/Tags.lua
index afbfee25f..b0677b2c6 100644
--- a/Interface/AddOns/ElvUI/Core/General/Tags.lua
+++ b/Interface/AddOns/ElvUI/Core/General/Tags.lua
@@ -27,7 +27,7 @@ local GetQuestDifficultyColor = GetQuestDifficultyColor
local GetRaidRosterInfo = GetRaidRosterInfo
local GetRelativeDifficultyColor = GetRelativeDifficultyColor
local GetRuneCooldown = GetRuneCooldown
-local GetSpecialization = (E.Classic or E.TBC or E.Wrath and LCS.GetSpecialization) or GetSpecialization
+local GetSpecialization = (E.Classic or E.Wrath and LCS.GetSpecialization) or GetSpecialization
local GetSpecializationInfo = GetSpecializationInfo
local GetTime = GetTime
local GetTitleName = GetTitleName
@@ -326,7 +326,7 @@ for textFormat in pairs(E.GetFormattedTextStyles) do
if min ~= 0 then
return E:GetFormattedText(textFormat, min, max)
end
- end, E.Classic or E.TBC)
+ end, E.Classic)
E:AddTag(format('altpower:%s', tagFormat), 'UNIT_POWER_UPDATE UNIT_POWER_BAR_SHOW UNIT_POWER_BAR_HIDE', function(unit)
local cur = UnitPower(unit, POWERTYPE_ALTERNATE)
@@ -379,7 +379,7 @@ for textFormat in pairs(E.GetFormattedTextStyles) do
if min ~= 0 then
return E:GetFormattedText(textFormat, min, max, nil, true)
end
- end, E.Classic or E.TBC)
+ end, E.Classic)
end
end
@@ -1374,19 +1374,19 @@ E.TagInfo = {
['cpoints'] = { category = 'Classpower', description = "Displays amount of combo points the player has (only for player, shows nothing on 0)" },
['arcanecharges'] = { hidden = not E.Retail, category = 'Classpower', description = "Displays the arcane charges (Mage)" },
['chi'] = { hidden = not E.Retail, category = 'Classpower', description = "Displays the chi points (Monk)" },
- ['classpower:current-max-percent'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's current and max amount of special power, separated by a dash (% when not full power)" },
- ['classpower:current-max'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's current and max amount of special power, separated by a dash" },
- ['classpower:current-percent'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's current and percentage amount of special power, separated by a dash" },
- ['classpower:current'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's current amount of special power" },
- ['classpower:deficit'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's special power as a deficit (Total Special Power - Current Special Power = -Deficit)" },
- ['classpower:percent'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the unit's current amount of special power as a percentage" },
- ['classpower:current-max-percent:shortvalue'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "" },
- ['classpower:current-max:shortvalue'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "" },
- ['classpower:current-percent:shortvalue'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "" },
- ['classpower:current:shortvalue'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "" },
- ['classpower:deficit:shortvalue'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "" },
+ ['classpower:current-max-percent'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's current and max amount of special power, separated by a dash (% when not full power)" },
+ ['classpower:current-max'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's current and max amount of special power, separated by a dash" },
+ ['classpower:current-percent'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's current and percentage amount of special power, separated by a dash" },
+ ['classpower:current'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's current amount of special power" },
+ ['classpower:deficit'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's special power as a deficit (Total Special Power - Current Special Power = -Deficit)" },
+ ['classpower:percent'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the unit's current amount of special power as a percentage" },
+ ['classpower:current-max-percent:shortvalue'] = { hidden = E.Classic, category = 'Classpower', description = "" },
+ ['classpower:current-max:shortvalue'] = { hidden = E.Classic, category = 'Classpower', description = "" },
+ ['classpower:current-percent:shortvalue'] = { hidden = E.Classic, category = 'Classpower', description = "" },
+ ['classpower:current:shortvalue'] = { hidden = E.Classic, category = 'Classpower', description = "" },
+ ['classpower:deficit:shortvalue'] = { hidden = E.Classic, category = 'Classpower', description = "" },
['holypower'] = { hidden = not E.Retail, category = 'Classpower', description = "Displays the holy power (Paladin)" },
- ['runes'] = { hidden = E.Classic or E.TBC, category = 'Classpower', description = "Displays the runes (Death Knight)" },
+ ['runes'] = { hidden = E.Classic, category = 'Classpower', description = "Displays the runes (Death Knight)" },
['soulshards'] = { hidden = not E.Retail, category = 'Classpower', description = "Displays the soulshards (Warlock)" },
-- Colors
['altpowercolor'] = { hidden = not E.Retail, category = 'Colors', description = "Changes the text color to the current alternative power color (Blizzard defined)" },
diff --git a/Interface/AddOns/ElvUI/Core/Modules/ActionBars/ActionBars.lua b/Interface/AddOns/ElvUI/Core/Modules/ActionBars/ActionBars.lua
index 99fb38524..1d713f5be 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/ActionBars/ActionBars.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/ActionBars/ActionBars.lua
@@ -634,7 +634,7 @@ function AB:StyleButton(button, noBackdrop, useMasque, ignoreNormal)
if border and not button.useMasque then border:Kill() end
if action then action:SetAlpha(0) end
if slotbg then slotbg:Hide() end
- if mask then mask:Hide() end
+ if mask and not button.useMasque then mask:Hide() end
if count then
local position, xOffset, yOffset = db and db.countTextPosition or 'BOTTOMRIGHT', db and db.countTextXOffset or 0, db and db.countTextYOffset or 2
diff --git a/Interface/AddOns/ElvUI/Core/Modules/ActionBars/Bind.lua b/Interface/AddOns/ElvUI/Core/Modules/ActionBars/Bind.lua
index 8e8800aa8..9d2dd3415 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/ActionBars/Bind.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/ActionBars/Bind.lua
@@ -265,7 +265,7 @@ do
AB:Unhook(frame, 'Update')
end
- function AB:ADDON_LOADED(event, addon)
+ function AB:ADDON_LOADED(_, addon)
if addon == 'Blizzard_MacroUI' then
if _G.MacroFrame.Update then
AB:SecureHook(_G.MacroFrame, 'Update', MacroFrame_FirstUpdate)
@@ -275,7 +275,7 @@ do
end
end
- AB:UnregisterEvent(event)
+ AB:UnregisterEvent('ADDON_LOADED')
end
end
end
diff --git a/Interface/AddOns/ElvUI/Core/Modules/Bags/Bags.lua b/Interface/AddOns/ElvUI/Core/Modules/Bags/Bags.lua
index f598106a0..63cbc9e11 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/Bags/Bags.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/Bags/Bags.lua
@@ -84,7 +84,7 @@ local IG_BACKPACK_CLOSE = SOUNDKIT.IG_BACKPACK_CLOSE
local IG_BACKPACK_OPEN = SOUNDKIT.IG_BACKPACK_OPEN
local ITEMQUALITY_COMMON = Enum.ItemQuality.Common or Enum.ItemQuality.Standard
local ITEMQUALITY_POOR = Enum.ItemQuality.Poor
-local MAX_WATCHED_TOKENS = MAX_WATCHED_TOKENS or 3
+local MAX_WATCHED_TOKENS = MAX_WATCHED_TOKENS or 20
local NUM_BAG_FRAMES = NUM_BAG_FRAMES
local NUM_BAG_SLOTS = NUM_BAG_SLOTS + (E.Retail and 1 or 0) -- add the profession bag
local NUM_BANKGENERIC_SLOTS = NUM_BANKGENERIC_SLOTS
@@ -171,6 +171,7 @@ B.SearchSlots = {}
B.QuestSlots = {}
B.ItemLevelSlots = {}
B.BAG_FILTER_ICONS = {}
+B.numTrackedTokens = 0
if E.Retail then
B.BAG_FILTER_ICONS[FILTER_FLAG_EQUIPMENT] = 'bags-icon-equipment'
@@ -1059,6 +1060,54 @@ function B:Layout(isBank)
end
end
+ if not isBank then
+ local currencies = f.currencyButton
+ if B.numTrackedTokens == 0 then
+ if f.bottomOffset > 8 then
+ f.bottomOffset = 8
+ end
+ else
+ local currentRow = 1
+ local rowSize = B:TokenFrameWidth()
+
+ if E.Retail then
+ local tokenSpacing = floor(currencies:GetWidth() / rowSize)
+ for i = 1, B.numTrackedTokens do
+ local token = currencies[i]
+ if not token then return end
+
+ if i == 1 then
+ token:Point('TOPLEFT', currencies, 3, -3)
+ elseif i == ((rowSize * currentRow) + 1) then
+ currentRow = currentRow + 1
+ token:Point('TOPLEFT', currencies, 3 , -3 -(24 * (currentRow - 1)))
+ elseif i <= (rowSize * currentRow) then
+ token:Point('TOPLEFT', currencies, (tokenSpacing * ( i - 1 - (rowSize * (currentRow - 1)))) , -3 - (24 * (currentRow - 1)))
+ end
+ end
+ else
+ local c1, c2, c3 = unpack(currencies)
+ if B.numTrackedTokens == 1 then
+ c1:Point('BOTTOM', currencies, -c1.text:GetWidth() * 0.5, 3)
+ elseif B.numTrackedTokens == 2 then
+ c1:Point('BOTTOM', currencies, -c1.text:GetWidth() - (c1:GetWidth() * 3), 3)
+ c2:Point('BOTTOMLEFT', currencies, 'BOTTOM', c2:GetWidth() * 3, 3)
+ else
+ c1:Point('BOTTOMLEFT', currencies, 3, 3)
+ c2:Point('BOTTOM', currencies, -c2.text:GetWidth() / 3, 3)
+ c3:Point('BOTTOMRIGHT', currencies, -c3.text:GetWidth() - (c3:GetWidth() * 0.5), 3)
+ end
+ end
+
+ local curHeight = 24 * currentRow
+ currencies:Height(curHeight)
+
+ if f.bottomOffset ~= (curHeight + 8) then
+ f.bottomOffset = (curHeight + 8)
+ end
+ end
+ end
+
if E.Retail and isBank and f.reagentFrame:IsShown() then
if not IsReagentBankUnlocked() then
f.reagentFrame.cover:Show()
@@ -1247,6 +1296,17 @@ function B:OnEvent(event, ...)
end
end
+function B:TokenFrameWidth()
+ local tokenWidth = 70 -- you can always track at least one token
+ return max(floor((B.db.bagWidth - (B.db.bagButtonSpacing * 2)) / tokenWidth), 1)
+end
+
+function B:UpdateTokensIfVisible()
+ if B.BagFrame:IsVisible() then
+ B:UpdateTokens()
+ end
+end
+
function B:UpdateTokens()
local bagFrame = B.BagFrame
local currencies = bagFrame.currencyButton
@@ -1279,28 +1339,9 @@ function B:UpdateTokens()
numTokens = numTokens + 1
end
- if numTokens == 0 then
- if bagFrame.bottomOffset > 8 then
- bagFrame.bottomOffset = 8
- B:Layout()
- end
- else
- if bagFrame.bottomOffset < 28 then
- bagFrame.bottomOffset = 28
- B:Layout()
- end
-
- local c1, c2, c3 = unpack(currencies)
- if numTokens == 1 then
- c1:Point('BOTTOM', currencies, -c1.text:GetWidth() * 0.5, 3)
- elseif numTokens == 2 then
- c1:Point('BOTTOM', currencies, -c1.text:GetWidth() - (c1:GetWidth() * 3), 3)
- c2:Point('BOTTOMLEFT', currencies, 'BOTTOM', c2:GetWidth() * 3, 3)
- else
- c1:Point('BOTTOMLEFT', currencies, 3, 3)
- c2:Point('BOTTOM', currencies, -c2.text:GetWidth() / 3, 3)
- c3:Point('BOTTOMRIGHT', currencies, -c3.text:GetWidth() - (c3:GetWidth() * 0.5), 3)
- end
+ if numTokens ~= B.numTrackedTokens then
+ B.numTrackedTokens = numTokens
+ B:Layout()
end
end
@@ -1872,9 +1913,9 @@ function B:ConstructContainerFrame(name, isBank)
if E.Retail or E.Wrath then
--Currency
f.currencyButton = CreateFrame('Frame', nil, f)
- f.currencyButton:Point('BOTTOM', 0, 4)
- f.currencyButton:Point('TOPLEFT', f.holderFrame, 'BOTTOMLEFT', 0, 18)
- f.currencyButton:Point('TOPRIGHT', f.holderFrame, 'BOTTOMRIGHT', 0, 18)
+ f.currencyButton:Point('BOTTOM', 0, -6)
+ f.currencyButton:Point('BOTTOMLEFT', f.holderFrame, 'BOTTOMLEFT', 0, -6)
+ f.currencyButton:Point('BOTTOMRIGHT', f.holderFrame, 'BOTTOMRIGHT', 0, -6)
f.currencyButton:Height(22)
for i = 1, MAX_WATCHED_TOKENS do
@@ -2138,6 +2179,7 @@ function B:OpenBags()
end
B.BagFrame:Show()
+ if E.Retail then B:UpdateTokensIfVisible() end
PlaySound(IG_BACKPACK_OPEN)
@@ -2758,8 +2800,10 @@ function B:Initialize()
if E.Wrath then
B:SecureHook('BackpackTokenFrame_Update', 'UpdateTokens')
- else
- B:SecureHook(_G.BackpackTokenFrame, 'Update', 'UpdateTokens')
+ elseif E.Retail then
+ B:SecureHook(_G.BackpackTokenFrame, 'Update', 'UpdateTokensIfVisible')
+ B:SecureHook(_G.BackpackTokenFrame, 'UpdateIfVisible', 'UpdateTokensIfVisible')
+ B:SecureHook(_G.TokenFramePopup.BackpackCheckBox, 'OnClick', 'UpdateTokensIfVisible')
end
if E.Retail then
diff --git a/Interface/AddOns/ElvUI/Core/Modules/Blizzard/Blizzard.lua b/Interface/AddOns/ElvUI/Core/Modules/Blizzard/Blizzard.lua
index 5b773746c..87dd9c6a6 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/Blizzard/Blizzard.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/Blizzard/Blizzard.lua
@@ -86,7 +86,7 @@ function B:Initialize()
B:PositionAltPowerBar()
B:SkinAltPowerBar()
end
- elseif (E.TBC or E.Classic) and E.db.general.objectiveTracker then
+ elseif E.Classic and E.db.general.objectiveTracker then
B:QuestWatch_MoveFrames()
hooksecurefunc('QuestWatch_Update', B.QuestWatch_AddQuestClick)
end
diff --git a/Interface/AddOns/ElvUI/Core/Modules/Maps/Minimap.lua b/Interface/AddOns/ElvUI/Core/Modules/Maps/Minimap.lua
index 1f88a4211..d8befdcd1 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/Maps/Minimap.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/Maps/Minimap.lua
@@ -50,7 +50,7 @@ local menuList = {
if E.Retail then
tinsert(menuList, { text = _G.LFG_TITLE, func = _G.ToggleLFDParentFrame })
-elseif E.TBC or E.Wrath then
+elseif E.Wrath then
tinsert(menuList, { text = _G.LFG_TITLE, func = function() if not IsAddOnLoaded('Blizzard_LookingForGroupUI') then UIParentLoadAddOn('Blizzard_LookingForGroupUI') end _G.ToggleLFGParentFrame() end })
end
@@ -584,12 +584,14 @@ function M:ClearQueueStatus()
end
function M:CreateQueueStatusText()
- local display = CreateFrame('Frame', 'ElvUIQueueStatusDisplay', _G.QueueStatusMinimapButton)
+ local display = CreateFrame('Frame', 'ElvUIQueueStatusDisplay', _G.QueueStatusButton)
+ display:SetIgnoreParentScale(true)
+ display:SetScale(E.uiscale)
display.text = display:CreateFontString(nil, 'OVERLAY')
M.QueueStatusDisplay = display
- _G.QueueStatusMinimapButton:HookScript('OnHide', M.ClearQueueStatus)
+ _G.QueueStatusButton:HookScript('OnHide', M.ClearQueueStatus)
hooksecurefunc('QueueStatusEntry_SetMinimalDisplay', M.SetMinimalQueueStatus)
hooksecurefunc('QueueStatusEntry_SetFullDisplay', M.SetFullQueueStatus)
end
@@ -723,8 +725,7 @@ function M:Initialize()
M.TrackingDropdown = M:CreateMinimapTrackingDropdown()
end
- if _G.QueueStatusMinimapButton then
- _G.QueueStatusMinimapButtonBorder:Hide()
+ if _G.QueueStatusButton then
M:CreateQueueStatusText()
elseif _G.MiniMapLFGFrame then
(E.Wrath and _G.MiniMapLFGFrameBorder or _G.MiniMapLFGBorder):Hide()
diff --git a/Interface/AddOns/ElvUI/Core/Modules/Nameplates/Nameplates.lua b/Interface/AddOns/ElvUI/Core/Modules/Nameplates/Nameplates.lua
index 31f6367c8..7c215aa59 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/Nameplates/Nameplates.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/Nameplates/Nameplates.lua
@@ -144,7 +144,7 @@ function NP:SetCVars()
NP:SetCVar('nameplateMotion', NP.db.motionType == 'STACKED' and 1 or 0)
- if E.TBC or E.Wrath then
+ if E.Wrath then
NP:SetCVar('nameplateMaxDistance', NP.db.loadDistance)
end
@@ -817,7 +817,7 @@ local optionsTable = {
'ShowAll'
}
-if E.TBC or E.Wrath then
+if E.Wrath then
tinsert(optionsTable, 'NameplateMaxDistanceSlider')
end
diff --git a/Interface/AddOns/ElvUI/Core/Modules/Skins/Skins.lua b/Interface/AddOns/ElvUI/Core/Modules/Skins/Skins.lua
index 04fd9932f..2971fc9d9 100644
--- a/Interface/AddOns/ElvUI/Core/Modules/Skins/Skins.lua
+++ b/Interface/AddOns/ElvUI/Core/Modules/Skins/Skins.lua
@@ -377,8 +377,39 @@ function S:SkinTalentListButtons(frame)
end
do
- local function borderVertex(border, r, g, b, a)
+ local quality = Enum.ItemQuality
+ local iconColors = {
+ ['auctionhouse-itemicon-border-gray'] = E.QualityColors[quality.Poor],
+ ['auctionhouse-itemicon-border-white'] = E.QualityColors[quality.Common],
+ ['auctionhouse-itemicon-border-green'] = E.QualityColors[quality.Uncommon],
+ ['auctionhouse-itemicon-border-blue'] = E.QualityColors[quality.Rare],
+ ['auctionhouse-itemicon-border-purple'] = E.QualityColors[quality.Epic],
+ ['auctionhouse-itemicon-border-orange'] = E.QualityColors[quality.Legendary],
+ ['auctionhouse-itemicon-border-artifact'] = E.QualityColors[quality.Artifact],
+ ['auctionhouse-itemicon-border-account'] = E.QualityColors[quality.Heirloom]
+ }
+
+ local function hideBorder(border)
+ border:SetAlpha(0)
border:StripTextures()
+ end
+
+ local function colorAtlas(border, atlas)
+ local color = iconColors[atlas]
+ if not color then return end
+
+ hideBorder(border)
+
+ if border.customFunc then
+ local br, bg, bb = unpack(E.media.bordercolor)
+ border.customFunc(border, color.r, color.g, color.b, 1, br, bg, bb)
+ elseif border.customBackdrop then
+ border.customBackdrop:SetBackdropBorderColor(color.r, color.g, color.b)
+ end
+ end
+
+ local function colorVertex(border, r, g, b, a)
+ hideBorder(border)
if border.customFunc then
local br, bg, bb = unpack(E.media.bordercolor)
@@ -413,9 +444,10 @@ do
border.customBackdrop = backdrop
if not border.IconBorderHooked then
- border:StripTextures()
+ hideBorder(border)
- hooksecurefunc(border, 'SetVertexColor', borderVertex)
+ hooksecurefunc(border, 'SetAtlas', colorAtlas)
+ hooksecurefunc(border, 'SetVertexColor', colorVertex)
hooksecurefunc(border, 'SetShown', borderShown)
hooksecurefunc(border, 'Hide', borderHide)
@@ -423,10 +455,13 @@ do
end
local r, g, b, a = border:GetVertexColor()
+ local atlas = iconColors[border.GetAtlas and border:GetAtlas()]
if customFunc then
border.customFunc = customFunc
local br, bg, bb = unpack(E.media.bordercolor)
customFunc(border, r, g, b, a, br, bg, bb)
+ elseif atlas then
+ backdrop:SetBackdropBorderColor(atlas.r, atlas.g, atlas.b, 1)
elseif r then
backdrop:SetBackdropBorderColor(r, g, b, a)
else
diff --git a/Interface/AddOns/ElvUI/Core/init.lua b/Interface/AddOns/ElvUI/Core/init.lua
index 03f62148f..70507d607 100644
--- a/Interface/AddOns/ElvUI/Core/init.lua
+++ b/Interface/AddOns/ElvUI/Core/init.lua
@@ -81,7 +81,7 @@ E.twoPixelsPlease = false -- changing this option is not supported! :P
-- Expansions
E.Retail = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
E.Classic = WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
-E.TBC = WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC
+E.TBC = WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC -- not used
E.Wrath = WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC
-- Item Qualitiy stuff, also used by MerathilisUI
@@ -273,7 +273,7 @@ function E:OnInitialize()
E.Minimap:SetGetMinimapShape() -- This is just to support for other mods, keep below UIMult
end
- if E.Classic or E.TBC then
+ if E.Classic then
RegisterCVar('fstack_showhighlight', '1')
end
diff --git a/Interface/AddOns/ElvUI/ElvUI_Classic.toc b/Interface/AddOns/ElvUI/ElvUI_Classic.toc
index 5261a0873..2086387e4 100644
--- a/Interface/AddOns/ElvUI/ElvUI_Classic.toc
+++ b/Interface/AddOns/ElvUI/ElvUI_Classic.toc
@@ -1,7 +1,7 @@
## Title: |cff1784d1ElvUI|r |cfd9b9b9bClassic|r
## Notes: User Interface Replacement
## Author: Elv, Simpy
-## Version: 12.97
+## Version: 12.98
## SavedVariables: ElvDB, ElvPrivateDB
## SavedVariablesPerCharacter: ElvCharacterDB
## OptionalDeps: SharedMedia, Tukui, Masque
diff --git a/Interface/AddOns/ElvUI/ElvUI_Mainline.toc b/Interface/AddOns/ElvUI/ElvUI_Mainline.toc
index 6c868bcde..3de88630d 100644
--- a/Interface/AddOns/ElvUI/ElvUI_Mainline.toc
+++ b/Interface/AddOns/ElvUI/ElvUI_Mainline.toc
@@ -1,7 +1,7 @@
## Title: |cff1784d1ElvUI|r
## Notes: User Interface Replacement
## Author: Elv, Simpy
-## Version: 12.97
+## Version: 12.98
## SavedVariables: ElvDB, ElvPrivateDB
## SavedVariablesPerCharacter: ElvCharacterDB
## OptionalDeps: SharedMedia, Tukui, Masque, Blizzard_PetJournal
diff --git a/Interface/AddOns/ElvUI/ElvUI_TBC.toc b/Interface/AddOns/ElvUI/ElvUI_TBC.toc
deleted file mode 100644
index 054a59e93..000000000
--- a/Interface/AddOns/ElvUI/ElvUI_TBC.toc
+++ /dev/null
@@ -1,16 +0,0 @@
-## Title: |cff1784d1ElvUI|r |cfd9b9b9bTBC|r
-## Notes: User Interface Replacement
-## Author: Elv, Simpy
-## Version: 12.97
-## SavedVariables: ElvDB, ElvPrivateDB
-## SavedVariablesPerCharacter: ElvCharacterDB
-## OptionalDeps: SharedMedia, Tukui, Masque
-## Interface: 20504
-## X-Interface: 20504
-## X-oUF: ElvUF
-
-TBC\Libs.xml
-
-Core\Load.xml
-
-TBC\Load.xml
diff --git a/Interface/AddOns/ElvUI/ElvUI_Wrath.toc b/Interface/AddOns/ElvUI/ElvUI_Wrath.toc
index ea0704baf..75894eea9 100644
--- a/Interface/AddOns/ElvUI/ElvUI_Wrath.toc
+++ b/Interface/AddOns/ElvUI/ElvUI_Wrath.toc
@@ -1,7 +1,7 @@
## Title: |cff1784d1ElvUI|r |cfd9b9b9bWrath|r
## Notes: User Interface Replacement
## Author: Elv, Simpy
-## Version: 12.97
+## Version: 12.98
## SavedVariables: ElvDB, ElvPrivateDB
## SavedVariablesPerCharacter: ElvCharacterDB
## OptionalDeps: SharedMedia, Tukui, Masque
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibClassicSpecs/LibClassicSpecs.lua b/Interface/AddOns/ElvUI/Libraries/Classic/LibClassicSpecs/LibClassicSpecs.lua
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibClassicSpecs/LibClassicSpecs.lua
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibClassicSpecs/LibClassicSpecs.lua
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibHealComm-4.0/LibHealComm-4.0.lua b/Interface/AddOns/ElvUI/Libraries/Classic/LibHealComm-4.0/LibHealComm-4.0.lua
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibHealComm-4.0/LibHealComm-4.0.lua
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibHealComm-4.0/LibHealComm-4.0.lua
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.lua b/Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.lua
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.lua
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.lua
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.toc b/Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.toc
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.toc
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.toc
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.xml b/Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.xml
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXP.xml
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXP.xml
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXPDB.lua b/Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXPDB.lua
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/LibQuestXPDB.lua
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/LibQuestXPDB.lua
diff --git a/Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/README.md b/Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/README.md
similarity index 100%
rename from Interface/AddOns/ElvUI/Libraries/TBC/LibQuestXP/README.md
rename to Interface/AddOns/ElvUI/Libraries/Classic/LibQuestXP/README.md
diff --git a/Interface/AddOns/ElvUI/Libraries/Core/LibActionButton-1.0/LibActionButton-1.0.lua b/Interface/AddOns/ElvUI/Libraries/Core/LibActionButton-1.0/LibActionButton-1.0.lua
index 0304bf290..0d83f5a9e 100644
--- a/Interface/AddOns/ElvUI/Libraries/Core/LibActionButton-1.0/LibActionButton-1.0.lua
+++ b/Interface/AddOns/ElvUI/Libraries/Core/LibActionButton-1.0/LibActionButton-1.0.lua
@@ -182,6 +182,7 @@ function lib:CreateButton(id, name, header, config)
local AuraCooldown = CreateFrame("Cooldown", nil, button, "CooldownFrameTemplate")
AuraCooldown:SetDrawBling(false)
AuraCooldown:SetDrawSwipe(false)
+ AuraCooldown:SetDrawEdge(false)
button.AuraCooldown = AuraCooldown
-- Frame Scripts
@@ -1429,8 +1430,8 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeMo
cooldown = CreateFrame("Cooldown", "LAB10ChargeCooldown"..lib.NumChargeCooldowns, parent, "CooldownFrameTemplate");
cooldown:SetScript("OnCooldownDone", EndChargeCooldown)
cooldown:SetHideCountdownNumbers(true)
+ cooldown:SetDrawBling(false)
cooldown:SetDrawSwipe(false)
- cooldown:SetEdgeScale(0)
lib.callbacks:Fire("OnChargeCreated", parent, cooldown)
end
@@ -1462,10 +1463,6 @@ local function OnCooldownDone(self)
self:SetScript("OnCooldownDone", nil)
- if button.chargeCooldown then
- button.chargeCooldown:SetDrawSwipe(false)
- end
-
lib.callbacks:Fire("OnCooldownDone", button, self)
end
@@ -1479,10 +1476,9 @@ local function LosCooldownDone(self)
end
function UpdateCooldown(self)
- local locStart, locDuration
- local start, duration, enable, modRate
+ local locStart, locDuration, _
+ local start, duration, modRate, auraData
local charges, maxCharges, chargeStart, chargeDuration, chargeModRate
- local auraData
local passiveCooldownSpellID = self:GetPassiveCooldownSpellID()
if passiveCooldownSpellID and passiveCooldownSpellID ~= 0 then
@@ -1504,14 +1500,13 @@ function UpdateCooldown(self)
chargeStart = currentTime * 0.001
chargeDuration = duration * 0.001
chargeModRate = modRate
- enable = 1
else
locStart, locDuration = self:GetLossOfControlCooldown()
- start, duration, enable, modRate = self:GetCooldown()
+ start, duration, _, modRate = self:GetCooldown()
charges, maxCharges, chargeStart, chargeDuration, chargeModRate = self:GetCharges()
end
- self.cooldown:SetDrawBling(self.config.useDrawBling and (self.cooldown:GetEffectiveAlpha() > 0.5))
+ self.cooldown:SetDrawBling(self.config.useDrawBling and (self:GetEffectiveAlpha() > 0.5))
if (locStart + locDuration) > (start + duration) then
if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_LOSS_OF_CONTROL then
@@ -1536,7 +1531,7 @@ function UpdateCooldown(self)
if charges and maxCharges and maxCharges > 1 and charges < maxCharges then
StartChargeCooldown(self, chargeStart, chargeDuration, chargeModRate)
- self.chargeCooldown:SetDrawSwipe(duration <= 0 and self.config.useDrawSwipeOnCharges)
+ self.chargeCooldown:SetDrawSwipe(self.config.useDrawSwipeOnCharges)
elseif self.chargeCooldown then
EndChargeCooldown(self.chargeCooldown)
end
diff --git a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/AuctionHouse.lua b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/AuctionHouse.lua
index 33f189d8d..98cdb6b42 100644
--- a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/AuctionHouse.lua
+++ b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/AuctionHouse.lua
@@ -78,10 +78,9 @@ local function SkinItemDisplay(frame)
local ItemButton = ItemDisplay.ItemButton
ItemButton.CircleMask:Hide()
- -- We skin the new IconBorder from the AH, it looks really cool tbh.
- ItemButton.Icon:SetTexCoord(.08, .92, .08, .92)
- ItemButton.Icon:Size(44)
- ItemButton.IconBorder:SetTexCoord(.08, .92, .08, .92)
+ S:HandleIcon(ItemButton.Icon, true)
+ S:HandleIconBorder(ItemButton.IconBorder, ItemButton.Icon.backdrop)
+ ItemButton:GetHighlightTexture():Hide()
end
local function HandleHeaders(frame)
@@ -119,7 +118,6 @@ local function HandleSellFrame(frame)
local ItemButton = ItemDisplay.ItemButton
if ItemButton.IconMask then ItemButton.IconMask:Hide() end
- if ItemButton.IconBorder then ItemButton.IconBorder:Kill() end
ItemButton.EmptyBackground:Hide()
ItemButton:SetPushedTexture(E.ClearTexture)
@@ -132,6 +130,10 @@ local function HandleSellFrame(frame)
S:HandleEditBox(frame.PriceInput.MoneyInputFrame.GoldBox)
S:HandleEditBox(frame.PriceInput.MoneyInputFrame.SilverBox)
+ if ItemButton.IconBorder then
+ S:HandleIconBorder(ItemButton.IconBorder, ItemButton.Icon.backdrop)
+ end
+
if frame.SecondaryPriceInput then
S:HandleEditBox(frame.SecondaryPriceInput.MoneyInputFrame.GoldBox)
S:HandleEditBox(frame.SecondaryPriceInput.MoneyInputFrame.SilverBox)
@@ -155,7 +157,6 @@ local function HandleTokenSellFrame(frame)
local ItemButton = ItemDisplay.ItemButton
if ItemButton.IconMask then ItemButton.IconMask:Hide() end
- if ItemButton.IconBorder then ItemButton.IconBorder:Kill() end
ItemButton.EmptyBackground:Hide()
ItemButton:SetPushedTexture(E.ClearTexture)
@@ -164,6 +165,10 @@ local function HandleTokenSellFrame(frame)
S:HandleIcon(ItemButton.Icon, true)
+ if ItemButton.IconBorder then
+ S:HandleIconBorder(ItemButton.IconBorder, ItemButton.Icon.backdrop)
+ end
+
S:HandleButton(frame.PostButton)
HandleAuctionButtons(frame.DummyRefreshButton)
@@ -377,6 +382,8 @@ local function LoadSkin()
local ItemButton = Token.ItemButton
S:HandleIcon(ItemButton.Icon, true)
ItemButton.Icon.backdrop:SetBackdropBorderColor(0, .8, 1)
+ ItemButton:GetHighlightTexture():Hide()
+ ItemButton.CircleMask:Hide()
ItemButton.IconBorder:Kill()
--WoW Token Tutorial Frame
diff --git a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/BGMap.lua b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/BGMap.lua
index 5d84fc00a..d6f816142 100644
--- a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/BGMap.lua
+++ b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/BGMap.lua
@@ -52,7 +52,7 @@ function S:Blizzard_BattlefieldMap()
frame:SetMovable(true)
frame:SetClampedToScreen(true)
frame:SetFrameStrata('LOW')
- frame:SetScript('OnUpdate', nil) -- shut off the tab fading in
+ frame:SetScript('OnUpdate', _G.MapCanvasMixin.OnUpdate) -- shut off the tab fading in, but keep the canvas updater
local border = frame.BorderFrame
border:StripTextures()
diff --git a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Bags.lua b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Bags.lua
index 92b7ad62e..538458097 100644
--- a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Bags.lua
+++ b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Bags.lua
@@ -58,6 +58,15 @@ local function BackpackToken_Update(container)
end
end
+local function GetSlotAndBagID(button)
+ if button.GetSlotAndBagID then -- bags
+ return button:GetSlotAndBagID()
+ elseif button.GetBagID then -- bank
+ local slotID, bagID = button:GetID(), button:GetBagID()
+ return slotID, bagID
+ end
+end
+
local function SkinButton(button)
if button.template then return end
@@ -79,10 +88,11 @@ local function SkinButton(button)
if button.Cooldown then
E:RegisterCooldown(button.Cooldown, 'bags')
- -- initialize any cooldown
- local slotID, bagID = button:GetSlotAndBagID()
- local start, duration = GetContainerItemCooldown(bagID, slotID)
- button.Cooldown:SetCooldown(start, duration)
+ local slotID, bagID = GetSlotAndBagID(button)
+ if slotID and bagID then -- initialize any cooldown
+ local start, duration = GetContainerItemCooldown(bagID, slotID)
+ button.Cooldown:SetCooldown(start, duration)
+ end
end
-- bag keybind support from actionbar module
diff --git a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Professions.lua b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Professions.lua
index db23ea879..b85ad1e62 100644
--- a/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Professions.lua
+++ b/Interface/AddOns/ElvUI/Mainline/Modules/Skins/Professions.lua
@@ -25,16 +25,20 @@ end
local function ReskinSlotButton(button)
if button and not button.isSkinned then
+ local texture = button.Icon:GetTexture()
button:StripTextures()
button:SetNormalTexture(E.ClearTexture)
button:SetPushedTexture(E.ClearTexture)
S:HandleIcon(button.Icon, true)
S:HandleIconBorder(button.IconBorder, button.Icon.backdrop)
+ button.Icon:SetOutside(button)
+ button.Icon:SetTexture(texture)
local hl = button:GetHighlightTexture()
hl:SetColorTexture(1, 1, 1, .25)
- hl:SetInside(button.bg)
+ hl:SetOutside(button)
+
if button.SlotBackground then
button.SlotBackground:Hide()
end
@@ -130,6 +134,14 @@ function S:Blizzard_Professions()
ReskinQualityContainer(QualityDialog.Container3)
end
+ local OutputIcon = SchematicForm.OutputIcon
+ if OutputIcon then
+ S:HandleIcon(OutputIcon.Icon, true)
+ S:HandleIconBorder(OutputIcon.IconBorder, OutputIcon.Icon.backdrop)
+ OutputIcon:GetHighlightTexture():Hide()
+ OutputIcon.CircleMask:Hide()
+ end
+
hooksecurefunc(SchematicForm, 'Init', function(frame)
for slot in frame.reagentSlotPool:EnumerateActive() do
ReskinSlotButton(slot.Button)
@@ -185,6 +197,7 @@ function S:Blizzard_Professions()
local icon = item:GetRegions()
S:HandleIcon(icon, true)
S:HandleIconBorder(item.IconBorder, icon.backdrop)
+
itemContainer.CritFrame:SetAlpha(0)
itemContainer.BorderFrame:Hide()
itemContainer.HighlightNameFrame:SetAlpha(0)
diff --git a/Interface/AddOns/ElvUI/TBC/Filters/Filters.lua b/Interface/AddOns/ElvUI/TBC/Filters/Filters.lua
deleted file mode 100644
index c2a4a2c82..000000000
--- a/Interface/AddOns/ElvUI/TBC/Filters/Filters.lua
+++ /dev/null
@@ -1,1126 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-
-local List = E.Filters.List
-local Aura = E.Filters.Aura
-
--- These are debuffs that are some form of CC
-G.unitframe.aurafilters.CCDebuffs = {
- type = 'Whitelist',
- spells = {
- -- Druid
- [339] = List(1), -- Entangling Roots (Rank 1)
- [1062] = List(1), -- Entangling Roots (Rank 2)
- [5195] = List(1), -- Entangling Roots (Rank 3)
- [5196] = List(1), -- Entangling Roots (Rank 4)
- [9852] = List(1), -- Entangling Roots (Rank 5)
- [9853] = List(1), -- Entangling Roots (Rank 6)
- [26989] = List(1), -- Entangling Roots (Rank 7)
- [19975] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 1)
- [19974] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 2)
- [19973] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 3)
- [19972] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 4)
- [19971] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 5)
- [19970] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 6)
- [27010] = List(1), -- Entangling Roots (Nature's Grasp) (Rank 7)
- [2637] = List(1), -- Hibernate (Rank 1)
- [18657] = List(1), -- Hibernate (Rank 2)
- [18658] = List(1), -- Hibernate (Rank 3)
- [45334] = List(2), -- Feral Charge Effect
- [5211] = List(4), -- Bash (Rank 1)
- [6798] = List(4), -- Bash (Rank 2)
- [8983] = List(4), -- Bash (Rank 3)
- [16922] = List(2), -- Celestial Focus (Starfire Stun)
- [9005] = List(2), -- Pounce (Rank 1)
- [9823] = List(2), -- Pounce (Rank 2)
- [9827] = List(2), -- Pounce (Rank 3)
- [27006] = List(2), -- Pounce (Rank 4)
- [770] = List(5), -- Faerie Fire (Rank 1)
- [778] = List(5), -- Faerie Fire (Rank 2)
- [9749] = List(5), -- Faerie Fire (Rank 3)
- [9907] = List(5), -- Faerie Fire (Rank 4)
- [16857] = List(5), -- Faerie Fire (Feral) (Rank 1)
- [17390] = List(5), -- Faerie Fire (Feral) (Rank 2)
- [17391] = List(5), -- Faerie Fire (Feral) (Rank 3)
- [17392] = List(5), -- Faerie Fire (Feral) (Rank 4)
- [22570] = List(4), -- Maim
- [33786] = List(5), -- Cyclone
- -- Hunter
- [3355] = List(3), -- Freezing Trap Effect (Rank 1)
- [14308] = List(3), -- Freezing Trap Effect (Rank 2)
- [14309] = List(3), -- Freezing Trap Effect (Rank 3)
- [13810] = List(1), -- Frost Trap Aura
- [19503] = List(4), -- Scatter Shot
- [5116] = List(2), -- Concussive Shot
- [2974] = List(2), -- Wing Clip (Rank 1)
- [14267] = List(2), -- Wing Clip (Rank 2)
- [14268] = List(2), -- Wing Clip (Rank 3)
- [1513] = List(2), -- Scare Beast (Rank 1)
- [14326] = List(2), -- Scare Beast (Rank 2)
- [14327] = List(2), -- Scare Beast (Rank 3)
- [24394] = List(2), -- Intimidation
- [19386] = List(2), -- Wyvern Sting (Rank 1)
- [24132] = List(2), -- Wyvern Sting (Rank 2)
- [24133] = List(2), -- Wyvern Sting (Rank 3)
- [27068] = List(2), -- Wyvern Sting (Rank 4)
- [19229] = List(2), -- Improved Wing Clip
- [19306] = List(2), -- Counterattack (Rank 1)
- [20909] = List(2), -- Counterattack (Rank 2)
- [20910] = List(2), -- Counterattack (Rank 3)
- [27067] = List(2), -- Counterattack (Rank 4)
- [19410] = List(2), -- Improved Concussive Shot
- [34490] = List(2), -- Silencing Shot
- [25999] = List(2), -- Charge (Boar)
- [19185] = List(1), -- Entrapment
- [35101] = List(2), -- Concussive Barrage
- -- Mage
- [118] = List(3), -- Polymorph (Rank 1)
- [12824] = List(3), -- Polymorph (Rank 2)
- [12825] = List(3), -- Polymorph (Rank 3)
- [12826] = List(3), -- Polymorph (Rank 4)
- [28271] = List(3), -- Polymorph (Turtle)
- [28272] = List(3), -- Polymorph (Pig)
- [31661] = List(3), -- Dragon's Breath (Rank 1)
- [33041] = List(3), -- Dragon's Breath (Rank 2)
- [33042] = List(3), -- Dragon's Breath (Rank 3)
- [33043] = List(3), -- Dragon's Breath (Rank 4)
- [122] = List(1), -- Frost Nova (Rank 1)
- [865] = List(1), -- Frost Nova (Rank 2)
- [6131] = List(1), -- Frost Nova (Rank 3)
- [10230] = List(1), -- Frost Nova (Rank 4)
- [27088] = List(1), -- Frost Nova (Rank 5)
- [12494] = List(2), -- Frostbite
- [116] = List(2), -- Frostbolt (Rank 1)
- [205] = List(2), -- Frostbolt (Rank 2)
- [837] = List(2), -- Frostbolt (Rank 3)
- [7322] = List(2), -- Frostbolt (Rank 4)
- [8406] = List(2), -- Frostbolt (Rank 5)
- [8407] = List(2), -- Frostbolt (Rank 6)
- [8408] = List(2), -- Frostbolt (Rank 7)
- [10179] = List(2), -- Frostbolt (Rank 8)
- [10180] = List(2), -- Frostbolt (Rank 9)
- [10181] = List(2), -- Frostbolt (Rank 10)
- [25304] = List(2), -- Frostbolt (Rank 11)
- [27071] = List(2), -- Frostbolt (Rank 12)
- [27072] = List(2), -- Frostbolt (Rank 13)
- [38697] = List(2), -- Frostbolt (Rank 14)
- [12355] = List(2), -- Impact
- [18469] = List(2), -- Counterspell - Silencedl
- [33395] = List(1), -- Freeze (Water Elemental)
- [11113] = List(2), -- Blast Wave
- [12484] = List(2), -- Chilled (Blizzard) (Rank 1)
- [12485] = List(2), -- Chilled (Blizzard) (Rank 2)
- [12486] = List(2), -- Chilled (Blizzard) (Rank 3)
- [6136] = List(2), -- Chilled (Frost Armor)
- [7321] = List(2), -- Chilled (Ice Armor)
- [120] = List(2), -- Cone of Cold
- [31589] = List(2), -- Slow
- -- Paladin
- [853] = List(3), -- Hammer of Justice (Rank 1)
- [5588] = List(3), -- Hammer of Justice (Rank 2)
- [5589] = List(3), -- Hammer of Justice (Rank 3)
- [10308] = List(3), -- Hammer of Justice (Rank 4)
- [20066] = List(3), -- Repentance
- [20170] = List(2), -- Stun (Seal of Justice Proc)
- [10326] = List(3), -- Turn Evil
- [2878] = List(3), -- Turn Undead (Rank 1)
- [5627] = List(3), -- Turn Undead (Rank 2)
- [31935] = List(2), -- Avenger's Shield
- [2812] = List(2), -- Holy Wrath (Rank 1)
- [10318] = List(2), -- Holy Wrath (Rank 2)
- [27139] = List(2), -- Holy Wrath (Rank 3)
- [48816] = List(2), -- Holy Wrath (Rank 4)
- [48817] = List(2), -- Holy Wrath (Rank 5)
- [63529] = List(2), -- Silenced - Shield of the Templar
- -- Priest
- [8122] = List(3), -- Psychic Scream (Rank 1)
- [8124] = List(3), -- Psychic Scream (Rank 2)
- [10888] = List(3), -- Psychic Scream (Rank 3)
- [10890] = List(3), -- Psychic Scream (Rank 4)
- [605] = List(5), -- Mind Control
- [15407] = List(2), -- Mind Flay (Rank 1)
- [17311] = List(2), -- Mind Flay (Rank 2)
- [17312] = List(2), -- Mind Flay (Rank 3)
- [17313] = List(2), -- Mind Flay (Rank 4)
- [17314] = List(2), -- Mind Flay (Rank 5)
- [18807] = List(2), -- Mind Flay (Rank 6)
- [25387] = List(2), -- Mind Flay (Rank 7)
- [15487] = List(2), -- Silence
- -- Rogue
- [6770] = List(4), -- Sap (Rank 1)
- [2070] = List(4), -- Sap (Rank 2)
- [11297] = List(4), -- Sap (Rank 3)
- [2094] = List(5), -- Blind
- [408] = List(4), -- Kidney Shot (Rank 1)
- [8643] = List(4), -- Kidney Shot (Rank 2)
- [1833] = List(2), -- Cheap Shot
- [1776] = List(2), -- Gouge (Rank 1)
- [1777] = List(2), -- Gouge (Rank 2)
- [8629] = List(2), -- Gouge (Rank 3)
- [11285] = List(2), -- Gouge (Rank 4)
- [11286] = List(2), -- Gouge (Rank 5)
- [38764] = List(2), -- Gouge (Rank 6)
- [1330] = List(2), -- Garrote - Silence
- [18425] = List(2), -- Kick - Silenced
- [14251] = List(2), -- Riposte
- [31125] = List(2), -- Blade Twisting
- [3409] = List(2), -- Crippling Poison (Rank 1)
- [11201] = List(2), -- Crippling Poison (Rank 2)
- [26679] = List(2), -- Deadly Throw
- [32747] = List(2), -- Deadly Interrupt Effect
- -- Shaman
- [2484] = List(1), -- Earthbind Totem
- [8056] = List(2), -- Frost Shock (Rank 1)
- [8058] = List(2), -- Frost Shock (Rank 2)
- [10472] = List(2), -- Frost Shock (Rank 3)
- [10473] = List(2), -- Frost Shock (Rank 4)
- [25464] = List(2), -- Frost Shock (Rank 5)
- [39796] = List(2), -- Stoneclaw Totem
- [8034] = List(2), -- Frostbrand Attack (Rank 1)
- [8037] = List(2), -- Frostbrand Attack (Rank 2)
- [10458] = List(2), -- Frostbrand Attack (Rank 3)
- [16352] = List(2), -- Frostbrand Attack (Rank 4)
- [16353] = List(2), -- Frostbrand Attack (Rank 5)
- [25501] = List(2), -- Frostbrand Attack (Rank 6)
- -- Warlock
- [5782] = List(3), -- Fear (Rank 1)
- [6213] = List(3), -- Fear (Rank 2)
- [6215] = List(3), -- Fear (Rank 3)
- [6358] = List(3), -- Seduction (Succubus)
- [18223] = List(2), -- Curse of Exhaustion
- [18093] = List(2), -- Pyroclasm
- [710] = List(2), -- Banish (Rank 1)
- [18647] = List(2), -- Banish (Rank 2)
- [30413] = List(2), -- Shadowfury
- [6789] = List(3), -- Death Coil (Rank 1)
- [17925] = List(3), -- Death Coil (Rank 2)
- [17926] = List(3), -- Death Coil (Rank 3)
- [27223] = List(3), -- Death Coil (Rank 4)
- [5484] = List(3), -- Howl of Terror (Rank 1)
- [17928] = List(3), -- Howl of Terror (Rank 2)
- [24259] = List(2), -- Spell Lock (Felhunter)
- [18118] = List(2), -- Aftermath
- [20812] = List(2), -- Cripple (Doomguard)
- [1098] = List(5), -- Enslave Demon (Rank 1)
- [11725] = List(5), -- Enslave Demon (Rank 2)
- [11726] = List(5), -- Enslave Demon (Rank 3)
- [30153] = List(2), -- Intercept Stun (Felguard)
- [31117] = List(2), -- Unstable Affliction (Silence)
- -- Warrior
- [20511] = List(4), -- Intimidating Shout (Cower)
- [5246] = List(4), -- Intimidating Shout (Fear)
- [1715] = List(2), -- Hamstring (Rank 1)
- [7372] = List(2), -- Hamstring (Rank 2)
- [7373] = List(2), -- Hamstring (Rank 3)
- [25212] = List(2), -- Hamstring (Rank 4)
- [12809] = List(2), -- Concussion Blow
- [20253] = List(2), -- Intercept Stun (Rank 1)
- [20614] = List(2), -- Intercept Stun (Rank 2)
- [20615] = List(2), -- Intercept Stun (Rank 3)
- [25273] = List(2), -- Intercept Stun (Rank 4)
- [25274] = List(2), -- Intercept Stun (Rank 5)
- [7386] = List(6), -- Sunder Armor (Rank 1)
- [7405] = List(6), -- Sunder Armor (Rank 2)
- [8380] = List(6), -- Sunder Armor (Rank 3)
- [11596] = List(6), -- Sunder Armor (Rank 4)
- [11597] = List(6), -- Sunder Armor (Rank 5)
- [25225] = List(6), -- Sunder Armor (Rank 6)
- [7922] = List(2), -- Charge Stun
- [12798] = List(2), -- Revenge Stun
- [18498] = List(2), -- Shield Bash - Silenced
- [23694] = List(2), -- Improved Hamstring
- [676] = List(2), -- Disarm
- [12323] = List(2), -- Piercing Howl
- --Mace Specialization
- [5530] = List(2), -- Mace Stun Effect
- -- Racial
- [20549] = List(2), -- War Stomp
- [44041] = List(2), -- Chastise
- [28730] = List(2), -- Arcane Torrent (Mana)
- [25046] = List(2), -- Arcane Torrent (Energy)
- },
-}
-
--- These are buffs that can be considered 'protection' buffs
-G.unitframe.aurafilters.TurtleBuffs = {
- type = 'Whitelist',
- spells = {
- -- Druid
- [22812] = List(2), -- Barkskin
- -- Hunter
- [19263] = List(2), -- Deterrence
- -- Hunter
- [34471] = List(2), -- The Beast Within
- -- Mage
- [45438] = List(2), -- Ice Block
- [66] = List(2), -- Invisibility
- -- Paladin
- [498] = List(2), -- Divine Protection (Rank 1)
- [5573] = List(2), -- Divine Protection (Rank 2)
- [642] = List(2), -- Divine Shield (Rank 1)
- [1020] = List(2), -- Divine Shield (Rank 2)
- [1022] = List(2), -- Blessing of Protection (Rank 1)
- [5599] = List(2), -- Blessing of Protection (Rank 2)
- [10278] = List(2), -- Blessing of Protection (Rank 3)
- -- Rogue
- [31224] = List(2), -- Cloak of Shadows
- [5277] = List(2), -- Evasion (Rank 1)
- [26669] = List(2), -- Evasion (Rank 2)
- [1856] = List(2), -- Vanish (Rank 1)
- [1857] = List(2), -- Vanish (Rank 2)
- [26889] = List(2), -- Vanish (Rank 3)
- -- Shaman
- [974] = List(2), -- Earth Shield (Rank 1)
- [32593] = List(2), -- Earth Shield (Rank 2)
- [32594] = List(2), -- Earth Shield (Rank 3)
- [49283] = List(2), -- Earth Shield (Rank 4)
- [49284] = List(2), -- Earth Shield (Rank 5)
- [30823] = List(2), -- Shamanistic Rage
- -- Warrior
- [12975] = List(2), -- Last Stand
- [871] = List(2), -- Shield Wall
- [20230] = List(2), -- Retaliation
- [23920] = List(2), -- Spell Reflection
- -- Consumables
- [3169] = List(2), -- Limited Invulnerability Potion
- [6615] = List(2), -- Free Action Potion
- -- Racial
- [7744] = List(2), -- Will of the Forsaken
- [6346] = List(2), -- Fear Ward
- [20594] = List(2), -- Stoneform
- -- All Classes
- [19753] = List(2), -- Divine Intervention
- },
-}
-
-G.unitframe.aurafilters.PlayerBuffs = {
- type = 'Whitelist',
- spells = {
- -- Druid
- [29166] = List(), -- Innervate
- [22812] = List(), -- Barkskin
- [17116] = List(), -- Nature's Swiftness
- [16689] = List(), -- Nature's Grasp (Rank 1)
- [16810] = List(), -- Nature's Grasp (Rank 2)
- [16811] = List(), -- Nature's Grasp (Rank 3)
- [16812] = List(), -- Nature's Grasp (Rank 4)
- [16813] = List(), -- Nature's Grasp (Rank 5)
- [17329] = List(), -- Nature's Grasp (Rank 6)
- [27009] = List(), -- Nature's Grasp (Rank 7)
- [16864] = List(), -- Omen of Clarity
- [5217] = List(), -- Tiger's Fury (Rank 1)
- [6793] = List(), -- Tiger's Fury (Rank 2)
- [9845] = List(), -- Tiger's Fury (Rank 3)
- [9846] = List(), -- Tiger's Fury (Rank 4)
- [2893] = List(), -- Abolish Poison
- [5229] = List(), -- Enrage
- [1850] = List(), -- Dash (Rank 1)
- [9821] = List(), -- Dash (Rank 2)
- [33357] = List(), -- Dash (Rank 3)
- -- Hunter
- [13161] = List(), -- Aspect of the Beast
- [5118] = List(), -- Aspect of the Cheetah
- [13163] = List(), -- Aspect of the Monkey
- [13159] = List(), -- Aspect of the Pack
- [20043] = List(), -- Aspect of the Wild (Rank 1)
- [20190] = List(), -- Aspect of the Wild (Rank 2)
- [27045] = List(), -- Aspect of the Wild (Rank 3)
- [3045] = List(), -- Rapid Fire
- [19263] = List(), -- Deterrence
- [13165] = List(), -- Aspect of the Hawk (Rank 1)
- [14318] = List(), -- Aspect of the Hawk (Rank 2)
- [14319] = List(), -- Aspect of the Hawk (Rank 3)
- [14320] = List(), -- Aspect of the Hawk (Rank 4)
- [14321] = List(), -- Aspect of the Hawk (Rank 5)
- [14322] = List(), -- Aspect of the Hawk (Rank 6)
- [25296] = List(), -- Aspect of the Hawk (Rank 7)
- [27044] = List(), -- Aspect of the Hawk (Rank 8)
- [19574] = List(), -- Bestial Wrath
- [34471] = List(), -- The Beast Within
- -- Mage
- [45438] = List(), -- Ice Block
- [12043] = List(), -- Presence of Mind
- [28682] = List(), -- Combustion
- [12042] = List(), -- Arcane Power
- [11426] = List(), -- Ice Barrier (Rank 1)
- [13031] = List(), -- Ice Barrier (Rank 2)
- [13032] = List(), -- Ice Barrier (Rank 3)
- [13033] = List(), -- Ice Barrier (Rank 4)
- [27134] = List(), -- Ice Barrier (Rank 5)
- [33405] = List(), -- Ice Barrier (Rank 6)
- [12472] = List(), -- Icy Veins
- [66] = List(), -- Invisibility
- -- Paladin
- [1044] = List(), -- Blessing of Freedom
- [465] = List(), -- Devotion Aura (Rank 1)
- [10290] = List(), -- Devotion Aura (Rank 2)
- [643] = List(), -- Devotion Aura (Rank 3)
- [10291] = List(), -- Devotion Aura (Rank 4)
- [1032] = List(), -- Devotion Aura (Rank 5)
- [10292] = List(), -- Devotion Aura (Rank 6)
- [10293] = List(), -- Devotion Aura (Rank 7)
- [27149] = List(), -- Devotion Aura (Rank 8)
- [19746] = List(), -- Concentration Aura
- [7294] = List(), -- Retribution Aura (Rank 1)
- [10298] = List(), -- Retribution Aura (Rank 2)
- [10299] = List(), -- Retribution Aura (Rank 3)
- [10300] = List(), -- Retribution Aura (Rank 4)
- [10301] = List(), -- Retribution Aura (Rank 5)
- [27150] = List(), -- Retribution Aura (Rank 6)
- [19876] = List(), -- Shadow Resistance Aura (Rank 1)
- [19895] = List(), -- Shadow Resistance Aura (Rank 2)
- [19896] = List(), -- Shadow Resistance Aura (Rank 3)
- [27151] = List(), -- Shadow Resistance Aura (Rank 4)
- [19888] = List(), -- Frost Resistance Aura (Rank 1)
- [19897] = List(), -- Frost Resistance Aura (Rank 2)
- [19898] = List(), -- Frost Resistance Aura (Rank 3)
- [27152] = List(), -- Frost Resistance Aura (Rank 4)
- [19891] = List(), -- Fire Resistance Aura (Rank 1)
- [19899] = List(), -- Fire Resistance Aura (Rank 2)
- [19900] = List(), -- Fire Resistance Aura (Rank 3)
- [27153] = List(), -- Fire Resistance Aura (Rank 4)
- [498] = List(), -- Divine Protection (Rank 1)
- [5573] = List(), -- Divine Protection (Rank 2)
- [642] = List(), -- Divine Shield (Rank 1)
- [1020] = List(), -- Divine Shield (Rank 2)
- [1022] = List(), -- Blessing of Protection (Rank 1)
- [5599] = List(), -- Blessing of Protection (Rank 2)
- [10278] = List(), -- Blessing of Protection (Rank 3)
- [6940] = List(), -- Blessing of Sacrifice (Rank 1)
- [20729] = List(), -- Blessing of Sacrifice (Rank 2)
- [27147] = List(), -- Blessing of Sacrifice (Rank 3)
- [27148] = List(), -- Blessing of Sacrifice (Rank 4)
- [20218] = List(), -- Sanctity Aura
- [31884] = List(), -- Avenging Wrath
- [20216] = List(), -- Divine Favor
- [31842] = List(), -- Divine Illumination
- -- Priest
- [15473] = List(), -- Shadowform
- [10060] = List(), -- Power Infusion
- [14751] = List(), -- Inner Focus
- [1706] = List(), -- Levitate
- [586] = List(), -- Fade (Rank 1)
- [9578] = List(), -- Fade (Rank 2)
- [9579] = List(), -- Fade (Rank 3)
- [9592] = List(), -- Fade (Rank 4)
- [10941] = List(), -- Fade (Rank 5)
- [10942] = List(), -- Fade (Rank 6)
- [25429] = List(), -- Fade (Rank 7)
- [32548] = List(), -- Symbol of Hope
- -- Rogue
- [14177] = List(), -- Cold Blood
- [13877] = List(), -- Blade Flurry
- [13750] = List(), -- Adrenaline Rush
- [2983] = List(), -- Sprint (Rank 1)
- [8696] = List(), -- Sprint (Rank 2)
- [11305] = List(), -- Sprint (Rank 3)
- [5171] = List(), -- Slice and Dice (Rank 1)
- [6774] = List(), -- Slice and Dice (Rank 2)
- [31224] = List(), -- Cloak of Shadows
- [5277] = List(), -- Evasion (Rank 1)
- [26669] = List(), -- Evasion (Rank 2)
- [1856] = List(), -- Vanish (Rank 1)
- [1857] = List(), -- Vanish (Rank 2)
- [26889] = List(), -- Vanish (Rank 3)
- -- Shaman
- [2645] = List(), -- Ghost Wolf
- [324] = List(), -- Lightning Shield (Rank 1)
- [325] = List(), -- Lightning Shield (Rank 2)
- [905] = List(), -- Lightning Shield (Rank 3)
- [945] = List(), -- Lightning Shield (Rank 4)
- [8134] = List(), -- Lightning Shield (Rank 5)
- [10431] = List(), -- Lightning Shield (Rank 6)
- [10432] = List(), -- Lightning Shield (Rank 7)
- [25469] = List(), -- Lightning Shield (Rank 8)
- [25472] = List(), -- Lightning Shield (Rank 9)
- [16188] = List(), -- Nature's Swiftness
- [16166] = List(), -- Elemental Mastery
- [24398] = List(), -- Water Shield (Rank 1)
- [33736] = List(), -- Water Shield (Rank 2)
- [974] = List(), -- Earth Shield (Rank 1)
- [32593] = List(), -- Earth Shield (Rank 2)
- [32594] = List(), -- Earth Shield (Rank 3)
- [49283] = List(), -- Earth Shield (Rank 4)
- [49284] = List(), -- Earth Shield (Rank 5)
- [30823] = List(), -- Shamanistic Rage
- [8178] = List(), -- Grounding Totem Effect
- [16191] = List(), -- Mana Tide
- -- Warlock
- [18789] = List(), -- Demonic Sacrifice (Burning Wish)
- [18790] = List(), -- Demonic Sacrifice (Fel Stamina)
- [18791] = List(), -- Demonic Sacrifice (Touch of Shadow)
- [18792] = List(), -- Demonic Sacrifice (Fel Energy)
- [35701] = List(), -- Demonic Sacrifice (Touch of Shadow)
- [5697] = List(), -- Unending Breath
- [6512] = List(), -- Detect Lesser Invisibility
- [25228] = List(), -- Soul Link
- [18708] = List(), -- Fel Domination
- -- Warrior
- [12975] = List(), -- Last Stand
- [871] = List(), -- Shield Wall
- [20230] = List(), -- Retaliation
- [1719] = List(), -- Recklessness
- [18499] = List(), -- Berserker Rage
- [2687] = List(), -- Bloodrage
- [12292] = List(), -- Death Wish
- [12328] = List(), -- Sweeping Strikes
- [2565] = List(), -- Shield Block
- [12880] = List(), -- Enrage (Rank 1)
- [14201] = List(), -- Enrage (Rank 2)
- [14202] = List(), -- Enrage (Rank 3)
- [14203] = List(), -- Enrage (Rank 4)
- [14204] = List(), -- Enrage (Rank 5)
- [23920] = List(), -- Spell Reflection
- -- Consumables
- [3169] = List(), -- Limited Invulnerability Potion
- [6615] = List(), -- Free Action Potion
- -- Racial
- [20554] = List(), -- Berserking (Mana)
- [26296] = List(), -- Berserking (Rage)
- [26297] = List(), -- Berserking (Energy)
- [7744] = List(), -- Will of the Forsaken
- [20572] = List(), -- Blood Fury (Physical)
- [33697] = List(), -- Blood Fury (Both)
- [33702] = List(), -- Blood Fury (Spell)
- [6346] = List(), -- Fear Ward
- [20594] = List(), -- Stoneform
- [28880] = List(), -- Gift of the Naaru
- -- All Classes
- [19753] = List(), -- Divine Intervention
- },
-}
-
--- Buffs that we don't really need to see
-G.unitframe.aurafilters.Blacklist = {
- type = 'Blacklist',
- spells = {
- -- General
- [186403] = List(), -- Sign of Battle
- },
-}
-
--- A list of important buffs that we always want to see
-G.unitframe.aurafilters.Whitelist = {
- type = 'Whitelist',
- spells = {
- -- Druid
- -- Hunter
- -- Mage
- -- Paladin
- -- Priest
- -- Rogue
- -- Shaman
- -- Warlock
- -- Warrior
- -- Racial
- },
-}
-
--- RAID DEBUFFS: This should be pretty self explainitory
-G.unitframe.aurafilters.RaidDebuffs = {
- type = 'Whitelist',
- spells = {
- -------------------------------------------------
- -------------------- Phase 1 --------------------
- -------------------------------------------------
- -- Karazhan
- -- Attument the Huntsman
- [29833] = List(2), -- Intangible Presence
- [29711] = List(2), -- Knockdown
- -- Moroes
- [29425] = List(2), -- Gouge
- [34694] = List(2), -- Blind
- [37066] = List(2), -- Garrote
- -- Opera Hall Event
- [30822] = List(2), -- Poisoned Thrust
- [30889] = List(2), -- Powerful Attraction
- [30890] = List(2), -- Blinding Passion
- -- Maiden of Virtue
- [29511] = List(2), -- Repentance
- [29522] = List(2), -- Holy Fire
- [29512] = List(2), -- Holy Ground
- -- The Curator
- -- Terestian Illhoof
- [30053] = List(2), -- Amplify Flames
- [30115] = List(2), -- Sacrifice
- -- Shade of Aran
- [29946] = List(2), -- Flame Wreath
- [29947] = List(2), -- Flame Wreath
- [29990] = List(2), -- Slow
- [29991] = List(2), -- Chains of Ice
- [29954] = List(2), -- Frostbolt
- [29951] = List(2), -- Blizzard
- -- Netherspite
- [38637] = List(2), -- Nether Exhaustion (Red)
- [38638] = List(2), -- Nether Exhaustion (Green)
- [38639] = List(2), -- Nether Exhaustion (Blue)
- [30400] = List(2), -- Nether Beam - Perseverence
- [30401] = List(2), -- Nether Beam - Serenity
- [30402] = List(2), -- Nether Beam - Dominance
- [30421] = List(2), -- Nether Portal - Perseverence
- [30422] = List(2), -- Nether Portal - Serenity
- [30423] = List(2), -- Nether Portal - Dominance
- -- Chess Event
- [30529] = List(2), -- Recently In Game
- -- Prince Malchezaar
- [39095] = List(2), -- Amplify Damage
- [30898] = List(2), -- Shadow Word: Pain 1
- [30854] = List(2), -- Shadow Word: Pain 2
- -- Nightbane
- [37091] = List(2), -- Rain of Bones
- [30210] = List(2), -- Smoldering Breath
- [30129] = List(2), -- Charred Earth
- [30127] = List(2), -- Searing Cinders
- [36922] = List(2), -- Bellowing Roar
- -- Gruul's Lair
- -- High King Maulgar
- [36032] = List(2), -- Arcane Blast
- [11726] = List(2), -- Enslave Demon
- [33129] = List(2), -- Dark Decay
- [33175] = List(2), -- Arcane Shock
- [33061] = List(2), -- Blast Wave
- [33130] = List(2), -- Death Coil
- [16508] = List(2), -- Intimidating Roar
- -- Gruul the Dragonkiller
- [38927] = List(2), -- Fel Ache
- [36240] = List(2), -- Cave In
- [33652] = List(2), -- Stoned
- [33525] = List(2), -- Ground Slam
- -- Magtheridon's Lair
- -- Magtheridon
- [44032] = List(2), -- Mind Exhaustion
- [30530] = List(2), -- Fear
- -------------------------------------------------
- -------------------- Phase 2 --------------------
- -------------------------------------------------
- -- Serpentshrine Cavern
- -- Trash
- [38634] = List(3), -- Arcane Lightning
- [39032] = List(4), -- Initial Infection
- [38572] = List(3), -- Mortal Cleave
- [38635] = List(3), -- Rain of Fire
- [39042] = List(5), -- Rampent Infection
- [39044] = List(4), -- Serpentshrine Parasite
- [38591] = List(4), -- Shatter Armor
- [38491] = List(3), -- Silence
- -- Hydross the Unstable
- [38246] = List(3), -- Vile Sludge
- [38235] = List(4), -- Water Tomb
- -- Leotheras the Blind
- [37675] = List(3), -- Chaos Blast
- [37749] = List(5), -- Consuming Madness
- [37676] = List(4), -- Insidious Whisper
- [37641] = List(3), -- Whirlwind
- -- Fathom-Lord Karathress
- [39261] = List(3), -- Gusting Winds
- [29436] = List(4), -- Leeching Throw
- -- Morogrim Tidewalker
- [38049] = List(4), -- Watery Grave
- [37850] = List(4), -- Watery Grave
- -- Lady Vashj
- [38280] = List(5), -- Static Charge
- [38316] = List(3), -- Entangle
- -- The Eye
- -- Trash
- [37133] = List(4), -- Arcane Buffet
- [37132] = List(3), -- Arcane Shock
- [37122] = List(5), -- Domination
- [37135] = List(5), -- Domination
- [37120] = List(4), -- Fragmentation Bomb
- [13005] = List(3), -- Hammer of Justice
- [39077] = List(3), -- Hammer of Justice
- [37279] = List(3), -- Rain of Fire
- [37123] = List(4), -- Saw Blade
- [37118] = List(5), -- Shell Shock
- [37160] = List(3), -- Silence
- -- Al'ar
- [35410] = List(4), -- Melt Armor
- -- High Astromancer Solarian
- [34322] = List(4), -- Psychic Scream
- [42783] = List(5), -- Wrath of the Astromancer (Patch 2.2.0)
- -- Kael'thas Sunstrider
- [36965] = List(4), -- Rend
- [30225] = List(4), -- Silence
- [44863] = List(5), -- Bellowing Roar
- [37018] = List(4), -- Conflagration
- [37027] = List(5), -- Remote Toy
- [36991] = List(4), -- Rend
- [36797] = List(5), -- Mind Control
- -------------------------------------------------
- -------------------- Phase 3 --------------------
- -------------------------------------------------
- -- The Battle for Mount Hyjal
- -- Rage Winterchill
- [31249] = List(6), -- Icebolt
- [31250] = List(5), -- Frost Nova
- -- Anetheron
- [31302] = List(4), -- Inferno
- [31298] = List(5), -- Sleep
- [31306] = List(6), -- Carrion Swarm
- -- Kaz'rogal
- [31447] = List(3), -- Mark of Kaz'rogal
- -- Azgalor
- [31341] = List(5), -- Unquenchable Flames
- [31340] = List(4), -- Rain of Fire
- [31347] = List(6), -- Doom
- -- Archimonde
- [31972] = List(6), -- Grip of the Legion
- [31970] = List(3), -- Fear
- [31944] = List(5), -- Doomfire
- -- Trash
- [31610] = List(3), -- Knockdown
- [28991] = List(2), -- Web
- -- Black Temple
- -- High Warlord Naj'entus
- [39837] = List(2), -- Impaling Spine
- -- Supremus
- [40253] = List(2), -- Molten Flame
- -- Shade of Akama
- [42023] = List(2), -- Rain of Fire
- -- Teron Gorefiend
- [40243] = List(5), -- Crushing Shadows
- [40239] = List(6), -- Incinerate
- [40251] = List(4), -- Shadow of Death
- -- Gurtogg Bloodboil
- [40481] = List(6), -- Acidic Wound
- [40599] = List(5), -- Arcing Smash
- [40491] = List(6), -- Bewildering Strike
- [42005] = List(4), -- Bloodboil
- [40508] = List(5), -- Fel Acid Breath
- [40604] = List(6), -- Fel Rage
- -- Reliquary of Souls
- [41303] = List(3), -- Soul Drain
- [41410] = List(3), -- Deaden
- [41426] = List(2), -- Spirit Shack
- [41294] = List(2), -- Fixate
- [41376] = List(3), -- Spite
- -- Mother Shahraz
- [41001] = List(6), -- Fatal Attraction
- [40860] = List(5), -- Vile Beam
- [40823] = List(4), -- Interrupting Shriek
- -- Illidari Council
- [41541] = List(2), -- Consecration
- [41468] = List(3), -- Hammer of Justice
- [41461] = List(6), -- Judgement of Blood
- [41485] = List(6), -- Deadly Poison
- [41472] = List(6), -- Divine Wrath
- [41482] = List(2), -- Blizzard
- [41481] = List(3), -- Flamestrike
- -- Illidan Stormrage
- [40932] = List(6), -- Agonizing Flame
- [41032] = List(6), -- Shear
- [40585] = List(5), -- Dark Barrage
- [41914] = List(4), -- Parasitic Shadowfiend
- [41142] = List(2), -- Aura of Dread
- -- Trash
- [41213] = List(3), -- Throw Shield
- [40864] = List(3), -- Throbbing Stun
- [41197] = List(3), -- Shield Bash
- [41171] = List(3), -- Skeleton Shot
- [41338] = List(3), -- Love Tap
- [13444] = List(2), -- Sunder Armor
- [41396] = List(2), -- Sleep
- [41334] = List(2), -- Polymorph
- [24698] = List(2), -- Gauge
- [41150] = List(2), -- Fear
- [34654] = List(2), -- Blind
- [39674] = List(2), -- Banish
- -------------------------------------------------
- -------------------- Phase 4 --------------------
- -------------------------------------------------
- -- Zul'Aman
- -- Nalorakk
- [42398] = List(2), -- Mangle
- -- Jan'alai
- [43299] = List(2), -- Flame Buffet
- -- Akil'zon
- [43657] = List(3), -- Electrical Storm
- [43622] = List(2), -- Static Disruption
- -- Halazzi
- [43303] = List(2), -- Flame Shock
- -- Hexxlord Jin'Zakk
- [43613] = List(3), -- Cold Stare
- [43501] = List(2), -- Siphon Soul
- -- Zul'jin
- [43150] = List(3), -- Rage
- [43095] = List(2), -- Paralyze
- [43093] = List(3), -- Throw
- -------------------------------------------------
- -------------------- Phase 5 --------------------
- -------------------------------------------------
- -- Sunwell Plateau
- -- Kalecgos
- [45018] = List(2), -- Arcane Buffet
- [45032] = List(2), -- Boundless Agony
- -- Brutallus
- [46394] = List(5), -- Burn
- [45150] = List(3), -- Meteor Slash
- [45185] = List(6), -- Stomp
- -- Felmyst
- [45855] = List(3), -- Gas Nova
- [45662] = List(6), -- Encapsulate
- [45402] = List(2), -- Demonic Vapor
- [45717] = List(5), -- Fog of Corruption
- -- Eredar Twins
- [45256] = List(3), -- Confounding Blow
- [45270] = List(2), -- Shadowfury
- [45333] = List(4), -- Conflagration
- [45347] = List(2), -- Dark Touched
- [45348] = List(2), -- Fire Touched
- [46771] = List(3), -- Flame Sear
- -- M'uru
- [45996] = List(6), -- Darkness
- -- Kil'Jaeden
- [45442] = List(2), -- Soul Flay
- [45641] = List(6), -- Fire Bloom
- [45737] = List(2), -- Flame Dart
- [45885] = List(2), -- Shadow Spike
- },
-}
-
---[[
- RAID BUFFS:
- Buffs that are provided by NPCs in raid or other PvE content.
- This can be buffs put on other enemies or on players.
-]]
-G.unitframe.aurafilters.RaidBuffsElvUI = {
- type = 'Whitelist',
- spells = {
- -------------------------------------------------
- -------------------- Phase 1 --------------------
- -------------------------------------------------
- -- Karazhan
- -- Attument the Huntsman
- -- Moroes
- [29448] = List(), -- Vanish
- [37023] = List(), -- Enrage
- -- Opera Hall Event
- [30887] = List(), -- Devotion
- [30841] = List(), -- Daring
- -- Maiden of Virtue
- [32429] = List(), -- Draining Touch
- -- The Curator
- -- Terestian Illhoof
- [29908] = List(), -- Astral Bite
- -- Shade of Aran
- [29920] = List(), -- Phasing Invisibility
- [29921] = List(), -- Phasing Invisibility
- -- Netherspite
- [30522] = List(), -- Nether Burn
- [30487] = List(), -- Nether Portal - Perseverence
- [30491] = List(), -- Nether Portal - Domination
- -- Chess Event
- [37469] = List(), -- Poison Cloud
- -- Prince Malchezaar
- [30859] = List(), -- Hellfire
- -- Nightbane
- [37098] = List(), -- Rain of Bones
- -- Gruul's Lair
- -- High King Maulgar
- [33232] = List(), -- Flurry
- [33238] = List(), -- Whirlwind
- [33054] = List(), -- Spell Shield
- -- Gruul the Dragonkiller
- [36300] = List(), -- Growth
- -- Magtheridon's Lair
- -- Magtheridon
- [30205] = List(), -- Shadow Cage
- [30576] = List(), -- Quake
- [30207] = List(), -- Shadow Grasp
- -------------------------------------------------
- -------------------- Phase 2 --------------------
- -------------------------------------------------
- -- Serpentshrine Cavern
- -- Hydross the Unstable
- [37935] = List(), -- Cleansing Field
- -- The Lurker Below
- -- Leotheras the Blind
- [37640] = List(), -- Whirlwind
- -- Fathom-Lord Karathress
- [38451] = List(), -- Power of Caribdis
- [38452] = List(), -- Power of Tidalvess
- [38455] = List(), -- Power of Sharkkis
- [38516] = List(), -- Cyclone
- [38373] = List(), -- The Beast Within
- -- Morogrim Tidewalker
- -- Lady Vashj
- [38112] = List(), -- Magic Barrier
- -- The Eye
- -- Al'ar
- [35412] = List(), -- Charge
- -- Void Reaver
- [34162] = List(), -- Pounding
- -- High Astromancer Solarian
- -- Kael'thas Sunstrider
- [36981] = List(), -- Whirlwind
- [36815] = List(), -- Shock Barrier
- -------------------------------------------------
- -------------------- Phase 3 --------------------
- -------------------------------------------------
- -- The Battle for Mount Hyjal
- -- Rage Winterchill
- [31256] = List(), -- Frost Armor
- -- Anetheron
- -- Kaz'rogal
- -- Azgalor
- -- Archimonde
- [31540] = List(), -- Frenzy
- -- Black Temple
- -- High Warlord Naj'entus
- [40076] = List(), -- Electric Spur
- -- Supremus
- [42055] = List(), -- Volcanic Geyser
- -- Shade of Akama
- [34970] = List(), -- Enrage
- -- Teron Gorefiend
- [41254] = List(), -- Frenzy
- -- Gurtogg Bloodboil
- [40594] = List(), -- Fel Rage
- [40601] = List(), -- Fury
- -- Reliquary of Souls
- [41305] = List(), -- Enrage
- [41431] = List(), -- Rune Shield
- -- Mother Shahraz
- -- Illidari Council
- [41450] = List(), -- Blessing of Protection
- [41451] = List(), -- Blessing of Spell Warding
- [41452] = List(), -- Devotion Aura
- [41453] = List(), -- Chromatic Resistance Aura
- [41475] = List(3), -- Reflective Shield
- -- Illidan Stormrage
- [40836] = List(), -- Flame Crash
- [40610] = List(), -- Blaze
- [40683] = List(), -- Enrage
- -------------------------------------------------
- -------------------- Phase 4 --------------------
- -------------------------------------------------
- -- Zul'Aman
- -- Nalorakk
- -- Jan'alai
- [44779] = List(), -- Enrage
- -- Akil'zon
- -- Halazzi
- [43290] = List(), -- Lynx Flurry
- -- Hexlord Jin'Zakk
- [43578] = List(), -- Bloodlust
- [43430] = List(), -- Avenging Wrath
- -- Zul'jin
- [17207] = List(), -- Whirlwind
- [43213] = List(), -- Flame Whirl
- [43120] = List(), -- Cyclone
- -------------------------------------------------
- -------------------- Phase 5 --------------------
- -------------------------------------------------
- -- Sunwell Plateau
- -- Kalecgos
- [44806] = List(), -- Crazed Rage
- -- Brutallus
- -- Felmyst
- -- Eredar Twins
- [45366] = List(), -- Empower
- [45230] = List(), -- Pyrogenics
- -- M'uru
- [45934] = List(), -- Dark Fiend
- [46160] = List(), -- Flurry
- [45996] = List(), -- Darkness
- [46102] = List(), -- Spell Fury
- -- Kil'Jaeden
- [46680] = List(), -- Shadow Spike
- [46474] = List(), -- Sacrifice of Aveena
- [46605] = List(), -- Darkness of a Thousand Souls
- },
-}
-
-G.unitframe.aurawatch = {
- GLOBAL = {},
- DRUID = {
- [1126] = Aura(1126, {5232,6756,5234,8907,9884,9885,26990}, 'TOPLEFT', {0.2, 0.8, 0.8}, true), -- Mark of the Wild
- [21849] = Aura(21849, {21850,26991}, 'TOPLEFT', {0.2, 0.8, 0.8}, true), -- Gift of the Wild
- [467] = Aura(467, {782,1075,8914,9756,9910,26992}, 'TOPRIGHT', {0.4, 0.2, 0.8}, true), -- Thorns
- [774] = Aura(774, {1058,1430,2090,2091,3627,8910,9839,9840,9841,25299,26981,26982}, 'BOTTOMLEFT', {0.83, 1.00, 0.25}), -- Rejuvenation
- [8936] = Aura(8936, {8938,8939,8940,8941,9750,9856,9857,9858,26980}, 'BOTTOMRIGHT', {0.33, 0.73, 0.75}), -- Regrowth
- [29166] = Aura(29166, nil, 'CENTER', {0.49, 0.60, 0.55}, true), -- Innervate
- [33763] = Aura(33763, nil, 'BOTTOM', {0.33, 0.37, 0.47}), -- Lifebloom
- },
- HUNTER = {
- [19506] = Aura(19506, {20905,20906,27066}, 'TOPLEFT', {0.89, 0.09, 0.05}), -- Trueshot Aura
- [13159] = Aura(13159, nil, 'TOP', {0.00, 0.00, 0.85}, true), -- Aspect of the Pack
- [20043] = Aura(20043, {20190,27045}, 'TOP', {0.33, 0.93, 0.79}), -- Aspect of the Wild
- },
- MAGE = {
- [1459] = Aura(1459, {1460,1461,10156,10157,27126}, 'TOPLEFT', {0.89, 0.09, 0.05}, true), -- Arcane Intellect
- [23028] = Aura(23028, {27127}, 'TOPLEFT', {0.89, 0.09, 0.05}, true), -- Arcane Brilliance
- [604] = Aura(604, {8450,8451,10173,10174,33944}, 'TOPRIGHT', {0.2, 0.8, 0.2}, true), -- Dampen Magic
- [1008] = Aura(1008, {8455,10169,10170,27130,33946}, 'TOPRIGHT', {0.2, 0.8, 0.2}, true), -- Amplify Magic
- [130] = Aura(130, nil, 'CENTER', {0.00, 0.00, 0.50}, true), -- Slow Fall
- },
- PALADIN = {
- [1044] = Aura(1044, nil, 'CENTER', {0.89, 0.45, 0}), -- Blessing of Freedom
- [1038] = Aura(1038, nil, 'TOPLEFT', {0.11, 1.00, 0.45}, true), -- Blessing of Salvation
- [6940] = Aura(6940, {20729,27147,27148}, 'CENTER', {0.89, 0.1, 0.1}), -- Blessing of Sacrifice
- [19740] = Aura(19740, {19834,19835,19836,19837,19838,25291,27140}, 'TOPLEFT', {0.2, 0.8, 0.2}, true), -- Blessing of Might
- [19742] = Aura(19742, {19850,19852,19853,19854,25290,27142}, 'TOPLEFT', {0.2, 0.8, 0.2}, true), -- Blessing of Wisdom
- [25782] = Aura(25782, {25916,27141}, 'TOPLEFT', {0.2, 0.8, 0.2}, true), -- Greater Blessing of Might
- [25894] = Aura(25894, {25918,27143}, 'TOPLEFT', {0.2, 0.8, 0.2}, true), -- Greater Blessing of Wisdom
- [465] = Aura(465, {10290,643,10291,1032,10292,10293,27149}, 'BOTTOMLEFT', {0.58, 1.00, 0.50}), -- Devotion Aura
- [19977] = Aura(19977, {19978,19979,27144}, 'BOTTOMRIGHT', {0.17, 1.00, 0.75}, true), -- Blessing of Light
- [1022] = Aura(1022, {5599,10278}, 'TOPRIGHT', {0.17, 1.00, 0.75}, true), -- Blessing of Protection
- [19746] = Aura(19746, nil, 'BOTTOMLEFT', {0.83, 1.00, 0.07}), -- Concentration Aura
- [32223] = Aura(32223, nil, 'BOTTOMLEFT', {0.83, 1.00, 0.07}), -- Crusader Aura
- },
- PRIEST = {
- [1243] = Aura(1243, {1244,1245,2791,10937,10938,25389}, 'TOPLEFT', {1, 1, 0.66}, true), -- Power Word: Fortitude
- [21562] = Aura(21562, {21564,25392}, 'TOPLEFT', {1, 1, 0.66}, true), -- Prayer of Fortitude
- [14752] = Aura(14752, {14818,14819,27841,25312}, 'TOPRIGHT', {0.2, 0.7, 0.2}, true), -- Divine Spirit
- [27681] = Aura(27681, {32999}, 'TOPRIGHT', {0.2, 0.7, 0.2}, true), -- Prayer of Spirit
- [976] = Aura(976, {10957,10958,25433}, 'BOTTOMLEFT', {0.7, 0.7, 0.7}, true), -- Shadow Protection
- [27683] = Aura(27683, {39374}, 'BOTTOMLEFT', {0.7, 0.7, 0.7}, true), -- Prayer of Shadow Protection
- [17] = Aura(17, {592,600,3747,6065,6066,10898,10899,10900,10901,25217,25218}, 'BOTTOM', {0.00, 0.00, 1.00}), -- Power Word: Shield
- [139] = Aura(139, {6074,6075,6076,6077,6078,10927,10928,10929,25315,25221,25222}, 'BOTTOMRIGHT', {0.33, 0.73, 0.75}), -- Renew
- },
- SHAMAN = {
- [29203] = Aura(29203, nil, 'TOPRIGHT', {0.7, 0.3, 0.7}), -- Healing Way
- [16237] = Aura(16237, nil, 'RIGHT', {0.2, 0.2, 1}), -- Ancestral Fortitude
- [8185] = Aura(8185, {10534,10535,25563}, 'TOPLEFT', {0.05, 1.00, 0.50}), -- Fire Resistance Totem
- [8182] = Aura(8182, {10476,10477,25560}, 'TOPLEFT', {0.54, 0.53, 0.79}), -- Frost Resistance Totem
- [10596] = Aura(10596, {10598,10599,25574}, 'TOPLEFT', {0.33, 1.00, 0.20}), -- Nature Resistance Totem
- [5672] = Aura(5672, {6371,6372,10460,10461,25567}, 'BOTTOM', {0.67, 1.00, 0.50}), -- Healing Stream Totem
- [16191] = Aura(16191, nil, 'BOTTOMLEFT', {0.67, 1.00, 0.80}), -- Mana Tide Totem
- [5677] = Aura(5677, {10491,10493,10494,25569}, 'LEFT', {0.67, 1.00, 0.80}), -- Mana Spring Totem
- [8072] = Aura(8072, {8156,8157,10403,10404,10405,25506,25507}, 'BOTTOMRIGHT', {0.00, 0.00, 0.26}), -- Stoneskin Totem
- [974] = Aura(974, {32593,32594}, 'TOP', {0.08, 0.21, 0.43}, true), -- Earth Shield
- },
- WARLOCK = {
- [5697] = Aura(5697, nil, 'TOPLEFT', {0.89, 0.09, 0.05}, true), -- Unending Breath
- [6512] = Aura(6512, nil, 'TOPRIGHT', {0.2, 0.8, 0.2}, true), -- Detect Lesser Invisibility
- },
- WARRIOR = {
- [6673] = Aura(6673, {5242,6192,11549,11550,11551,25289,2048}, 'TOPLEFT', {0.2, 0.2, 1}, true), -- Battle Shout
- [469] = Aura(469, nil, 'TOPRIGHT', {0.4, 0.2, 0.8}, true), -- Commanding Shout
- },
- PET = {
- -- Warlock Imp
- [6307] = Aura(6307, {7804,7805,11766,11767,27268}, 'BOTTOMLEFT', {0.89, 0.09, 0.05}), -- Blood Pact
- -- Warlock Felhunter
- [19480] = Aura(19480, nil, 'BOTTOMLEFT', {0.2, 0.8, 0.2}), -- Paranoia
- -- Hunter Pets
- [24604] = Aura(24604, {24605,24603,24597}, 'TOPRIGHT', {0.08, 0.59, 0.41}), -- Furious Howl
- },
-}
-
--- List of spells to display ticks
-G.unitframe.ChannelTicks = {
- --Druid
- [740] = 4, -- Tranquility (Rank 1)
- [8918] = 4, -- Tranquility (Rank 2)
- [9862] = 4, -- Tranquility (Rank 3)
- [9863] = 4, -- Tranquility (Rank 4)
- [26983] = 4, -- Tranquility (Rank 5)
- [16914] = 10, -- Hurricane (Rank 1)
- [17401] = 10, -- Hurricane (Rank 2)
- [17402] = 10, -- Hurricane (Rank 3)
- [27012] = 10, -- Hurricane (Rank 4)
- --Hunter
- [1510] = 6, -- Volley (Rank 1)
- [14294] = 6, -- Volley (Rank 2)
- [14295] = 6, -- Volley (Rank 3)
- [27022] = 6, -- Volley (Rank 4)
- -- Mage
- [10] = 8, -- Blizzard (Rank 1)
- [6141] = 8, -- Blizzard (Rank 2)
- [8427] = 8, -- Blizzard (Rank 3)
- [10185] = 8, -- Blizzard (Rank 4)
- [10186] = 8, -- Blizzard (Rank 5)
- [10187] = 8, -- Blizzard (Rank 6)
- [27085] = 8, -- Blizzard (Rank 7)
- [5143] = 3, -- Arcane Missiles (Rank 1)
- [5144] = 4, -- Arcane Missiles (Rank 2)
- [5145] = 5, -- Arcane Missiles (Rank 3)
- [8416] = 5, -- Arcane Missiles (Rank 4)
- [8417] = 5, -- Arcane Missiles (Rank 5)
- [10211] = 5, -- Arcane Missiles (Rank 6)
- [10212] = 5, -- Arcane Missiles (Rank 7)
- [25345] = 5, -- Arcane Missiles (Rank 8)
- [27075] = 5, -- Arcane Missiles (Rank 9)
- [38699] = 5, -- Arcane Missiles (Rank 10)
- [38704] = 5, -- Arcane Missiles (Rank 11)
- [12051] = 4, -- Evocation
- -- Priest
- [15407] = 3, -- Mind Flay (Rank 1)
- [17311] = 3, -- Mind Flay (Rank 2)
- [17312] = 3, -- Mind Flay (Rank 3)
- [17313] = 3, -- Mind Flay (Rank 4)
- [17314] = 3, -- Mind Flay (Rank 5)
- [18807] = 3, -- Mind Flay (Rank 6)
- [25387] = 3, -- Mind Flay (Rank 7)
- -- Warlock
- [1120] = 5, -- Drain Soul (Rank 1)
- [8288] = 5, -- Drain Soul (Rank 2)
- [8289] = 5, -- Drain Soul (Rank 3)
- [11675] = 5, -- Drain Soul (Rank 4)
- [27217] = 5, -- Drain Soul (Rank 5)
- [755] = 10, -- Health Funnel (Rank 1)
- [3698] = 10, -- Health Funnel (Rank 2)
- [3699] = 10, -- Health Funnel (Rank 3)
- [3700] = 10, -- Health Funnel (Rank 4)
- [11693] = 10, -- Health Funnel (Rank 5)
- [11694] = 10, -- Health Funnel (Rank 6)
- [11695] = 10, -- Health Funnel (Rank 7)
- [27259] = 10, -- Health Funnel (Rank 8)
- [689] = 5, -- Drain Life (Rank 1)
- [699] = 5, -- Drain Life (Rank 2)
- [709] = 5, -- Drain Life (Rank 3)
- [7651] = 5, -- Drain Life (Rank 4)
- [11699] = 5, -- Drain Life (Rank 5)
- [11700] = 5, -- Drain Life (Rank 6)
- [27219] = 5, -- Drain Life (Rank 7)
- [27220] = 5, -- Drain Life (Rank 8)
- [5740] = 4, -- Rain of Fire (Rank 1)
- [6219] = 4, -- Rain of Fire (Rank 2)
- [11677] = 4, -- Rain of Fire (Rank 3)
- [11678] = 4, -- Rain of Fire (Rank 4)
- [27212] = 4, -- Rain of Fire (Rank 5)
- [1949] = 15, -- Hellfire (Rank 1)
- [11683] = 15, -- Hellfire (Rank 2)
- [11684] = 15, -- Hellfire (Rank 3)
- [27213] = 15, -- Hellfire (Rank 4)
- [5138] = 5, -- Drain Mana (Rank 1)
- [6226] = 5, -- Drain Mana (Rank 2)
- [11703] = 5, -- Drain Mana (Rank 3)
- [11704] = 5, -- Drain Mana (Rank 4)
- [27221] = 5, -- Drain Mana (Rank 5)
- [30908] = 5, -- Drain Mana (Rank 6)
- -- First Aid
- [27031] = 8, -- Heavy Netherweave Bandage
- [27030] = 8, -- Netherweave Bandage
- [23567] = 8, -- Warsong Gulch Runecloth Bandage
- [23696] = 8, -- Alterac Heavy Runecloth Bandage
- [24414] = 8, -- Arathi Basin Runecloth Bandage
- [18610] = 8, -- Heavy Runecloth Bandage
- [18608] = 8, -- Runecloth Bandage
- [10839] = 8, -- Heavy Mageweave Bandage
- [10838] = 8, -- Mageweave Bandage
- [7927] = 8, -- Heavy Silk Bandage
- [7926] = 8, -- Silk Bandage
- [3268] = 7, -- Heavy Wool Bandage
- [3267] = 7, -- Wool Bandage
- [1159] = 6, -- Heavy Linen Bandage
- [746] = 6, -- Linen Bandage
-}
-
--- Spells Effected By Talents
-G.unitframe.TalentChannelTicks = {}
-
-G.unitframe.ChannelTicksSize = {}
-
--- Spells Effected By Haste
-G.unitframe.HastedChannelTicks = {}
-
--- This should probably be the same as the whitelist filter + any personal class ones that may be important to watch
-G.unitframe.AuraBarColors = {
- [2825] = { enable = true, color = {r = 0.98, g = 0.57, b = 0.10 }}, -- Bloodlust
- [32182] = { enable = true, color = {r = 0.98, g = 0.57, b = 0.10 }}, -- Heroism
-}
-
-G.unitframe.AuraHighlightColors = {
- [25771] = {enable = false, style = 'FILL', color = {r = 0.85, g = 0, b = 0, a = 0.85}},
-}
diff --git a/Interface/AddOns/ElvUI/TBC/Filters/Load_Filters.xml b/Interface/AddOns/ElvUI/TBC/Filters/Load_Filters.xml
deleted file mode 100644
index 9827d4628..000000000
--- a/Interface/AddOns/ElvUI/TBC/Filters/Load_Filters.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Libs.xml b/Interface/AddOns/ElvUI/TBC/Libs.xml
deleted file mode 100644
index e79807990..000000000
--- a/Interface/AddOns/ElvUI/TBC/Libs.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Load.xml b/Interface/AddOns/ElvUI/TBC/Load.xml
deleted file mode 100644
index 6c8258529..000000000
--- a/Interface/AddOns/ElvUI/TBC/Load.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Blizzard/Load_Blizzard.xml b/Interface/AddOns/ElvUI/TBC/Modules/Blizzard/Load_Blizzard.xml
deleted file mode 100644
index 8311e5a6b..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Blizzard/Load_Blizzard.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/DataBars/Load_DataBars.xml b/Interface/AddOns/ElvUI/TBC/Modules/DataBars/Load_DataBars.xml
deleted file mode 100644
index 651c3abd8..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/DataBars/Load_DataBars.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/DataTexts/Load_DataTexts.xml b/Interface/AddOns/ElvUI/TBC/Modules/DataTexts/Load_DataTexts.xml
deleted file mode 100644
index d347c2f48..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/DataTexts/Load_DataTexts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Load_Modules.xml b/Interface/AddOns/ElvUI/TBC/Modules/Load_Modules.xml
deleted file mode 100644
index 91976b3c6..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Load_Modules.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Misc/Load_Misc.xml b/Interface/AddOns/ElvUI/TBC/Modules/Misc/Load_Misc.xml
deleted file mode 100644
index c60b26cef..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Misc/Load_Misc.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/AddonManager.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/AddonManager.lua
deleted file mode 100644
index 167541b4f..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/AddonManager.lua
+++ /dev/null
@@ -1,102 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local gsub = gsub
-local GetNumAddOns = GetNumAddOns
-local GetAddOnInfo = GetAddOnInfo
-local GetAddOnEnableState = GetAddOnEnableState
-local UIDropDownMenu_GetSelectedValue = UIDropDownMenu_GetSelectedValue
-local hooksecurefunc = hooksecurefunc
-
-function S:AddonList()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.addonManager) then return end
-
- local AddonList = _G.AddonList
- local maxShown = _G.MAX_ADDONS_DISPLAYED
- local AddonCharacterDropDown = _G.AddonCharacterDropDown
-
- S:HandleFrame(AddonList, true)
- S:HandleButton(AddonList.EnableAllButton, true)
- S:HandleButton(AddonList.DisableAllButton, true)
- S:HandleButton(AddonList.OkayButton, true)
- S:HandleButton(AddonList.CancelButton, true)
- S:HandleDropDownBox(AddonCharacterDropDown, 165)
- S:HandleScrollBar(_G.AddonListScrollFrameScrollBar)
- S:HandleCheckBox(_G.AddonListForceLoad)
-
- _G.AddonListForceLoad:Size(26, 26)
-
- S:HandleFrame(_G.AddonListScrollFrame, true, nil, -14, 0, 0, -1)
-
- for i = 1, maxShown do
- S:HandleCheckBox(_G['AddonListEntry'..i..'Enabled'], nil, nil, true)
- S:HandleButton(_G['AddonListEntry'..i].LoadAddonButton)
- end
-
- local font = E.Libs.LSM:Fetch('font', 'Expressway')
- hooksecurefunc('AddonList_Update', function()
- local numEntrys = GetNumAddOns()
- for i = 1, maxShown do
- local index = AddonList.offset + i
- if index <= numEntrys then
- local entry = _G['AddonListEntry'..i]
- local string = _G['AddonListEntry'..i..'Title']
- local checkbox = _G['AddonListEntry'..i..'Enabled']
- local name, title, _, loadable, reason = GetAddOnInfo(index)
-
- -- Get the character from the current list (nil is all characters)
- local checkall
- local character = UIDropDownMenu_GetSelectedValue(AddonCharacterDropDown)
- if character == true then
- character = nil
- else
- checkall = GetAddOnEnableState(nil, index)
- end
-
- local checkstate = GetAddOnEnableState(character, index)
- local enabled = checkstate > 0
-
- string:FontTemplate(font, 13, 'NONE')
- entry.Status:FontTemplate(font, 11, 'NONE')
- entry.Reload:FontTemplate(font, 11, 'NONE')
- entry.Reload:SetTextColor(1.0, 0.3, 0.3)
- entry.LoadAddonButton.Text:FontTemplate(font, 11, 'NONE')
-
- local enabledForSome = not character and checkstate == 1
- local disabled = not enabled or enabledForSome
-
- if disabled then
- entry.Status:SetTextColor(0.4, 0.4, 0.4)
- else
- entry.Status:SetTextColor(0.7, 0.7, 0.7)
- end
-
- if disabled or reason == 'DEP_DISABLED' then
- string:SetText(gsub(title or name, '|c%x%x%x%x%x%x%x%x(.-)|?r?','%1'))
- end
-
- if enabledForSome then
- string:SetTextColor(0.5, 0.5, 0.5)
- elseif enabled and (loadable or reason == 'DEP_DEMAND_LOADED' or reason == 'DEMAND_LOADED') then
- string:SetTextColor(0.9, 0.9, 0.9)
- elseif enabled and reason ~= 'DEP_DISABLED' then
- string:SetTextColor(1.0, 0.2, 0.2)
- else
- string:SetTextColor(0.3, 0.3, 0.3)
- end
-
- local checktex = checkbox:GetCheckedTexture()
- if not enabled and checkall == 1 then
- checktex:SetVertexColor(0.3, 0.3, 0.3)
- checktex:SetDesaturated(false)
- checktex:Show()
- elseif checkstate == 0 then
- checktex:Hide()
- end
- end
- end
- end)
-end
-
-S:AddCallback('AddonList')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Arena.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Arena.lua
deleted file mode 100644
index 29614c8a9..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Arena.lua
+++ /dev/null
@@ -1,27 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:SkinArena()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.arena) then return end
-
- local ArenaFrame = _G.ArenaFrame
- ArenaFrame:StripTextures(true)
- ArenaFrame:CreateBackdrop('Transparent')
- ArenaFrame.backdrop:Point('TOPLEFT', 10, -12)
- ArenaFrame.backdrop:Point('BOTTOMRIGHT', -32, 73)
-
- S:HandleButton(_G.ArenaFrameCancelButton)
- S:HandleButton(_G.ArenaFrameJoinButton)
- S:HandleButton(_G.ArenaFrameGroupJoinButton)
-
- _G.ArenaFrameZoneDescription:SetTextColor(1, 1, 1)
-
- _G.ArenaFrameNameHeader:Point('TOPLEFT', _G.ArenaZone1, 'TOPLEFT', 8, 24)
- _G.ArenaFrameGroupJoinButton:Point('RIGHT', _G.ArenaFrameJoinButton, 'LEFT', -2, 0)
-
- S:HandleCloseButton(_G.ArenaFrameCloseButton)
-end
-
-S:AddCallback('SkinArena')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/ArenaRegistrar.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/ArenaRegistrar.lua
deleted file mode 100644
index d036d9b08..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/ArenaRegistrar.lua
+++ /dev/null
@@ -1,85 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local select = select
-
-local MAX_TEAM_BORDERS = MAX_TEAM_BORDERS
-
-function S:SkinArenaRegistrar()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.arenaRegistrar) then return end
-
- local ArenaRegistrarFrame = _G.ArenaRegistrarFrame
- ArenaRegistrarFrame:CreateBackdrop('Transparent')
- ArenaRegistrarFrame.backdrop:Point('TOPLEFT', 14, -18)
- ArenaRegistrarFrame.backdrop:Point('BOTTOMRIGHT', -30, 67)
-
- ArenaRegistrarFrame:StripTextures(true)
-
- local ArenaRegistrarFrameCloseButton = _G.ArenaRegistrarFrameCloseButton
- S:HandleCloseButton(ArenaRegistrarFrameCloseButton)
-
- local ArenaRegistrarGreetingFrame = _G.ArenaRegistrarGreetingFrame
- ArenaRegistrarGreetingFrame:StripTextures()
-
- select(1, ArenaRegistrarGreetingFrame:GetRegions()):SetTextColor(1, 0.80, 0.10)
- _G.RegistrationText:SetTextColor(1, 0.80, 0.10)
-
- local ArenaRegistrarFrameGoodbyeButton = _G.ArenaRegistrarFrameGoodbyeButton
- S:HandleButton(ArenaRegistrarFrameGoodbyeButton)
-
- for i = 1, MAX_TEAM_BORDERS do
- local button = _G['ArenaRegistrarButton'..i]
- local obj = select(3, button:GetRegions())
-
- S:HandleButtonHighlight(button)
-
- obj:SetTextColor(1, 1, 1)
- end
-
- _G.ArenaRegistrarPurchaseText:SetTextColor(1, 1, 1)
-
- S:HandleButton(_G.ArenaRegistrarFrameCancelButton)
- S:HandleButton(_G.ArenaRegistrarFramePurchaseButton)
-
- S:HandleEditBox(_G.ArenaRegistrarFrameEditBox)
- _G.ArenaRegistrarFrameEditBox:Height(18)
-
- local PVPBannerFrame = _G.PVPBannerFrame
- PVPBannerFrame:CreateBackdrop('Transparent')
- PVPBannerFrame.backdrop:Point('TOPLEFT', 10, -12)
- PVPBannerFrame.backdrop:Point('BOTTOMRIGHT', -33, 73)
-
- PVPBannerFrame:StripTextures()
-
- _G.PVPBannerFramePortrait:Kill()
- _G.PVPBannerFrameCustomizationFrame:StripTextures()
-
- for i = 1, 2 do
- local customization = _G['PVPBannerFrameCustomization'..i]
- local customizationLeft = _G['PVPBannerFrameCustomization'..i..'LeftButton']
- local customizationRight = _G['PVPBannerFrameCustomization'..i..'RightButton']
-
- customization:StripTextures()
- S:HandleNextPrevButton(customizationLeft)
- S:HandleNextPrevButton(customizationRight)
- end
-
- for i = 1, 3 do
- local pickerButton = _G['PVPColorPickerButton'..i]
- S:HandleButton(pickerButton)
-
- if i == 2 then
- pickerButton:Point('TOP', _G.PVPBannerFrameCustomization2, 'BOTTOM', 0, -33)
- elseif i == 3 then
- pickerButton:Point('TOP', _G.PVPBannerFrameCustomization2, 'BOTTOM', 0, -59)
- end
- end
-
- S:HandleButton(_G.PVPBannerFrameAcceptButton)
- S:HandleButton(_G.PVPBannerFrameCancelButton)
- S:HandleButton(select(4, PVPBannerFrame:GetChildren()))
- S:HandleCloseButton(_G.PVPBannerFrameCloseButton)
-end
-
-S:AddCallback('SkinArenaRegistrar')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/AuctionHouse.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/AuctionHouse.lua
deleted file mode 100644
index 2de6ee61c..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/AuctionHouse.lua
+++ /dev/null
@@ -1,292 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs, unpack = pairs, unpack
-
-local hooksecurefunc = hooksecurefunc
-local GetAuctionSellItemInfo = GetAuctionSellItemInfo
-local GetItemQualityColor = GetItemQualityColor
-local CreateFrame = CreateFrame
-
-function S:Blizzard_AuctionUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.auctionhouse) then return end
-
- local AuctionFrame = _G.AuctionFrame
- AuctionFrame:StripTextures(true)
- S:HandleFrame(AuctionFrame, true, nil, 10)
-
- local Buttons = {
- _G.BrowseSearchButton,
- _G.BrowseBidButton,
- _G.BrowseBuyoutButton,
- _G.BrowseCloseButton,
- _G.BrowseResetButton,
- _G.BidBidButton,
- _G.BidBuyoutButton,
- _G.BidCloseButton,
- _G.AuctionsCreateAuctionButton,
- _G.AuctionsCancelAuctionButton,
- _G.AuctionsStackSizeMaxButton,
- _G.AuctionsNumStacksMaxButton,
- _G.AuctionsCloseButton
- }
-
- local CheckBoxes = {
- _G.IsUsableCheckButton,
- _G.ShowOnPlayerCheckButton
- }
-
- local EditBoxes = {
- _G.BrowseName,
- _G.BrowseMinLevel,
- _G.BrowseMaxLevel,
- _G.BrowseBidPriceGold,
- _G.BrowseBidPriceSilver,
- _G.BrowseBidPriceCopper,
- _G.BidBidPriceGold,
- _G.BidBidPriceSilver,
- _G.BidBidPriceCopper,
- _G.AuctionsStackSizeEntry,
- _G.AuctionsNumStacksEntry,
- _G.StartPriceGold,
- _G.StartPriceSilver,
- _G.StartPriceCopper,
- _G.BuyoutPriceGold,
- _G.BuyoutPriceCopper,
- _G.BuyoutPriceSilver
- }
-
- local SortTabs = {
- _G.BrowseQualitySort,
- _G.BrowseLevelSort,
- _G.BrowseDurationSort,
- _G.BrowseHighBidderSort,
- _G.BrowseCurrentBidSort,
- _G.BidQualitySort,
- _G.BidLevelSort,
- _G.BidDurationSort,
- _G.BidBuyoutSort,
- _G.BidStatusSort,
- _G.BidBidSort,
- _G.AuctionsQualitySort,
- _G.AuctionsDurationSort,
- _G.AuctionsHighBidderSort,
- _G.AuctionsBidSort,
- }
-
- for _, Button in pairs(Buttons) do
- S:HandleButton(Button, true)
- end
-
- for _, CheckBox in pairs(CheckBoxes) do
- S:HandleCheckBox(CheckBox)
- end
-
- for _, EditBox in pairs(EditBoxes) do
- S:HandleEditBox(EditBox)
- EditBox:SetTextInsets(1, 1, -1, 1)
- end
-
- for i = 1, AuctionFrame.numTabs do
- local tab = _G['AuctionFrameTab'..i]
-
- S:HandleTab(tab)
-
- if i == 1 then
- tab:ClearAllPoints()
- tab:Point('BOTTOMLEFT', AuctionFrame, 'BOTTOMLEFT', 20, -30)
- tab.SetPoint = E.noop
- end
- end
-
- for _, Tab in pairs(SortTabs) do
- Tab:StripTextures()
- Tab:SetNormalTexture([[Interface\Buttons\UI-SortArrow]])
- Tab:StyleButton()
- end
-
- for _, Filter in pairs(_G.AuctionFrameBrowse.FilterButtons) do
- Filter:StripTextures()
- Filter:StyleButton()
-
- Filter = Filter:GetName()
- _G[Filter..'Lines']:SetAlpha(0)
- _G[Filter..'Lines'].SetAlpha = E.noop
- _G[Filter..'NormalTexture']:SetAlpha(0)
- _G[Filter..'NormalTexture'].SetAlpha = E.noop
- end
-
- _G.BrowseLevelHyphen:Point('RIGHT', 13, 0)
-
- S:HandleCloseButton(_G.AuctionFrameCloseButton, AuctionFrame.backdrop)
-
- _G.AuctionFrameMoneyFrame:Point('BOTTOMRIGHT', AuctionFrame, 'BOTTOMLEFT', 181, 11)
-
- -- Browse Frame
- _G.BrowseTitle:ClearAllPoints()
- _G.BrowseTitle:Point('TOP', AuctionFrame, 'TOP', 0, -5)
-
- _G.BrowseScrollFrame:StripTextures()
-
- _G.BrowseFilterScrollFrame:StripTextures()
-
- _G.BrowseBidText:ClearAllPoints()
- _G.BrowseBidText:Point('RIGHT', _G.BrowseBidButton, 'LEFT', -270, 2)
-
- _G.BrowseCloseButton:Point('BOTTOMRIGHT', 66, 6)
- _G.BrowseBuyoutButton:Point('RIGHT', _G.BrowseCloseButton, 'LEFT', -4, 0)
- _G.BrowseBidButton:Point('RIGHT', _G.BrowseBuyoutButton, 'LEFT', -4, 0)
-
- _G.BrowseBidPrice:Point('BOTTOM', 25, 10)
-
- S:HandleScrollBar(_G.BrowseFilterScrollFrameScrollBar)
- S:HandleScrollBar(_G.BrowseScrollFrameScrollBar)
- S:HandleNextPrevButton(_G.BrowsePrevPageButton, nil, nil, true)
- S:HandleNextPrevButton(_G.BrowseNextPageButton, nil, nil, true)
-
- -- Bid Frame
- _G.BidTitle:ClearAllPoints()
- _G.BidTitle:Point('TOP', _G.AuctionFrame, 'TOP', 0, -5)
-
- _G.BidScrollFrame:StripTextures()
-
- _G.BidBidText:ClearAllPoints()
- _G.BidBidText:Point('RIGHT', _G.BidBidButton, 'LEFT', -270, 2)
-
- _G.BidCloseButton:Point('BOTTOMRIGHT', 66, 6)
- _G.BidBuyoutButton:Point('RIGHT', _G.BidCloseButton, 'LEFT', -4, 0)
- _G.BidBidButton:Point('RIGHT', _G.BidBuyoutButton, 'LEFT', -4, 0)
-
- _G.BidBidPrice:Point('BOTTOM', 25, 10)
-
- S:HandleScrollBar(_G.BidScrollFrameScrollBar)
- _G.BidScrollFrameScrollBar:ClearAllPoints()
- _G.BidScrollFrameScrollBar:Point('TOPRIGHT', _G.BidScrollFrame, 'TOPRIGHT', 23, -18)
- _G.BidScrollFrameScrollBar:Point('BOTTOMRIGHT', _G.BidScrollFrame, 'BOTTOMRIGHT', 0, 16)
-
- --Auctions Frame
- _G.AuctionsTitle:ClearAllPoints()
- _G.AuctionsTitle:Point('TOP', AuctionFrame, 'TOP', 0, -5)
-
- _G.AuctionsScrollFrame:StripTextures()
-
- S:HandleScrollBar(_G.AuctionsScrollFrameScrollBar)
- _G.AuctionsScrollFrameScrollBar:ClearAllPoints()
- _G.AuctionsScrollFrameScrollBar:Point('TOPRIGHT', _G.AuctionsScrollFrame, 'TOPRIGHT', 23, -20)
- _G.AuctionsScrollFrameScrollBar:Point('BOTTOMRIGHT', _G.AuctionsScrollFrame, 'BOTTOMRIGHT', 0, 18)
-
- _G.AuctionsCloseButton:Point('BOTTOMRIGHT', 66, 6)
- _G.AuctionsCancelAuctionButton:Point('RIGHT', _G.AuctionsCloseButton, 'LEFT', -4, 0)
-
- _G.AuctionsStackSizeEntry.backdrop:SetAllPoints()
- _G.AuctionsNumStacksEntry.backdrop:SetAllPoints()
-
- _G.AuctionsItemButton:StripTextures()
- _G.AuctionsItemButton:SetTemplate(nil, true)
- _G.AuctionsItemButton:StyleButton()
-
- _G.AuctionsItemButton:HookScript('OnEvent', function(button, event)
- local normal = event == 'NEW_AUCTION_UPDATE' and button:GetNormalTexture()
- if normal then
- normal:SetTexCoord(unpack(E.TexCoords))
- normal:SetInside()
-
- local _, _, _, quality = GetAuctionSellItemInfo()
- if quality and quality > 1 then
- button:SetBackdropBorderColor(GetItemQualityColor(quality))
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end)
-
- S:HandleRadioButton(_G.AuctionsShortAuctionButton)
- S:HandleRadioButton(_G.AuctionsMediumAuctionButton)
- S:HandleRadioButton(_G.AuctionsLongAuctionButton)
-
- S:HandleDropDownBox(_G.BrowseDropDown, 155)
- S:HandleDropDownBox(_G.PriceDropDown)
-
- -- Progress Frame
- _G.AuctionProgressFrame:StripTextures()
- _G.AuctionProgressFrame:SetTemplate('Transparent')
-
- local AuctionProgressFrameCancelButton = _G.AuctionProgressFrameCancelButton
- S:HandleButton(AuctionProgressFrameCancelButton)
- AuctionProgressFrameCancelButton:SetHitRectInsets(0, 0, 0, 0)
- AuctionProgressFrameCancelButton:GetNormalTexture():SetTexture(E.Media.Textures.Close)
- AuctionProgressFrameCancelButton:GetNormalTexture():SetInside()
- AuctionProgressFrameCancelButton:Size(28)
- AuctionProgressFrameCancelButton:Point('LEFT', _G.AuctionProgressBar, 'RIGHT', 8, 0)
-
- for Frame, NumButtons in pairs({['Browse'] = _G.NUM_BROWSE_TO_DISPLAY, ['Auctions'] = _G.NUM_AUCTIONS_TO_DISPLAY, ['Bid'] = _G.NUM_BIDS_TO_DISPLAY}) do
- for i = 1, NumButtons do
- local Button = _G[Frame..'Button'..i]
- local ItemButton = _G[Frame..'Button'..i..'Item']
- local Texture = _G[Frame..'Button'..i..'ItemIconTexture']
- local Name = _G[Frame..'Button'..i..'Name']
-
- ItemButton:SetTemplate()
- ItemButton:StyleButton()
- ItemButton.IconBorder:SetAlpha(0)
-
- Button:StripTextures()
- Button:SetHighlightTexture(E.media.blankTex)
- Button:GetHighlightTexture():SetVertexColor(1, 1, 1, .2)
-
- ItemButton:GetNormalTexture():SetTexture()
- Button:GetHighlightTexture():Point('TOPLEFT', ItemButton, 'TOPRIGHT', 2, 0)
- Button:GetHighlightTexture():Point('BOTTOMRIGHT', Button, 'BOTTOMRIGHT', -2, 5)
-
- S:HandleIcon(Texture)
- Texture:SetInside()
-
- if Name then
- hooksecurefunc(Name, 'SetVertexColor', function(_, r, g, b)
- if not (r == g) then
- ItemButton:SetBackdropBorderColor(r, g, b)
- else
- ItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end)
-
- hooksecurefunc(Name, 'Hide', function() ItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor)) end)
- end
- end
- end
-
- -- Custom Backdrops
- for _, Frame in pairs({_G.AuctionFrameBrowse, _G.AuctionFrameAuctions}) do
- Frame.LeftBackground = CreateFrame('Frame', nil, Frame)
- Frame.LeftBackground:SetTemplate('Transparent')
- Frame.LeftBackground:SetFrameLevel(Frame:GetFrameLevel() - 1)
-
- Frame.RightBackground = CreateFrame('Frame', nil, Frame)
- Frame.RightBackground:SetTemplate('Transparent')
- Frame.RightBackground:SetFrameLevel(Frame:GetFrameLevel() - 1)
- end
-
- local AuctionFrameAuctions = _G.AuctionFrameAuctions
- AuctionFrameAuctions.LeftBackground:Point('TOPLEFT', 15, -72)
- AuctionFrameAuctions.LeftBackground:Point('BOTTOMRIGHT', -545, 34)
-
- AuctionFrameAuctions.RightBackground:Point('TOPLEFT', AuctionFrameAuctions.LeftBackground, 'TOPRIGHT', 3, 0)
- AuctionFrameAuctions.RightBackground:Point('BOTTOMRIGHT', AuctionFrame, -8, 34)
-
- local AuctionFrameBrowse = _G.AuctionFrameBrowse
- AuctionFrameBrowse.LeftBackground:Point('TOPLEFT', 20, -103)
- AuctionFrameBrowse.LeftBackground:Point('BOTTOMRIGHT', -575, 34)
-
- AuctionFrameBrowse.RightBackground:Point('TOPLEFT', AuctionFrameBrowse.LeftBackground, 'TOPRIGHT', 4, 0)
- AuctionFrameBrowse.RightBackground:Point('BOTTOMRIGHT', AuctionFrame, 'BOTTOMRIGHT', -8, 34)
-
- local AuctionFrameBid = _G.AuctionFrameBid
- AuctionFrameBid.Background = CreateFrame('Frame', nil, AuctionFrameBid)
- S:HandleFrame(AuctionFrameBid.Background, true, nil, 22, -72, 66, 34)
- AuctionFrameBid.Background:SetFrameLevel(AuctionFrameBid:GetFrameLevel() - 1)
-end
-
-S:AddCallbackForAddon('Blizzard_AuctionUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGMap.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGMap.lua
deleted file mode 100644
index f5794339f..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGMap.lua
+++ /dev/null
@@ -1,94 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local hooksecurefunc = hooksecurefunc
-
-local function GetOpacity()
- return 1 - (_G.BattlefieldMapOptions and _G.BattlefieldMapOptions.opacity or 1)
-end
-
-local function InitializeOptionsDropDown()
- _G.BattlefieldMapTab:InitializeOptionsDropDown()
-end
-
-local function setBackdropAlpha()
- if _G.BattlefieldMapFrame.backdrop then
- _G.BattlefieldMapFrame.backdrop:SetBackdropColor(0, 0, 0, GetOpacity())
- end
-end
-
--- alpha stuff
-local oldAlpha = 0
-local function setOldAlpha()
- if oldAlpha then
- _G.BattlefieldMapFrame:SetGlobalAlpha(oldAlpha)
- oldAlpha = nil
- end
-end
-
-local function setRealAlpha()
- oldAlpha = GetOpacity()
- _G.BattlefieldMapFrame:SetGlobalAlpha(1)
-end
-
-local function refreshAlpha()
- oldAlpha = GetOpacity()
-end
-
-function S:Blizzard_BattlefieldMap()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.bgmap) then return end
-
- local BattlefieldMapFrame = _G.BattlefieldMapFrame
- local BattlefieldMapTab = _G.BattlefieldMapTab
-
- S:HandleFrame(BattlefieldMapFrame, true)
-
- refreshAlpha() -- will need this soon
- BattlefieldMapFrame:SetClampedToScreen(true)
- BattlefieldMapFrame:SetFrameStrata('LOW')
- BattlefieldMapFrame.backdrop:SetOutside(BattlefieldMapFrame.ScrollContainer)
- BattlefieldMapFrame.backdrop:SetBackdropColor(0, 0, 0, oldAlpha)
-
- BattlefieldMapFrame:EnableMouse(true)
- BattlefieldMapFrame:SetMovable(true)
-
- BattlefieldMapFrame.BorderFrame:StripTextures()
- BattlefieldMapFrame.BorderFrame.CloseButton:SetFrameLevel(BattlefieldMapFrame.BorderFrame.CloseButton:GetFrameLevel()+1)
- S:HandleCloseButton(BattlefieldMapFrame.BorderFrame.CloseButton)
- BattlefieldMapTab:Kill()
-
- BattlefieldMapFrame.ScrollContainer:HookScript('OnMouseUp', function(_, btn)
- if btn == 'LeftButton' then
- BattlefieldMapTab:StopMovingOrSizing()
- if not _G.BattlefieldMapOptions.position then _G.BattlefieldMapOptions.position = {} end
- _G.BattlefieldMapOptions.position.x, _G.BattlefieldMapOptions.position.y = BattlefieldMapTab:GetCenter()
- elseif btn == 'RightButton' then
- _G.UIDropDownMenu_Initialize(BattlefieldMapTab.OptionsDropDown, InitializeOptionsDropDown, 'MENU')
- _G.ToggleDropDownMenu(1, nil, BattlefieldMapTab.OptionsDropDown, BattlefieldMapFrame:GetName(), 0, -4)
- end
-
- if _G.OpacityFrame:IsShown() then
- _G.OpacityFrame:Hide()
- end
- end)
-
- BattlefieldMapFrame.ScrollContainer:HookScript('OnMouseDown', function(_, btn)
- if btn == 'LeftButton' and (_G.BattlefieldMapOptions and not _G.BattlefieldMapOptions.locked) then
- BattlefieldMapTab:StartMoving()
- end
- end)
-
- hooksecurefunc(BattlefieldMapFrame, 'SetGlobalAlpha', setBackdropAlpha)
- hooksecurefunc(BattlefieldMapFrame, 'RefreshAlpha', refreshAlpha)
-
- BattlefieldMapFrame:HookScript('OnShow', setBackdropAlpha)
- BattlefieldMapFrame.ScrollContainer:HookScript('OnLeave', setOldAlpha)
- BattlefieldMapFrame.ScrollContainer:HookScript('OnEnter', setRealAlpha)
- BattlefieldMapFrame.BorderFrame.CloseButton:HookScript('OnLeave', setOldAlpha)
- BattlefieldMapFrame.BorderFrame.CloseButton:HookScript('OnEnter', setRealAlpha)
-
- S:HandleSliderFrame(_G.OpacityFrameSlider)
-end
-
-S:AddCallbackForAddon('Blizzard_BattlefieldMap')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGScore.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGScore.lua
deleted file mode 100644
index 5ca14e59a..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BGScore.lua
+++ /dev/null
@@ -1,36 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:SkinWorldStateScore()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.bgscore) then return end
-
- local WorldStateScoreFrame = _G.WorldStateScoreFrame
- S:HandleFrame(WorldStateScoreFrame, true, nil, 0, -5, -70, 25)
-
- _G.WorldStateScoreScrollFrame:StripTextures()
- _G.WorldStateScoreScrollFrameScrollBar:SetPoint('RIGHT', 110, 40)
- S:HandleScrollBar(_G.WorldStateScoreScrollFrameScrollBar)
-
- for i = 1, 3 do
- S:HandleTab(_G['WorldStateScoreFrameTab'..i])
- _G['WorldStateScoreFrameTab'..i..'Text']:SetPoint('CENTER', 0, 2)
- end
-
- S:HandleButton(_G.WorldStateScoreFrameLeaveButton)
- S:HandleCloseButton(_G.WorldStateScoreFrameCloseButton)
- _G.WorldStateScoreFrameCloseButton:SetPoint('TOPRIGHT', -68, 0)
-
- _G.WorldStateScoreFrameKB:StyleButton()
- _G.WorldStateScoreFrameDeaths:StyleButton()
- _G.WorldStateScoreFrameHK:StyleButton()
- _G.WorldStateScoreFrameHonorGained:StyleButton()
- _G.WorldStateScoreFrameName:StyleButton()
-
- for i = 1, 7 do
- _G['WorldStateScoreColumn'..i]:StyleButton()
- end
-end
-
-S:AddCallback('SkinWorldStateScore')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Bags.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Bags.lua
deleted file mode 100644
index 48d5926bf..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Bags.lua
+++ /dev/null
@@ -1,237 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-local B = E:GetModule('Bags')
-
-local _G = _G
-local select, unpack = select, unpack
-local hooksecurefunc = hooksecurefunc
-
-local ContainerIDToInventoryID = ContainerIDToInventoryID
-local GetContainerItemLink = GetContainerItemLink
-local GetContainerNumFreeSlots = GetContainerNumFreeSlots
-local GetInventoryItemLink = GetInventoryItemLink
-local GetItemQualityColor = GetItemQualityColor
-local GetInventoryItemID = GetInventoryItemID
-local GetItemInfo = GetItemInfo
-local CreateFrame = CreateFrame
-
-local BANK_CONTAINER = BANK_CONTAINER
-local LE_ITEM_CLASS_QUESTITEM = LE_ITEM_CLASS_QUESTITEM
-
-local bagIconCache = {
- [-2] = [[Interface\ICONS\INV_Misc_Key_03]],
- [0] = E.Media.Textures.Backpack
-}
-
-local function setBagIcon(frame, texture)
- if not frame.BagIcon then
- local portraitButton = _G[frame:GetName()..'PortraitButton']
-
- portraitButton:CreateBackdrop()
- portraitButton:Size(32)
- portraitButton:Point('TOPLEFT', 12, -7)
- portraitButton:StyleButton(nil, true)
- portraitButton.hover:SetAllPoints()
-
- frame.BagIcon = portraitButton:CreateTexture()
- frame.BagIcon:SetTexCoord(unpack(E.TexCoords))
- frame.BagIcon:SetAllPoints()
- end
-
- frame.BagIcon:SetTexture(texture)
-end
-
-function S:ContainerFrame()
- if E.private.bags.enable or not (E.private.skins.blizzard.enable and E.private.skins.blizzard.bags) then return end
-
- -- ContainerFrame
- for i = 1, _G.NUM_CONTAINER_FRAMES do
- local frame = _G['ContainerFrame'..i]
- local closeButton = _G['ContainerFrame'..i..'CloseButton']
-
- frame:StripTextures(true)
- S:HandleFrame(frame, true, nil, 9, -4, -4, 2)
-
- S:HandleCloseButton(closeButton, frame.backdrop)
-
- for j = 1, _G.MAX_CONTAINER_ITEMS do
- local item = _G['ContainerFrame'..i..'Item'..j]
- local icon = _G['ContainerFrame'..i..'Item'..j..'IconTexture']
- local questIcon = _G['ContainerFrame'..i..'Item'..j..'IconQuestTexture']
- local cooldown = _G['ContainerFrame'..i..'Item'..j..'Cooldown']
-
- item:SetNormalTexture(E.ClearTexture)
- item:SetTemplate(nil, true)
- item:StyleButton()
-
- icon:SetInside()
- icon:SetTexCoord(unpack(E.TexCoords))
-
- questIcon:SetTexture(E.Media.Textures.BagQuestIcon)
- questIcon.SetTexture = E.noop
- questIcon:SetTexCoord(0, 1, 0, 1)
- questIcon:SetInside()
-
- E:RegisterCooldown(cooldown, 'bags')
- end
- end
-
- hooksecurefunc('ContainerFrame_GenerateFrame', function(frame)
- local id = frame:GetID()
-
- if id > 0 then
- local itemID = GetInventoryItemID('player', ContainerIDToInventoryID(id))
-
- if not bagIconCache[itemID] then
- bagIconCache[itemID] = select(10, GetItemInfo(itemID))
- end
-
- setBagIcon(frame, bagIconCache[itemID])
- else
- setBagIcon(frame, bagIconCache[id])
- end
- end)
-
- hooksecurefunc('ContainerFrame_Update', function(frame)
- local frameName = frame:GetName()
- local id = frame:GetID()
- local _, bagType = GetContainerNumFreeSlots(id)
-
- for i = 1, frame.size do
- local item = _G[frameName..'Item'..i]
- local questIcon = _G[frameName..'Item'..i..'IconQuestTexture']
- local link = GetContainerItemLink(id, item:GetID())
-
- questIcon:Hide()
-
- if B.ProfessionColors[bagType] then
- item:SetBackdropBorderColor(unpack(B.ProfessionColors[bagType]))
- item.ignoreBorderColors = true
- elseif link then
- local _, _, quality, _, _, _, _, _, _, _, _, itemClassID = GetItemInfo(link)
-
- if itemClassID == LE_ITEM_CLASS_QUESTITEM then
- item:SetBackdropBorderColor(unpack(B.QuestColors.questItem))
- item.ignoreBorderColors = true
-
- if questIcon then
- questIcon:Show()
- end
- elseif quality and quality > 1 then
- item:SetBackdropBorderColor(GetItemQualityColor(quality))
- item.ignoreBorderColors = true
- else
- item:SetBackdropBorderColor(unpack(E.media.bordercolor))
- item.ignoreBorderColors = nil
- end
- else
- item:SetBackdropBorderColor(unpack(E.media.bordercolor))
- item.ignoreBorderColors = nil
- end
- end
- end)
-
- -- BankFrame
- local BankFrame = _G.BankFrame
- BankFrame:StripTextures(true)
- S:HandleFrame(BankFrame, true, nil, 12, 0, 10, 80)
-
- S:HandleCloseButton(_G.BankCloseButton, BankFrame.backdrop)
-
- _G.BankSlotsFrame:StripTextures()
-
- _G.BankFrameMoneyFrame:Point('RIGHT', 0, 0)
-
- for i = 1, _G.NUM_BANKGENERIC_SLOTS do
- local button = _G['BankFrameItem'..i]
- local icon = _G['BankFrameItem'..i..'IconTexture']
- local cooldown = _G['BankFrameItem'..i..'Cooldown']
-
- button:SetNormalTexture(E.ClearTexture)
- button:SetTemplate(nil, true)
- button:StyleButton()
- button.IconBorder:StripTextures()
- button.IconOverlay:StripTextures()
-
- icon:SetInside()
- icon:SetTexCoord(unpack(E.TexCoords))
-
- button.IconQuestTexture:SetTexture(E.Media.Textures.BagQuestIcon)
- button.IconQuestTexture.SetTexture = E.noop
- button.IconQuestTexture:SetTexCoord(0, 1, 0, 1)
- button.IconQuestTexture:SetInside()
-
- E:RegisterCooldown(cooldown, 'bags')
- end
-
- BankFrame.itemBackdrop = CreateFrame('Frame', 'BankFrameItemBackdrop', BankFrame)
- BankFrame.itemBackdrop:SetTemplate()
- BankFrame.itemBackdrop:SetFrameLevel(BankFrame:GetFrameLevel())
-
- BankFrame.bagBackdrop = CreateFrame('Frame', 'BankFrameBagBackdrop', BankFrame)
- BankFrame.bagBackdrop:SetTemplate()
- BankFrame.bagBackdrop:SetFrameLevel(BankFrame:GetFrameLevel())
-
- S:HandleButton(_G.BankFramePurchaseButton)
-
- hooksecurefunc('BankFrameItemButton_Update', function(button)
- local id = button:GetID()
-
- if button.isBag then
- button:SetNormalTexture(E.ClearTexture)
- button:SetTemplate(nil, true)
- button:StyleButton()
-
- button.icon:SetInside()
- button.icon:SetTexCoord(unpack(E.TexCoords))
-
- button.HighlightFrame.HighlightTexture:SetInside()
- button.HighlightFrame.HighlightTexture:SetTexture(unpack(E.media.rgbvaluecolor), 0.3)
-
- local link = GetInventoryItemLink('player', ContainerIDToInventoryID(id))
- if link then
- local _, _, quality = GetItemInfo(link)
- if quality and quality > 1 then
- button:SetBackdropBorderColor(GetItemQualityColor(quality))
- button.ignoreBorderColors = true
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- button.ignoreBorderColors = nil
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- button.ignoreBorderColors = nil
- end
- else
- local questIcon = button.IconQuestTexture
- if questIcon then
- questIcon:Hide()
- end
-
- local link = GetContainerItemLink(BANK_CONTAINER, id)
- if link then
- local _, _, quality, _, _, _, _, _, _, _, _, itemClassID = GetItemInfo(link)
-
- if itemClassID == LE_ITEM_CLASS_QUESTITEM then
- button:SetBackdropBorderColor(unpack(B.QuestColors.questItem))
- button.ignoreBorderColors = true
-
- if questIcon then
- questIcon:Show()
- end
- elseif quality and quality > 1 then
- button:SetBackdropBorderColor(GetItemQualityColor(quality))
- button.ignoreBorderColors = true
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- button.ignoreBorderColors = nil
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- button.ignoreBorderColors = nil
- end
- end
- end)
-end
-
-S:AddCallback('ContainerFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlefield.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlefield.lua
deleted file mode 100644
index f13fa8a90..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlefield.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:SkinBattlefield()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.battlefield) then return end
-
- local BattlefieldFrame = _G.BattlefieldFrame
-
- BattlefieldFrame:StripTextures(true)
- BattlefieldFrame:CreateBackdrop('Transparent')
- BattlefieldFrame.backdrop:Point('TOPLEFT', 10, -12)
- BattlefieldFrame.backdrop:Point('BOTTOMRIGHT', -32, 73)
-
- _G.BattlefieldListScrollFrame:StripTextures()
- S:HandleScrollBar(_G.BattlefieldListScrollFrameScrollBar)
-
- _G.BattlefieldFrameZoneDescription:SetTextColor(1, 1, 1)
-
- S:HandleButton(_G.BattlefieldFrameCancelButton)
- S:HandleButton(_G.BattlefieldFrameJoinButton)
- S:HandleButton(_G.BattlefieldFrameGroupJoinButton)
-
- _G.BattlefieldFrameGroupJoinButton:Point('RIGHT', _G.BattlefieldFrameJoinButton, 'LEFT', -2, 0)
-
- S:HandleCloseButton(_G.BattlefieldFrameCloseButton)
-end
-
-S:AddCallback('SkinBattlefield')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlenet.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlenet.lua
deleted file mode 100644
index abae5164a..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Battlenet.lua
+++ /dev/null
@@ -1,48 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-
-function S:BattleNetFrames()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.misc) then return end
-
- local skins = {
- _G.BNToastFrame,
- _G.TimeAlertFrame,
- _G.TicketStatusFrameButton,
- }
-
- for i = 1, #skins do
- skins[i]:SetTemplate('Transparent')
- end
-
- local PlayerReportFrame = _G.PlayerReportFrame
- S:HandleFrame(PlayerReportFrame, true)
-
- PlayerReportFrame.Comment:StripTextures()
- S:HandleEditBox(PlayerReportFrame.Comment)
-
- S:HandleButton(PlayerReportFrame.ReportButton)
- S:HandleButton(PlayerReportFrame.CancelButton)
-
- S:HandleFrame(_G.ReportCheatingDialog, true)
-
- _G.ReportCheatingDialogCommentFrame:StripTextures()
-
- S:HandleButton(_G.ReportCheatingDialogReportButton)
- S:HandleButton(_G.ReportCheatingDialogCancelButton)
-
- S:HandleEditBox(_G.ReportCheatingDialogCommentFrameEditBox)
-
- local BattleTagInviteFrame = _G.BattleTagInviteFrame
- S:HandleFrame(BattleTagInviteFrame, true)
-
- for _, child in next, { BattleTagInviteFrame:GetChildren() } do
- if child:IsObjectType('Button') then
- S:HandleButton(child)
- end
- end
-end
-
-S:AddCallback('BattleNetFrames')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Binding.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Binding.lua
deleted file mode 100644
index f009e726a..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Binding.lua
+++ /dev/null
@@ -1,53 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-local hooksecurefunc = hooksecurefunc
-
-function S:Blizzard_BindingUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.binding) then return end
-
- local KB = _G.KeyBindingFrame
- for _, v in next, { 'defaultsButton', 'unbindButton', 'okayButton', 'cancelButton' } do
- S:HandleButton(KB[v])
- end
-
- S:HandleFrame(KB, true)
- S:HandleFrame(KB.categoryList, true)
- S:HandleFrame(KB.bindingsContainer, true)
-
- KB.header:StripTextures()
- KB.header:ClearAllPoints()
- KB.header:Point('TOP', KB, 'TOP', 0, -4)
-
- _G.KeyBindingFrameScrollFrame:StripTextures()
- S:HandleScrollBar(_G.KeyBindingFrameScrollFrameScrollBar)
-
- S:HandleCheckBox(KB.characterSpecificButton)
-
- for i = 1, _G.KEY_BINDINGS_DISPLAYED, 1 do
- local button1 = _G['KeyBindingFrameKeyBinding'..i..'Key1Button']
- local button2 = _G['KeyBindingFrameKeyBinding'..i..'Key2Button']
- button2:Point('LEFT', button1, 'RIGHT', 1, 0) -- Needed for new Pixel Perfect
- end
-
- hooksecurefunc('BindingButtonTemplate_SetupBindingButton', function(_, button)
- if not button.IsSkinned then
- local selected = button.selectedHighlight
- selected:SetTexture(E.media.normTex)
- selected:Point('TOPLEFT', 1, -1)
- selected:Point('BOTTOMRIGHT', -1, 1)
- selected:SetColorTexture(1, 1, 1, .25)
- S:HandleButton(button)
-
- button.IsSkinned = true
- end
- end)
-
- KB.okayButton:Point('BOTTOMLEFT', KB.unbindButton, 'BOTTOMRIGHT', 3, 0)
- KB.cancelButton:Point('BOTTOMLEFT', KB.okayButton, 'BOTTOMRIGHT', 3, 0)
- KB.unbindButton:Point('BOTTOMRIGHT', KB, 'BOTTOMRIGHT', -211, 16)
-end
-
-S:AddCallbackForAddon('Blizzard_BindingUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BlizzardOptions.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/BlizzardOptions.lua
deleted file mode 100644
index c6610ae64..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/BlizzardOptions.lua
+++ /dev/null
@@ -1,342 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-local pairs = pairs
-local ipairs = ipairs
-
-local hooksecurefunc = hooksecurefunc
-local InCombatLockdown = InCombatLockdown
-
-local function HandlePushToTalkButton(button)
- button:Size(button:GetSize())
-
- button.TopLeft:Hide()
- button.TopRight:Hide()
- button.BottomLeft:Hide()
- button.BottomRight:Hide()
- button.TopMiddle:Hide()
- button.MiddleLeft:Hide()
- button.MiddleRight:Hide()
- button.BottomMiddle:Hide()
- button.MiddleMiddle:Hide()
- button:SetHighlightTexture(E.ClearTexture)
-
- button:SetTemplate(nil, true)
- button:HookScript('OnEnter', S.SetModifiedBackdrop)
- button:HookScript('OnLeave', S.SetOriginalBackdrop)
-end
-
-local function Skin_InterfaceOptions_Buttons()
- for i = 1, #_G.INTERFACEOPTIONS_ADDONCATEGORIES do
- local button = _G['InterfaceOptionsFrameAddOnsButton'..i..'Toggle']
- if button and not button.IsSkinned then
- S:HandleCollapseTexture(button, true)
- button.IsSkinned = true
- end
- end
-end
-
-function S.AudioOptionsVoicePanel_InitializeCommunicationModeUI(btn)
- HandlePushToTalkButton(btn.PushToTalkKeybindButton)
-end
-
-function S:BlizzardOptions()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.blizzardOptions) then return end
-
- _G.InterfaceOptionsFrame:SetClampedToScreen(true)
- _G.InterfaceOptionsFrame:SetMovable(true)
- _G.InterfaceOptionsFrame:EnableMouse(true)
- _G.InterfaceOptionsFrame:RegisterForDrag('LeftButton', 'RightButton')
- _G.InterfaceOptionsFrame:SetScript('OnDragStart', function(frame)
- if InCombatLockdown() then return end
- frame:StartMoving()
- frame.isMoving = true
- end)
- _G.InterfaceOptionsFrame:SetScript('OnDragStop', function(frame)
- frame:StopMovingOrSizing()
- frame.isMoving = false
- end)
-
- --Chat Config
- local ChatConfigFrame = _G.ChatConfigFrame
-
- hooksecurefunc(_G.ChatConfigFrameChatTabManager, 'UpdateWidth', function(frame)
- for tab in frame.tabPool:EnumerateActive() do
- if not tab.IsSkinned then
- tab:StripTextures()
-
- tab.IsSkinned = true
- end
- end
- end)
-
- -- Chat Config
- local ChatFrames = {
- _G.ChatConfigFrame,
- _G.ChatConfigCategoryFrame,
- _G.ChatConfigBackgroundFrame,
- _G.ChatConfigCombatSettingsFilters,
- _G.ChatConfigCombatSettingsFiltersScrollFrame,
- _G.CombatConfigColorsHighlighting,
- _G.CombatConfigColorsColorizeUnitName,
- _G.CombatConfigColorsColorizeSpellNames,
- _G.CombatConfigColorsColorizeDamageNumber,
- _G.CombatConfigColorsColorizeDamageSchool,
- _G.CombatConfigColorsColorizeEntireLine,
- _G.ChatConfigChatSettingsLeft,
- _G.ChatConfigOtherSettingsCombat,
- _G.ChatConfigOtherSettingsPVP,
- _G.ChatConfigOtherSettingsSystem,
- _G.ChatConfigOtherSettingsCreature,
- _G.ChatConfigChannelSettingsAvailable,
- _G.ChatConfigChannelSettingsAvailableBox,
- _G.ChatConfigChannelSettingsLeft,
- _G.CombatConfigMessageSourcesDoneBy,
- _G.CombatConfigColorsUnitColors,
- _G.CombatConfigMessageSourcesDoneTo,
- }
-
- local ChatButtons = {
- _G.ChatConfigFrameDefaultButton,
- _G.ChatConfigFrameRedockButton,
- _G.ChatConfigFrameOkayButton,
- _G.ChatConfigFrame.ToggleChatButton,
- _G.ChatConfigCombatSettingsFiltersDeleteButton,
- _G.ChatConfigCombatSettingsFiltersAddFilterButton,
- _G.ChatConfigCombatSettingsFiltersCopyFilterButton,
- _G.CombatConfigSettingsSaveButton,
- _G.CombatLogDefaultButton,
- }
-
- local ChatCheckBoxs = {
- _G.CombatConfigColorsHighlightingLine,
- _G.CombatConfigColorsHighlightingAbility,
- _G.CombatConfigColorsHighlightingDamage,
- _G.CombatConfigColorsHighlightingSchool,
- _G.CombatConfigColorsColorizeUnitNameCheck,
- _G.CombatConfigColorsColorizeSpellNamesCheck,
- _G.CombatConfigColorsColorizeSpellNamesSchoolColoring,
- _G.CombatConfigColorsColorizeDamageNumberCheck,
- _G.CombatConfigColorsColorizeDamageNumberSchoolColoring,
- _G.CombatConfigColorsColorizeDamageSchoolCheck,
- _G.CombatConfigColorsColorizeEntireLineCheck,
- _G.CombatConfigFormattingShowTimeStamp,
- _G.CombatConfigFormattingShowBraces,
- _G.CombatConfigFormattingUnitNames,
- _G.CombatConfigFormattingSpellNames,
- _G.CombatConfigFormattingItemNames,
- _G.CombatConfigFormattingFullText,
- _G.CombatConfigSettingsShowQuickButton,
- _G.CombatConfigSettingsSolo,
- _G.CombatConfigSettingsParty,
- _G.CombatConfigSettingsRaid,
- }
-
- for _, Frame in pairs(ChatFrames) do
- Frame:StripTextures()
- Frame:SetTemplate('Transparent')
- end
-
- for _, CheckBox in pairs(ChatCheckBoxs) do
- S:HandleCheckBox(CheckBox)
- end
-
- for _, Button in pairs(ChatButtons) do
- S:HandleButton(Button)
- end
-
- for i in pairs(_G.COMBAT_CONFIG_TABS) do
- S:HandleTab(_G['CombatConfigTab'..i])
- _G['CombatConfigTab'..i].backdrop:Point('TOPLEFT', 0, -10)
- _G['CombatConfigTab'..i].backdrop:Point('BOTTOMRIGHT', -2, 3)
- _G['CombatConfigTab'..i..'Text']:Point('BOTTOM', 0, 10)
- end
-
- _G.CombatConfigTab1:ClearAllPoints()
- _G.CombatConfigTab1:Point('BOTTOMLEFT', _G.ChatConfigBackgroundFrame, 'TOPLEFT', 6, -2)
-
- S:HandleEditBox(_G.CombatConfigSettingsNameEditBox)
- S:HandleNextPrevButton(_G.ChatConfigMoveFilterUpButton)
- S:HandleNextPrevButton(_G.ChatConfigMoveFilterDownButton)
- _G.ChatConfigMoveFilterUpButton:Size(19, 19)
- _G.ChatConfigMoveFilterDownButton:Size(19, 19)
- _G.ChatConfigMoveFilterUpButton:Point('TOPLEFT', '$parent', 'BOTTOMLEFT', 0, -3)
- _G.ChatConfigMoveFilterDownButton:Point('LEFT', _G.ChatConfigMoveFilterUpButton, 'RIGHT', 3, 0)
-
- _G.ChatConfigFrameOkayButton:Point('RIGHT', '$parentCancelButton', 'RIGHT', -1, -3)
- _G.ChatConfigFrameDefaultButton:Point('BOTTOMLEFT', 12, 10)
- _G.ChatConfigCombatSettingsFiltersDeleteButton:Point('TOPRIGHT', '$parent', 'BOTTOMRIGHT', -3, -1)
- _G.ChatConfigCombatSettingsFiltersAddFilterButton:Point('RIGHT', '$parentDeleteButton', 'LEFT', -2, 0)
- _G.ChatConfigCombatSettingsFiltersCopyFilterButton:Point('RIGHT', '$parentAddFilterButton', 'LEFT', -2, 0)
-
- ChatConfigFrame:HookScript('OnShow', function()
- for tab in _G.ChatConfigFrameChatTabManager.tabPool:EnumerateActive() do
- S:HandleButton(tab, true)
- end
- end)
-
- hooksecurefunc('ChatConfig_UpdateCheckboxes', function(frame)
- if not _G.FCF_GetCurrentChatFrame() then
- return
- end
- for index in ipairs(frame.checkBoxTable) do
- local checkBoxNameString = frame:GetName()..'CheckBox'
- local checkBoxName = checkBoxNameString..index
- local checkBox = _G[checkBoxName]
- local check = _G[checkBoxName..'Check']
- if checkBox and not checkBox.isSkinned then
- checkBox:StripTextures()
- S:HandleCheckBox(check)
- if _G[checkBoxName..'ColorClasses'] then
- S:HandleCheckBox(_G[checkBoxName..'ColorClasses'])
- end
- checkBox.isSkinned = true
- end
- end
- end)
-
- hooksecurefunc('ChatConfig_UpdateTieredCheckboxes', function(frame, index)
- local group = frame.checkBoxTable[index]
- local checkBox = _G[frame:GetName()..'CheckBox'..index]
- if checkBox then
- S:HandleCheckBox(checkBox)
- end
- if group.subTypes then
- for k in ipairs(group.subTypes) do
- S:HandleCheckBox(_G[frame:GetName()..'CheckBox'..index..'_'..k])
- end
- end
- end)
-
- hooksecurefunc('ChatConfig_UpdateSwatches', function(frame)
- if not _G.FCF_GetCurrentChatFrame() then
- return
- end
- for index in ipairs(frame.swatchTable) do
- _G[frame:GetName()..'Swatch'..index]:StripTextures()
- end
- end)
-
- local OptionsFrames = { _G.InterfaceOptionsFrame, _G.InterfaceOptionsFrameCategories, _G.InterfaceOptionsFramePanelContainer, _G.InterfaceOptionsFrameAddOns, _G.VideoOptionsFrame, _G.VideoOptionsFrameCategoryFrame, _G.VideoOptionsFramePanelContainer, _G.Display_, _G.Graphics_, _G.RaidGraphics_ }
- local OptionsFrameBackdrops = { _G.AudioOptionsSoundPanelHardware, _G.AudioOptionsSoundPanelVolume, _G.AudioOptionsSoundPanelPlayback, _G.AudioOptionsVoicePanelTalking, _G.AudioOptionsVoicePanelListening, _G.AudioOptionsVoicePanelBinding }
- local OptionsButtons = { _G.GraphicsButton, _G.RaidButton }
-
- local InterfaceOptions = {
- _G.InterfaceOptionsFrame,
- _G.InterfaceOptionsControlsPanel,
- _G.InterfaceOptionsCombatPanel,
- _G.InterfaceOptionsDisplayPanel,
- _G.InterfaceOptionsSocialPanel,
- _G.InterfaceOptionsActionBarsPanel,
- _G.InterfaceOptionsNamesPanel,
- _G.InterfaceOptionsNamesPanelFriendly,
- _G.InterfaceOptionsNamesPanelEnemy,
- _G.InterfaceOptionsNamesPanelUnitNameplates,
- _G.InterfaceOptionsCameraPanel,
- _G.InterfaceOptionsMousePanel,
- _G.InterfaceOptionsAccessibilityPanel,
- _G.VideoOptionsFrame,
- _G.Display_,
- _G.Graphics_,
- _G.RaidGraphics_,
- _G.Advanced_,
- _G.NetworkOptionsPanel,
- _G.InterfaceOptionsLanguagesPanel,
- _G.AudioOptionsSoundPanel,
- _G.AudioOptionsSoundPanelHardware,
- _G.AudioOptionsSoundPanelVolume,
- _G.AudioOptionsSoundPanelPlayback,
- _G.AudioOptionsVoicePanel,
- _G.CompactUnitFrameProfiles,
- _G.CompactUnitFrameProfilesGeneralOptionsFrame,
- }
-
- for _, Frame in pairs(OptionsFrames) do
- Frame:StripTextures()
- Frame:SetTemplate('Transparent')
- end
-
- for _, Frame in pairs(OptionsFrameBackdrops) do
- Frame:StripTextures()
- Frame:CreateBackdrop('Transparent')
- end
-
- for _, Tab in pairs(OptionsButtons) do
- S:HandleButton(Tab, true)
- end
-
- for _, Panel in pairs(InterfaceOptions) do
- if Panel then
- for _, Child in next, { Panel:GetChildren() } do
- if Child:IsObjectType('CheckButton') then
- S:HandleCheckBox(Child)
- elseif Child:IsObjectType('Button') then
- S:HandleButton(Child, true)
- elseif Child:IsObjectType('Slider') then
- S:HandleSliderFrame(Child)
- elseif Child:IsObjectType('Tab') then
- S:HandleTab(Child)
- elseif Child:IsObjectType('Frame') and Child.Left and Child.Middle and Child.Right then
- S:HandleDropDownBox(Child)
- end
- end
- end
- end
-
- _G.InterfaceOptionsFrameTab1:Point('BOTTOMLEFT', _G.InterfaceOptionsFrameCategories, 'TOPLEFT', 6, 1)
- _G.InterfaceOptionsFrameTab1:StripTextures()
- _G.InterfaceOptionsFrameTab2:Point('TOPLEFT', _G.InterfaceOptionsFrameTab1, 'TOPRIGHT', 1, 0)
- _G.InterfaceOptionsFrameTab2:StripTextures()
- _G.InterfaceOptionsSocialPanel.EnableTwitter.Logo:SetAtlas('WoWShare-TwitterLogo')
-
- -- Plus minus buttons in addons category
- hooksecurefunc('InterfaceOptions_AddCategory', Skin_InterfaceOptions_Buttons)
- Skin_InterfaceOptions_Buttons()
-
- --Create New Raid Profle
- local newProfileDialog = _G.CompactUnitFrameProfilesNewProfileDialog
- if newProfileDialog then
- newProfileDialog:StripTextures()
- newProfileDialog:CreateBackdrop('Transparent')
-
- S:HandleDropDownBox(_G.CompactUnitFrameProfilesNewProfileDialogBaseProfileSelector)
- S:HandleButton(_G.CompactUnitFrameProfilesNewProfileDialogCreateButton)
- S:HandleButton(_G.CompactUnitFrameProfilesNewProfileDialogCancelButton)
-
- if newProfileDialog.editBox then
- S:HandleEditBox(newProfileDialog.editBox)
- newProfileDialog.editBox:Size(210, 25)
- end
- end
-
- --Delete Raid Profile
- local deleteProfileDialog = _G.CompactUnitFrameProfilesDeleteProfileDialog
- if deleteProfileDialog then
- deleteProfileDialog:StripTextures()
- deleteProfileDialog:CreateBackdrop('Transparent')
-
- S:HandleButton(_G.CompactUnitFrameProfilesDeleteProfileDialogDeleteButton)
- S:HandleButton(_G.CompactUnitFrameProfilesDeleteProfileDialogCancelButton)
- end
-
- -- Toggle Test Audio Button - Wow 8.0
- S:HandleButton(_G.AudioOptionsVoicePanel.TestInputDevice.ToggleTest)
-
- local VUMeter = _G.AudioOptionsVoicePanelTestInputDevice.VUMeter
- VUMeter.NineSlice:Hide()
- VUMeter.Status:CreateBackdrop()
- VUMeter.Status:SetStatusBarTexture(E.media.normTex)
- E:RegisterStatusBar(VUMeter.Status)
-
- -- PushToTalk KeybindButton - Wow 8.0
- hooksecurefunc('AudioOptionsVoicePanel_InitializeCommunicationModeUI', S.AudioOptionsVoicePanel_InitializeCommunicationModeUI)
-
- -- New Voice Sliders
- S:HandleSliderFrame(_G.UnitPopupVoiceSpeakerVolume.Slider)
- S:HandleSliderFrame(_G.UnitPopupVoiceMicrophoneVolume.Slider)
- S:HandleSliderFrame(_G.UnitPopupVoiceUserVolume.Slider)
-end
-
-S:AddCallback('BlizzardOptions')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Channels.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Channels.lua
deleted file mode 100644
index fba1eee26..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Channels.lua
+++ /dev/null
@@ -1,50 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-local hooksecurefunc = hooksecurefunc
-
-function S:Blizzard_Channels()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.channels) then return end
-
- local ChannelFrame = _G.ChannelFrame
- S:HandleFrame(ChannelFrame, true, nil, -5)
-
- S:HandleButton(ChannelFrame.NewButton)
- S:HandleButton(ChannelFrame.SettingsButton)
-
- S:HandlePointXY(ChannelFrame.NewButton, -1, 4)
- S:HandlePointXY(_G.ChannelFrameCloseButton, 2, 2)
-
- S:HandleScrollBar(ChannelFrame.ChannelRoster.ScrollFrame.scrollBar)
- ChannelFrame.ChannelRoster.ScrollFrame.scrollBar:Point('TOPLEFT', ChannelFrame.ChannelRoster.ScrollFrame, 'TOPRIGHT', 1, -13)
- ChannelFrame.ChannelRoster.ScrollFrame.scrollBar:Point('BOTTOMLEFT', ChannelFrame.ChannelRoster.ScrollFrame, 'BOTTOMRIGHT', 1, 13)
-
- S:HandleScrollBar(ChannelFrame.ChannelList.ScrollBar)
- ChannelFrame.ChannelList.ScrollBar:Point('BOTTOMLEFT', ChannelFrame.ChannelList, 'BOTTOMRIGHT', 0, 15)
-
- local CreateChannelPopup = _G.CreateChannelPopup
- S:HandleFrame(CreateChannelPopup, true)
-
- S:HandleButton(CreateChannelPopup.OKButton)
- S:HandleButton(CreateChannelPopup.CancelButton)
-
- S:HandleEditBox(CreateChannelPopup.Name)
- S:HandleEditBox(CreateChannelPopup.Password)
-
- S:HandlePointXY(CreateChannelPopup.CloseButton, 2, 2)
-
- local VoiceChatPromptActivateChannel = _G.VoiceChatPromptActivateChannel
- S:HandleFrame(VoiceChatPromptActivateChannel, true)
- S:HandleButton(VoiceChatPromptActivateChannel.AcceptButton)
- S:HandleCloseButton(VoiceChatPromptActivateChannel.CloseButton, VoiceChatPromptActivateChannel.backrop)
-
- -- Hide the Channel Header Textures
- hooksecurefunc(_G.ChannelButtonHeaderMixin, 'Update', function(s)
- s:SetTemplate('Transparent')
- s.NormalTexture:SetTexture()
- end)
-end
-
-S:AddCallbackForAddon('Blizzard_Channels')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Character.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Character.lua
deleted file mode 100644
index fb5ecd09b..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Character.lua
+++ /dev/null
@@ -1,338 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local pairs = pairs
-local strfind = strfind
-
-local HasPetUI = HasPetUI
-local GetPetHappiness = GetPetHappiness
-local GetInventoryItemQuality = GetInventoryItemQuality
-local GetItemQualityColor = GetItemQualityColor
-local GetNumFactions = GetNumFactions
-local hooksecurefunc = hooksecurefunc
-
-local MAX_ARENA_TEAMS = MAX_ARENA_TEAMS
-local NUM_FACTIONS_DISPLAYED = NUM_FACTIONS_DISPLAYED
-local CHARACTERFRAME_SUBFRAMES = CHARACTERFRAME_SUBFRAMES
-local FauxScrollFrame_GetOffset = FauxScrollFrame_GetOffset
-
-local ResistanceCoords = {
- [1] = { 0.21875, 0.8125, 0.25, 0.32421875 }, --Arcane
- [2] = { 0.21875, 0.8125, 0.0234375, 0.09765625 }, --Fire
- [3] = { 0.21875, 0.8125, 0.13671875, 0.2109375 }, --Nature
- [4] = { 0.21875, 0.8125, 0.36328125, 0.4375}, --Frost
- [5] = { 0.21875, 0.8125, 0.4765625, 0.55078125}, --Shadow
-}
-
-local function HandleResistanceFrame(frameName)
- for i = 1, 5 do
- local frame, icon, text = _G[frameName..i], _G[frameName..i]:GetRegions()
- frame:Size(24)
- frame:SetTemplate()
-
- if i ~= 1 then
- frame:ClearAllPoints()
- frame:Point('TOP', _G[frameName..i - 1], 'BOTTOM', 0, -1)
- end
-
- if icon then
- icon:SetInside()
- icon:SetTexCoord(unpack(ResistanceCoords[i]))
- icon:SetDrawLayer('ARTWORK')
- end
-
- if text then
- text:SetDrawLayer('OVERLAY')
- end
- end
-end
-
-function S:CharacterFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.character) then return end
-
- -- Character Frame
- local CharacterFrame = _G.CharacterFrame
- S:HandleFrame(CharacterFrame, true, nil, 11, -12, -32, 76)
-
- S:HandleCloseButton(_G.CharacterFrameCloseButton, CharacterFrame.backdrop)
-
- S:HandleDropDownBox(_G.PlayerStatFrameRightDropDown, 145)
- S:HandleDropDownBox(_G.PlayerStatFrameLeftDropDown, 147)
- S:HandleDropDownBox(_G.PlayerTitleDropDown, 200)
- _G.PlayerStatFrameRightDropDown:Point('TOP', -2, 24)
- _G.PlayerStatFrameLeftDropDown:Point('LEFT', -25, 24)
- _G.PlayerTitleDropDown:Point('TOP', -7, -51)
-
- for i = 1, #CHARACTERFRAME_SUBFRAMES do
- S:HandleTab(_G['CharacterFrameTab'..i])
- end
-
- _G.PaperDollFrame:StripTextures()
-
- S:HandleRotateButton(_G.CharacterModelFrameRotateLeftButton)
- _G.CharacterModelFrameRotateLeftButton:Point('TOPLEFT', 3, -3)
- S:HandleRotateButton(_G.CharacterModelFrameRotateRightButton)
- _G.CharacterModelFrameRotateRightButton:Point('TOPLEFT', _G.CharacterModelFrameRotateLeftButton, 'TOPRIGHT', 3, 0)
-
- _G.CharacterAttributesFrame:StripTextures()
-
- HandleResistanceFrame('MagicResFrame')
-
- for _, slot in pairs({ _G.PaperDollItemsFrame:GetChildren() }) do
- if slot:IsObjectType('Button') then
- local icon = _G[slot:GetName()..'IconTexture']
- local cooldown = _G[slot:GetName()..'Cooldown']
-
- slot:StripTextures()
- slot:SetTemplate(nil, true, true)
- slot:StyleButton()
-
- S:HandleIcon(icon)
- icon:SetInside()
-
- if cooldown then
- E:RegisterCooldown(cooldown)
- end
- end
- end
-
- hooksecurefunc('PaperDollItemSlotButton_Update', function(frame)
- if frame.SetBackdropBorderColor then
- local rarity = GetInventoryItemQuality('player', frame:GetID())
- if rarity and rarity > 1 then
- frame:SetBackdropBorderColor(GetItemQualityColor(rarity))
- else
- frame:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
- end)
-
- -- PetPaperDollFrame
- _G.PetPaperDollFrame:StripTextures()
-
- S:HandleButton(_G.PetPaperDollCloseButton)
-
- S:HandleRotateButton(_G.PetModelFrameRotateLeftButton)
- _G.PetModelFrameRotateLeftButton:ClearAllPoints()
- _G.PetModelFrameRotateLeftButton:Point('TOPLEFT', 3, -3)
- S:HandleRotateButton(_G.PetModelFrameRotateRightButton)
- _G.PetModelFrameRotateRightButton:ClearAllPoints()
- _G.PetModelFrameRotateRightButton:Point('TOPLEFT', _G.PetModelFrameRotateLeftButton, 'TOPRIGHT', 3, 0)
-
- _G.PetAttributesFrame:StripTextures()
-
- _G.PetResistanceFrame:CreateBackdrop()
- _G.PetResistanceFrame.backdrop:SetOutside(_G.PetMagicResFrame1, nil, nil, _G.PetMagicResFrame5)
-
- HandleResistanceFrame('PetMagicResFrame')
-
- _G.PetPaperDollFrameExpBar:StripTextures()
- _G.PetPaperDollFrameExpBar:SetStatusBarTexture(E.media.normTex)
- E:RegisterStatusBar(_G.PetPaperDollFrameExpBar)
- _G.PetPaperDollFrameExpBar:CreateBackdrop()
-
- local function updHappiness(frame)
- local happiness = GetPetHappiness()
- local _, isHunterPet = HasPetUI()
- if not (happiness and isHunterPet) then return end
-
- local texture = frame:GetRegions()
- if happiness == 1 then
- texture:SetTexCoord(0.41, 0.53, 0.06, 0.30)
- elseif happiness == 2 then
- texture:SetTexCoord(0.22, 0.345, 0.06, 0.30)
- elseif happiness == 3 then
- texture:SetTexCoord(0.04, 0.15, 0.06, 0.30)
- end
- end
-
- local PetPaperDollPetInfo = _G.PetPaperDollPetInfo
- PetPaperDollPetInfo:Point('TOPLEFT', _G.PetModelFrameRotateLeftButton, 'BOTTOMLEFT', 9, -3)
- PetPaperDollPetInfo:GetRegions():SetTexCoord(0.04, 0.15, 0.06, 0.30)
- PetPaperDollPetInfo:SetFrameLevel(_G.PetModelFrame:GetFrameLevel() + 2)
- PetPaperDollPetInfo:CreateBackdrop()
- PetPaperDollPetInfo:Size(24)
-
- PetPaperDollPetInfo:RegisterEvent('UNIT_HAPPINESS')
- PetPaperDollPetInfo:SetScript('OnEvent', updHappiness)
- PetPaperDollPetInfo:SetScript('OnShow', updHappiness)
-
- -- Reputation Frame
- _G.ReputationFrame:StripTextures()
-
- for i = 1, NUM_FACTIONS_DISPLAYED do
- local factionBar = _G['ReputationBar'..i]
- local factionHeader = _G['ReputationHeader'..i]
- local factionName = _G['ReputationBar'..i..'FactionName']
- local factionWar = _G['ReputationBar'..i..'AtWarCheck']
-
- factionBar:StripTextures()
- factionBar:CreateBackdrop()
- factionBar:SetStatusBarTexture(E.media.normTex)
- factionBar:Size(108, 13)
- E:RegisterStatusBar(factionBar)
-
- if i == 1 then
- factionBar:Point('TOPLEFT', 190, -86)
- end
-
- factionName:Width(140)
- factionName:Point('LEFT', factionBar, 'LEFT', -150, 0)
- factionName.SetWidth = E.noop
-
- factionHeader:GetNormalTexture():Size(14)
- factionHeader:SetHighlightTexture(E.ClearTexture)
- factionHeader:Point('TOPLEFT', factionBar, 'TOPLEFT', -175, 0)
-
- factionWar:StripTextures()
- factionWar:Point('LEFT', factionBar, 'RIGHT', 0, 0)
-
- factionWar.Icon = factionWar:CreateTexture(nil, 'OVERLAY')
- factionWar.Icon:Point('LEFT', 6, -8)
- factionWar.Icon:Size(32)
- factionWar.Icon:SetTexture([[Interface\Buttons\UI-CheckBox-SwordCheck]])
- end
-
- hooksecurefunc('ReputationFrame_Update', function()
- local numFactions = GetNumFactions()
- local factionIndex, factionHeader
- local factionOffset = FauxScrollFrame_GetOffset(_G.ReputationListScrollFrame)
-
- for i = 1, NUM_FACTIONS_DISPLAYED, 1 do
- factionHeader = _G['ReputationHeader'..i]
- factionIndex = factionOffset + i
- if factionIndex <= numFactions then
- if factionHeader.isCollapsed then
- factionHeader:SetNormalTexture(E.Media.Textures.PlusButton)
- else
- factionHeader:SetNormalTexture(E.Media.Textures.MinusButton)
- end
- end
- end
- end)
-
- _G.ReputationListScrollFrame:StripTextures()
- S:HandleScrollBar(_G.ReputationListScrollFrameScrollBar)
-
- _G.ReputationDetailFrame:StripTextures()
- _G.ReputationDetailFrame:SetTemplate('Transparent')
- _G.ReputationDetailFrame:Point('TOPLEFT', _G.ReputationFrame, 'TOPRIGHT', -31, -12)
-
- S:HandleCloseButton(_G.ReputationDetailCloseButton)
- _G.ReputationDetailCloseButton:Point('TOPRIGHT', 2, 2)
-
- S:HandleCheckBox(_G.ReputationDetailAtWarCheckBox)
- S:HandleCheckBox(_G.ReputationDetailInactiveCheckBox)
- S:HandleCheckBox(_G.ReputationDetailMainScreenCheckBox)
-
- -- Skill Frame
- _G.SkillFrame:StripTextures()
-
- _G.SkillFrameExpandButtonFrame:DisableDrawLayer('BACKGROUND')
- _G.SkillFrameCollapseAllButton:GetNormalTexture():Size(15)
- _G.SkillFrameCollapseAllButton:Point('LEFT', _G.SkillFrameExpandTabLeft, 'RIGHT', -40, -3)
-
- _G.SkillFrameCollapseAllButton:SetHighlightTexture(E.ClearTexture)
-
- hooksecurefunc('SkillFrame_UpdateSkills', function()
- if strfind(_G.SkillFrameCollapseAllButton:GetNormalTexture():GetTexture(), 'MinusButton') then
- _G.SkillFrameCollapseAllButton:SetNormalTexture(E.Media.Textures.MinusButton)
- else
- _G.SkillFrameCollapseAllButton:SetNormalTexture(E.Media.Textures.PlusButton)
- end
- end)
-
- S:HandleButton(_G.SkillFrameCancelButton)
-
- for i = 1, _G.SKILLS_TO_DISPLAY do
- local bar = _G['SkillRankFrame'..i]
- local label = _G['SkillTypeLabel'..i]
- local border = _G['SkillRankFrame'..i..'Border']
- local background = _G['SkillRankFrame'..i..'Background']
-
- bar:CreateBackdrop()
- bar:SetStatusBarTexture(E.media.normTex)
- E:RegisterStatusBar(bar)
-
- border:StripTextures()
- background:SetTexture(nil)
-
- label:GetNormalTexture():Size(14)
- label:SetHighlightTexture(E.ClearTexture)
- end
-
- hooksecurefunc('SkillFrame_SetStatusBar', function(statusBarID)
- local skillLine = _G['SkillTypeLabel'..statusBarID]
- if strfind(skillLine:GetNormalTexture():GetTexture(), 'MinusButton') then
- skillLine:SetNormalTexture(E.Media.Textures.MinusButton)
- else
- skillLine:SetNormalTexture(E.Media.Textures.PlusButton)
- end
- end)
-
- _G.SkillListScrollFrame:StripTextures()
- S:HandleScrollBar(_G.SkillListScrollFrameScrollBar)
-
- _G.SkillDetailScrollFrame:StripTextures()
- S:HandleScrollBar(_G.SkillDetailScrollFrameScrollBar)
-
- _G.SkillDetailStatusBar:StripTextures()
- _G.SkillDetailStatusBar:SetParent(_G.SkillDetailScrollFrame)
- _G.SkillDetailStatusBar:CreateBackdrop()
- _G.SkillDetailStatusBar:SetStatusBarTexture(E.media.normTex)
- E:RegisterStatusBar(_G.SkillDetailStatusBar)
-
- S:HandleCloseButton(_G.SkillDetailStatusBarUnlearnButton)
- S:HandleButton(_G.SkillDetailStatusBarUnlearnButton)
- _G.SkillDetailStatusBarUnlearnButton:Size(24)
- _G.SkillDetailStatusBarUnlearnButton:Point('LEFT', _G.SkillDetailStatusBarBorder, 'RIGHT', 5, 0)
- _G.SkillDetailStatusBarUnlearnButton:SetHitRectInsets(0, 0, 0, 0)
-
- -- Honor/Arena/PvP Tab
- local PVPFrame = _G.PVPFrame
- PVPFrame:StripTextures(true)
-
- for i = 1, MAX_ARENA_TEAMS do
- local pvpTeam = _G['PVPTeam'..i]
-
- pvpTeam:StripTextures()
- pvpTeam:CreateBackdrop()
- pvpTeam.backdrop:Point('TOPLEFT', 9, -4)
- pvpTeam.backdrop:Point('BOTTOMRIGHT', -24, 3)
-
- pvpTeam:HookScript('OnEnter', S.SetModifiedBackdrop)
- pvpTeam:HookScript('OnLeave', S.SetOriginalBackdrop)
-
- _G['PVPTeam'..i..'Highlight']:Kill()
- end
-
- local PVPTeamDetails = _G.PVPTeamDetails
- PVPTeamDetails:StripTextures()
- PVPTeamDetails:SetTemplate('Transparent')
- PVPTeamDetails:Point('TOPLEFT', PVPFrame, 'TOPRIGHT', -30, -12)
-
- local PVPFrameToggleButton = _G.PVPFrameToggleButton
- S:HandleNextPrevButton(PVPFrameToggleButton)
- PVPFrameToggleButton:Point('BOTTOMRIGHT', PVPFrame, 'BOTTOMRIGHT', -48, 81)
- PVPFrameToggleButton:Size(14)
-
- for i = 1, 5 do
- local header = _G['PVPTeamDetailsFrameColumnHeader'..i]
- header:StripTextures()
- header:StyleButton()
- end
-
- for i = 1, 10 do
- local button = _G['PVPTeamDetailsButton'..i]
- button:Width(335)
- S:HandleButtonHighlight(button)
- end
-
- S:HandleButton(_G.PVPTeamDetailsAddTeamMember)
- S:HandleNextPrevButton(_G.PVPTeamDetailsToggleButton)
- S:HandleCloseButton(_G.PVPTeamDetailsCloseButton)
-end
-
-S:AddCallback('CharacterFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/CombatLog.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/CombatLog.lua
deleted file mode 100644
index babb6c8fc..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/CombatLog.lua
+++ /dev/null
@@ -1,48 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local ipairs = ipairs
-local hooksecurefunc = hooksecurefunc
-
--- credit: Aftermathh
-function S:Blizzard_CombatLog()
- if E.private.chat.enable ~= true then return end
- -- this is always on with the chat module, it's only handle the top bar in combat log chat frame
-
- local Button = _G.CombatLogQuickButtonFrame_Custom
- Button:StripTextures()
- Button:SetTemplate('Transparent')
-
- local FontContainer = _G.ChatFrame2.FontStringContainer
- if FontContainer then
- local point1, point2 = E.PixelMode and 2 or 1, E.PixelMode and 0 or 1
- Button:ClearAllPoints()
- Button:Point('BOTTOMLEFT', FontContainer, 'TOPLEFT', -point1, point2)
- Button:Point('BOTTOMRIGHT', FontContainer, 'TOPRIGHT', point1, point2)
- end
-
- hooksecurefunc('Blizzard_CombatLog_Update_QuickButtons', function()
- for index in ipairs(_G.Blizzard_CombatLog_Filters.filters) do
- local button = _G['CombatLogQuickButtonFrameButton'..index]
- if button then
- local text = button:GetFontString()
- if text then
- text:FontTemplate(nil, nil, 'OUTLINE')
- end
- end
- end
- end)
-
- local ProgressBar = _G.CombatLogQuickButtonFrame_CustomProgressBar
- ProgressBar:SetStatusBarTexture(E.media.normTex)
- ProgressBar:SetInside(Button)
-
- S:HandleNextPrevButton(_G.CombatLogQuickButtonFrame_CustomAdditionalFilterButton)
-
- _G.CombatLogQuickButtonFrame_CustomAdditionalFilterButton:Size(20, 22)
- _G.CombatLogQuickButtonFrame_CustomAdditionalFilterButton:Point('TOPRIGHT', Button, 'TOPRIGHT', 0, -1)
- _G.CombatLogQuickButtonFrame_CustomTexture:Hide()
-end
-
-S:AddCallbackForAddon('Blizzard_CombatLog')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Communities.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Communities.lua
deleted file mode 100644
index 5bcd83445..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Communities.lua
+++ /dev/null
@@ -1,303 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-local ipairs, select = ipairs, select
-
-local C_CreatureInfo_GetClassInfo = C_CreatureInfo.GetClassInfo
-local BATTLENET_FONT_COLOR = BATTLENET_FONT_COLOR
-local FRIENDS_BNET_BACKGROUND_COLOR = FRIENDS_BNET_BACKGROUND_COLOR
-local FRIENDS_WOW_BACKGROUND_COLOR = FRIENDS_WOW_BACKGROUND_COLOR
-local GREEN_FONT_COLOR = GREEN_FONT_COLOR
-local CreateFrame = CreateFrame
-local hooksecurefunc = hooksecurefunc
-
-local ClubTypeGuild = Enum.ClubType.Guild
-local ClubTypeBattleNet = Enum.ClubType.BattleNet
-
-local function UpdateNames(button)
- if not button.expanded then return end
-
- local memberInfo = button:GetMemberInfo()
- if memberInfo and memberInfo.classID then
- local classInfo = C_CreatureInfo_GetClassInfo(memberInfo.classID)
- if classInfo then
- local tcoords = _G.CLASS_ICON_TCOORDS[classInfo.classFile]
- button.Class:SetTexCoord(tcoords[1] + .022, tcoords[2] - .025, tcoords[3] + .022, tcoords[4] - .025)
- end
- end
-end
-
-local function HandleCommunitiesButtons(button, color)
- button.Background:Hide()
- button.CircleMask:Hide()
- button:SetFrameLevel(button:GetFrameLevel() + 5)
-
- S:HandleIcon(button.Icon)
- button.Icon:ClearAllPoints()
- button.Icon:Point('TOPLEFT', 15, -18)
- button.IconRing:Hide()
-
- if not button.bg then
- button.bg = CreateFrame('Frame', nil, button)
- button.bg:CreateBackdrop('Transparent')
- button.bg:Point('TOPLEFT', 7, -16)
- button.bg:Point('BOTTOMRIGHT', -10, 12)
- end
-
- if button.IconBorder then
- button.IconBorder:Hide()
- end
-
- if color then
- button.Selection:ClearAllPoints()
- button.Selection:SetAllPoints(button.bg)
-
- if color == 1 then
- button.Selection:SetAtlas(nil)
- button.Selection:SetColorTexture(GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, 0.2)
- else
- button.Selection:SetAtlas(nil)
- button.Selection:SetColorTexture(BATTLENET_FONT_COLOR.r, BATTLENET_FONT_COLOR.g, BATTLENET_FONT_COLOR.b, 0.2)
- end
- end
-
- local highlight = button:GetHighlightTexture()
- highlight:SetColorTexture(1, 1, 1, 0.3)
- highlight:SetInside(button.bg)
-end
-
-function S:Blizzard_Communities()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.communities) then return end
-
- local CommunitiesFrame = _G.CommunitiesFrame
- CommunitiesFrame:StripTextures()
- _G.CommunitiesFrameInset.Bg:Hide()
- CommunitiesFrame.CommunitiesList.InsetFrame:StripTextures()
-
- S:HandlePortraitFrame(CommunitiesFrame)
-
- local CommunitiesFrameCommunitiesList = _G.CommunitiesFrameCommunitiesList
- CommunitiesFrameCommunitiesList.FilligreeOverlay:Hide()
- CommunitiesFrameCommunitiesList.Bg:Hide()
- CommunitiesFrameCommunitiesList.TopFiligree:Hide()
- CommunitiesFrameCommunitiesList.BottomFiligree:Hide()
- _G.CommunitiesFrameCommunitiesListListScrollFrame:StripTextures()
-
- hooksecurefunc(_G.CommunitiesListEntryMixin, 'SetClubInfo', function(s, clubInfo, isInvitation, isTicket)
- if clubInfo then
- s.Background:Hide()
- s.CircleMask:Hide()
-
- s.Icon:ClearAllPoints()
- s.Icon:Point('TOPLEFT', 8, -17)
- S:HandleIcon(s.Icon)
- s.IconRing:Hide()
-
- if not s.IconBorder then
- s.IconBorder = s:CreateTexture(nil, 'BORDER')
- s.IconBorder:SetOutside(s.Icon)
- s.IconBorder:Hide()
- end
-
- if not s.bg then
- s.bg = CreateFrame('Frame', nil, s)
- s.bg:CreateBackdrop('Transparent')
- s.bg:Point('TOPLEFT', 7, -16)
- s.bg:Point('BOTTOMRIGHT', -10, 12)
- end
-
- local isGuild = clubInfo.clubType == ClubTypeGuild
- if isGuild then
- s.Background:SetAtlas(nil)
- s.Selection:SetAtlas(nil)
- s.Selection:SetAllPoints(s.bg)
- s.Selection:SetColorTexture(0, 1, 0, 0.2)
- else
- s.Background:SetAtlas(nil)
- s.Selection:SetAtlas(nil)
- s.Selection:SetAllPoints(s.bg)
- s.Selection:SetColorTexture(FRIENDS_BNET_BACKGROUND_COLOR.r, FRIENDS_BNET_BACKGROUND_COLOR.g, FRIENDS_BNET_BACKGROUND_COLOR.b, 0.2)
- end
-
- if not isInvitation and not isGuild and not isTicket then
- if clubInfo.clubType == ClubTypeBattleNet then
- s.IconBorder:SetColorTexture(FRIENDS_BNET_BACKGROUND_COLOR.r, FRIENDS_BNET_BACKGROUND_COLOR.g, FRIENDS_BNET_BACKGROUND_COLOR.b)
- else
- s.IconBorder:SetColorTexture(FRIENDS_WOW_BACKGROUND_COLOR.r, FRIENDS_WOW_BACKGROUND_COLOR.g, FRIENDS_WOW_BACKGROUND_COLOR.b)
- end
- s.IconBorder:Show()
- else
- s.IconBorder:Hide()
- end
-
- local highlight = s:GetHighlightTexture()
- highlight:SetColorTexture(1, 1, 1, 0.3)
- highlight:SetAllPoints(s.bg)
- end
- end)
-
- -- Add Community Button
- hooksecurefunc(_G.CommunitiesListEntryMixin, 'SetAddCommunity', function(s) HandleCommunitiesButtons(s, 1) end)
-
- S:HandleItemButton(CommunitiesFrame.ChatTab)
- CommunitiesFrame.ChatTab:Point('TOPLEFT', '$parent', 'TOPRIGHT', E.PixelMode and 0 or E.Border + E.Spacing, -36)
- S:HandleItemButton(CommunitiesFrame.RosterTab)
-
- S:HandleInsetFrame(CommunitiesFrame.CommunitiesList)
- S:HandleMaxMinFrame(CommunitiesFrame.MaximizeMinimizeFrame)
- CommunitiesFrame.MaximizeMinimizeFrame:ClearAllPoints()
- CommunitiesFrame.MaximizeMinimizeFrame:Point('RIGHT', CommunitiesFrame.CloseButton, 'LEFT', 12, 0)
-
- S:HandleButton(CommunitiesFrame.InviteButton)
- S:HandleNextPrevButton(CommunitiesFrame.AddToChatButton)
-
- S:HandleScrollBar(CommunitiesFrame.MemberList.ListScrollFrame.scrollBar)
- S:HandleScrollBar(CommunitiesFrame.Chat.MessageFrame.ScrollBar)
- S:HandleScrollBar(_G.CommunitiesFrameCommunitiesListListScrollFrame.ScrollBar)
-
- S:HandleDropDownBox(CommunitiesFrame.StreamDropDownMenu)
- S:HandleDropDownBox(CommunitiesFrame.CommunitiesListDropDownMenu)
-
- hooksecurefunc(_G.CommunitiesNotificationSettingsStreamEntryMixin, 'SetFilter', function(s)
- s.ShowNotificationsButton:Size(20, 20)
- s.HideNotificationsButton:Size(20, 20)
- S:HandleCheckBox(s.ShowNotificationsButton)
- S:HandleCheckBox(s.HideNotificationsButton)
- end)
-
- -- Chat Tab
- CommunitiesFrame.MemberList:StripTextures()
- CommunitiesFrame.MemberList.InsetFrame:Hide()
-
- CommunitiesFrame.Chat:StripTextures()
- CommunitiesFrame.Chat.InsetFrame:CreateBackdrop('Transparent')
-
- S:HandleEditBox(CommunitiesFrame.ChatEditBox)
- CommunitiesFrame.ChatEditBox:Size(120, 20)
-
- -- [[ ROSTER TAB ]]
- local MemberList = CommunitiesFrame.MemberList
- local ColumnDisplay = MemberList.ColumnDisplay
- ColumnDisplay:StripTextures()
- ColumnDisplay.InsetBorderLeft:Hide()
- ColumnDisplay.InsetBorderBottomLeft:Hide()
- ColumnDisplay.InsetBorderTopLeft:Hide()
- ColumnDisplay.InsetBorderTop:Hide()
-
- S:HandleInsetFrame(CommunitiesFrame.MemberList.InsetFrame)
- S:HandleButton(CommunitiesFrame.CommunitiesControlFrame.CommunitiesSettingsButton)
- CommunitiesFrame.CommunitiesControlFrame.CommunitiesSettingsButton:Size(129, 19)
- S:HandleCheckBox(CommunitiesFrame.MemberList.ShowOfflineButton)
- CommunitiesFrame.MemberList.ShowOfflineButton:Size(25, 25)
-
- hooksecurefunc(CommunitiesFrame.MemberList, 'RefreshListDisplay', function(s)
- for _, child in next, { s.ColumnDisplay:GetChildren() } do
- child:StripTextures()
- child:CreateBackdrop('Transparent')
- end
-
- for _, button in ipairs(s.ListScrollFrame.buttons or {}) do
- if button and not button.hooked then
- hooksecurefunc(button, 'RefreshExpandedColumns', UpdateNames)
- if button.ProfessionHeader then
- local header = button.ProfessionHeader
- for i = 1, 3 do
- select(i, header:GetRegions()):Hide()
- end
-
- header:CreateBackdrop('Transparent')
- end
-
- button.hooked = true
- end
- if button and button.bg then
- button.bg:SetShown(button.Class:IsShown())
- end
- end
- end)
-
- -- Notification Settings Dialog
- local NotificationSettings = _G.CommunitiesFrame.NotificationSettingsDialog
- NotificationSettings:StripTextures()
- NotificationSettings:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, true)
-
- S:HandleDropDownBox(CommunitiesFrame.NotificationSettingsDialog.CommunitiesListDropDownMenu)
- S:HandleCheckBox(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.QuickJoinButton)
- S:HandleButton(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.AllButton)
- S:HandleButton(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.NoneButton)
- S:HandleButton(CommunitiesFrame.NotificationSettingsDialog.OkayButton)
- S:HandleButton(CommunitiesFrame.NotificationSettingsDialog.CancelButton)
- S:HandleScrollBar(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.ScrollBar) -- Adjust me
-
- -- Create Channel Dialog
- local EditStreamDialog = CommunitiesFrame.EditStreamDialog
- EditStreamDialog:StripTextures()
- EditStreamDialog:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, true)
-
- S:HandleEditBox(EditStreamDialog.NameEdit)
- EditStreamDialog.NameEdit:Size(280, 20)
- S:HandleEditBox(EditStreamDialog.Description)
- S:HandleCheckBox(EditStreamDialog.TypeCheckBox)
-
- S:HandleButton(EditStreamDialog.Accept)
- S:HandleButton(EditStreamDialog.Cancel)
-
- -- Communities Settings
- local Settings = _G.CommunitiesSettingsDialog
- Settings:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, true)
- S:HandleIcon(Settings.IconPreview)
- Settings.IconPreviewRing:Hide()
-
- S:HandleEditBox(Settings.NameEdit)
- S:HandleEditBox(Settings.ShortNameEdit)
- S:HandleEditBox(Settings.Description)
- S:HandleEditBox(Settings.MessageOfTheDay)
-
- S:HandleButton(Settings.ChangeAvatarButton)
- S:HandleButton(Settings.Accept)
- S:HandleButton(Settings.Delete)
- S:HandleButton(Settings.Cancel)
-
- -- Avatar Picker
- local Avatar = _G.CommunitiesAvatarPickerDialog
- Avatar:StripTextures()
- Avatar:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, true)
-
- Avatar.ScrollFrame:StripTextures()
- S:HandleScrollBar(_G.CommunitiesAvatarPickerDialogScrollBar)
-
- S:HandleButton(Avatar.OkayButton)
- S:HandleButton(Avatar.CancelButton)
-
- -- Invite Frame
- local TicketManager = _G.CommunitiesTicketManagerDialog
- TicketManager:StripTextures()
- TicketManager.InviteManager.ArtOverlay:Hide()
- TicketManager.InviteManager.ColumnDisplay:StripTextures()
- TicketManager.InviteManager.ColumnDisplay.InsetBorderLeft:Hide()
- TicketManager.InviteManager.ColumnDisplay.InsetBorderBottomLeft:Hide()
- -- TO DO: Fix the Tabs
- TicketManager.InviteManager.ListScrollFrame:StripTextures()
-
- TicketManager:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, true)
-
- S:HandleButton(TicketManager.LinkToChat)
- S:HandleButton(TicketManager.Copy)
- S:HandleButton(TicketManager.Close)
- S:HandleButton(TicketManager.GenerateLinkButton)
-
- S:HandleDropDownBox(TicketManager.ExpiresDropDownMenu)
- S:HandleDropDownBox(TicketManager.UsesDropDownMenu)
-
- S:HandleScrollBar(TicketManager.InviteManager.ListScrollFrame.scrollBar)
- S:HandleButton(TicketManager.MaximizeButton)
-
- -- Bottom Tabs
- for i = 1, 5 do
- S:HandleTab(_G['CommunitiesFrameTab'..i])
- end
-end
-
-S:AddCallbackForAddon('Blizzard_Communities')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Craft.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Craft.lua
deleted file mode 100644
index 0b4f5dc52..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Craft.lua
+++ /dev/null
@@ -1,190 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, select = unpack, select
-local strfind = strfind
-
-local GetItemInfo = GetItemInfo
-local GetCraftNumReagents = GetCraftNumReagents
-local GetItemQualityColor = GetItemQualityColor
-local GetCraftItemLink = GetCraftItemLink
-local GetCraftReagentInfo = GetCraftReagentInfo
-local GetCraftReagentItemLink = GetCraftReagentItemLink
-local hooksecurefunc = hooksecurefunc
-
--- This is the Hunter Beast Training skin
-function S:SkinCraftFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.craft) then return end
-
- local CraftFrame = _G.CraftFrame
- S:HandleFrame(CraftFrame, true, nil, 11, -12, -32, 76)
-
- local CraftRankFrame = _G.CraftRankFrame
- CraftRankFrame:StripTextures()
- CraftRankFrame:Size(322, 16)
- CraftRankFrame:ClearAllPoints()
- CraftRankFrame:Point('TOP', -10, -45)
- CraftRankFrame:CreateBackdrop()
- CraftRankFrame:SetStatusBarTexture(E.media.normTex)
- CraftRankFrame:SetStatusBarColor(0.13, 0.35, 0.80)
- E:RegisterStatusBar(CraftRankFrame)
-
- _G.CraftRankFrameBorder:StripTextures()
-
- _G.CraftListScrollFrame:StripTextures()
- _G.CraftDetailScrollFrame:StripTextures()
- _G.CraftDetailScrollChildFrame:StripTextures()
-
- S:HandleScrollBar(_G.CraftListScrollFrameScrollBar)
- S:HandleScrollBar(_G.CraftDetailScrollFrameScrollBar)
-
- S:HandleButton(_G.CraftCancelButton)
-
- S:HandleButton(_G.CraftCreateButton)
-
- local CraftFrameAvailableFilterCheckButton = _G.CraftFrameAvailableFilterCheckButton
- S:HandleCheckBox(CraftFrameAvailableFilterCheckButton)
- CraftFrameAvailableFilterCheckButton:ClearAllPoints()
- CraftFrameAvailableFilterCheckButton:Point('LEFT', _G.CraftRankFrameBorder, 'LEFT', 0, -20)
-
- local CraftFrameFilterDropDown = _G.CraftFrameFilterDropDown
- S:HandleDropDownBox(CraftFrameFilterDropDown, 160)
- CraftFrameFilterDropDown:ClearAllPoints()
- CraftFrameFilterDropDown:Point('RIGHT', _G.CraftRankFrameBorder, 'RIGHT', 55, -25)
-
- local CraftIcon = _G.CraftIcon
-
- _G.CraftRequirements:SetTextColor(1, 0.80, 0.10)
-
- S:HandleCloseButton(_G.CraftFrameCloseButton, CraftFrame.backdrop)
-
- _G.CraftExpandButtonFrame:StripTextures()
-
- local CraftCollapseAllButton = _G.CraftCollapseAllButton
- CraftCollapseAllButton:Point('LEFT', _G.CraftExpandTabLeft, 'RIGHT', -8, 5)
- CraftCollapseAllButton:GetNormalTexture():Point('LEFT', 3, 2)
- CraftCollapseAllButton:GetNormalTexture():Size(15)
-
- CraftCollapseAllButton:SetHighlightTexture(E.ClearTexture)
- CraftCollapseAllButton.SetHighlightTexture = E.noop
-
- CraftCollapseAllButton:SetDisabledTexture(E.Media.Textures.MinusButton)
- CraftCollapseAllButton.SetDisabledTexture = E.noop
- CraftCollapseAllButton:GetDisabledTexture():Point('LEFT', 3, 2)
- CraftCollapseAllButton:GetDisabledTexture():Size(15)
- CraftCollapseAllButton:GetDisabledTexture():SetDesaturated(true)
-
- for i = 1, _G.CRAFTS_DISPLAYED do
- local button = _G['Craft'..i]
- local highlight = _G['Craft'..i..'Highlight']
-
- button:GetNormalTexture():Size(14)
- button:GetNormalTexture():Point('LEFT', 4, 1)
-
- highlight:SetTexture('')
- highlight.SetTexture = E.noop
- end
-
- for i = 1, _G.MAX_CRAFT_REAGENTS do
- local icon = _G['CraftReagent'..i..'IconTexture']
- local count = _G['CraftReagent'..i..'Count']
- local nameFrame = _G['CraftReagent'..i..'NameFrame']
-
- S:HandleIcon(icon, true)
- icon:SetDrawLayer('ARTWORK')
- count:SetDrawLayer('OVERLAY')
-
- nameFrame:SetAlpha(0)
- end
-
- _G.CraftReagent1:Point('TOPLEFT', _G.CraftReagentLabel, 'BOTTOMLEFT', -3, -3)
- _G.CraftReagent2:Point('LEFT', _G.CraftReagent1, 'RIGHT', 3, 0)
- _G.CraftReagent4:Point('LEFT', _G.CraftReagent3, 'RIGHT', 3, 0)
- _G.CraftReagent6:Point('LEFT', _G.CraftReagent5, 'RIGHT', 3, 0)
- _G.CraftReagent8:Point('LEFT', _G.CraftReagent7, 'RIGHT', 3, 0)
-
- hooksecurefunc('CraftFrame_Update', function()
- for i = 1, _G.CRAFTS_DISPLAYED do
- local button = _G['Craft'..i]
- local texture = button:GetNormalTexture():GetTexture()
- if texture then
- if strfind(texture, 'MinusButton') then
- button:SetNormalTexture(E.Media.Textures.MinusButton)
- elseif strfind(texture, 'PlusButton') then
- button:SetNormalTexture(E.Media.Textures.PlusButton)
- end
- end
- end
-
- if CraftCollapseAllButton.collapsed then
- CraftCollapseAllButton:SetNormalTexture(E.Media.Textures.PlusButton)
- else
- CraftCollapseAllButton:SetNormalTexture(E.Media.Textures.MinusButton)
- end
- end)
-
- CraftIcon:CreateBackdrop()
-
- hooksecurefunc('CraftFrame_SetSelection', function(id)
- if ( not id ) then
- return
- end
-
- local CraftReagentLabel = _G.CraftReagentLabel
- CraftReagentLabel:Point('TOPLEFT', _G.CraftDescription, 'BOTTOMLEFT', 0, -10)
-
- if CraftIcon:GetNormalTexture() then
- S:HandleIcon(CraftIcon:GetNormalTexture())
- end
-
- CraftIcon:Size(40)
- CraftIcon:Point('TOPLEFT', 2, -3)
-
- local skillLink = GetCraftItemLink(id)
- if skillLink then
- local quality = select(3, GetItemInfo(skillLink))
- if quality and quality > 1 then
- CraftIcon.backdrop:SetBackdropBorderColor(GetItemQualityColor(quality))
- _G.CraftName:SetTextColor(GetItemQualityColor(quality))
- else
- CraftIcon.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.CraftName:SetTextColor(1, 1, 1)
- end
- end
-
- local numReagents = GetCraftNumReagents(id)
- for i = 1, numReagents, 1 do
- local _, _, reagentCount, playerReagentCount = GetCraftReagentInfo(id, i)
- local reagentLink = GetCraftReagentItemLink(id, i)
- local icon = _G['CraftReagent'..i..'IconTexture']
- local name = _G['CraftReagent'..i..'Name']
-
- if reagentLink then
- local quality = select(3, GetItemInfo(reagentLink))
- if quality and quality > 1 then
- icon.backdrop:SetBackdropBorderColor(GetItemQualityColor(quality))
- if playerReagentCount < reagentCount then
- name:SetTextColor(0.5, 0.5, 0.5)
- else
- name:SetTextColor(GetItemQualityColor(quality))
- end
- else
- icon.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
- end
-
- if (numReagents < 5) then
- _G.CraftDetailScrollFrameScrollBar:Hide()
- _G.CraftDetailScrollFrameTop:Hide()
- _G.CraftDetailScrollFrameBottom:Hide()
- else
- _G.CraftDetailScrollFrameScrollBar:Show()
- _G.CraftDetailScrollFrameTop:Show()
- _G.CraftDetailScrollFrameBottom:Show()
- end
- end)
-end
-
-S:AddCallbackForAddon('Blizzard_CraftUI', 'SkinCraftFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Debug.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Debug.lua
deleted file mode 100644
index 0491e7a28..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Debug.lua
+++ /dev/null
@@ -1,116 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-local TT = E:GetModule('Tooltip')
-
-local _G = _G
-local hooksecurefunc = hooksecurefunc
-
-local FrameTexs = {
- 'TopLeft',
- 'TopRight',
- 'Top',
- 'BottomLeft',
- 'BottomRight',
- 'Bottom',
- 'Left',
- 'Right',
- 'TitleBG',
- 'DialogBG',
-}
-
-local function SkinOnShow()
- local ScriptErrorsFrame = _G.ScriptErrorsFrame
- ScriptErrorsFrame:SetParent(E.UIParent)
- ScriptErrorsFrame:CreateBackdrop('Transparent')
- S:HandleScrollBar(_G.ScriptErrorsFrameScrollBar)
- S:HandleCloseButton(_G.ScriptErrorsFrameClose)
- ScriptErrorsFrame.ScrollFrame.Text:FontTemplate(nil, 13)
- ScriptErrorsFrame.ScrollFrame:CreateBackdrop()
- ScriptErrorsFrame.ScrollFrame:SetFrameLevel(ScriptErrorsFrame.ScrollFrame:GetFrameLevel() + 2)
-
- for i=1, #FrameTexs do
- _G['ScriptErrorsFrame'..FrameTexs[i]]:SetTexture()
- end
-
- -- Our Buttons
- if ScriptErrorsFrame.firstButton then
- S:HandleButton(ScriptErrorsFrame.firstButton)
- end
- if ScriptErrorsFrame.lastButton then
- S:HandleButton(ScriptErrorsFrame.lastButton)
- end
-
- -- Default Buttons
- S:HandleButton(ScriptErrorsFrame.Reload)
- S:HandleButton(ScriptErrorsFrame.Close)
- S:HandleNextPrevButton(ScriptErrorsFrame.PreviousError)
- S:HandleNextPrevButton(ScriptErrorsFrame.NextError)
-
- S:Unhook(ScriptErrorsFrame, 'OnShow')
-end
-
-local function SkinTableAttributeDisplay(frame)
- frame:StripTextures()
- frame:CreateBackdrop('Transparent')
- frame.ScrollFrameArt:StripTextures()
- frame.ScrollFrameArt:CreateBackdrop('Transparent')
- S:HandleCloseButton(frame.CloseButton)
- frame.OpenParentButton:ClearAllPoints()
- frame.OpenParentButton:Point('TOPLEFT', frame, 'TOPLEFT', 2, -2)
- S:HandleNextPrevButton(frame.OpenParentButton, 'up')
- frame.OpenParentButton:Size(17)
- frame.DuplicateButton:ClearAllPoints()
- frame.DuplicateButton:Point('LEFT', frame.NavigateForwardButton, 'RIGHT')
- S:HandleCheckBox(frame.VisibilityButton)
- frame.VisibilityButton:Size(28)
- S:HandleCheckBox(frame.HighlightButton)
- frame.HighlightButton:Size(28)
- S:HandleCheckBox(frame.DynamicUpdateButton)
- frame.DynamicUpdateButton:Size(28)
- frame.NavigateBackwardButton:ClearAllPoints()
- frame.NavigateBackwardButton:Point('LEFT', frame.OpenParentButton, 'RIGHT', 2, 0)
- frame.NavigateForwardButton:ClearAllPoints()
- frame.NavigateForwardButton:Point('LEFT', frame.NavigateBackwardButton, 'RIGHT', 2, 0)
- frame.DuplicateButton:ClearAllPoints()
- frame.DuplicateButton:Point('LEFT', frame.NavigateForwardButton, 'RIGHT', 2, 0)
- S:HandleNextPrevButton(frame.DuplicateButton)
- frame.DuplicateButton:Size(17)
- S:HandleNextPrevButton(frame.NavigateBackwardButton)
- S:HandleNextPrevButton(frame.NavigateForwardButton)
- S:HandleEditBox(frame.FilterBox)
- S:HandleScrollBar(frame.LinesScrollFrame.ScrollBar)
-end
-
-function S:ScriptErrorsFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.debug) then return end
-
- S:SecureHookScript(_G.ScriptErrorsFrame, 'OnShow', SkinOnShow)
-end
-
-function S:Blizzard_DebugTools()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.debug) then return end
-
- -- Tooltips
- if E.private.skins.blizzard.tooltip then
- TT:SetStyle(_G.FrameStackTooltip)
- end
-
- --New Table Attribute Display: mouse over frame and (/tableinspect or [/fstack -> then Ctrl])
- SkinTableAttributeDisplay(_G.TableAttributeDisplay)
- hooksecurefunc(_G.TableInspectorMixin, 'OnLoad', function(s)
- if s and s.ScrollFrameArt and not s.skinned then
- SkinTableAttributeDisplay(s)
- s.skinned = true
- end
- end)
-end
-
--- ScriptErrorsFrame Skin
-S:AddCallback('ScriptErrorsFrame')
-
--- FrameStack, TableInspect Skins
-if _G.IsAddOnLoaded('Blizzard_DebugTools') then
- S:AddCallback('Blizzard_DebugTools')
-else
- S:AddCallbackForAddon('Blizzard_DebugTools')
-end
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/DressingRoom.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/DressingRoom.lua
deleted file mode 100644
index d6205fbf1..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/DressingRoom.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:DressUpFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.dressingroom) then return end
-
- local DressUpFrame = _G.DressUpFrame
- S:HandleFrame(DressUpFrame, true, nil, 11, -12, -32, 76)
-
- DressUpFrame.BGBottomLeft:SetDesaturated(true)
- DressUpFrame.BGBottomRight:SetDesaturated(true)
- DressUpFrame.BGTopLeft:SetDesaturated(true)
- DressUpFrame.BGTopRight:SetDesaturated(true)
-
- _G.DressUpFrameDescriptionText:Point('CENTER', _G.DressUpFrameTitleText, 'BOTTOM', -5, -22)
-
- S:HandleCloseButton(_G.DressUpFrameCloseButton, DressUpFrame.backdrop)
-
- S:HandleRotateButton(_G.DressUpModelFrameRotateLeftButton)
- _G.DressUpModelFrameRotateLeftButton:Point('TOPLEFT', DressUpFrame, 25, -79)
- S:HandleRotateButton(_G.DressUpModelFrameRotateRightButton)
- _G.DressUpModelFrameRotateRightButton:Point('TOPLEFT', _G.DressUpModelFrameRotateLeftButton, 'TOPRIGHT', 3, 0)
-
- S:HandleButton(_G.DressUpFrameCancelButton)
- _G.DressUpFrameCancelButton:Point('BOTTOMRIGHT', -35, 80)
- S:HandleButton(_G.DressUpFrameResetButton)
- _G.DressUpFrameResetButton:Point('RIGHT', _G.DressUpFrameCancelButton, 'LEFT', -3, 0)
-
- S:HandleFrame(_G.DressUpModelFrame, true, nil, -2, 1, 0, 19)
-end
-
-S:AddCallback('DressUpFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/EventTrace.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/EventTrace.lua
deleted file mode 100644
index 1c53c8dbd..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/EventTrace.lua
+++ /dev/null
@@ -1,141 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-local pairs = pairs
-local unpack = unpack
-local hooksecurefunc = hooksecurefunc
-
-local function ReskinEventTraceButton(button)
- S:HandleButton(button)
- button.NormalTexture:SetAlpha(0)
- button.MouseoverOverlay:SetAlpha(0)
-end
-
-local function reskinScrollChild(self)
- for _, child in next, { self.ScrollTarget:GetChildren() } do
- local button = child.HideButton
- if button and not button.IsSkinned then
- S:HandleCloseButton(button)
-
- button:ClearAllPoints()
- button:SetPoint('LEFT', 3, 0)
-
- local checkButton = child.CheckButton
- if checkButton then
- S:HandleCheckBox(checkButton)
- checkButton:SetSize(22, 22)
- end
-
- button.IsSkinned = true
- end
- end
-end
-
-local function ReskinEventTraceScrollBox(frame)
- frame:DisableDrawLayer('BACKGROUND')
- frame:CreateBackdrop('Transparent')
- hooksecurefunc(frame, 'Update', reskinScrollChild)
-end
-
-local function ReskinScrollBarArrow(frame, direction)
- S:HandleNextPrevButton(frame, direction)
- frame.Overlay:SetAlpha(0)
- frame.Texture:Hide()
-end
-
-local function ReskinEventTraceScrollBar(frame)
- frame.Background:Hide()
- frame:StripTextures()
-
- local track = frame.Track
- track:SetTemplate('Transparent')
- track:ClearAllPoints()
- track:SetPoint('TOPLEFT', 4, -21)
- track:SetPoint('BOTTOMRIGHT', -3, 21)
-
- local thumb = track.Thumb
- thumb.Middle:Hide()
- thumb.Begin:Hide()
- thumb.End:Hide()
-
- thumb:SetTemplate(nil, true, true)
- thumb:SetBackdropColor(unpack(E.media.rgbvaluecolor))
-
- ReskinScrollBarArrow(frame.Back, 'up')
- ReskinScrollBarArrow(frame.Forward, 'down')
-end
-
-local function ReskinEventTraceFrame(frame)
- ReskinEventTraceScrollBox(frame.ScrollBox)
- ReskinEventTraceScrollBar(frame.ScrollBar)
-end
-
-function S:Blizzard_EventTrace()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.eventLog) then return end
-
- -- Frame
- local EventTrace = _G.EventTrace
- EventTrace:StripTextures()
- EventTrace:CreateBackdrop('Transparent')
- S:HandleCloseButton(_G.EventTraceCloseButton)
-
- _G.EventTraceTooltip:SetFrameLevel(10)
-
- -- Top Buttons
- local SubtitleBar = EventTrace.SubtitleBar
- EventTrace.SubtitleBar.ViewLog:StripTextures()
- EventTrace.SubtitleBar.ViewFilter:StripTextures()
- S:HandleButton(EventTrace.SubtitleBar.ViewLog)
- S:HandleButton(EventTrace.SubtitleBar.ViewFilter)
-
- -- Options Dropdown
- local OptionsDropDown = EventTrace.SubtitleBar.OptionsDropDown
- OptionsDropDown:SetWidth(135)
- S:HandleButton(OptionsDropDown)
-
- -- Log Bar
- local LogBar = EventTrace.Log.Bar
- S:HandleEditBox(LogBar.SearchBox)
- LogBar.SearchBox:SetHeight(18)
- LogBar.DiscardAllButton:StripTextures()
- LogBar.PlaybackButton:StripTextures()
- LogBar.MarkButton:StripTextures()
- S:HandleButton(LogBar.DiscardAllButton)
- S:HandleButton(LogBar.PlaybackButton)
- S:HandleButton(LogBar.MarkButton)
-
- -- Filter Bar
- local FilterBar = EventTrace.Filter.Bar
- FilterBar.DiscardAllButton:StripTextures()
- FilterBar.UncheckAllButton:StripTextures()
- FilterBar.CheckAllButton:StripTextures()
- S:HandleButton(FilterBar.DiscardAllButton)
- S:HandleButton(FilterBar.UncheckAllButton)
- S:HandleButton(FilterBar.CheckAllButton)
-
- -- Resize Button
- EventTrace.ResizeButton:SetAlpha(0)
-
- ReskinEventTraceFrame(EventTrace.Log.Events)
- ReskinEventTraceFrame(EventTrace.Log.Search)
- ReskinEventTraceFrame(EventTrace.Filter)
-
- local buttons = {
- SubtitleBar.ViewLog,
- SubtitleBar.ViewFilter,
- LogBar.DiscardAllButton,
- LogBar.PlaybackButton,
- LogBar.MarkButton,
- FilterBar.DiscardAllButton,
- FilterBar.UncheckAllButton,
- FilterBar.CheckAllButton,
- }
-
- for _, button in pairs(buttons) do
- ReskinEventTraceButton(button)
- end
-end
-
-S:AddCallbackForAddon('Blizzard_EventTrace')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Friends.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Friends.lua
deleted file mode 100644
index 659321080..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Friends.lua
+++ /dev/null
@@ -1,534 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local pairs = pairs
-
-local BNConnected = BNConnected
-local BNFeaturesEnabled = BNFeaturesEnabled
-local GetGuildRosterInfo = GetGuildRosterInfo
-local GetNumSubgroupMembers = GetNumSubgroupMembers
-local GetQuestDifficultyColor = GetQuestDifficultyColor
-local hooksecurefunc = hooksecurefunc
-
-local GUILDMEMBERS_TO_DISPLAY = GUILDMEMBERS_TO_DISPLAY
-local C_FriendList_GetNumWhoResults = C_FriendList.GetNumWhoResults
-local C_FriendList_GetWhoInfo = C_FriendList.GetWhoInfo
-
-local function skinFriendRequest(frame)
- if frame.isSkinned then return end
- S:HandleButton(frame.DeclineButton, nil, true)
- S:HandleButton(frame.AcceptButton)
- frame.isSkinned = true
-end
-
-local function SkinPlusMinus(button, minus)
- local texture = E.Media.Textures.PlusButton
- if minus then
- texture = E.Media.Textures.MinusButton
- end
-
- button:SetNormalTexture(texture)
- button.SetNormalTexture = E.noop
-
- button:SetPushedTexture(texture)
- button.SetPushedTexture = E.noop
-
- button:SetHighlightTexture(E.ClearTexture)
- button.SetHighlightTexture = E.noop
-
- button:SetDisabledTexture(texture)
- button.SetDisabledTexture = E.noop
- button:GetDisabledTexture():SetDesaturated(true)
-end
-
-function S:FriendsFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.friends) then return end
-
- -- Friends Frame
- local FriendsFrame = _G.FriendsFrame
- S:HandleFrame(FriendsFrame, true, nil, -5, 0, -2)
-
- _G.FriendsFrameCloseButton:Point('TOPRIGHT', 0, 2)
-
- S:HandleDropDownBox(_G.FriendsFrameStatusDropDown, 72)
- S:HandlePointXY(_G.FriendsFrameStatusDropDown, 266, -55)
-
- for i = 1, #_G.FRIENDSFRAME_SUBFRAMES do
- S:HandleTab(_G['FriendsFrameTab'..i])
- end
-
- -- Friends List Frame
- for i = 1, _G.FRIEND_HEADER_TAB_IGNORE do
- local tab = _G['FriendsTabHeaderTab'..i]
- S:HandleFrame(tab, true, nil, 3, -7, -2, -1)
-
- tab:HookScript('OnEnter', S.SetModifiedBackdrop)
- tab:HookScript('OnLeave', S.SetOriginalBackdrop)
- end
-
- for i = 1, _G.FRIENDS_FRIENDS_TO_DISPLAY do
- local button = 'FriendsFrameFriendsScrollFrameButton'..i
-
- _G[button..'SummonButtonIcon']:SetTexCoord(unpack(E.TexCoords))
- _G[button..'SummonButtonNormalTexture']:SetAlpha(0)
- _G[button..'SummonButton']:StyleButton()
- _G[button].highlight:SetTexture(E.Media.Textures.Highlight)
- _G[button].highlight:SetAlpha(0.35)
- end
-
- for i = 1, _G.FRIENDS_FRIENDS_TO_DISPLAY do
- S:HandleButtonHighlight(_G['FriendsFriendsButton'..i])
- end
-
- S:HandleScrollBar(_G.FriendsFrameFriendsScrollFrameScrollBar)
-
- S:HandleButton(_G.AddFriendEntryFrameAcceptButton)
- S:HandleButton(_G.AddFriendEntryFrameCancelButton)
- S:HandleButton(_G.FriendsFrameAddFriendButton)
- S:HandleButton(_G.FriendsFrameSendMessageButton)
- S:HandleButton(_G.FriendsFrameUnsquelchButton)
-
- S:HandlePointXY(_G.FriendsFrameAddFriendButton, -1, 4)
-
- -- Battle.net
- local FriendsFrameBattlenetFrame = _G.FriendsFrameBattlenetFrame
- FriendsFrameBattlenetFrame:StripTextures()
- FriendsFrameBattlenetFrame:GetRegions():Hide()
-
- FriendsFrameBattlenetFrame.UnavailableInfoFrame:Point('TOPLEFT', FriendsFrame, 'TOPRIGHT', 1, -18)
-
- FriendsFrameBattlenetFrame.Tag:SetParent(_G.FriendsListFrame)
- FriendsFrameBattlenetFrame.Tag:Point('TOP', FriendsFrame, 'TOP', 0, -8)
-
- local FriendsFrameBroadcastInput = _G.FriendsFrameBroadcastInput
- FriendsFrameBroadcastInput:CreateBackdrop()
- FriendsFrameBroadcastInput:Width(250)
- FriendsFrameBroadcastInput:Point('TOPLEFT', 22, -32)
- FriendsFrameBroadcastInput:Point('TOPRIGHT', -9, -32)
-
- _G.FriendsFrameBroadcastInputLeft:Kill()
- _G.FriendsFrameBroadcastInputRight:Kill()
- _G.FriendsFrameBroadcastInputMiddle:Kill()
-
- hooksecurefunc('FriendsFrame_CheckBattlenetStatus', function()
- if BNFeaturesEnabled() then
-
- FriendsFrameBattlenetFrame.BroadcastButton:Hide()
-
- if BNConnected() then
- FriendsFrameBattlenetFrame:Hide()
- _G.FriendsFrameBroadcastInput:Show()
- _G.FriendsFrameBroadcastInput_UpdateDisplay()
- end
- end
- end)
-
- _G.FriendsFrame_CheckBattlenetStatus()
-
- hooksecurefunc('FriendsFrame_Update', function()
- if FriendsFrame.selectedTab == 1 and _G.FriendsTabHeader.selectedTab == 1 and _G.FriendsFrameBattlenetFrame.Tag:IsShown() then
- _G.FriendsFrameTitleText:Hide()
- else
- _G.FriendsFrameTitleText:Show()
- end
- end)
-
- S:HandleEditBox(_G.AddFriendNameEditBox)
-
- _G.AddFriendFrame:SetTemplate('Transparent')
-
- -- Pending invites
- _G.FriendsFrameFriendsScrollFrame:StripTextures()
-
- S:HandleButton(_G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton, true)
-
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton:SetScript('OnMouseUp', nil)
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton:SetScript('OnMouseDown', nil)
-
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.RightArrow:SetTexture(E.Media.Textures.ArrowUp)
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.RightArrow:SetRotation(S.ArrowRotation['right'])
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.DownArrow:SetTexture(E.Media.Textures.ArrowUp)
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.DownArrow:SetRotation(S.ArrowRotation['down'])
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.RightArrow:SetPoint('LEFT', 11, 0)
- _G.FriendsFrameFriendsScrollFrame.PendingInvitesHeaderButton.DownArrow:SetPoint('TOPLEFT', 8, -10)
- hooksecurefunc(_G.FriendsFrameFriendsScrollFrame.invitePool, 'Acquire', function()
- for object in pairs(_G.FriendsFrameFriendsScrollFrame.invitePool.activeObjects) do
- skinFriendRequest(object)
- end
- end)
-
- S:HandleFrame(_G.FriendsFriendsFrame, true)
-
- _G.FriendsFriendsList:StripTextures()
- _G.IgnoreListFrame:StripTextures()
-
- S:HandleButton(_G.FriendsFriendsCloseButton)
- S:HandleButton(_G.FriendsFriendsSendRequestButton)
-
- S:HandleEditBox(_G.FriendsFriendsList)
-
- S:HandleScrollBar(_G.FriendsFriendsScrollFrameScrollBar)
-
- S:HandleDropDownBox(_G.FriendsFriendsFrameDropDown, 150)
-
- -- Ignore List Frame
- _G.IgnoreListFrame:StripTextures()
-
- S:HandleButton(_G.FriendsFrameIgnorePlayerButton, true)
- S:HandleButton(_G.FriendsFrameUnsquelchButton, true)
-
- S:HandleScrollBar(_G.FriendsFrameIgnoreScrollFrameScrollBar)
-
- -- Who Frame
- _G.WhoFrameListInset:StripTextures()
- _G.WhoFrameEditBoxInset:StripTextures()
- _G.WhoListScrollFrame:StripTextures()
-
- for i = 1, 4 do
- local header = _G['WhoFrameColumnHeader'..i]
- header:StripTextures()
- header:StyleButton()
- header:ClearAllPoints()
- end
-
- _G.WhoFrameColumnHeader1:Point('LEFT', _G.WhoFrameColumnHeader4, 'RIGHT', -2, 0)
- _G.WhoFrameColumn_SetWidth(_G.WhoFrameColumnHeader1, 105)
- _G.WhoFrameColumnHeader2:Point('LEFT', _G.WhoFrameColumnHeader1, 'RIGHT', -5, 0)
- _G.WhoFrameColumnHeader3:Point('TOPLEFT', _G.WhoFrame, 'TOPLEFT', 8, -57)
- _G.WhoFrameColumnHeader4:Point('LEFT', _G.WhoFrameColumnHeader3, 'RIGHT', -2, 0)
- _G.WhoFrameColumn_SetWidth(_G.WhoFrameColumnHeader4, 50)
-
- _G.WhoFrameButton1:Point('TOPLEFT', 10, -82)
-
- S:HandleEditBox(_G.WhoFrameEditBox)
- _G.WhoFrameEditBox:Point('BOTTOM', -3, 29)
- _G.WhoFrameEditBox:Size(332, 18)
-
- S:HandleButton(_G.WhoFrameWhoButton)
- _G.WhoFrameWhoButton:Point('RIGHT', _G.WhoFrameAddFriendButton, 'LEFT', -2, 0)
- _G.WhoFrameWhoButton:Width(90)
-
- S:HandleButton(_G.WhoFrameAddFriendButton)
- _G.WhoFrameAddFriendButton:Point('RIGHT', _G.WhoFrameGroupInviteButton, 'LEFT', -2, 0)
-
- S:HandleButton(_G.WhoFrameGroupInviteButton)
- _G.WhoFrameGroupInviteButton:Point('BOTTOMRIGHT', -6, 4)
-
- S:HandleDropDownBox(_G.WhoFrameDropDown)
- _G.WhoFrameDropDown:Point('TOPLEFT', -6, 4)
-
- S:HandleScrollBar(_G.WhoListScrollFrameScrollBar, 3)
- _G.WhoListScrollFrameScrollBar:ClearAllPoints()
- _G.WhoListScrollFrameScrollBar:Point('TOPRIGHT', _G.WhoListScrollFrame, 'TOPRIGHT', 26, -13)
- _G.WhoListScrollFrameScrollBar:Point('BOTTOMRIGHT', _G.WhoListScrollFrame, 'BOTTOMRIGHT', 0, 18)
-
- for i = 1, _G.WHOS_TO_DISPLAY do
- local button = _G['WhoFrameButton'..i]
- local level = _G['WhoFrameButton'..i..'Level']
- local name = _G['WhoFrameButton'..i..'Name']
- local class = _G['WhoFrameButton'..i..'Class']
-
- button.icon = button:CreateTexture('$parentIcon', 'ARTWORK')
- button.icon:Point('LEFT', 45, 0)
- button.icon:Size(15)
- button.icon:SetTexture([[Interface\WorldStateFrame\Icons-Classes]])
-
- button:CreateBackdrop(nil, true)
- button.backdrop:SetAllPoints(button.icon)
- S:HandleButtonHighlight(button)
-
- level:ClearAllPoints()
- level:SetPoint('TOPLEFT', 11, -1)
-
- name:SetSize(100, 14)
- name:ClearAllPoints()
- name:SetPoint('LEFT', 85, 0)
-
- class:Hide()
- end
-
- hooksecurefunc('WhoList_Update', function()
- local numWhos = C_FriendList_GetNumWhoResults()
- if numWhos == 0 then return end
-
- if numWhos > _G.WHOS_TO_DISPLAY then
- numWhos = _G.WHOS_TO_DISPLAY
- end
-
- local playerZone = E.MapInfo.realZoneText
- local classTextColor, levelTextColor
-
- for i = 1, numWhos do
- local button = _G['WhoFrameButton'..i]
- local info = C_FriendList_GetWhoInfo(button.whoIndex)
-
- if info.filename then
- classTextColor = E:ClassColor(info.filename)
- button.icon:Show()
- button.icon:SetTexCoord(unpack(_G.CLASS_ICON_TCOORDS[info.filename]))
- else
- classTextColor = _G.HIGHLIGHT_FONT_COLOR
- button.icon:Hide()
- end
-
- levelTextColor = GetQuestDifficultyColor(info.level)
-
- _G['WhoFrameButton'..i..'Name']:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b)
- _G['WhoFrameButton'..i..'Level']:SetTextColor(levelTextColor.r, levelTextColor.g, levelTextColor.b)
- _G['WhoFrameButton'..i..'Class']:SetTextColor(1, 1, 1)
-
- if info.area == playerZone then
- _G['WhoFrameButton'..i..'Variable']:SetTextColor(0, 1, 0)
- else
- _G['WhoFrameButton'..i..'Variable']:SetTextColor(1, 1, 1)
- end
- end
- end)
-
- -- Guild Frame
- _G.GuildFrame:StripTextures()
-
- _G.GuildFrameColumnHeader3:ClearAllPoints()
- _G.GuildFrameColumnHeader3:Point('TOPLEFT', 8, -57)
-
- _G.GuildFrameColumnHeader4:ClearAllPoints()
- _G.GuildFrameColumnHeader4:Point('LEFT', _G.GuildFrameColumnHeader3, 'RIGHT', -2, -0)
- _G.GuildFrameColumnHeader4:Width(50)
-
- _G.GuildFrameColumnHeader1:ClearAllPoints()
- _G.GuildFrameColumnHeader1:Point('LEFT', _G.GuildFrameColumnHeader4, 'RIGHT', -2, -0)
- _G.GuildFrameColumnHeader1:Width(105)
-
- _G.GuildFrameColumnHeader2:ClearAllPoints()
- _G.GuildFrameColumnHeader2:Point('LEFT', _G.GuildFrameColumnHeader1, 'RIGHT', -2, -0)
- _G.GuildFrameColumnHeader2:Width(127)
-
- for i = 1, _G.GUILDMEMBERS_TO_DISPLAY do
- local button = _G['GuildFrameButton'..i]
- local level = _G['GuildFrameButton'..i..'Level']
- local name = _G['GuildFrameButton'..i..'Name']
- local class = _G['GuildFrameButton'..i..'Class']
- local statusButton = _G['GuildFrameGuildStatusButton'..i]
- local statusName = _G['GuildFrameGuildStatusButton'..i..'Name']
-
- button.icon = button:CreateTexture('$parentIcon', 'ARTWORK')
- button.icon:Point('LEFT', 48, 0)
- button.icon:Size(15)
- button.icon:SetTexture([[Interface\WorldStateFrame\Icons-Classes]])
-
- button:CreateBackdrop(nil, true)
- button.backdrop:SetAllPoints(button.icon)
-
- S:HandleButtonHighlight(button)
- S:HandleButtonHighlight(statusButton)
-
- level:ClearAllPoints()
- level:SetPoint('TOPLEFT', 10, -1)
-
- name:SetSize(100, 14)
- name:ClearAllPoints()
- name:SetPoint('LEFT', 85, 0)
-
- class:Hide()
-
- statusName:ClearAllPoints()
- statusName:SetPoint('LEFT', 10, 0)
- end
-
- hooksecurefunc('GuildStatus_Update', function()
- if FriendsFrame.playerStatusFrame then
- local playerZone = E.MapInfo.realZoneText
-
- for i = 1, GUILDMEMBERS_TO_DISPLAY do
- local button = _G['GuildFrameButton'..i]
- local _, _, _, level, class, zone, _, _, online = GetGuildRosterInfo(button.guildIndex)
-
- local classFileName = E:UnlocalizedClassName(class)
- if classFileName then
- if online then
- local classTextColor = E:ClassColor(classFileName)
- local levelTextColor = GetQuestDifficultyColor(level)
-
- _G['GuildFrameButton'..i..'Name']:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b)
- _G['GuildFrameButton'..i..'Level']:SetTextColor(levelTextColor.r, levelTextColor.g, levelTextColor.b)
-
- if zone == playerZone then
- _G['GuildFrameButton'..i..'Zone']:SetTextColor(0, 1, 0)
- else
- _G['GuildFrameButton'..i..'Zone']:SetTextColor(1, 1, 1)
- end
- end
-
- button.icon:SetTexCoord(unpack(_G.CLASS_ICON_TCOORDS[classFileName]))
- end
- end
- else
- for i = 1, _G.GUILDMEMBERS_TO_DISPLAY, 1 do
- local button = _G['GuildFrameGuildStatusButton'..i]
- local _, _, _, _, class, _, _, _, online = GetGuildRosterInfo(button.guildIndex)
-
- local classFileName = online and E:UnlocalizedClassName(class)
- if classFileName then
- local classTextColor = E:ClassColor(classFileName)
- _G['GuildFrameGuildStatusButton'..i..'Name']:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b)
- _G['GuildFrameGuildStatusButton'..i..'Online']:SetTextColor(1, 1, 1)
- end
- end
- end
- end)
-
- S:HandleFrame(_G.GuildFrameLFGFrame, true)
- S:HandleCheckBox(_G.GuildFrameLFGButton)
-
- for i = 1, 4 do
- _G['GuildFrameColumnHeader'..i]:StripTextures()
- _G['GuildFrameColumnHeader'..i]:StyleButton()
- _G['GuildFrameGuildStatusColumnHeader'..i]:StripTextures()
- _G['GuildFrameGuildStatusColumnHeader'..i]:StyleButton()
- end
-
- _G.GuildListScrollFrame:StripTextures()
- S:HandleScrollBar(_G.GuildListScrollFrameScrollBar)
-
- S:HandleNextPrevButton(_G.GuildFrameGuildListToggleButton, 'left')
-
- S:HandleButton(_G.GuildFrameGuildInformationButton)
- _G.GuildFrameGuildInformationButton:Point('BOTTOMLEFT', -1, 4)
- S:HandleButton(_G.GuildFrameAddMemberButton)
- S:HandleButton(_G.GuildFrameControlButton)
-
- -- Member Detail Frame
- _G.GuildMemberDetailFrame:StripTextures()
- _G.GuildMemberDetailFrame:CreateBackdrop('Transparent')
- _G.GuildMemberDetailFrame:Point('TOPLEFT', _G.GuildFrame, 'TOPRIGHT', 3, -1)
-
- S:HandleCloseButton(_G.GuildMemberDetailCloseButton, _G.GuildMemberDetailFrame.backdrop)
-
- S:HandleButton(_G.GuildMemberRemoveButton)
- _G.GuildMemberRemoveButton:Point('BOTTOMLEFT', 3, 3)
-
- S:HandleButton(_G.GuildMemberGroupInviteButton)
- _G.GuildMemberGroupInviteButton:Point('BOTTOMRIGHT', -3, 3)
-
- S:HandleNextPrevButton(_G.GuildFramePromoteButton, 'up')
- _G.GuildFramePromoteButton:SetHitRectInsets(0, 0, 0, 0)
- _G.GuildFramePromoteButton:SetPoint('TOPLEFT', _G.GuildMemberDetailFrame, 'TOPLEFT', 155, -68)
-
- S:HandleNextPrevButton(_G.GuildFrameDemoteButton)
- _G.GuildFrameDemoteButton:SetHitRectInsets(0, 0, 0, 0)
- _G.GuildFrameDemoteButton:Point('LEFT', _G.GuildFramePromoteButton, 'RIGHT', 2, 0)
-
- _G.GuildMemberNoteBackground:StripTextures()
- _G.GuildMemberNoteBackground:CreateBackdrop()
- _G.GuildMemberNoteBackground.backdrop:Point('TOPLEFT', 0, -2)
- _G.GuildMemberNoteBackground.backdrop:Point('BOTTOMRIGHT', 0, 2)
-
- _G.PersonalNoteText:Point('TOPLEFT', 4, -4)
- _G.PersonalNoteText:Width(197)
-
- _G.GuildMemberOfficerNoteBackground:StripTextures()
- _G.GuildMemberOfficerNoteBackground:CreateBackdrop()
- _G.GuildMemberOfficerNoteBackground.backdrop:Point('TOPLEFT', 0, -2)
- _G.GuildMemberOfficerNoteBackground.backdrop:Point('BOTTOMRIGHT', 0, -1)
-
- _G.GuildFrameNotesLabel:Point('TOPLEFT', _G.GuildFrame, 'TOPLEFT', 6, -328)
- _G.GuildFrameNotesText:Point('TOPLEFT', _G.GuildFrameNotesLabel, 'BOTTOMLEFT', 0, -6)
-
- _G.GuildFrameBarLeft:StripTextures()
-
- _G.GuildMOTDEditButton:CreateBackdrop()
- _G.GuildMOTDEditButton.backdrop:Point('TOPLEFT', -7, 3)
- _G.GuildMOTDEditButton.backdrop:Point('BOTTOMRIGHT', 7, -2)
- _G.GuildMOTDEditButton:SetHitRectInsets(-7, -7, -3, -2)
-
- -- Info Frame
- _G.GuildInfoFrame:StripTextures()
- _G.GuildInfoFrame:CreateBackdrop('Transparent')
- _G.GuildInfoFrame:Point('TOPLEFT', _G.GuildFrame, 'TOPRIGHT', -1, 6)
- _G.GuildInfoFrame.backdrop:Point('TOPLEFT', 3, -6)
- _G.GuildInfoFrame.backdrop:Point('BOTTOMRIGHT', -2, 3)
-
- _G.GuildInfoTextBackground.NineSlice:SetTemplate('Transparent')
- S:HandleScrollBar(_G.GuildInfoFrameScrollFrameScrollBar)
- S:HandleCloseButton(_G.GuildInfoCloseButton, _G.GuildInfoFrame.backdrop)
-
- S:HandleButton(_G.GuildInfoSaveButton)
- S:HandleButton(_G.GuildInfoCancelButton)
-
- _G.GuildInfoCancelButton:ClearAllPoints()
- _G.GuildInfoCancelButton:Point('BOTTOMRIGHT', _G.GuildInfoFrame, -10, 8)
-
- _G.GuildInfoSaveButton:ClearAllPoints()
- _G.GuildInfoSaveButton:Point('RIGHT', _G.GuildInfoCancelButton, 'LEFT', -4, 0)
-
- -- Control Frame
- _G.GuildControlPopupFrame:StripTextures()
- _G.GuildControlPopupFrame:CreateBackdrop('Transparent')
- _G.GuildControlPopupFrame.backdrop:Point('TOPLEFT', 3, 0)
-
- S:HandleDropDownBox(_G.GuildControlPopupFrameDropDown, 185)
- _G.GuildControlPopupFrameDropDownButton:Size(18)
-
- SkinPlusMinus(_G.GuildControlPopupFrameAddRankButton)
- _G.GuildControlPopupFrameAddRankButton:Point('LEFT', _G.GuildControlPopupFrameDropDown, 'RIGHT', -8, 3)
-
- SkinPlusMinus(_G.GuildControlPopupFrameRemoveRankButton, true)
- _G.GuildControlPopupFrameRemoveRankButton:Point('LEFT', _G.GuildControlPopupFrameAddRankButton, 'RIGHT', 4, 0)
-
- _G.GuildControlPopupFrameEditBox:StripTextures()
-
- S:HandleEditBox(_G.GuildControlPopupFrameEditBox)
- _G.GuildControlPopupFrameEditBox.backdrop:Point('TOPLEFT', 0, -5)
- _G.GuildControlPopupFrameEditBox.backdrop:Point('BOTTOMRIGHT', 0, 5)
-
- for _, CheckBox in pairs({ _G.GuildControlPopupFrameCheckboxes:GetChildren()}) do
- if CheckBox:IsObjectType("CheckButton") then
- S:HandleCheckBox(CheckBox)
- end
- end
-
- S:HandleButton(_G.GuildControlPopupAcceptButton)
- S:HandleButton(_G.GuildControlPopupFrameCancelButton)
-
- _G.GuildControlPopupFrameTabPermissions:StripTextures()
-
- -- Raid Frame
- S:HandleButton(_G.RaidFrameConvertToRaidButton)
- _G.RaidFrameConvertToRaidButton:Point('BOTTOMRIGHT', -6, 4)
- S:HandleButton(_G.RaidFrameRaidInfoButton)
-
- S:HandleCheckBox(_G.RaidFrameAllAssistCheckButton)
-
- for i = 1, _G.MAX_GUILDBANK_TABS do
- _G['GuildBankTabPermissionsTab'..i]:StripTextures()
- end
-
- S:HandleEditBox(_G.GuildControlWithdrawGoldEditBox)
- S:HandleEditBox(_G.GuildControlWithdrawItemsEditBox)
- _G.GuildControlWithdrawGoldEditBox:Height(20)
- _G.GuildControlWithdrawItemsEditBox:Height(20)
- S:HandleCheckBox(_G.GuildControlTabPermissionsViewTab)
- S:HandleCheckBox(_G.GuildControlTabPermissionsDepositItems)
- S:HandleCheckBox(_G.GuildControlTabPermissionsUpdateText)
-
- -- Raid Info Frame
- _G.RaidInfoFrame:StripTextures(true)
- _G.RaidInfoFrame:CreateBackdrop('Transparent')
-
- _G.RaidInfoFrame:HookScript('OnShow', function()
- if GetNumSubgroupMembers() > 0 then
- _G.RaidInfoFrame:Point('TOPLEFT', _G.RaidFrame, 'TOPRIGHT', 0, 0)
- else
- _G.RaidInfoFrame:Point('TOPLEFT', _G.RaidFrame, 'TOPRIGHT', 0, 0)
- end
- end)
-
- S:HandleCloseButton(_G.RaidInfoCloseButton, _G.RaidInfoFrame)
-
- _G.RaidInfoScrollFrame:StripTextures()
- S:HandleScrollBar(_G.RaidInfoScrollFrameScrollBar)
-end
-
-S:AddCallback('FriendsFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Gossip.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Gossip.lua
deleted file mode 100644
index f2ddbf5c0..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Gossip.lua
+++ /dev/null
@@ -1,119 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local strmatch = strmatch
-local gsub, pairs = gsub, pairs
-local IsQuestComplete = IsQuestComplete
-local GetQuestLogTitle = GetQuestLogTitle
-local GetNumQuestLogEntries = GetNumQuestLogEntries
-local hooksecurefunc = hooksecurefunc
-
-function S:GossipFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.gossip) then return end
-
- -- GossipFrame
- local GossipFrame = _G.GossipFrame
- S:HandleFrame(GossipFrame, true, nil, 11, -12, -32, 66)
-
- S:HandleFrame(_G.GossipGreetingScrollFrame, true, nil, -6, 2)
-
- S:HandleScrollBar(_G.GossipGreetingScrollFrameScrollBar)
-
- S:HandleCloseButton(_G.GossipFrameCloseButton, GossipFrame.backdrop)
-
- _G.GossipFrameNpcNameText:ClearAllPoints()
- _G.GossipFrameNpcNameText:Point('CENTER', _G.GossipNpcNameFrame, 'CENTER', -1, 0)
-
- for i = 1, _G.NUMGOSSIPBUTTONS do
- _G['GossipTitleButton'..i..'GossipIcon']:SetSize(16, 16)
- _G['GossipTitleButton'..i..'GossipIcon']:SetPoint('TOPLEFT', 3, 1)
- end
-
- S:HandleButton(_G.GossipFrameGreetingGoodbyeButton)
- _G.GossipFrameGreetingGoodbyeButton:Point('BOTTOMRIGHT', -38, 72)
-
- -- ItemTextFrame
- S:HandleFrame(_G.ItemTextFrame, true, nil, 11, -12, -32, 76)
-
- _G.ItemTextScrollFrame:StripTextures()
-
- S:HandleNextPrevButton(_G.ItemTextPrevPageButton)
- S:HandleNextPrevButton(_G.ItemTextNextPageButton)
-
- _G.ItemTextPageText:SetTextColor(1, 1, 1)
- hooksecurefunc(_G.ItemTextPageText, 'SetTextColor', function(pageText, headerType, r, g, b)
- if r ~= 1 or g ~= 1 or b ~= 1 then
- pageText:SetTextColor(headerType, 1, 1, 1)
- end
- end)
-
- local StripAllTextures = { 'GossipFrameGreetingPanel', 'GossipGreetingScrollFrame' }
-
- for _, object in pairs(StripAllTextures) do
- _G[object]:StripTextures()
- end
-
- local GossipGreetingScrollFrame = _G.GossipGreetingScrollFrame
- GossipGreetingScrollFrame:CreateBackdrop()
-
- if E.private.skins.parchmentRemoverEnable then
- _G.GossipGreetingText:SetTextColor(1, 1, 1)
-
- hooksecurefunc('GossipFrameUpdate', function()
- for i = 1, _G.NUMGOSSIPBUTTONS do
- local button = _G['GossipTitleButton'..i]
- local icon = _G['GossipTitleButton'..i..'GossipIcon']
- local text = button:GetFontString()
-
- if text and text:GetText() then
- local textString = gsub(text:GetText(), '|c[Ff][Ff]%x%x%x%x%x%x(.+)|r', '%1')
-
- button:SetText(textString)
- text:SetTextColor(1, 1, 1)
-
- if button.type == 'Available' or button.type == 'Active' then
- if button.type == 'Active' then
- icon:SetDesaturation(1)
- text:SetTextColor(.6, .6, .6)
- else
- icon:SetDesaturation(0)
- text:SetTextColor(1, .8, .1)
- end
-
- local numEntries = GetNumQuestLogEntries()
- for k = 1, numEntries, 1 do
- local questLogTitleText, _, _, _, _, isComplete, _, questId = GetQuestLogTitle(k)
- if strmatch(questLogTitleText, textString) then
- if (isComplete == 1 or IsQuestComplete(questId)) then
- icon:SetDesaturation(0)
- button:GetFontString():SetTextColor(1, .8, .1)
- break
- end
- end
- end
- end
- end
- end
- end)
- else
- GossipGreetingScrollFrame.spellTex = GossipGreetingScrollFrame:CreateTexture(nil, 'ARTWORK')
- GossipGreetingScrollFrame.spellTex:SetTexture([[Interface\QuestFrame\QuestBG]])
- GossipGreetingScrollFrame.spellTex:Point('TOPLEFT', 2, 2)
- GossipGreetingScrollFrame.spellTex:Size(506, 515)
- GossipGreetingScrollFrame.spellTex:SetTexCoord(0, 1, 0.02, 1)
- end
-
- S:HandleScrollBar(_G.ItemTextScrollFrameScrollBar)
-
- S:HandleCloseButton(_G.ItemTextCloseButton, _G.ItemTextFrame.backdrop)
-
- local NPCFriendshipStatusBar = _G.NPCFriendshipStatusBar
- NPCFriendshipStatusBar:StripTextures()
- NPCFriendshipStatusBar:SetStatusBarTexture(E.media.normTex)
- NPCFriendshipStatusBar:CreateBackdrop()
-
- E:RegisterStatusBar(NPCFriendshipStatusBar)
-end
-
-S:AddCallback('GossipFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildBank.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildBank.lua
deleted file mode 100644
index c16b754a4..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildBank.lua
+++ /dev/null
@@ -1,122 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next, unpack = next, unpack
-local CreateFrame = CreateFrame
-
-local NUM_GUILDBANK_ICONS_PER_ROW = 10
-local NUM_GUILDBANK_ICON_ROWS = 9
-local NUM_GUILDBANK_ICONS_SHOWN = NUM_GUILDBANK_ICONS_PER_ROW * NUM_GUILDBANK_ICON_ROWS
-
-function S:Blizzard_GuildBankUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.gbank) then return end
-
- local GuildBankFrame = _G.GuildBankFrame
- GuildBankFrame:StripTextures()
- GuildBankFrame:CreateBackdrop('Transparent')
- GuildBankFrame.backdrop:Point('TOPLEFT', 8, -11)
- GuildBankFrame.backdrop:Point('BOTTOMRIGHT', 0, 6)
- GuildBankFrame:Width(770)
- GuildBankFrame:Height(450)
- GuildBankFrame.Emblem:Kill()
-
- for _, child in next, { GuildBankFrame:GetChildren() } do
- if child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then
- S:HandleCloseButton(child)
- end
- end
-
- for i=1, _G.MAX_GUILDBANK_TABS do
- local tab = _G['GuildBankTab'..i]
- tab:StripTextures()
-
- local button = tab.Button
- local icon = button.IconTexture
- local texture = icon:GetTexture()
- button:StripTextures()
- button:StyleButton(true)
- button:SetTemplate(nil, true)
- icon:SetTexture(texture)
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetInside()
- end
-
- for i = 1, 7 do
- local column = _G.GuildBankFrame['Column'..i]
- column:StripTextures()
-
- for x = 1, 14 do
- local button = column['Button'..x]
- button:StripTextures()
- button:StyleButton()
- button:SetTemplate('Transparent')
-
- button.icon:SetInside()
- button.icon:SetTexCoord(unpack(E.TexCoords))
-
- --S:HandleIconBorder(button.IconBorder) tbc doesnt have vertex color on iconborder rn?
- end
- end
-
- S:HandleButton(GuildBankFrame.BuyInfo.PurchaseButton)
- S:HandleButton(GuildBankFrame.DepositButton)
- S:HandleButton(GuildBankFrame.WithdrawButton)
- GuildBankFrame.WithdrawButton:ClearAllPoints()
- GuildBankFrame.WithdrawButton:Point('LEFT', GuildBankFrame.DepositButton, 'LEFT', -102, 0)
-
- local GuildBankInfoSaveButton = _G.GuildBankInfoSaveButton
- S:HandleButton(GuildBankInfoSaveButton)
-
- local GuildBankInfoScrollFrame = _G.GuildBankInfoScrollFrame
- GuildBankInfoScrollFrame:StripTextures()
- GuildBankInfoScrollFrame:Width(685)
-
- S:HandleScrollBar(_G.GuildBankInfoScrollFrameScrollBar)
- _G.GuildBankInfoScrollFrameScrollBar:ClearAllPoints()
- _G.GuildBankInfoScrollFrameScrollBar:Point('TOPRIGHT', GuildBankInfoScrollFrame, 'TOPRIGHT', 29, -12)
- _G.GuildBankInfoScrollFrameScrollBar:Point('BOTTOMRIGHT', GuildBankInfoScrollFrame, 'BOTTOMRIGHT', 0, 17)
-
- local GuildBankTabInfoEditBox = _G.GuildBankTabInfoEditBox
- GuildBankTabInfoEditBox:Width(685)
-
- local GuildBankTransactionsScrollFrame = _G.GuildBankTransactionsScrollFrame
- GuildBankTransactionsScrollFrame:StripTextures()
-
- S:HandleScrollBar(_G.GuildBankTransactionsScrollFrameScrollBar)
- _G.GuildBankTransactionsScrollFrameScrollBar:ClearAllPoints()
- _G.GuildBankTransactionsScrollFrameScrollBar:Point('TOPRIGHT', GuildBankTransactionsScrollFrame, 'TOPRIGHT', 29, -8)
- _G.GuildBankTransactionsScrollFrameScrollBar:Point('BOTTOMRIGHT', GuildBankTransactionsScrollFrame, 'BOTTOMRIGHT', 0, 16)
-
- GuildBankFrame.bg = CreateFrame('Frame', nil, GuildBankFrame)
- GuildBankFrame.bg:SetTemplate()
- GuildBankFrame.bg:Point('TOPLEFT', 24, -64)
- GuildBankFrame.bg:Point('BOTTOMRIGHT', -18, 62)
- GuildBankFrame.bg:SetFrameLevel(GuildBankFrame:GetFrameLevel())
-
- _G.GuildBankLimitLabel:Point('CENTER', GuildBankFrame.TabLimitBG, 'CENTER', -40, -5)
-
- for i = 1, 4 do
- local tab = _G['GuildBankFrameTab'..i]
-
- S:HandleTab(tab)
-
- if i == 1 then
- tab:ClearAllPoints()
- tab:Point('BOTTOMLEFT', GuildBankFrame, 'BOTTOMLEFT', 0, -24)
- end
- end
-
- _G.GuildBankTab1:Point('TOPLEFT', GuildBankFrame, 'TOPRIGHT', E.PixelMode and -1 or 2, -36)
- _G.GuildBankTab2:Point('TOPLEFT', _G.GuildBankTab1, 'BOTTOMLEFT', 0, 7)
- _G.GuildBankTab3:Point('TOPLEFT', _G.GuildBankTab2, 'BOTTOMLEFT', 0, 7)
- _G.GuildBankTab4:Point('TOPLEFT', _G.GuildBankTab3, 'BOTTOMLEFT', 0, 7)
- _G.GuildBankTab5:Point('TOPLEFT', _G.GuildBankTab4, 'BOTTOMLEFT', 0, 7)
- _G.GuildBankTab6:Point('TOPLEFT', _G.GuildBankTab5, 'BOTTOMLEFT', 0, 7)
-
- if not E:IsAddOnEnabled('ArkInventory') then
- S:HandleIconSelectionFrame(_G.GuildBankPopupFrame, NUM_GUILDBANK_ICONS_SHOWN, 'GuildBankPopupButton', 'GuildBankPopup')
- end
-end
-
-S:AddCallbackForAddon('Blizzard_GuildBankUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildRegistrar.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildRegistrar.lua
deleted file mode 100644
index dc45fa520..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/GuildRegistrar.lua
+++ /dev/null
@@ -1,38 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-
-function S:GuildRegistrarFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.guildregistrar) then return end
-
- local GuildRegistrarFrame = _G.GuildRegistrarFrame
- S:HandleFrame(GuildRegistrarFrame, true, nil, 12, -17, -28, 65)
-
- _G.GuildRegistrarFrameEditBox:StripTextures()
- _G.GuildRegistrarGreetingFrame:StripTextures()
-
- S:HandleCloseButton(_G.GuildRegistrarFrameCloseButton)
- S:HandleButton(_G.GuildRegistrarFrameGoodbyeButton)
- S:HandleButton(_G.GuildRegistrarFrameCancelButton)
- S:HandleButton(_G.GuildRegistrarFramePurchaseButton)
- S:HandleEditBox(_G.GuildRegistrarFrameEditBox)
-
- for _, region in next, { _G.GuildRegistrarFrameEditBox:GetRegions() } do
- if region:IsObjectType('Texture') and (region:GetTexture() == [[Interface\ChatFrame\UI-ChatInputBorder-Left]] or region:GetTexture() == [[Interface\ChatFrame\UI-ChatInputBorder-Right]]) then
- region:Kill()
- end
- end
-
- _G.GuildRegistrarFrameEditBox:Height(20)
-
- for i = 1, 2 do
- _G['GuildRegistrarButton'..i]:GetFontString():SetTextColor(1, 1, 1)
- end
-
- _G.GuildRegistrarPurchaseText:SetTextColor(1, 1, 1)
- _G.GuildAvailableServicesText:SetTextColor(1, 1, 0)
-end
-
-S:AddCallback('GuildRegistrarFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Help.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Help.lua
deleted file mode 100644
index fbe53b91c..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Help.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs = pairs
-
-function S:HelpFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.help) then return end
-
- -- Frames
- _G.HelpFrame:StripTextures(true)
- _G.HelpFrame:CreateBackdrop('Transparent')
- _G.HelpFrameTitleBg:StripTextures(true)
- _G.HelpFrameTopBorder:StripTextures(true)
-
- -- Buttons
- _G.HelpFrameCloseButton:StripTextures()
- S:HandleCloseButton(_G.HelpFrameCloseButton)
-
- -- Insets
- local insets = {
- _G.HelpBrowser.BrowserInset,
- _G.HelpBrowserInsetTopBorder,
- _G.HelpBrowserInsetLeftBorder,
- _G.HelpBrowserInsetRightBorder,
- _G.HelpBrowserInsetBottomBorder
- }
-
- for _, inset in pairs(insets) do
- inset:StripTextures()
- end
-end
-
-S:AddCallback('HelpFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Inspect.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Inspect.lua
deleted file mode 100644
index 1222fdf19..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Inspect.lua
+++ /dev/null
@@ -1,144 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, select = unpack, select
-local ipairs = ipairs
-
-local GetInventoryItemID = GetInventoryItemID
-local GetItemQualityColor = GetItemQualityColor
-local GetItemInfo = GetItemInfo
-local hooksecurefunc = hooksecurefunc
-
-local MAX_ARENA_TEAMS = MAX_ARENA_TEAMS
-
-local function Update_InspectPaperDollItemSlotButton(button)
- local unit = button.hasItem and _G.InspectFrame.unit
- if not unit then return end
-
- local itemID = GetInventoryItemID(unit, button:GetID())
- if itemID then
- local quality = select(3, GetItemInfo(itemID))
- if quality and quality > 1 then
- button.backdrop:SetBackdropBorderColor(GetItemQualityColor(quality))
- return
- end
- end
-
- button.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
-end
-
-function S:Blizzard_InspectUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.inspect) then return end
-
- local InspectFrame = _G.InspectFrame
- S:HandleFrame(InspectFrame, true, nil, 11, -12, -32, 76)
- S:HandleCloseButton(_G.InspectFrameCloseButton, InspectFrame.backdrop)
-
- for i = 1, #_G.INSPECTFRAME_SUBFRAMES do
- S:HandleTab(_G['InspectFrameTab'..i])
- end
-
- _G.InspectPaperDollFrame:StripTextures()
-
- for _, slot in ipairs({ _G.InspectPaperDollItemsFrame:GetChildren() }) do
- local icon = _G[slot:GetName()..'IconTexture']
- local cooldown = _G[slot:GetName()..'Cooldown']
-
- slot:StripTextures()
- slot:CreateBackdrop()
- slot.backdrop:SetAllPoints()
- slot:SetFrameLevel(slot:GetFrameLevel() + 2)
- slot:StyleButton()
-
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetInside()
-
- if cooldown then
- E:RegisterCooldown(cooldown)
- end
- end
-
- hooksecurefunc('InspectPaperDollItemSlotButton_Update', Update_InspectPaperDollItemSlotButton)
-
- S:HandleRotateButton(_G.InspectModelFrameRotateLeftButton)
- _G.InspectModelFrameRotateLeftButton:Point('TOPLEFT', 3, -3)
-
- S:HandleRotateButton(_G.InspectModelFrameRotateRightButton)
- _G.InspectModelFrameRotateRightButton:Point('TOPLEFT', _G.InspectModelFrameRotateLeftButton, 'TOPRIGHT', 3, 0)
-
- -- Talents
- S:HandleFrame(_G.InspectTalentFrame, true, nil, 11, -12, -32, 76)
- S:HandleCloseButton(_G.InspectTalentFrameCloseButton, _G.InspectTalentFrame.backdrop)
-
- _G.InspectTalentFrameCancelButton:Kill()
-
- for i = 1, 3 do
- S:HandleTab(_G['InspectTalentFrameTab'..i], true)
- end
-
- _G.InspectTalentFrameScrollFrame:StripTextures()
- _G.InspectTalentFrameScrollFrame:CreateBackdrop()
-
- S:HandleScrollBar(_G.InspectTalentFrameScrollFrameScrollBar)
- _G.InspectTalentFrameScrollFrameScrollBar:Point('TOPLEFT', _G.InspectTalentFrameScrollFrame, 'TOPRIGHT', 10, -16)
-
- for i = 1, _G.MAX_NUM_TALENTS do
- local talent = _G['InspectTalentFrameTalent'..i]
- local icon = _G['InspectTalentFrameTalent'..i..'IconTexture']
- local rank = _G['InspectTalentFrameTalent'..i..'Rank']
-
- if talent then
- talent:StripTextures()
- talent:SetTemplate()
- talent:StyleButton()
-
- icon:SetInside()
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetDrawLayer('ARTWORK')
-
- rank:SetFont(E.LSM:Fetch('font', E.db['general'].font), 12, 'OUTLINE')
- end
- end
-
- -- Honor/Arena/PvP Tab
- local InspectPVPFrame = _G.InspectPVPFrame
- InspectPVPFrame:StripTextures(true)
-
- for i = 1, MAX_ARENA_TEAMS do
- local inspectpvpTeam = _G['InspectPVPTeam'..i]
-
- inspectpvpTeam:StripTextures()
- inspectpvpTeam:CreateBackdrop()
- inspectpvpTeam.backdrop:Point('TOPLEFT', 9, -4)
- inspectpvpTeam.backdrop:Point('BOTTOMRIGHT', -24, 3)
-
- inspectpvpTeam:HookScript('OnEnter', S.SetModifiedBackdrop)
- inspectpvpTeam:HookScript('OnLeave', S.SetOriginalBackdrop)
-
- _G['InspectPVPTeam'..i..'Highlight']:Kill()
- end
-
- local PVPTeamDetails = _G.PVPTeamDetails
- PVPTeamDetails:StripTextures()
- PVPTeamDetails:SetTemplate('Transparent')
- PVPTeamDetails:Point('TOPLEFT', InspectPVPFrame, 'TOPRIGHT', -30, -12)
-
- for i = 1, 5 do
- local header = _G['PVPTeamDetailsFrameColumnHeader'..i]
- header:StripTextures()
- header:StyleButton()
- end
-
- for i = 1, 10 do
- local button = _G['PVPTeamDetailsButton'..i]
- button:Width(335)
- S:HandleButtonHighlight(button)
- end
-
- S:HandleButton(_G.PVPTeamDetailsAddTeamMember)
- S:HandleNextPrevButton(_G.PVPTeamDetailsToggleButton)
- S:HandleCloseButton(_G.PVPTeamDetailsCloseButton)
-end
-
-S:AddCallbackForAddon('Blizzard_InspectUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/LFG.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/LFG.lua
deleted file mode 100644
index 033f9c3c8..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/LFG.lua
+++ /dev/null
@@ -1,100 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs, next = pairs, next
-
-function S:Blizzard_LookingForGroupUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.lfg) then return end
-
- local LFGParentFrame = _G.LFGParentFrame
- LFGParentFrame:StripTextures(true)
- LFGParentFrame:CreateBackdrop('Transparent')
- LFGParentFrame.backdrop:Point('TOPLEFT', 10, -10)
- LFGParentFrame.backdrop:Point('BOTTOMRIGHT', -24, 75)
-
- local lfgButtons = {
- 'LFGFrameClearAllButton',
- 'LFGFramePostButton',
- 'LFMFrameGroupInviteButton',
- 'LFMFrameSearchButton',
- 'LFMFrameSendMessageButton',
- }
-
- for _, button in pairs(lfgButtons) do
- _G[button]:StripTextures()
- S:HandleButton(_G[button])
- end
-
- local dropDownFrames = {
- 'LFGFrameTypeDropDown1',
- 'LFGFrameTypeDropDown2',
- 'LFGFrameTypeDropDown3',
- 'LFGFrameActivityDropDown1',
- 'LFGFrameActivityDropDown2',
- 'LFGFrameActivityDropDown3',
- }
-
- for _, dropDown in pairs(dropDownFrames) do
- S:HandleDropDownBox(_G[dropDown], 245)
- end
-
- -- LFM DropDowns, different sizes
- local LFMFrameTypeDropDown = _G.LFMFrameTypeDropDown
- local LFMFrameActivityDropDown = _G.LFMFrameActivityDropDown
- S:HandleDropDownBox(LFMFrameTypeDropDown, 150)
- S:HandleDropDownBox(LFMFrameActivityDropDown, 225)
-
- -- 1st icon
- _G.LFGSearchBg1:StripTextures()
- _G.LFGSearchBg1:CreateBackdrop('Transparent')
- _G.LFGSearchBg1:Width(58)
- _G.LFGSearchBg1:Height(53)
-
- -- 2nd icon
- _G.LFGSearchBg2:StripTextures()
- _G.LFGSearchBg2:CreateBackdrop('Transparent')
- _G.LFGSearchBg2:Width(58)
- _G.LFGSearchBg2:Height(53)
-
- -- 3rd icon
- _G.LFGSearchBg3:StripTextures()
- _G.LFGSearchBg3:CreateBackdrop('Transparent')
- _G.LFGSearchBg3:Width(58)
- _G.LFGSearchBg3:Height(53)
-
- local LFMFrameInsetBg = _G.LFMFrameInsetBg
- LFMFrameInsetBg:StripTextures()
- LFMFrameInsetBg:CreateBackdrop('Transparent')
-
- local LFMFrameInset = _G.LFMFrameInset
- LFMFrameInset:StripTextures()
-
- local LFMFrameGroupInviteButton = _G.LFMFrameGroupInviteButton
- LFMFrameGroupInviteButton:Point('BOTTOMRIGHT', -40, 85)
-
- for i = 1, 2 do
- local tab = _G['LFGParentFrameTab'..i]
-
- S:HandleTab(tab)
- end
-
- for _, child in next, { LFGParentFrame:GetChildren() } do
- if child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then
- S:HandleCloseButton(child)
- end
- end
-
- local LFGComment = _G.LFGComment
- S:HandleEditBox(LFGComment)
- LFGComment:Size(323, 19)
- LFGComment:Point('BOTTOMLEFT', LFGParentFrame, 'BOTTOMLEFT', 20, 110)
- LFGComment.SetPoint = E.noop
-
- for i = 1, 4 do
- local frame = _G['LFMFrameColumnHeader'..i]
- frame:StripTextures()
- end
-end
-
-S:AddCallbackForAddon('Blizzard_LookingForGroupUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Load_Skins.xml b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Load_Skins.xml
deleted file mode 100644
index d6869d800..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Load_Skins.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Loot.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Loot.lua
deleted file mode 100644
index 51d69e1b4..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Loot.lua
+++ /dev/null
@@ -1,203 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-local LCG = E.Libs.CustomGlow
-
-local _G = _G
-local next = next
-local unpack = unpack
-
-local GetItemInfo = GetItemInfo
-local GetLootSlotInfo = GetLootSlotInfo
-local hooksecurefunc = hooksecurefunc
-local IsFishingLoot = IsFishingLoot
-local UnitIsDead = UnitIsDead
-local UnitIsFriend = UnitIsFriend
-local UnitName = UnitName
-
-local C_LootHistory_GetNumItems = C_LootHistory.GetNumItems
-local C_LootHistory_GetItem = C_LootHistory.GetItem
-local ITEM_QUALITY_COLORS = ITEM_QUALITY_COLORS
-local LOOT, ITEMS = LOOT, ITEMS
-
-local function UpdateLoots()
- local numItems = C_LootHistory_GetNumItems()
- for i=1, numItems do
- local frame = _G.LootHistoryFrame.itemFrames[i]
- if frame and not frame.isSkinned then
- local Icon = frame.Icon:GetTexture()
- frame:StripTextures()
- frame.Icon:SetTexture(Icon)
- frame.Icon:SetTexCoord(unpack(E.TexCoords))
-
- -- create a backdrop around the icon
- frame:CreateBackdrop()
- frame.backdrop:SetOutside(frame.Icon)
- frame.Icon:SetParent(frame.backdrop)
-
- local _, itemLink = C_LootHistory_GetItem(frame.itemIdx)
- if itemLink then
- local _, _, itemRarity = GetItemInfo(itemLink)
-
- if itemRarity then
- local color = ITEM_QUALITY_COLORS[itemRarity]
-
- if color then
- frame.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
- end
- end
- end
-
- frame.isSkinned = true
- end
- end
-end
-
-function S:LootFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.loot) then return end
-
- -- Loot history frame
- local LootHistoryFrame = _G.LootHistoryFrame
- LootHistoryFrame:StripTextures()
- S:HandleCloseButton(LootHistoryFrame.CloseButton)
- LootHistoryFrame:StripTextures()
- LootHistoryFrame:SetTemplate('Transparent')
- LootHistoryFrame.ResizeButton:StripTextures()
- LootHistoryFrame.ResizeButton.text = LootHistoryFrame.ResizeButton:CreateFontString(nil, 'OVERLAY')
- LootHistoryFrame.ResizeButton.text:FontTemplate(nil, 16, 'OUTLINE')
- LootHistoryFrame.ResizeButton.text:SetJustifyH('CENTER')
- LootHistoryFrame.ResizeButton.text:Point('CENTER', LootHistoryFrame.ResizeButton)
- LootHistoryFrame.ResizeButton.text:SetText('v v v v')
- LootHistoryFrame.ResizeButton:SetTemplate()
- LootHistoryFrame.ResizeButton:Width(LootHistoryFrame:GetWidth())
- LootHistoryFrame.ResizeButton:Height(19)
- LootHistoryFrame.ResizeButton:ClearAllPoints()
- LootHistoryFrame.ResizeButton:Point('TOP', LootHistoryFrame, 'BOTTOM', 0, -2)
- _G.LootHistoryFrameScrollFrame:StripTextures()
- S:HandleScrollBar(_G.LootHistoryFrameScrollFrameScrollBar)
-
- hooksecurefunc('LootHistoryFrame_FullUpdate', UpdateLoots)
-
- -- Master Loot
- local MasterLooterFrame = _G.MasterLooterFrame
- MasterLooterFrame:StripTextures()
- MasterLooterFrame:SetTemplate()
-
- hooksecurefunc('MasterLooterFrame_Show', function()
- local b = MasterLooterFrame.Item
- if b then
- local i = b.Icon
- local icon = i:GetTexture()
- local c = ITEM_QUALITY_COLORS[_G.LootFrame.selectedQuality]
-
- b:StripTextures()
- i:SetTexture(icon)
- i:SetTexCoord(unpack(E.TexCoords))
- b:CreateBackdrop()
- b.backdrop:SetOutside(i)
- b.backdrop:SetBackdropBorderColor(c.r, c.g, c.b)
- end
-
- for _, child in next, { MasterLooterFrame:GetChildren() } do
- if not child.isSkinned and not child:GetName() and child:IsObjectType('Button') then
- if child:GetPushedTexture() then
- S:HandleCloseButton(child)
- else
- child:SetTemplate()
- child:StyleButton()
- end
- child.isSkinned = true
- end
- end
- end)
-
- local LootFrame = _G.LootFrame
- S:HandleFrame(LootFrame, true)
- LootFrame:Height(LootFrame:GetHeight() - 30)
- _G.LootFramePortraitOverlay:SetParent(E.HiddenFrame)
-
- for _, region in next, { LootFrame:GetRegions() } do
- if region:IsObjectType('FontString') and region:GetText() == ITEMS then
- LootFrame.Title = region
- end
- end
-
- LootFrame.Title:ClearAllPoints()
- LootFrame.Title:Point('TOPLEFT', LootFrame, 'TOPLEFT', 4, -4)
- LootFrame.Title:SetJustifyH('LEFT')
-
- for i = 1, _G.LOOTFRAME_NUMBUTTONS do
- local button = _G['LootButton'..i]
- _G['LootButton'..i..'NameFrame']:Hide()
- S:HandleItemButton(button, true)
-
- button.IconBorder:SetTexture()
- hooksecurefunc(button.IconBorder, 'SetVertexColor', function(s, r, g, b)
- s:GetParent().backdrop:SetBackdropBorderColor(r, g, b)
- s:SetTexture()
- end)
- hooksecurefunc(button.IconBorder, 'Hide', function(s)
- s:GetParent().backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end)
-
- local point, attachTo, point2, x, y = button:GetPoint()
- button:ClearAllPoints()
- button:Point(point, attachTo, point2, x, y+30)
- end
-
- hooksecurefunc('LootFrame_UpdateButton', function(index)
- local numLootItems = LootFrame.numLootItems
- --Logic to determine how many items to show per page
- local numLootToShow = _G.LOOTFRAME_NUMBUTTONS
- if LootFrame.AutoLootTable then
- numLootItems = #LootFrame.AutoLootTable
- end
- if numLootItems > _G.LOOTFRAME_NUMBUTTONS then
- numLootToShow = numLootToShow - 1 -- make space for the page buttons
- end
-
- local button = _G['LootButton'..index]
- local slot = (numLootToShow * (LootFrame.page - 1)) + index
- if(button and button:IsShown()) then
- local texture, _, isQuestItem, questId, isActive
- if (LootFrame.AutoLootTable) then
- local entry = LootFrame.AutoLootTable[slot]
- if( entry.hide ) then
- button:Hide()
- return
- else
- texture = entry.texture
- isQuestItem = entry.isQuestItem
- questId = entry.questId
- isActive = entry.isActive
- end
- else
- texture, _, _, _, _, _, isQuestItem, questId, isActive = GetLootSlotInfo(slot)
- end
-
- if texture then
- if questId and not isActive then
- LCG.ShowOverlayGlow(button)
- elseif questId or isQuestItem then
- LCG.ShowOverlayGlow(button)
- else
- LCG.HideOverlayGlow(button)
- end
- end
- end
- end)
-
- LootFrame:HookScript('OnShow', function(frame)
- if IsFishingLoot() then
- frame.Title:SetText(L["Fishy Loot"])
- elseif(not UnitIsFriend('player', 'target') and UnitIsDead'target') then
- frame.Title:SetText(UnitName('target'))
- else
- frame.Title:SetText(LOOT)
- end
- end)
-
- S:HandleNextPrevButton(_G.LootFrameDownButton)
- S:HandleNextPrevButton(_G.LootFrameUpButton)
-end
-
-S:AddCallback('LootFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Macro.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Macro.lua
deleted file mode 100644
index e836acf04..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Macro.lua
+++ /dev/null
@@ -1,106 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local format = format
-
-function S:Blizzard_MacroUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.macro) then return end
-
- local MacroFrame = _G.MacroFrame
- S:HandlePortraitFrame(MacroFrame)
- MacroFrame:Width(334)
-
- _G.MacroFrameTextBackground:StripTextures()
- _G.MacroFrameTextBackground:SetTemplate('Transparent')
- _G.MacroButtonScrollFrame:StripTextures()
- _G.MacroButtonScrollFrame:CreateBackdrop('Transparent')
-
- S:HandleScrollBar(_G.MacroButtonScrollFrameScrollBar)
- S:HandleScrollBar(_G.MacroFrameScrollFrameScrollBar)
-
- local buttons = {
- _G.MacroSaveButton,
- _G.MacroCancelButton,
- _G.MacroDeleteButton,
- _G.MacroNewButton,
- _G.MacroExitButton,
- _G.MacroEditButton,
- _G.MacroFrameTab1,
- _G.MacroFrameTab2,
- }
-
- for i = 1, #buttons do
- buttons[i]:StripTextures()
- S:HandleButton(buttons[i])
- end
-
- _G.MacroNewButton:ClearAllPoints()
- _G.MacroNewButton:Point('RIGHT', _G.MacroExitButton, 'LEFT', -2 , 0)
-
- for i = 1, 2 do
- local tab = _G[format('MacroFrameTab%s', i)]
- tab:Height(22)
- end
-
- _G.MacroFrameTab1:Point('TOPLEFT', MacroFrame, 'TOPLEFT', 12, -39)
- _G.MacroFrameTab2:Point('LEFT', _G.MacroFrameTab1, 'RIGHT', 4, 0)
-
- --Reposition edit button
- _G.MacroEditButton:ClearAllPoints()
- _G.MacroEditButton:Point('BOTTOMLEFT', _G.MacroFrameSelectedMacroButton, 'BOTTOMRIGHT', 10, 0)
-
- -- Regular scroll bar
- S:HandleScrollBar(_G.MacroButtonScrollFrame)
-
- -- Big icon
- _G.MacroFrameSelectedMacroButton:StripTextures()
- _G.MacroFrameSelectedMacroButton:StyleButton(true)
- _G.MacroFrameSelectedMacroButton:GetNormalTexture():SetTexture()
- _G.MacroFrameSelectedMacroButton:SetTemplate()
- _G.MacroFrameSelectedMacroButtonIcon:SetTexCoord(unpack(E.TexCoords))
- _G.MacroFrameSelectedMacroButtonIcon:Point('TOPLEFT', 1, -1)
- _G.MacroFrameSelectedMacroButtonIcon:Point('BOTTOMRIGHT', -1, 1)
-
- -- Skin all buttons
- for i = 1, _G.MAX_ACCOUNT_MACROS do
- local b = _G['MacroButton'..i]
- local t = _G['MacroButton'..i..'Icon']
-
- if b then
- b:StripTextures()
- b:StyleButton(true)
- b:SetTemplate('Transparent')
- end
-
- if t then
- t:SetTexCoord(unpack(E.TexCoords))
- t:Point('TOPLEFT', 1, -1)
- t:Point('BOTTOMRIGHT', -1, 1)
- end
- end
-
- local MacroPopupFrame = _G.MacroPopupFrame
- S:HandleButton(MacroPopupFrame.BorderBox.OkayButton)
- local cancel_btn = MacroPopupFrame.BorderBox.CancelButton
- S:HandleButton(cancel_btn)
- cancel_btn:ClearAllPoints()
- cancel_btn:Point('RIGHT', MacroPopupFrame.BorderBox, 'BOTTOMRIGHT', -5, 15)
- S:HandleScrollBar(_G.MacroPopupScrollFrameScrollBar)
- S:HandleEditBox(_G.MacroPopupEditBox)
- _G.MacroPopupNameLeft:SetTexture()
- _G.MacroPopupNameMiddle:SetTexture()
- _G.MacroPopupNameRight:SetTexture()
-
- MacroPopupFrame:HookScript('OnShow', function(frame)
- frame:ClearAllPoints()
- frame:Point('TOPLEFT', MacroFrame, 'TOPRIGHT', 2, 0)
-
- if not frame.isSkinned then
- S:HandleIconSelectionFrame(frame, _G.NUM_MACRO_ICONS_SHOWN, 'MacroPopupButton', 'MacroPopup')
- end
- end)
-end
-
-S:AddCallbackForAddon('Blizzard_MacroUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Mail.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Mail.lua
deleted file mode 100644
index 1ff5937a0..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Mail.lua
+++ /dev/null
@@ -1,256 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, select = unpack, select
-
-local GetInboxHeaderInfo = GetInboxHeaderInfo
-local GetInboxItemLink = GetInboxItemLink
-local GetInboxNumItems = GetInboxNumItems
-local GetItemInfo = GetItemInfo
-local GetItemQualityColor = GetItemQualityColor
-local GetSendMailItem = GetSendMailItem
-local hooksecurefunc = hooksecurefunc
-
-function S:MailFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.mail) then return end
-
- -- Mail Frame / Inbox Frame
- local MailFrame = _G.MailFrame
- S:HandleFrame(MailFrame, true, nil, -5, 0, -2, 0)
-
- _G.MailFrameCloseButton:Point('TOPRIGHT', 0, 2)
-
- _G.InboxFrameBg:StripTextures()
- _G.MailFrameBg:StripTextures()
-
- _G.InboxTitleText:Point('CENTER', _G.InboxFrame, 'TOP', -10, -17)
-
- for i = 1, _G.INBOXITEMS_TO_DISPLAY do
- local mail = _G['MailItem'..i]
- local button = _G['MailItem'..i..'Button']
- local icon = _G['MailItem'..i..'ButtonIcon']
-
- mail:StripTextures()
- mail:CreateBackdrop()
- mail.backdrop:Point('TOPLEFT', 42, -3)
- mail.backdrop:Point('BOTTOMRIGHT', -2, 5)
-
- button:StripTextures()
- button:SetTemplate()
- button:StyleButton()
-
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetInside()
- end
-
- hooksecurefunc('InboxFrame_Update', function()
- local numItems = GetInboxNumItems()
- local index = ((_G.InboxFrame.pageNum - 1) * _G.INBOXITEMS_TO_DISPLAY) + 1
-
- for i = 1, _G.INBOXITEMS_TO_DISPLAY do
- local mail = _G['MailItem'..i]
-
- if index <= numItems then
- local packageIcon, _, _, _, _, _, _, _, _, _, _, _, isGM = GetInboxHeaderInfo(index)
- if packageIcon and not isGM then
- local itemlink = GetInboxItemLink(index, 1)
- if itemlink then
- local quality = select(3, GetItemInfo(itemlink))
-
- if quality and quality > 1 then
- mail.backdrop:SetBackdropBorderColor(GetItemQualityColor(quality))
- else
- mail.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
- elseif isGM then
- mail.backdrop:SetBackdropBorderColor(0, 0.56, 0.94)
- else
- mail.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- else
- mail.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
-
- index = index + 1
- end
- end)
-
- S:HandleNextPrevButton(_G.InboxPrevPageButton, nil, nil, true)
- _G.InboxPrevPageButton:Size(24)
- _G.InboxPrevPageButton:Point('CENTER', _G.InboxFrame, 'BOTTOMLEFT', 12, 104)
-
- S:HandleNextPrevButton(_G.InboxNextPageButton, nil, nil, true)
- _G.InboxNextPageButton:Size(24)
- _G.InboxNextPageButton:Point('CENTER', _G.InboxFrame, 'BOTTOMLEFT', 319, 104)
-
- S:HandleButton(_G.OpenAllMail)
- _G.OpenAllMail:Point('CENTER', _G.InboxFrame, 'BOTTOM', -28, 104)
-
- for i = 1, 2 do
- local tab = _G['MailFrameTab'..i]
-
- tab:StripTextures()
- S:HandleTab(tab)
- end
-
- -- Send Mail Frame
- _G.SendMailFrame:StripTextures()
- _G.SendStationeryBackgroundLeft:Hide()
- _G.SendStationeryBackgroundRight:Hide()
- _G.MailEditBox.ScrollBox:StripTextures(true)
- _G.MailEditBox.ScrollBox:SetTemplate()
- _G.MailEditBox.ScrollBox.EditBox:SetTextColor(1, 1, 1)
-
- _G.SendMailTitleText:Point('CENTER', _G.SendMailFrame, 'TOP', -10, -17)
-
- hooksecurefunc('SendMailFrame_Update', function()
- for i = 1, _G.ATTACHMENTS_MAX_SEND do
- local button = _G['SendMailAttachment'..i]
- if not button.template then
- button:StripTextures()
- button:SetTemplate(nil, true)
- button:StyleButton(nil, true)
- end
-
- local name = GetSendMailItem(i)
- if name then
- local quality = select(3, GetItemInfo(name))
- if quality and quality > 1 then
- button:SetBackdropBorderColor(GetItemQualityColor(quality))
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
-
- local icon = button:GetNormalTexture()
- if icon then
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetInside()
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
-
- _G.MailEditBox:SetHeight(_G.SendStationeryBackgroundLeft:GetHeight())
- end)
-
- S:HandleScrollBar(_G.MailEditBoxScrollBar)
- S:HandleEditBox(_G.SendMailNameEditBox)
- S:HandleEditBox(_G.SendMailSubjectEditBox)
- S:HandleEditBox(_G.SendMailMoneyGold)
- S:HandleEditBox(_G.SendMailMoneySilver)
- S:HandleEditBox(_G.SendMailMoneyCopper)
-
- _G.SendMailMoneyBg:Kill()
- _G.SendMailMoneyInset:StripTextures()
- _G.SendMailSubjectEditBox:Point('TOPLEFT', _G.SendMailNameEditBox, 'BOTTOMLEFT', 0, -10)
- _G.SendMailSubjectEditBox:Height(18)
- _G.SendMailNameEditBox:Height(18)
- _G.SendMailFrame:StripTextures()
-
- S:HandleButton(_G.SendMailMailButton)
- _G.SendMailMailButton:Point('RIGHT', _G.SendMailCancelButton, 'LEFT', -2, 0)
-
- S:HandleButton(_G.SendMailCancelButton)
- _G.SendMailCancelButton:Point('BOTTOMRIGHT', -53, 94)
-
- _G.SendMailMoneyFrame:Point('BOTTOMLEFT', 170, 94)
-
- S:HandleRadioButton(_G.SendMailSendMoneyButton)
- S:HandleRadioButton(_G.SendMailCODButton)
-
- for i = 1, 5 do
- _G['AutoCompleteButton'..i]:StyleButton()
- end
-
- -- Open Mail Frame
- local OpenMailFrame = _G.OpenMailFrame
- OpenMailFrame:StripTextures(true) -- stupid portrait
- S:HandleFrame(OpenMailFrame, true)
- OpenMailFrame.backdrop:Point('TOPLEFT', -5, 0)
- OpenMailFrame.backdrop:Point('BOTTOMRIGHT', -2, 0)
-
- _G.OpenMailFrameCloseButton:Point('TOPRIGHT', OpenMailFrame.backdrop, 'TOPRIGHT', 4, 3)
-
- for i = 1, _G.ATTACHMENTS_MAX_RECEIVE do
- local button = _G['OpenMailAttachmentButton'..i]
- local icon = _G['OpenMailAttachmentButton'..i..'IconTexture']
- local count = _G['OpenMailAttachmentButton'..i..'Count']
-
- button:StripTextures()
- button:SetTemplate(nil, true)
- button:StyleButton()
-
- if icon then
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetDrawLayer('ARTWORK')
- icon:SetInside()
-
- count:SetDrawLayer('OVERLAY')
- end
- end
-
- hooksecurefunc('OpenMailFrame_UpdateButtonPositions', function()
- for i = 1, _G.ATTACHMENTS_MAX_RECEIVE do
- local itemLink = GetInboxItemLink(_G.InboxFrame.openMailID, i)
- local button = _G['OpenMailAttachmentButton'..i]
-
- if itemLink then
- local quality = select(3, GetItemInfo(itemLink))
- if quality and quality > 1 then
- button:SetBackdropBorderColor(GetItemQualityColor(quality))
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
- end)
-
- S:HandleButton(_G.OpenMailReportSpamButton)
-
- S:HandleButton(_G.OpenMailReplyButton)
- _G.OpenMailReplyButton:Point('RIGHT', _G.OpenMailDeleteButton, 'LEFT', -2, 0)
-
- S:HandleButton(_G.OpenMailDeleteButton)
- _G.OpenMailDeleteButton:Point('RIGHT', _G.OpenMailCancelButton, 'LEFT', -2, 0)
-
- S:HandleButton(_G.OpenMailCancelButton)
-
- _G.OpenMailScrollFrame:StripTextures(true)
- _G.OpenMailScrollFrame:SetTemplate()
-
- S:HandleScrollBar(_G.OpenMailScrollFrameScrollBar)
-
- _G.OpenMailBodyText:SetTextColor(1, 1, 1)
- _G.InvoiceTextFontNormal:SetFont(E.media.normFont, 13)
- _G.InvoiceTextFontNormal:SetTextColor(1, 1, 1)
- _G.OpenMailInvoiceBuyMode:SetTextColor(1, 0.80, 0.10)
-
- _G.OpenMailArithmeticLine:Kill()
-
- _G.OpenMailLetterButton:StripTextures()
- _G.OpenMailLetterButton:SetTemplate(nil, true)
- _G.OpenMailLetterButton:StyleButton()
-
- _G.OpenMailLetterButtonIconTexture:SetTexCoord(unpack(E.TexCoords))
- _G.OpenMailLetterButtonIconTexture:SetDrawLayer('ARTWORK')
- _G.OpenMailLetterButtonIconTexture:SetInside()
-
- _G.OpenMailLetterButtonCount:SetDrawLayer('OVERLAY')
-
- _G.OpenMailMoneyButton:StripTextures()
- _G.OpenMailMoneyButton:SetTemplate(nil, true)
- _G.OpenMailMoneyButton:StyleButton()
-
- _G.OpenMailMoneyButtonIconTexture:SetTexCoord(unpack(E.TexCoords))
- _G.OpenMailMoneyButtonIconTexture:SetDrawLayer('ARTWORK')
- _G.OpenMailMoneyButtonIconTexture:SetInside()
-
- _G.OpenMailMoneyButtonCount:SetDrawLayer('OVERLAY')
-end
-
-S:AddCallback('MailFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Merchant.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Merchant.lua
deleted file mode 100644
index 4b523d6ba..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Merchant.lua
+++ /dev/null
@@ -1,205 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, select = unpack, select
-
-local GetItemInfo = GetItemInfo
-local GetItemQualityColor = GetItemQualityColor
-local GetBuybackItemInfo = GetBuybackItemInfo
-local GetNumBuybackItems = GetNumBuybackItems
-local GetMerchantNumItems = GetMerchantNumItems
-local hooksecurefunc = hooksecurefunc
-
-local function merchantItemPoint()
- S:HandlePointXY(_G.MerchantItem1, 6, -40)
-
- for i = 2, _G.BUYBACK_ITEMS_PER_PAGE do
- if E:IsEvenNumber(i) then
- S:HandlePointXY(_G['MerchantItem'..i], 12, 0)
- else
- S:HandlePointXY(_G['MerchantItem'..i], 0, -16)
- end
- end
-end
-
-function S:MerchantFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.merchant) then return end
-
- local MerchantFrame = _G.MerchantFrame
- S:HandleFrame(MerchantFrame, true, nil, -5, 0, 1, -1)
-
- _G.MerchantFrameCloseButton:Point('TOPRIGHT', 2, 2)
-
- -- skin icons / merchant slots
- for i = 1, _G.BUYBACK_ITEMS_PER_PAGE do
- local item = _G['MerchantItem'..i]
- local button = _G['MerchantItem'..i..'ItemButton']
- local icon = _G['MerchantItem'..i..'ItemButtonIconTexture']
- local money = _G['MerchantItem'..i..'MoneyFrame']
- local nameFrame = _G['MerchantItem'..i..'NameFrame']
- local name = _G['MerchantItem'..i..'Name']
- local slot = _G['MerchantItem'..i..'SlotTexture']
-
- item:StripTextures(true)
- item:CreateBackdrop()
- item.backdrop:Point('TOPLEFT', -1, 3)
- item.backdrop:Point('BOTTOMRIGHT', 2, -3)
-
- button:StripTextures()
- button:StyleButton()
- button:SetTemplate(nil, true)
- button:Size(40)
- button:Point('TOPLEFT', item, 'TOPLEFT', 4, -2)
-
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetInside()
-
- nameFrame:Point('LEFT', slot, 'RIGHT', -6, -17)
-
- name:Point('LEFT', slot, 'RIGHT', -4, 5)
-
- money:ClearAllPoints()
- money:Point('BOTTOMLEFT', button, 'BOTTOMRIGHT', 3, 0)
- end
-
- _G.MerchantNameText:SetTextColor(1, 1, 1)
-
- _G.MerchantPageText:SetTextColor(1, 1, 1)
- _G.MerchantPageText:Point('BOTTOM', -2, 10)
-
- S:HandleNextPrevButton(_G.MerchantNextPageButton, nil, nil, nil, true)
- _G.MerchantNextPageButton:Point('BOTTOMRIGHT', _G.MerchantFrame, 'BOTTOMRIGHT', -11, 10)
- _G.MerchantNextPageButton:Size(24)
-
- S:HandleNextPrevButton(_G.MerchantPrevPageButton, nil, nil, nil, true)
- _G.MerchantPrevPageButton:Point('TOPLEFT', _G.MerchantNextPageButton, 'TOPLEFT', -30, 0)
- _G.MerchantPrevPageButton:Size(24)
-
- S:HandleButton(_G.MerchantRepairItemButton)
- _G.MerchantRepairItemButton:StyleButton(false)
- _G.MerchantRepairItemButton:GetRegions():SetTexCoord(0.04, 0.24, 0.06, 0.5)
- _G.MerchantRepairItemButton:GetRegions():SetInside()
-
- S:HandleButton(_G.MerchantGuildBankRepairButton)
- _G.MerchantGuildBankRepairButton:StyleButton()
- _G.MerchantGuildBankRepairButtonIcon:SetTexCoord(0.61, 0.82, 0.1, 0.52)
- _G.MerchantGuildBankRepairButtonIcon:SetInside()
-
- S:HandleButton(_G.MerchantRepairAllButton)
- _G.MerchantRepairAllIcon:StyleButton(false)
- _G.MerchantRepairAllIcon:SetTexCoord(0.34, 0.1, 0.34, 0.535, 0.535, 0.1, 0.535, 0.535)
- _G.MerchantRepairAllIcon:SetInside()
-
- _G.MerchantMoneyBg:StripTextures()
- _G.MerchantMoneyInset:StripTextures()
-
- _G.MerchantMoneyFrame:ClearAllPoints()
- _G.MerchantMoneyFrame:Point('BOTTOMLEFT', _G.MerchantFrame, 'BOTTOMLEFT', 7, 10)
-
- S:HandleFrame(_G.MerchantBuyBackItem, true, nil, -1, 3, 2, -2)
- _G.MerchantBuyBackItem:Height(46)
- S:HandlePointXY(_G.MerchantBuyBackItem, 0, -16)
-
- _G.MerchantBuyBackItemItemButton:StripTextures()
- _G.MerchantBuyBackItemItemButton:StyleButton()
- _G.MerchantBuyBackItemItemButton:SetTemplate(nil, true)
- _G.MerchantBuyBackItemItemButton:Size(40)
- _G.MerchantBuyBackItemItemButton:Point('TOPLEFT', 4, -2)
-
- _G.MerchantBuyBackItemItemButtonIconTexture:SetTexCoord(unpack(E.TexCoords))
- _G.MerchantBuyBackItemItemButtonIconTexture:SetInside()
-
- _G.MerchantBuyBackItemNameFrame:Point('LEFT', _G.MerchantBuyBackItemSlotTexture, 'RIGHT', -6, -17)
-
- _G.MerchantBuyBackItemName:Point('LEFT', _G.MerchantBuyBackItemSlotTexture, 'RIGHT', -4, 5)
-
- _G.MerchantBuyBackItemMoneyFrame:ClearAllPoints()
- _G.MerchantBuyBackItemMoneyFrame:Point('BOTTOMLEFT', _G.MerchantBuyBackItemItemButton, 'BOTTOMRIGHT', 3, 0)
-
- -- skin tabs
- for i = 1, 2 do
- S:HandleTab(_G['MerchantFrameTab'..i])
- end
-
- hooksecurefunc('MerchantFrame_UpdateMerchantInfo', function()
- local numMerchantItems = GetMerchantNumItems()
- local index = (MerchantFrame.page - 1) * _G.MERCHANT_ITEMS_PER_PAGE
- local button, name, quality
-
- for i = 1, _G.BUYBACK_ITEMS_PER_PAGE do
- index = index + 1
-
- if index <= numMerchantItems then
- button = _G['MerchantItem'..i..'ItemButton']
- name = _G['MerchantItem'..i..'Name']
-
- if button.link then
- quality = select(3, GetItemInfo(button.link))
-
- if quality and quality > 1 then
- local r, g, b = GetItemQualityColor(quality)
- button:SetBackdropBorderColor(r, g, b)
- name:SetTextColor(r, g, b)
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- name:SetTextColor(1, 1, 1)
- end
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- name:SetTextColor(1, 1, 1)
- end
- end
-
- local itemName = GetBuybackItemInfo(GetNumBuybackItems())
- if itemName then
- quality = select(3, GetItemInfo(itemName))
-
- if quality and quality > 1 then
- local r, g, b = GetItemQualityColor(quality)
- _G.MerchantBuyBackItemItemButton:SetBackdropBorderColor(r, g, b)
- _G.MerchantBuyBackItemName:SetTextColor(r, g, b)
- else
- _G.MerchantBuyBackItemItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.MerchantBuyBackItemName:SetTextColor(1, 1, 1)
- end
- else
- _G.MerchantBuyBackItemItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
-
- _G.MerchantRepairText:Point('BOTTOMLEFT', 14, 69)
-
- merchantItemPoint()
- end)
-
- hooksecurefunc('MerchantFrame_UpdateBuybackInfo', function()
- local numBuybackItems = GetNumBuybackItems()
- local button, name, quality
-
- for i = 1, _G.BUYBACK_ITEMS_PER_PAGE do
- if i <= numBuybackItems then
- local itemName = GetBuybackItemInfo(i)
-
- if itemName then
- button = _G['MerchantItem'..i..'ItemButton']
- name = _G['MerchantItem'..i..'Name']
- quality = select(3, GetItemInfo(itemName))
-
- if quality and quality > 1 then
- local r, g, b = GetItemQualityColor(quality)
- button:SetBackdropBorderColor(r, g, b)
- name:SetTextColor(r, g, b)
- else
- button:SetBackdropBorderColor(unpack(E.media.bordercolor))
- name:SetTextColor(1, 1, 1)
- end
- end
- end
- end
-
- merchantItemPoint()
- end)
-end
-
-S:AddCallback('MerchantFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/MirrorTimers.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/MirrorTimers.lua
deleted file mode 100644
index 49372303a..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/MirrorTimers.lua
+++ /dev/null
@@ -1,53 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-local function MirrorTimer_OnUpdate(frame, elapsed)
- if frame.paused then return end
-
- if frame.timeSinceUpdate >= 0.3 then
- local text = frame.label:GetText()
-
- if frame.value > 0 then
- frame.TimerText:SetFormattedText('%s (%d:%02d)', text, frame.value / 60, frame.value % 60)
- else
- frame.TimerText:SetFormattedText('%s (0:00)', text)
- end
-
- frame.timeSinceUpdate = 0
- else
- frame.timeSinceUpdate = frame.timeSinceUpdate + elapsed
- end
-end
-
-function S:MirrorTimers()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.mirrorTimers) then return end
-
- for i = 1, _G.MIRRORTIMER_NUMTIMERS do
- local mirrorTimer = _G['MirrorTimer'..i]
- local statusBar = _G['MirrorTimer'..i..'StatusBar']
- local text = _G['MirrorTimer'..i..'Text']
-
- mirrorTimer:StripTextures()
- mirrorTimer:Size(222, 18)
- mirrorTimer.label = text
- statusBar:SetStatusBarTexture(E.media.normTex)
- E:RegisterStatusBar(statusBar)
- statusBar:CreateBackdrop()
- statusBar:Size(222, 18)
- text:Hide()
-
- local timerText = mirrorTimer:CreateFontString(nil, 'OVERLAY')
- timerText:FontTemplate(nil, nil, 'OUTLINE')
- timerText:Point('CENTER', statusBar, 'CENTER', 0, 0)
- mirrorTimer.TimerText = timerText
-
- mirrorTimer.timeSinceUpdate = 0.3
- mirrorTimer:HookScript('OnUpdate', MirrorTimer_OnUpdate)
-
- E:CreateMover(mirrorTimer, 'MirrorTimer'..i..'Mover', L["MirrorTimer"]..i, nil, nil, nil, 'ALL,SOLO')
- end
-end
-
-S:AddCallback('MirrorTimers')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Misc.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Misc.lua
deleted file mode 100644
index 928b01a02..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Misc.lua
+++ /dev/null
@@ -1,329 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs = pairs
-local ipairs = ipairs
-local unpack = unpack
-
-local hooksecurefunc = hooksecurefunc
-local UnitIsUnit = UnitIsUnit
-local CreateFrame = CreateFrame
-
-local function SkinNavBarButtons(self)
- if (self:GetParent():GetName() == 'EncounterJournal' and not E.private.skins.blizzard.encounterjournal) or (self:GetParent():GetName() == 'WorldMapFrame' and not E.private.skins.blizzard.worldmap) or (self:GetParent():GetName() == 'HelpFrameKnowledgebase' and not E.private.skins.blizzard.help) then
- return
- end
-
- local navButton = self.navList[#self.navList]
- if navButton and not navButton.isSkinned then
- S:HandleButton(navButton, true)
- navButton:GetFontString():SetTextColor(1, 1, 1)
- if navButton.MenuArrowButton then
- navButton.MenuArrowButton:StripTextures()
- if navButton.MenuArrowButton.Art then
- navButton.MenuArrowButton.Art:SetTexture(E.Media.Textures.ArrowUp)
- navButton.MenuArrowButton.Art:SetTexCoord(0, 1, 0, 1)
- navButton.MenuArrowButton.Art:SetRotation(3.14)
- end
- end
-
- navButton.xoffset = 1
-
- navButton.isSkinned = true
- end
-end
-
-function S:BlizzardMiscFrames()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.misc) then return end
-
- -- Blizzard frame we want to reskin
- local skins = {
- 'AutoCompleteBox',
- 'ReadyCheckFrame'
- }
-
- for i = 1, #skins do
- _G[skins[i]]:StripTextures()
- _G[skins[i]]:SetTemplate('Transparent')
- end
-
- -- here we reskin all 'normal' buttons
- S:HandleButton(_G.ReadyCheckFrameYesButton)
- S:HandleButton(_G.ReadyCheckFrameNoButton)
-
- local ReadyCheckFrame = _G.ReadyCheckFrame
- _G.ReadyCheckFrameYesButton:SetParent(ReadyCheckFrame)
- _G.ReadyCheckFrameNoButton:SetParent(ReadyCheckFrame)
- _G.ReadyCheckFrameYesButton:ClearAllPoints()
- _G.ReadyCheckFrameNoButton:ClearAllPoints()
- _G.ReadyCheckFrameYesButton:Point('TOPRIGHT', ReadyCheckFrame, 'CENTER', -3, -5)
- _G.ReadyCheckFrameNoButton:Point('TOPLEFT', ReadyCheckFrame, 'CENTER', 3, -5)
- _G.ReadyCheckFrameText:SetParent(ReadyCheckFrame)
- _G.ReadyCheckFrameText:ClearAllPoints()
- _G.ReadyCheckFrameText:Point('TOP', 0, -15)
-
- _G.ReadyCheckListenerFrame:SetAlpha(0)
- ReadyCheckFrame:HookScript('OnShow', function(frame)
- -- bug fix, don't show it if player is initiator
- if frame.initiator and UnitIsUnit('player', frame.initiator) then
- frame:Hide()
- end
- end)
-
- S:HandleButton(_G.StaticPopup1ExtraButton)
-
- if not E:IsAddOnEnabled('ConsolePortUI_Menu') then
- -- reskin all esc/menu buttons
- for _, Button in pairs({_G.GameMenuFrame:GetChildren()}) do
- if Button.IsObjectType and Button:IsObjectType("Button") then
- S:HandleButton(Button)
- end
- end
-
- _G.GameMenuFrame:StripTextures()
- _G.GameMenuFrame:SetTemplate('Transparent')
- _G.GameMenuFrameHeader:SetTexture()
- _G.GameMenuFrameHeader:ClearAllPoints()
- _G.GameMenuFrameHeader:Point('TOP', _G.GameMenuFrame, 0, 7)
- end
-
- if E:IsAddOnEnabled('OptionHouse') then
- S:HandleButton(_G.GameMenuButtonOptionHouse)
- end
-
- -- since we cant hook `CinematicFrame_OnShow` or `CinematicFrame_OnEvent` directly
- -- we can just hook onto this function so that we can get the correct `self`
- -- this is called through `CinematicFrame_OnShow` so the result would still happen where we want
- hooksecurefunc('CinematicFrame_OnDisplaySizeChanged', function(s)
- if s and s.closeDialog and not s.closeDialog.template then
- s.closeDialog:StripTextures()
- s.closeDialog:SetTemplate('Transparent')
- s:SetScale(E.uiscale)
-
- local dialogName = s.closeDialog.GetName and s.closeDialog:GetName()
- local closeButton = s.closeDialog.ConfirmButton or (dialogName and _G[dialogName..'ConfirmButton'])
- local resumeButton = s.closeDialog.ResumeButton or (dialogName and _G[dialogName..'ResumeButton'])
- if closeButton then S:HandleButton(closeButton) end
- if resumeButton then S:HandleButton(resumeButton) end
- end
- end)
-
- -- same as above except `MovieFrame_OnEvent` and `MovieFrame_OnShow`
- -- cant be hooked directly so we can just use this
- -- this is called through `MovieFrame_OnEvent` on the event `PLAY_MOVIE`
- hooksecurefunc('MovieFrame_PlayMovie', function(s)
- if s and s.CloseDialog and not s.CloseDialog.template then
- s:SetScale(E.uiscale)
- s.CloseDialog:StripTextures()
- s.CloseDialog:SetTemplate('Transparent')
- S:HandleButton(s.CloseDialog.ConfirmButton)
- S:HandleButton(s.CloseDialog.ResumeButton)
- end
- end)
-
- local ChatMenus = {
- _G.ChatMenu,
- _G.EmoteMenu,
- _G.LanguageMenu,
- _G.VoiceMacroMenu,
- }
-
- for _, frame in ipairs(ChatMenus) do
- if frame == _G.ChatMenu then
- frame:HookScript('OnShow', function(menu) menu:SetTemplate('Transparent', true) menu:SetBackdropColor(unpack(E.media.backdropfadecolor)) menu:ClearAllPoints() menu:Point('BOTTOMLEFT', _G.ChatFrame1, 'TOPLEFT', 0, 30) end)
- else
- frame:HookScript('OnShow', function(menu) menu:SetTemplate('Transparent', true) menu:SetBackdropColor(unpack(E.media.backdropfadecolor)) end)
- end
- end
-
- -- reskin popup buttons
- for i = 1, 4 do
- local StaticPopup = _G['StaticPopup'..i]
- StaticPopup:HookScript('OnShow', function() -- UpdateRecapButton is created OnShow
- if StaticPopup.UpdateRecapButton and (not StaticPopup.UpdateRecapButtonHooked) then
- StaticPopup.UpdateRecapButtonHooked = true -- we should only hook this once
- hooksecurefunc(_G['StaticPopup'..i], 'UpdateRecapButton', S.UpdateRecapButton)
- end
- end)
- StaticPopup:StripTextures()
- StaticPopup:SetTemplate('Transparent')
-
- for j = 1, 4 do
- local button = StaticPopup['button'..j]
- S:HandleButton(button)
-
- button.Flash:Hide()
-
- button:CreateShadow(5)
- button.shadow:SetAlpha(0)
- button.shadow:SetBackdropBorderColor(unpack(E.media.rgbvaluecolor))
-
- local anim1, anim2 = button.PulseAnim:GetAnimations()
- anim1:SetTarget(button.shadow)
- anim2:SetTarget(button.shadow)
- end
-
- _G['StaticPopup'..i..'EditBox']:SetFrameLevel(_G['StaticPopup'..i..'EditBox']:GetFrameLevel()+1)
- S:HandleEditBox(_G['StaticPopup'..i..'EditBox'])
- S:HandleEditBox(_G['StaticPopup'..i..'MoneyInputFrameGold'])
- S:HandleEditBox(_G['StaticPopup'..i..'MoneyInputFrameSilver'])
- S:HandleEditBox(_G['StaticPopup'..i..'MoneyInputFrameCopper'])
- _G['StaticPopup'..i..'EditBox'].backdrop:Point('TOPLEFT', -2, -4)
- _G['StaticPopup'..i..'EditBox'].backdrop:Point('BOTTOMRIGHT', 2, 4)
- _G['StaticPopup'..i..'ItemFrameNameFrame']:Kill()
- _G['StaticPopup'..i..'ItemFrame']:SetTemplate()
- _G['StaticPopup'..i..'ItemFrame']:StyleButton()
- _G['StaticPopup'..i..'ItemFrame'].IconBorder:SetAlpha(0)
- _G['StaticPopup'..i..'ItemFrameIconTexture']:SetTexCoord(unpack(E.TexCoords))
- _G['StaticPopup'..i..'ItemFrameIconTexture']:SetInside()
- local normTex = _G['StaticPopup'..i..'ItemFrame']:GetNormalTexture()
- if normTex then
- normTex:SetTexture()
- hooksecurefunc(normTex, 'SetTexture', function(texture, tex)
- if tex ~= nil then texture:SetTexture() end
- end)
- end
-
- -- Quality IconBorder
- hooksecurefunc(_G['StaticPopup'..i..'ItemFrame'].IconBorder, 'SetVertexColor', function(frame, r, g, b)
- frame:GetParent():SetBackdropBorderColor(r, g, b)
- frame:SetTexture()
- end)
- hooksecurefunc(_G['StaticPopup'..i..'ItemFrame'].IconBorder, 'Hide', function(frame)
- frame:GetParent():SetBackdropBorderColor(unpack(E.media.bordercolor))
- end)
- end
-
- _G.OpacityFrame:StripTextures()
- _G.OpacityFrame:SetTemplate('Transparent')
-
- --DropDownMenu
- hooksecurefunc('UIDropDownMenu_CreateFrames', function(level, index)
- local listFrame = _G['DropDownList'..level]
- local listFrameName = listFrame:GetName()
- local expandArrow = _G[listFrameName..'Button'..index..'ExpandArrow']
- if expandArrow then
- local normTex = expandArrow:GetNormalTexture()
- expandArrow:SetNormalTexture(E.Media.Textures.ArrowUp)
- normTex:SetVertexColor(unpack(E.media.rgbvaluecolor))
- normTex:SetRotation(S.ArrowRotation.right)
- expandArrow:Size(12, 12)
- end
-
- local Backdrop = _G[listFrameName..'Backdrop']
- if Backdrop and not Backdrop.template then
- Backdrop:StripTextures()
- Backdrop:SetTemplate('Transparent')
- end
-
- local menuBackdrop = _G[listFrameName..'MenuBackdrop']
- if menuBackdrop and not menuBackdrop.template then
- menuBackdrop:StripTextures()
- menuBackdrop:SetTemplate('Transparent')
- end
- end)
-
- hooksecurefunc('UIDropDownMenu_SetIconImage', function(icon, texture)
- if texture:find('Divider') then
- local r, g, b = unpack(E.media.rgbvaluecolor)
- icon:SetColorTexture(r, g, b, 0.45)
- icon:Height(1)
- end
- end)
-
- hooksecurefunc('ToggleDropDownMenu', function(level)
- if not level then
- level = 1
- end
-
- local r, g, b = unpack(E.media.rgbvaluecolor)
-
- for i = 1, _G.UIDROPDOWNMENU_MAXBUTTONS do
- local button = _G['DropDownList'..level..'Button'..i]
- local check = _G['DropDownList'..level..'Button'..i..'Check']
- local uncheck = _G['DropDownList'..level..'Button'..i..'UnCheck']
- local highlight = _G['DropDownList'..level..'Button'..i..'Highlight']
-
- highlight:SetTexture(E.Media.Textures.Highlight)
- highlight:SetBlendMode('BLEND')
- highlight:SetDrawLayer('BACKGROUND')
- highlight:SetVertexColor(r, g, b)
-
- if not button.backdrop then
- button:CreateBackdrop()
- end
-
- if not button.notCheckable then
- uncheck:SetTexture()
-
- local _, co = check:GetTexCoord()
- if co == 0 then
- check:SetTexture([[Interface\Buttons\UI-CheckBox-Check]])
- check:SetVertexColor(r, g, b, 1)
- check:Size(20, 20)
- check:SetDesaturated(true)
- button.backdrop:SetInside(check, 4, 4)
- else
- check:SetTexture(E.media.normTex)
- check:SetVertexColor(r, g, b, 1)
- check:Size(10, 10)
- check:SetDesaturated(false)
- button.backdrop:SetOutside(check)
- end
-
- button.backdrop:Show()
- check:SetTexCoord(0, 1, 0, 1)
- else
- button.backdrop:Hide()
- check:Size(16, 16)
- end
- end
- end)
-
- local SideDressUpFrame = _G.SideDressUpFrame
- S:HandleCloseButton(_G.SideDressUpModelCloseButton)
- SideDressUpFrame:StripTextures()
- SideDressUpFrame.BGTopLeft:Hide()
- SideDressUpFrame.BGBottomLeft:Hide()
- S:HandleButton(_G.SideDressUpModelResetButton)
- SideDressUpFrame:SetTemplate('Transparent')
-
- -- StackSplit
- local StackSplitFrame = _G.StackSplitFrame
- StackSplitFrame:StripTextures()
- StackSplitFrame:SetTemplate('Transparent')
-
- StackSplitFrame.bg1 = CreateFrame('Frame', nil, StackSplitFrame)
- StackSplitFrame.bg1:SetTemplate('Transparent')
- StackSplitFrame.bg1:Point('TOPLEFT', 10, -15)
- StackSplitFrame.bg1:Point('BOTTOMRIGHT', -10, 55)
- StackSplitFrame.bg1:SetFrameLevel(StackSplitFrame.bg1:GetFrameLevel() - 1)
-
- S:HandleButton(_G.StackSplitOkayButton)
- S:HandleButton(_G.StackSplitCancelButton)
-
- local buttons = {StackSplitFrame.LeftButton, StackSplitFrame.RightButton}
- for _, btn in pairs(buttons) do
- btn:Size(14, 18)
-
- btn:ClearAllPoints()
-
- if btn == StackSplitFrame.LeftButton then
- btn:Point('LEFT', StackSplitFrame.bg1, 'LEFT', 4, 0)
- else
- btn:Point('RIGHT', StackSplitFrame.bg1, 'RIGHT', -4, 0)
- end
-
- S:HandleNextPrevButton(btn)
-
- if btn.SetTemplate then
- btn:SetTemplate('NoBackdrop')
- end
- end
-
- --NavBar Buttons (Used in WorldMapFrame, EncounterJournal and HelpFrame)
- hooksecurefunc('NavBar_AddButton', SkinNavBarButtons)
-end
-
-S:AddCallback('BlizzardMiscFrames')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Petition.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Petition.lua
deleted file mode 100644
index 0aa3b4998..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Petition.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:PetitionFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.petition) then return end
-
- local PetitionFrame = _G.PetitionFrame
- S:HandleFrame(PetitionFrame, true, nil, 12, -17, -28, 65)
-
- local buttons = {
- _G.PetitionFrameSignButton,
- _G.PetitionFrameRequestButton,
- _G.PetitionFrameRenameButton,
- _G.PetitionFrameCancelButton
- }
-
- for _, button in pairs(buttons) do
- S:HandleButton(button)
- end
-
- S:HandleCloseButton(_G.PetitionFrameCloseButton)
-
- _G.PetitionFrameCharterTitle:SetTextColor(1, 1, 0)
- _G.PetitionFrameCharterName:SetTextColor(1, 1, 1)
- _G.PetitionFrameMasterTitle:SetTextColor(1, 1, 0)
- _G.PetitionFrameMasterName:SetTextColor(1, 1, 1)
- _G.PetitionFrameMemberTitle:SetTextColor(1, 1, 0)
-
- for i = 1, 9 do
- _G['PetitionFrameMemberName'..i]:SetTextColor(1, 1, 1)
- end
-
- _G.PetitionFrameInstructions:SetTextColor(1, 1, 1)
-
- _G.PetitionFrameRenameButton:Point('LEFT', _G.PetitionFrameRequestButton, 'RIGHT', 3, 0)
- _G.PetitionFrameRenameButton:Point('RIGHT', _G.PetitionFrameCancelButton, 'LEFT', -3, 0)
-end
-
-S:AddCallback('PetitionFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Quest.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Quest.lua
deleted file mode 100644
index 00073941c..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Quest.lua
+++ /dev/null
@@ -1,467 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, gsub = unpack, gsub
-local select, pairs = select, pairs
-local next, strmatch = next, strmatch
-
-local GetMoney = GetMoney
-local GetItemInfo = GetItemInfo
-local GetItemQualityColor = GetItemQualityColor
-local GetNumQuestLeaderBoards = GetNumQuestLeaderBoards
-local GetNumQuestLogEntries = GetNumQuestLogEntries
-local GetQuestItemLink = GetQuestItemLink
-local GetQuestLogItemLink = GetQuestLogItemLink
-local GetQuestLogLeaderBoard = GetQuestLogLeaderBoard
-local GetQuestLogRequiredMoney = GetQuestLogRequiredMoney
-local GetQuestLogTitle = GetQuestLogTitle
-local GetQuestMoneyToGet = GetQuestMoneyToGet
-local IsQuestComplete = IsQuestComplete
-local MAX_NUM_ITEMS = MAX_NUM_ITEMS
-local MAX_NUM_QUESTS = MAX_NUM_QUESTS
-local MAX_REQUIRED_ITEMS = MAX_REQUIRED_ITEMS
-local hooksecurefunc = hooksecurefunc
-
-local function handleItemButton(item)
- if not item then return end
-
- if item then
- item:SetTemplate()
- item:Size(143, 40)
- item:SetFrameLevel(item:GetFrameLevel() + 2)
- end
-
- if item.Icon then
- item.Icon:Size(E.PixelMode and 35 or 32)
- item.Icon:SetDrawLayer('ARTWORK')
- item.Icon:Point('TOPLEFT', E.PixelMode and 2 or 4, -(E.PixelMode and 2 or 4))
- S:HandleIcon(item.Icon)
- end
-
- if item.IconBorder then
- S:HandleIconBorder(item.IconBorder)
- end
-
- if item.Count then
- item.Count:SetDrawLayer('OVERLAY')
- item.Count:ClearAllPoints()
- item.Count:SetPoint('BOTTOMRIGHT', item.Icon, 'BOTTOMRIGHT', 0, 0)
- end
-
- if item.NameFrame then
- item.NameFrame:SetAlpha(0)
- item.NameFrame:Hide()
- end
-
- if item.IconOverlay then
- item.IconOverlay:SetAlpha(0)
- end
-
- if item.Name then
- item.Name:FontTemplate()
- end
-
- if item.CircleBackground then
- item.CircleBackground:SetAlpha(0)
- item.CircleBackgroundGlow:SetAlpha(0)
- end
-
- for _, Region in next, { item:GetRegions() } do
- if Region:IsObjectType('Texture') and Region:GetTexture() == [[Interface\Spellbook\Spellbook-Parts]] then
- Region:SetTexture('')
- end
- end
-end
-
-local function questQualityColors(frame, text, link)
- if not frame.template then
- handleItemButton(frame)
- end
-
- local quality = link and select(3, GetItemInfo(link))
- if quality and quality > 1 then
- local r, g, b = GetItemQualityColor(quality)
-
- text:SetTextColor(r, g, b)
- frame:SetBackdropBorderColor(r, g, b)
- else
- text:SetTextColor(1, 1, 1)
- frame:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
-end
-
-local function UpdateGreetingFrame()
- local i = 1
- local title = _G['QuestTitleButton'..i]
- while (title and title:IsVisible()) do
- _G.GreetingText:SetTextColor(1, 1, 1)
- _G.CurrentQuestsText:SetTextColor(1, 0.80, 0.10)
- _G.AvailableQuestsText:SetTextColor(1, 0.80, 0.10)
-
- local text = title:GetFontString()
- local textString = gsub(title:GetText(), '|c[Ff][Ff]%x%x%x%x%x%x(.+)|r', '%1')
- title:SetText(textString)
-
- local icon = _G['QuestTitleButton'..i..'QuestIcon']
- if title.isActive == 1 then
- icon:SetTexture(132048)
- icon:SetDesaturation(1)
- text:SetTextColor(.6, .6, .6)
- else
- icon:SetTexture(132049)
- icon:SetDesaturation(0)
- text:SetTextColor(1, .8, .1)
- end
-
- local numEntries = GetNumQuestLogEntries()
- for y = 1, numEntries do
- local titleText, _, _, _, _, isComplete, _, questId = GetQuestLogTitle(y)
- if not titleText then
- break
- elseif strmatch(titleText, textString) and (isComplete == 1 or IsQuestComplete(questId)) then
- icon:SetDesaturation(0)
- text:SetTextColor(1, .8, .1)
- break
- end
- end
-
- i = i + 1
- title = _G['QuestTitleButton'..i]
- end
-end
-
-function S:BlizzardQuestFrames()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.quest) then return end
-
- local QuestStrip = {
- _G.EmptyQuestLogFrame,
- _G.QuestDetailScrollChildFrame,
- _G.QuestDetailScrollFrame,
- _G.QuestFrame,
- _G.QuestFrameDetailPanel,
- _G.QuestFrameGreetingPanel,
- _G.QuestFrameProgressPanel,
- _G.QuestFrameRewardPanel,
- _G.QuestGreetingScrollFrame,
- _G.QuestInfoItemHighlight,
- _G.QuestLogDetailScrollFrame,
- _G.QuestLogFrame,
- _G.QuestLogListScrollFrame,
- _G.QuestLogQuestCount,
- _G.QuestProgressScrollFrame,
- _G.QuestRewardScrollChildFrame,
- _G.QuestRewardScrollFrame,
- _G.QuestRewardScrollFrame
- }
- for _, object in pairs(QuestStrip) do
- object:StripTextures(true)
- end
-
- local QuestButtons = {
- _G.QuestFrameAcceptButton,
- _G.QuestFrameCancelButton,
- _G.QuestFrameCompleteButton,
- _G.QuestFrameCompleteQuestButton,
- _G.QuestFrameDeclineButton,
- _G.QuestFrameExitButton,
- _G.QuestFrameGoodbyeButton,
- _G.QuestFrameGreetingGoodbyeButton,
- _G.QuestFramePushQuestButton,
- _G.QuestLogFrameAbandonButton
- }
- for _, button in pairs(QuestButtons) do
- button:StripTextures()
- S:HandleButton(button)
- end
-
- local ScrollBars = {
- _G.QuestDetailScrollFrameScrollBar,
- _G.QuestGreetingScrollFrameScrollBar,
- _G.QuestLogDetailScrollFrameScrollBar,
- _G.QuestLogListScrollFrameScrollBar,
- _G.QuestProgressScrollFrameScrollBar,
- _G.QuestRewardScrollFrameScrollBar
- }
- for _, object in pairs(ScrollBars) do
- S:HandleScrollBar(object)
- end
-
- for frame, numItems in pairs({ QuestLogItem = MAX_NUM_ITEMS, QuestProgressItem = MAX_REQUIRED_ITEMS }) do
- for i = 1, numItems do
- handleItemButton(_G[frame..i])
- end
- end
-
- hooksecurefunc('QuestInfo_GetRewardButton', function(rewardsFrame, index)
- local button = rewardsFrame.RewardButtons[index]
- if not button and button.template then return end
-
- handleItemButton(button)
- end)
-
- hooksecurefunc('QuestInfoItem_OnClick', function(frame)
- if frame.type == 'choice' then
- frame:SetBackdropBorderColor(1, 0.80, 0.10)
- _G[frame:GetName()..'Name']:SetTextColor(1, 0.80, 0.10)
-
- for i = 1, #_G.QuestInfoRewardsFrame.RewardButtons do
- local item = _G['QuestInfoRewardsFrameQuestInfoItem'..i]
-
- if item ~= frame then
- local name = _G['QuestInfoRewardsFrameQuestInfoItem'..i..'Name']
- local link = item.type and (_G.QuestInfoFrame.questLog and GetQuestLogItemLink or GetQuestItemLink)(item.type, item:GetID())
-
- questQualityColors(item, name, link)
- end
- end
- end
- end)
-
- hooksecurefunc('QuestInfo_ShowRewards', function()
- for i = 1, #_G.QuestInfoRewardsFrame.RewardButtons do
- local item = _G['QuestInfoRewardsFrameQuestInfoItem'..i]
- local name = _G['QuestInfoRewardsFrameQuestInfoItem'..i..'Name']
- local link = item.type and (_G.QuestInfoFrame.questLog and GetQuestLogItemLink or GetQuestItemLink)(item.type, item:GetID())
-
- questQualityColors(item, name, link)
- end
- end)
-
- hooksecurefunc('QuestInfo_ShowRequiredMoney', function()
- local requiredMoney = GetQuestLogRequiredMoney()
- if requiredMoney > 0 then
- if requiredMoney > GetMoney() then
- _G.QuestInfoRequiredMoneyText:SetTextColor(0.6, 0.6, 0.6)
- else
- _G.QuestInfoRequiredMoneyText:SetTextColor(1, 0.80, 0.10)
- end
- end
- end)
-
- hooksecurefunc('QuestFrameProgressItems_Update', function()
- _G.QuestProgressTitleText:SetTextColor(1, .8, .1)
- _G.QuestProgressText:SetTextColor(1, 1, 1)
- _G.QuestProgressRequiredItemsText:SetTextColor(1, .8, 0.1)
-
- local moneyToGet = GetQuestMoneyToGet()
- if moneyToGet > 0 then
- if moneyToGet > GetMoney() then
- _G.QuestProgressRequiredMoneyText:SetTextColor(.6, .6, .6)
- else
- _G.QuestProgressRequiredMoneyText:SetTextColor(1, .8, .1)
- end
- end
-
- for i = 1, _G.MAX_REQUIRED_ITEMS do
- local item = _G['QuestProgressItem'..i]
- local name = _G['QuestProgressItem'..i..'Name']
- local link = item.type and GetQuestItemLink(item.type, item:GetID())
-
- questQualityColors(item, name, link)
- end
- end)
-
- hooksecurefunc('QuestLog_UpdateQuestDetails', function()
- local requiredMoney = GetQuestLogRequiredMoney()
- if requiredMoney > 0 then
- if requiredMoney > GetMoney() then
- _G.QuestLogRequiredMoneyText:SetTextColor(0.6, 0.6, 0.6)
- else
- _G.QuestLogRequiredMoneyText:SetTextColor(1, 0.80, 0.10)
- end
- end
- end)
-
- local textColor = {1, 1, 1}
- local titleTextColor = {1, 0.80, 0.10}
- hooksecurefunc('QuestFrameItems_Update', function()
- -- Headers
- _G.QuestLogDescriptionTitle:SetTextColor(unpack(titleTextColor))
- _G.QuestLogRewardTitleText:SetTextColor(unpack(titleTextColor))
- _G.QuestLogQuestTitle:SetTextColor(unpack(titleTextColor))
-
- -- Other text
- _G.QuestLogItemChooseText:SetTextColor(unpack(textColor))
- _G.QuestLogItemReceiveText:SetTextColor(unpack(textColor))
- _G.QuestLogObjectivesText:SetTextColor(unpack(textColor))
- _G.QuestLogQuestDescription:SetTextColor(unpack(textColor))
- _G.QuestLogSpellLearnText:SetTextColor(unpack(textColor))
-
- local requiredMoney = GetQuestLogRequiredMoney()
- if requiredMoney > 0 then
- if requiredMoney > GetMoney() then
- _G.QuestInfoRequiredMoneyText:SetTextColor(0.6, 0.6, 0.6)
- else
- _G.QuestInfoRequiredMoneyText:SetTextColor(1, 0.80, 0.10)
- end
- end
-
- _G.QuestLogItem1:Point('TOPLEFT', _G.QuestLogItemChooseText, 'BOTTOMLEFT', 1, -3)
-
- local numVisibleObjectives = 0
- local numObjectives = GetNumQuestLeaderBoards()
- for i = 1, numObjectives do
- local _, objType, finished = GetQuestLogLeaderBoard(i)
- if objType ~= 'spell' then
- numVisibleObjectives = numVisibleObjectives + 1
- local objective = _G['QuestLogObjective'..numVisibleObjectives]
-
- if objective then
- if finished then
- objective:SetTextColor(1, .8, .1)
- else
- objective:SetTextColor(.63, .09, .09)
- end
- end
- end
- end
-
- for i = 1, _G.MAX_NUM_ITEMS do
- local item = _G['QuestLogItem'..i]
- local name = _G['QuestLogItem'..i..'Name']
- local link = item.type and (GetQuestLogItemLink or GetQuestItemLink)(item.type, item:GetID())
-
- questQualityColors(item, name, link)
- end
- end)
-
- hooksecurefunc('QuestInfo_Display', function()
- -- Headers
- _G.QuestInfoTitleHeader:SetTextColor(unpack(titleTextColor))
- _G.QuestInfoDescriptionHeader:SetTextColor(unpack(titleTextColor))
- _G.QuestInfoObjectivesHeader:SetTextColor(unpack(titleTextColor))
- _G.QuestInfoRewardsFrame.Header:SetTextColor(unpack(titleTextColor))
-
- -- Other text
- _G.QuestInfoDescriptionText:SetTextColor(unpack(textColor))
- _G.QuestInfoObjectivesText:SetTextColor(unpack(textColor))
- _G.QuestInfoGroupSize:SetTextColor(unpack(textColor))
- _G.QuestInfoRewardText:SetTextColor(unpack(textColor))
-
- -- Reward frame text
- _G.QuestInfoRewardsFrame.ItemChooseText:SetTextColor(unpack(textColor))
- _G.QuestInfoRewardsFrame.ItemReceiveText:SetTextColor(unpack(textColor))
- _G.QuestInfoRewardsFrame.PlayerTitleText:SetTextColor(unpack(textColor))
- _G.QuestInfoRewardsFrame.XPFrame.ReceiveText:SetTextColor(unpack(textColor))
-
- _G.QuestInfoRewardsFrame.spellHeaderPool.textR, _G.QuestInfoRewardsFrame.spellHeaderPool.textG, _G.QuestInfoRewardsFrame.spellHeaderPool.textB = unpack(textColor)
-
- for spellHeader, _ in _G.QuestInfoFrame.rewardsFrame.spellHeaderPool:EnumerateActive() do
- spellHeader:SetVertexColor(1, 1, 1)
- end
- for spellIcon, _ in _G.QuestInfoFrame.rewardsFrame.spellRewardPool:EnumerateActive() do
- if not spellIcon.template then
- handleItemButton(spellIcon)
- end
- end
-
- local requiredMoney = GetQuestLogRequiredMoney()
- if requiredMoney > 0 then
- if requiredMoney > GetMoney() then
- _G.QuestInfoRequiredMoneyText:SetTextColor(0.6, 0.6, 0.6)
- else
- _G.QuestInfoRequiredMoneyText:SetTextColor(1, 0.80, 0.10)
- end
- end
-
- for i = 1, #_G.QuestInfoRewardsFrame.RewardButtons do
- local item = _G['QuestInfoRewardsFrameQuestInfoItem'..i]
- local name = _G['QuestInfoRewardsFrameQuestInfoItem'..i..'Name']
- local link = item.type and (_G.QuestInfoFrame.questLog and GetQuestLogItemLink or GetQuestItemLink)(item.type, item:GetID())
-
- questQualityColors(item, name, link)
- end
- end)
-
- for i = 1, MAX_NUM_QUESTS do
- _G['QuestTitleButton'..i..'QuestIcon']:SetPoint('TOPLEFT', 4, 2)
- _G['QuestTitleButton'..i..'QuestIcon']:SetSize(16, 16)
- end
-
- _G.QuestFrameGreetingPanel:HookScript('OnUpdate', UpdateGreetingFrame)
- hooksecurefunc('QuestFrameGreetingPanel_OnShow', UpdateGreetingFrame)
-
- _G.QuestLogTimerText:SetTextColor(1, 1, 1)
-
- S:HandleFrame(_G.QuestFrame, true, nil, 11, -12, -32, 66)
- S:HandleFrame(_G.QuestLogCount, true)
- S:HandleFrame(_G.QuestLogFrame, true, nil, 11, -12, -32, 45)
- S:HandleFrame(_G.QuestLogListScrollFrame, true, nil, -1, 2)
- S:HandleFrame(_G.QuestLogDetailScrollFrame, true, nil, -1, 2)
- S:HandleFrame(_G.QuestDetailScrollFrame, true, nil, -6, 2)
- S:HandleFrame(_G.QuestRewardScrollFrame, true, nil, -6, 2)
- S:HandleFrame(_G.QuestProgressScrollFrame, true, nil, -6, 2)
- S:HandleFrame(_G.QuestGreetingScrollFrame, true, nil, -6, 2)
-
- S:HandlePointXY(_G.QuestLogFrameAbandonButton, 15, 49)
- S:HandlePointXY(_G.QuestFramePushQuestButton, -2)
- S:HandlePointXY(_G.QuestFrameExitButton, -36, 49)
- S:HandlePointXY(_G.QuestFrameAcceptButton, 15, 70)
- S:HandlePointXY(_G.QuestFrameDeclineButton, -36, 70)
- S:HandlePointXY(_G.QuestFrameCompleteQuestButton, 15, 70)
- S:HandlePointXY(_G.QuestFrameCompleteButton, 15, 70)
- S:HandlePointXY(_G.QuestFrameCancelButton, -36, 70)
- S:HandlePointXY(_G.QuestFrameGoodbyeButton, -36, 70)
- S:HandlePointXY(_G.QuestFrameGreetingGoodbyeButton, -36, 70)
- S:HandlePointXY(_G.QuestFrameNpcNameText, -1, 0)
-
- _G.QuestGreetingFrameHorizontalBreak:Kill()
-
- _G.QuestLogListScrollFrame:Width(303)
- _G.QuestLogDetailScrollFrame:Width(303)
- _G.QuestLogFrameAbandonButton:Width(129)
-
- _G.QuestLogHighlightFrame:Width(303)
- _G.QuestLogHighlightFrame.SetWidth = E.noop
-
- _G.QuestLogSkillHighlight:SetTexture(E.Media.Textures.Highlight)
- _G.QuestLogSkillHighlight:SetAlpha(0.35)
-
- S:HandleCloseButton(_G.QuestFrameCloseButton, _G.QuestFrame.backdrop)
- S:HandleCloseButton(_G.QuestLogFrameCloseButton, _G.QuestLogFrame.backdrop)
-
- local questLogIndex = 1
- local questLogTitle = _G['QuestLogTitle'..questLogIndex]
- while questLogTitle do
- questLogTitle:SetNormalTexture(E.Media.Textures.PlusButton)
- questLogTitle.SetNormalTexture = E.noop
-
- questLogTitle:SetHighlightTexture(E.ClearTexture)
- questLogTitle.SetHighlightTexture = E.noop
-
- local normalTex = questLogTitle:GetNormalTexture()
- normalTex:Size(16)
- normalTex:Point('LEFT', 5, 0)
-
- questLogTitle:Width(300)
-
- _G['QuestLogTitle'..questLogIndex..'Highlight']:SetAlpha(0)
-
- S:HandleCollapseTexture(questLogTitle)
-
- questLogIndex = questLogIndex + 1
- questLogTitle = _G['QuestLogTitle'..questLogIndex]
- end
-
- local QuestLogCollapseAllButton = _G.QuestLogCollapseAllButton
- QuestLogCollapseAllButton:StripTextures()
- QuestLogCollapseAllButton:Point('TOPLEFT', -45, 7)
-
- QuestLogCollapseAllButton:SetNormalTexture(E.Media.Textures.PlusButton)
- QuestLogCollapseAllButton.SetNormalTexture = E.noop
- QuestLogCollapseAllButton:GetNormalTexture():Size(16)
-
- QuestLogCollapseAllButton:SetHighlightTexture(E.ClearTexture)
- QuestLogCollapseAllButton.SetHighlightTexture = E.noop
-
- QuestLogCollapseAllButton:SetDisabledTexture(E.Media.Textures.PlusButton)
- QuestLogCollapseAllButton.SetDisabledTexture = E.noop
- QuestLogCollapseAllButton:GetDisabledTexture():Size(16)
- QuestLogCollapseAllButton:GetDisabledTexture():SetTexture(E.Media.Textures.PlusButton)
- QuestLogCollapseAllButton:GetDisabledTexture():SetDesaturated(true)
-
- S:HandleCollapseTexture(_G.QuestLogCollapseAllButton)
-end
-
-S:AddCallback('BlizzardQuestFrames')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/QuestTimers.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/QuestTimers.lua
deleted file mode 100644
index 60b7ece34..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/QuestTimers.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-local CreateFrame = CreateFrame
-local hooksecurefunc = hooksecurefunc
-
-function S:SkinQuestTimers()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.questtimers) then return end
-
- local QuestTimerFrame = _G.QuestTimerFrame
- S:HandleFrame(QuestTimerFrame, true)
-
- E:CreateMover(QuestTimerFrame, 'QuestTimerFrameMover', _G.QUEST_TIMERS)
-
- QuestTimerFrame:ClearAllPoints()
- QuestTimerFrame:SetAllPoints(_G.QuestTimerFrameMover)
-
- _G.QuestTimerHeader:Point('TOP', 1, 8)
-
- local QuestTimerFrameHolder = CreateFrame('Frame', 'QuestTimerFrameHolder', E.UIParent)
- QuestTimerFrameHolder:Size(150, 22)
- QuestTimerFrameHolder:SetPoint('TOP', _G.QuestTimerFrameMover, 'TOP')
-
- hooksecurefunc(QuestTimerFrame, 'SetPoint', function(_, _, parent)
- if parent ~= QuestTimerFrameHolder then
- QuestTimerFrame:ClearAllPoints()
- QuestTimerFrame:Point('TOP', QuestTimerFrameHolder, 'TOP')
- end
- end)
-end
-
-S:AddCallback('SkinQuestTimers')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Raid.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Raid.lua
deleted file mode 100644
index 4f42bf4a9..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Raid.lua
+++ /dev/null
@@ -1,135 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local pairs, ipairs = pairs, ipairs
-local hooksecurefunc = hooksecurefunc
-
-local StripAllTextures = {
- 'RaidGroup1',
- 'RaidGroup2',
- 'RaidGroup3',
- 'RaidGroup4',
- 'RaidGroup5',
- 'RaidGroup6',
- 'RaidGroup7',
- 'RaidGroup8',
-}
-
-function S:Blizzard_RaidUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.raid) then return end
-
- for _, object in ipairs(StripAllTextures) do
- local obj = _G[object]
- if obj then
- obj:StripTextures()
- end
- end
-
- S:HandleButton(_G.RaidFrameReadyCheckButton)
- S:HandleButton(_G.RaidFrameRaidInfoButton)
-
- for i = 1, _G.MAX_RAID_GROUPS * 5 do
- S:HandleButton(_G['RaidGroupButton'..i], true)
- end
-
- for i = 1, 8 do
- for j = 1, 5 do
- local slot = _G['RaidGroup'..i..'Slot'..j]
- slot:StripTextures()
- slot:SetTemplate('Transparent')
- end
- end
-
- do
- local prevButton
- for key, data in pairs(_G.RAID_CLASS_BUTTONS) do
- local index = data.button
- if index then
- local button = _G['RaidClassButton'..index]
- local icon = _G['RaidClassButton'..index..'IconTexture']
- local count = _G['RaidClassButton'..index..'Count']
- button:StripTextures()
- button:SetTemplate()
- button:Size(22)
-
- button:ClearAllPoints()
- if index == 1 then
- button:Point('TOPLEFT', _G.RaidFrame, 'TOPRIGHT', -34, -37)
- elseif index == 11 then
- button:Point('TOP', prevButton, 'BOTTOM', 0, -20)
- else
- button:Point('TOP', prevButton, 'BOTTOM', 0, -6)
- end
- prevButton = button
-
- count:FontTemplate(nil, 12, 'OUTLINE')
-
- icon:SetInside()
- icon:SetTexCoord(unpack(E.TexCoords))
-
- if key == 'PETS' then
- icon:SetTexture([[Interface\RaidFrame\UI-RaidFrame-Pets]])
- elseif key == 'MAINTANK' then
- icon:SetTexture([[Interface\RaidFrame\UI-RaidFrame-MainTank]])
- elseif key == 'MAINASSIST' then
- icon:SetTexture([[Interface\RaidFrame\UI-RaidFrame-MainAssist]])
- else
- local coords = _G.CLASS_ICON_TCOORDS[_G.CLASS_SORT_ORDER[index]]
- if coords then
- icon:SetTexture([[Interface\WorldStateFrame\Icons-Classes]])
- icon:SetTexCoord(coords[1] + 0.015, coords[2] - 0.02, coords[3] + 0.018, coords[4] - 0.02)
- end
- end
- end
- end
- end
-
- hooksecurefunc('RaidPullout_GetFrame', function()
- for i = 1, _G.NUM_RAID_PULLOUT_FRAMES do
- local rp = _G['RaidPullout'..i]
- if rp and not rp.backdrop then
- S:HandleFrame(rp, true, nil, 9, -17, -7, 10)
- end
- end
- end)
-
- local bars = { 'HealthBar', 'ManaBar', 'Target', 'TargetTarget' }
- hooksecurefunc('RaidPullout_Update', function(pullOutFrame)
- local pfName = pullOutFrame:GetName()
- local pfBName, pfBObj, pfTot
-
- for i = 1, pullOutFrame.numPulloutButtons do
- pfBName = pfName..'Button'..i
- pfBObj = _G[pfBName]
- pfTot = _G[pfBName..'TargetTargetFrame']
-
- if not pfBObj.backdrop then
- local sBar
-
- for _, v in ipairs(bars) do
- sBar = _G[pfBName..v]
- sBar:StripTextures()
- sBar:SetStatusBarTexture(E.media.normTex)
- end
-
- _G[pfBName..'ManaBar']:Point('TOP', '$parentHealthBar', 'BOTTOM', 0, 0)
- _G[pfBName..'Target']:Point('TOP', '$parentManaBar', 'BOTTOM', 0, -1)
-
- pfBObj:CreateBackdrop()
- pfBObj.backdrop:Point('TOPLEFT', E.PixelMode and 0 or -1, -(E.PixelMode and 10 or 9))
- pfBObj.backdrop:Point('BOTTOMRIGHT', E.PixelMode and 0 or 1, E.PixelMode and 1 or 0)
- end
-
- if not pfTot.backdrop then
- pfTot:StripTextures()
- pfTot:CreateBackdrop()
- pfTot.backdrop:Point('TOPLEFT', E.PixelMode and 10 or 9, -(E.PixelMode and 15 or 14))
- pfTot.backdrop:Point('BOTTOMRIGHT', -(E.PixelMode and 10 or 9), E.PixelMode and 8 or 7)
- end
- end
- end)
-end
-
-S:AddCallbackForAddon('Blizzard_RaidUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Socket.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Socket.lua
deleted file mode 100644
index c8e69d0ee..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Socket.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local GetNumSockets = GetNumSockets
-local GetSocketTypes = GetSocketTypes
-local hooksecurefunc = hooksecurefunc
-
-function S:Blizzard_ItemSocketingUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.socket) then return end
-
- local ItemSocketingFrame = _G.ItemSocketingFrame
- S:HandlePortraitFrame(ItemSocketingFrame)
-
- _G.ItemSocketingDescription:DisableDrawLayer('BORDER')
- _G.ItemSocketingDescription:DisableDrawLayer('BACKGROUND')
- _G.ItemSocketingScrollFrame:StripTextures()
- _G.ItemSocketingScrollFrame:CreateBackdrop('Transparent')
- S:HandleScrollBar(_G.ItemSocketingScrollFrameScrollBar, 2)
-
- for i = 1, _G.MAX_NUM_SOCKETS do
- local button = _G[('ItemSocketingSocket%d'):format(i)]
- local button_bracket = _G[('ItemSocketingSocket%dBracketFrame'):format(i)]
- local button_bg = _G[('ItemSocketingSocket%dBackground'):format(i)]
- local button_icon = _G[('ItemSocketingSocket%dIconTexture'):format(i)]
- button:StripTextures()
- button:StyleButton(false)
- button:CreateBackdrop(nil, true)
- button_bracket:Kill()
- button_bg:Kill()
- button_icon:SetTexCoord(unpack(E.TexCoords))
- button_icon:SetInside()
- end
-
- hooksecurefunc('ItemSocketingFrame_Update', function()
- local numSockets = GetNumSockets()
- for i = 1, numSockets do
- local socket = _G['ItemSocketingSocket'..i]
- local gemColor = GetSocketTypes(i)
- local color = E.GemTypeInfo[gemColor]
- socket.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
- end
- end)
-
- S:HandleCloseButton(_G.ItemSocketingCloseButton)
-
- _G.ItemSocketingFramePortrait:Kill()
- _G.ItemSocketingSocketButton:ClearAllPoints()
- _G.ItemSocketingSocketButton:Point('BOTTOMRIGHT', ItemSocketingFrame, 'BOTTOMRIGHT', -5, 5)
- S:HandleButton(_G.ItemSocketingSocketButton)
-end
-
-S:AddCallbackForAddon('Blizzard_ItemSocketingUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/SpellBook.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/SpellBook.lua
deleted file mode 100644
index 8849a4a10..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/SpellBook.lua
+++ /dev/null
@@ -1,139 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local next = next
-local unpack = unpack
-
-local CreateFrame = CreateFrame
-local hooksecurefunc = hooksecurefunc
-
-function S:SpellBookFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.spellbook) then return end
-
- S:HandleFrame(_G.SpellBookFrame, true, nil, 11, -12, -32, 76)
-
- _G.SpellBookTitleText:Point('TOP', -10, -17)
- _G.SpellBookTitleText:SetTextColor(1, 1, 1)
-
- _G.SpellBookSpellIconsFrame:StripTextures(true)
- _G.SpellBookSideTabsFrame:StripTextures(true)
- _G.SpellBookPageNavigationFrame:StripTextures(true)
-
- _G.SpellBookPageText:SetTextColor(1, 1, 1)
- _G.SpellBookPageText:Point('BOTTOM', -10, 87)
-
- S:HandleNextPrevButton(_G.SpellBookPrevPageButton)
- _G.SpellBookPrevPageButton:Point('BOTTOMRIGHT', _G.SpellBookFrame, 'BOTTOMRIGHT', -73, 87)
- _G.SpellBookPrevPageButton:Size(24)
-
- S:HandleNextPrevButton(_G.SpellBookNextPageButton)
- _G.SpellBookNextPageButton:Point('TOPLEFT', _G.SpellBookPrevPageButton, 'TOPLEFT', 30, 0)
- _G.SpellBookNextPageButton:Size(24)
-
- S:HandleCloseButton(_G.SpellBookCloseButton, _G.SpellBookFrame.backdrop)
-
- for i = 1, 3 do
- local tab = _G['SpellBookFrameTabButton'..i]
-
- tab:GetNormalTexture():SetTexture(nil)
- tab:GetDisabledTexture():SetTexture(nil)
-
- S:HandleTab(tab)
-
- tab.backdrop:Point('TOPLEFT', 14, E.PixelMode and -16 or -19)
- tab.backdrop:Point('BOTTOMRIGHT', -14, 19)
- end
-
- -- Spell Buttons
- for i = 1, _G.SPELLS_PER_PAGE do
- local button = _G['SpellButton'..i]
- local icon = _G['SpellButton'..i..'IconTexture']
- local cooldown = _G['SpellButton'..i..'Cooldown']
- local highlight = _G['SpellButton'..i..'Highlight']
-
- for _, region in next, { button:GetRegions() } do
- if region:GetObjectType() == 'Texture' and region:GetTexture() ~= [[Interface\Buttons\ActionBarFlyoutButton]] then
- region:SetTexture(nil)
- end
- end
-
- button:CreateBackdrop(nil, true)
- button.backdrop:SetFrameLevel(button.backdrop:GetFrameLevel() - 1)
-
- button.SpellSubName:SetTextColor(0.6, 0.6, 0.6)
-
- button.bg = CreateFrame('Frame', nil, button)
- button.bg:CreateBackdrop('Transparent', true)
- button.bg:Point('TOPLEFT', -6, 6)
- button.bg:Point('BOTTOMRIGHT', 112, -6)
- button.bg:Height(46)
- button.bg:SetFrameLevel(button.bg:GetFrameLevel() - 2)
-
- icon:SetTexCoord(unpack(E.TexCoords))
-
- highlight:SetAllPoints()
- hooksecurefunc(highlight, 'SetTexture', function(texture, tex)
- if tex == [[Interface\Buttons\ButtonHilight-Square]] or tex == [[Interface\Buttons\UI-PassiveHighlight]] then
- texture:SetColorTexture(1, 1, 1, 0.3)
- end
- end)
-
- E:RegisterCooldown(cooldown)
- end
-
- S:HandlePointXY(_G.SpellButton1, 28, -55)
-
- -- evens
- for i = 2, _G.SPELLS_PER_PAGE, 2 do
- S:HandlePointXY(_G['SpellButton'..i], 163, 0)
- end
- -- odds
- for i = 3, _G.SPELLS_PER_PAGE, 2 do
- S:HandlePointXY(_G['SpellButton'..i], 0, -20)
- end
-
- hooksecurefunc('SpellButton_UpdateButton', function(button)
- local spellName = _G[button:GetName()..'SpellName']
- local r = spellName:GetTextColor()
-
- if r < 0.8 then
- spellName:SetTextColor(0.6, 0.6, 0.6)
- end
- end)
-
- for i = 1, _G.MAX_SKILLLINE_TABS do
- local tab = _G['SpellBookSkillLineTab'..i]
- local flash = _G['SpellBookSkillLineTab'..i..'Flash']
-
- tab:StripTextures()
- tab:SetTemplate()
- tab:StyleButton(nil, true)
- tab:SetTemplate(nil, true)
- tab.pushed = true
-
- tab:GetNormalTexture():SetInside()
- tab:GetNormalTexture():SetTexCoord(unpack(E.TexCoords))
-
- if i == 1 then
- tab:Point('TOPLEFT', _G.SpellBookSideTabsFrame, 'TOPRIGHT', -32, -70)
- end
-
- hooksecurefunc(tab:GetHighlightTexture(), 'SetTexture', function(texture, tex)
- if tex ~= nil then
- texture:SetPushedTexture(E.ClearTexture)
- end
- end)
-
- hooksecurefunc(tab:GetCheckedTexture(), 'SetTexture', function(texture, tex)
- if tex ~= nil then
- texture:SetHighlightTexture(E.ClearTexture)
- end
- end)
-
- flash:Kill()
- end
-end
-
-S:AddCallback('SpellBookFrame')
-
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Stable.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Stable.lua
deleted file mode 100644
index cdc97dcc5..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Stable.lua
+++ /dev/null
@@ -1,52 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local HasPetUI = HasPetUI
-local UnitExists = UnitExists
-local GetPetHappiness = GetPetHappiness
-local hooksecurefunc = hooksecurefunc
-
-function S:PetStableFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.stable) then return end
-
- local PetStableFrame = _G.PetStableFrame
- S:HandleFrame(PetStableFrame, true, nil, 10, -11, -32, 71)
-
- S:HandleButton(_G.PetStablePurchaseButton)
- S:HandleCloseButton(_G.PetStableFrameCloseButton)
- S:HandleRotateButton(_G.PetStableModelRotateRightButton)
- S:HandleRotateButton(_G.PetStableModelRotateLeftButton)
-
- S:HandleItemButton(_G.PetStableCurrentPet, true)
- _G.PetStableCurrentPetIconTexture:SetDrawLayer('ARTWORK')
-
- for i = 1, _G.NUM_PET_STABLE_SLOTS do
- S:HandleItemButton(_G['PetStableStabledPet'..i], true)
- _G['PetStableStabledPet'..i..'IconTexture']:SetDrawLayer('ARTWORK')
- end
-
- local PetStablePetInfo = _G.PetStablePetInfo
- PetStablePetInfo:GetRegions():SetTexCoord(0.04, 0.15, 0.06, 0.30)
- PetStablePetInfo:SetFrameLevel(_G.PetModelFrame:GetFrameLevel() + 2)
- PetStablePetInfo:CreateBackdrop()
- PetStablePetInfo:Size(22)
-
- hooksecurefunc('PetStable_Update', function()
- local hasPetUI, isHunterPet = HasPetUI()
- if hasPetUI and not isHunterPet and UnitExists('pet') then return end
-
- local happiness = GetPetHappiness()
- local texture = PetStablePetInfo:GetRegions()
-
- if happiness == 1 then
- texture:SetTexCoord(0.41, 0.53, 0.06, 0.30)
- elseif happiness == 2 then
- texture:SetTexCoord(0.22, 0.345, 0.06, 0.30)
- elseif happiness == 3 then
- texture:SetTexCoord(0.04, 0.15, 0.06, 0.30)
- end
- end)
-end
-
-S:AddCallback('PetStableFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tabard.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tabard.lua
deleted file mode 100644
index 9eb7534b4..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tabard.lua
+++ /dev/null
@@ -1,73 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs = pairs
-local hooksecurefunc = hooksecurefunc
-
-function S:TabardFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.tabard) then return end
-
- local TabardFrame = _G.TabardFrame
- S:HandleFrame(TabardFrame, true, nil, 10, -12, -32, 74)
-
- S:HandleCloseButton(_G.TabardFrameCloseButton)
-
- S:HandleButton(_G.TabardFrameCancelButton)
- S:HandleButton(_G.TabardFrameAcceptButton)
- S:HandleRotateButton(_G.TabardCharacterModelRotateLeftButton)
- S:HandleRotateButton(_G.TabardCharacterModelRotateRightButton)
-
- _G.TabardModel:CreateBackdrop()
- _G.TabardFrameCostFrame:StripTextures()
- _G.TabardFrameCustomizationFrame:StripTextures()
-
- --Add Tabard Emblem back
- local emblemFrames = {
- _G.TabardFrameEmblemTopRight,
- _G.TabardFrameEmblemBottomRight,
- _G.TabardFrameEmblemTopLeft,
- _G.TabardFrameEmblemBottomLeft,
- }
- for _, frame in pairs(emblemFrames) do
- frame:SetParent(TabardFrame)
- frame.Show = nil
- frame:Show()
- end
-
- for i = 1, 5 do
- local custom = 'TabardFrameCustomization'..i
- local button = _G[custom]
-
- button:StripTextures()
- S:HandleNextPrevButton(_G[custom..'LeftButton'])
- S:HandleNextPrevButton(_G[custom..'RightButton'])
-
- if i > 1 then
- button:ClearAllPoints()
- button:Point('TOP', _G['TabardFrameCustomization'..i - 1], 'BOTTOM', 0, -6)
- else
- local point, anchor, point2, x, y = button:GetPoint()
- button:Point(point, anchor, point2, x, y+4)
- end
- end
-
- _G.TabardCharacterModelRotateLeftButton:Point('BOTTOMLEFT', 4, 4)
- _G.TabardCharacterModelRotateRightButton:Point('TOPLEFT', _G.TabardCharacterModelRotateLeftButton, 'TOPRIGHT', 4, 0)
-
- hooksecurefunc(_G.TabardCharacterModelRotateLeftButton, 'SetPoint', function(button)
- if button._blocked then return end
- button._blocked = true
- button:Point('BOTTOMLEFT', 4, 4)
- button._blocked = nil
- end)
-
- hooksecurefunc(_G.TabardCharacterModelRotateRightButton, 'SetPoint', function(button)
- if button._blocked then return end
- button._blocked = true
- button:Point('TOPLEFT', _G.TabardCharacterModelRotateLeftButton, 'TOPRIGHT', 4, 0)
- button._blocked = nil
- end)
-end
-
-S:AddCallback('TabardFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Talent.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Talent.lua
deleted file mode 100644
index 5169db67e..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Talent.lua
+++ /dev/null
@@ -1,47 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-
-function S:Blizzard_TalentUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.talent) then return end
-
- S:HandleFrame(_G.PlayerTalentFrame, true, nil, 11, -12, -32, 76)
- S:HandleCloseButton(_G.PlayerTalentFrameCloseButton, _G.PlayerTalentFrame.backdrop)
-
- _G.PlayerTalentFrameCancelButton:Kill()
-
- for i = 1, 3 do
- S:HandleTab(_G['PlayerTalentFrameTab'..i])
- end
-
- _G.PlayerTalentFrameScrollFrame:StripTextures()
- _G.PlayerTalentFrameScrollFrame:CreateBackdrop()
-
- S:HandleScrollBar(_G.PlayerTalentFrameScrollFrameScrollBar)
- _G.PlayerTalentFrameScrollFrameScrollBar:Point('TOPLEFT', _G.PlayerTalentFrameScrollFrame, 'TOPRIGHT', 10, -16)
-
- _G.PlayerTalentFrameSpentPoints:Point('TOP', 0, -42)
- _G.PlayerTalentFrameTalentPointsText:Point('BOTTOMRIGHT', _G.PlayerTalentFrame, 'BOTTOMLEFT', 220, 84)
-
- for i = 1, _G.MAX_NUM_TALENTS do
- local talent = _G['PlayerTalentFrameTalent'..i]
- local icon = _G['PlayerTalentFrameTalent'..i..'IconTexture']
- local rank = _G['PlayerTalentFrameTalent'..i..'Rank']
-
- if talent then
- talent:StripTextures()
- talent:SetTemplate()
- talent:StyleButton()
-
- icon:SetInside()
- icon:SetTexCoord(unpack(E.TexCoords))
- icon:SetDrawLayer('ARTWORK')
-
- rank:SetFont(E.LSM:Fetch('font', E.db['general'].font), 12, 'OUTLINE')
- end
- end
-end
-
-S:AddCallbackForAddon('Blizzard_TalentUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Taxi.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Taxi.lua
deleted file mode 100644
index b30b918c2..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Taxi.lua
+++ /dev/null
@@ -1,21 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:TaxiFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.taxi) then return end
-
- local TaxiFrame = _G.TaxiFrame
- S:HandleFrame(TaxiFrame, true, nil, 11, -12, -32, 76)
- _G.TaxiPortrait:Kill() -- Blizz didnt name this TaxiFramePortrait
-
- S:HandlePointXY(_G.TaxiMap, -11, -71)
- S:HandlePointXY(_G.TaxiRouteMap, -11, -71)
-
- _G.TaxiMerchant:SetTextColor(1, 1, 1)
-
- S:HandleCloseButton(_G.TaxiCloseButton, TaxiFrame.backdrop)
-end
-
-S:AddCallback('TaxiFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/TimeManager.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/TimeManager.lua
deleted file mode 100644
index d7ef99266..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/TimeManager.lua
+++ /dev/null
@@ -1,83 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack, select = unpack, select
-local hooksecurefunc = hooksecurefunc
-
-local function SetPlayTexture()
- _G.StopwatchPlayPauseButton:SetNormalTexture(E.Media.Textures.Play)
-end
-
-local function SetPauseTexture()
- _G.StopwatchPlayPauseButton:SetNormalTexture(E.Media.Textures.Pause)
-end
-
-function S:Blizzard_TimeManager()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.timemanager) then return end
-
- local TimeManagerFrame = _G.TimeManagerFrame
- S:HandleFrame(TimeManagerFrame, true)
- TimeManagerFrame:Size(185, 240)
- TimeManagerFrame:Point('TOPRIGHT', -1, -186)
-
- select(7, TimeManagerFrame:GetRegions()):Point('TOP', 0, -5)
-
- _G.TimeManagerFrameCloseButton:Point('TOPRIGHT', 4, 5)
-
- _G.TimeManagerStopwatchFrame:Point('TOPRIGHT', 10, -12)
-
- _G.TimeManagerStopwatchCheck:SetTemplate()
- _G.TimeManagerStopwatchCheck:StyleButton(nil, true)
-
- _G.TimeManagerStopwatchCheck:GetNormalTexture():SetInside()
- _G.TimeManagerStopwatchCheck:GetNormalTexture():SetTexCoord(unpack(E.TexCoords))
-
- _G.TimeManagerAlarmTimeFrame:Point('TOPLEFT', 12, -65)
-
- S:HandleDropDownBox(_G.TimeManagerAlarmHourDropDown, 80)
- S:HandleDropDownBox(_G.TimeManagerAlarmMinuteDropDown, 80)
- S:HandleDropDownBox(_G.TimeManagerAlarmAMPMDropDown, 80)
-
- S:HandleEditBox(_G.TimeManagerAlarmMessageEditBox)
-
- _G.TimeManagerAlarmEnabledButton:Point('LEFT', 16, -45)
- _G.TimeManagerAlarmEnabledButton:SetNormalTexture(E.ClearTexture)
- _G.TimeManagerAlarmEnabledButton.SetNormalTexture = E.noop
- _G.TimeManagerAlarmEnabledButton:SetPushedTexture(E.ClearTexture)
- _G.TimeManagerAlarmEnabledButton.SetPushedTexture = E.noop
- S:HandleButton(_G.TimeManagerAlarmEnabledButton)
-
- _G.TimeManagerMilitaryTimeCheck:Point('TOPLEFT', 155, -190)
- S:HandleCheckBox(_G.TimeManagerMilitaryTimeCheck)
- S:HandleCheckBox(_G.TimeManagerLocalTimeCheck)
-
- _G.StopwatchFrame:CreateBackdrop('Transparent')
- _G.StopwatchFrame.backdrop:Point('TOPLEFT', 0, -16)
- _G.StopwatchFrame.backdrop:Point('BOTTOMRIGHT', 0, 2)
-
- _G.StopwatchFrame:StripTextures()
-
- _G.StopwatchTabFrame:StripTextures()
-
- S:HandleCloseButton(_G.StopwatchCloseButton)
-
- _G.StopwatchPlayPauseButton:CreateBackdrop(nil, true)
- _G.StopwatchPlayPauseButton:SetSize(12, 12)
- _G.StopwatchPlayPauseButton:SetNormalTexture(E.Media.Textures.Play)
- _G.StopwatchPlayPauseButton:SetHighlightTexture(E.ClearTexture)
- _G.StopwatchPlayPauseButton.backdrop:SetOutside(_G.StopwatchPlayPauseButton, 2, 2)
- _G.StopwatchPlayPauseButton:HookScript('OnEnter', S.SetModifiedBackdrop)
- _G.StopwatchPlayPauseButton:HookScript('OnLeave', S.SetOriginalBackdrop)
- _G.StopwatchPlayPauseButton:Point('RIGHT', _G.StopwatchResetButton, 'LEFT', -4, 0)
- S:HandleButton(_G.StopwatchResetButton)
- _G.StopwatchResetButton:SetSize(16,16)
- _G.StopwatchResetButton:SetNormalTexture(E.Media.Textures.Reset)
- _G.StopwatchResetButton:Point('BOTTOMRIGHT', _G.StopwatchFrame, 'BOTTOMRIGHT', -4, 6)
-
- hooksecurefunc('Stopwatch_Play', SetPauseTexture)
- hooksecurefunc('Stopwatch_Pause', SetPlayTexture)
- hooksecurefunc('Stopwatch_Clear', SetPlayTexture)
-end
-
-S:AddCallbackForAddon('Blizzard_TimeManager')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tooltip.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tooltip.lua
deleted file mode 100644
index 89bd5572c..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tooltip.lua
+++ /dev/null
@@ -1,59 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-local TT = E:GetModule('Tooltip')
-
-local _G = _G
-local pairs = pairs
-
-function S:StyleTooltips()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.tooltip) then return end
-
- for _, tt in pairs({
- _G.ItemRefTooltip,
- _G.ItemRefShoppingTooltip1,
- _G.ItemRefShoppingTooltip2,
- _G.AutoCompleteBox,
- _G.FriendsTooltip,
- _G.EmbeddedItemTooltip,
- _G.ReputationParagonTooltip,
- _G.GameTooltip,
- _G.WorldMapTooltip,
- _G.ShoppingTooltip1,
- _G.ShoppingTooltip2,
- _G.QuickKeybindTooltip,
- -- ours
- _G.ElvUIConfigTooltip,
- _G.ElvUISpellBookTooltip
- }) do
- TT:SetStyle(tt)
- end
-end
-
-function S:TooltipFrames()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.tooltip) then return end
-
- S:StyleTooltips()
- S:HandleCloseButton(_G.ItemRefCloseButton)
-
- -- EmbeddedItemTooltip (also Paragon Reputation)
- local EmbeddedTT = _G.EmbeddedItemTooltip.ItemTooltip
- S:HandleIcon(EmbeddedTT.Icon, true)
- S:HandleIconBorder(EmbeddedTT.IconBorder, EmbeddedTT.Icon.backdrop)
-
- -- Skin GameTooltip Status Bar
- _G.GameTooltipStatusBar:SetStatusBarTexture(E.media.normTex)
- _G.GameTooltipStatusBar:CreateBackdrop('Transparent')
- _G.GameTooltipStatusBar:ClearAllPoints()
- _G.GameTooltipStatusBar:Point('TOPLEFT', _G.GameTooltip, 'BOTTOMLEFT', E.Border, -(E.Spacing * 3))
- _G.GameTooltipStatusBar:Point('TOPRIGHT', _G.GameTooltip, 'BOTTOMRIGHT', -E.Border, -(E.Spacing * 3))
- E:RegisterStatusBar(_G.GameTooltipStatusBar)
-
- -- Tooltip Styling
- TT:SecureHook('GameTooltip_ShowStatusBar') -- Skin Status Bars
- TT:SecureHook('GameTooltip_ShowProgressBar') -- Skin Progress Bars
- TT:SecureHook('GameTooltip_ClearProgressBars')
- TT:SecureHook('GameTooltip_AddQuestRewardsToTooltip') -- Color Progress Bars
- TT:SecureHook('SharedTooltip_SetBackdropStyle', 'SetStyle') -- This also deals with other tooltip borders like AzeriteEssence Tooltip
-end
-
-S:AddCallback('TooltipFrames')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trade.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trade.lua
deleted file mode 100644
index 85deb5179..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trade.lua
+++ /dev/null
@@ -1,136 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local pairs, ipairs = pairs, ipairs
-local unpack, select = unpack, select
-local hooksecurefunc = hooksecurefunc
-
-local GetItemInfo = GetItemInfo
-local GetItemQualityColor = GetItemQualityColor
-local GetTradePlayerItemLink = GetTradePlayerItemLink
-local GetTradeTargetItemLink = GetTradeTargetItemLink
-
-function S:TradeFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.trade) then return end
-
- local TradeFrame = _G.TradeFrame
- S:HandleFrame(TradeFrame, true, nil, -5, 0, 0)
-
- S:HandleButton(_G.TradeFrameTradeButton, true)
- S:HandleButton(_G.TradeFrameCancelButton, true)
-
- S:HandlePointXY(_G.TradeFrameCloseButton, -5)
- S:HandlePointXY(_G.TradeFrameTradeButton, -85)
- S:HandlePointXY(_G.TradeFrameTradeButton, -85, 2)
- S:HandlePointXY(_G.TradeFrameCancelButton, 3)
- S:HandlePointXY(_G.TradePlayerItem1, 8)
-
- S:HandleEditBox(_G.TradePlayerInputMoneyFrameGold)
- S:HandleEditBox(_G.TradePlayerInputMoneyFrameSilver)
- S:HandleEditBox(_G.TradePlayerInputMoneyFrameCopper)
-
- _G.TradePlayerInputMoneyInset:StripTextures()
-
- local tradeFrames = {
- _G.TradeFramePlayerPortrait,
- _G.TradeFrameRecipientPortrait,
- _G.TradePlayerInputMoneyInset,
- _G.TradeRecipientPortraitFrame,
- _G.TradeRecipientMoneyBg
- }
-
- for _, frame in ipairs(tradeFrames) do
- frame:Kill()
- end
-
- for _, Frame in pairs({'TradePlayerItem', 'TradeRecipientItem'}) do
- for i = 1, 7 do
- local ItemBackground = _G[Frame..i]
- local ItemButton = _G[Frame..i..'ItemButton']
-
- ItemBackground:StripTextures()
- ItemBackground:SetTemplate()
- S:HandleItemButton(ItemButton)
- ItemButton:StyleButton()
-
- S:HandleIcon(ItemButton.icon, true)
- end
- end
-
- for _, Inset in pairs({ _G.TradePlayerItemsInset, _G.TradeRecipientItemsInset, _G.TradePlayerEnchantInset, _G.TradeRecipientEnchantInset, _G.TradeRecipientMoneyInset }) do
- Inset:StripTextures()
- Inset:SetTemplate('Transparent')
- end
-
- for _, Highlight in pairs({ _G.TradeHighlightPlayer, _G.TradeHighlightRecipient, _G.TradeHighlightPlayerEnchant, _G.TradeHighlightRecipientEnchant }) do
- Highlight:StripTextures()
- end
-
- _G.TradeFrame:HookScript('OnShow', function()
- _G.TradePlayerItemsInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradePlayerEnchantInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeRecipientItemsInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeRecipientEnchantInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeRecipientMoneyInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end)
-
- hooksecurefunc('TradeFrame_SetAcceptState', function(playerState, targetState)
- if playerState == 1 then
- _G.TradePlayerItemsInset:SetBackdropBorderColor(0, 1, 0)
- _G.TradePlayerEnchantInset:SetBackdropBorderColor(0, 1, 0)
- else
- _G.TradePlayerItemsInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradePlayerEnchantInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- if targetState == 1 then
- _G.TradeRecipientItemsInset:SetBackdropBorderColor(0, 1, 0)
- _G.TradeRecipientEnchantInset:SetBackdropBorderColor(0, 1, 0)
- _G.TradeRecipientMoneyInset:SetBackdropBorderColor(0, 1, 0)
- else
- _G.TradeRecipientItemsInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeRecipientEnchantInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeRecipientMoneyInset:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end)
-
- hooksecurefunc('TradeFrame_UpdatePlayerItem', function(id)
- local tradeItemButton = _G['TradePlayerItem'..id..'ItemButton']
- local link = GetTradePlayerItemLink(id)
-
- tradeItemButton:SetTemplate('NoBackdrop')
- tradeItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
-
- if link then
- local tradeItemName = _G['TradePlayerItem'..id..'Name']
- local quality = select(3, GetItemInfo(link))
-
- tradeItemName:SetTextColor(GetItemQualityColor(quality))
-
- if quality and quality > 1 then
- tradeItemButton:SetBackdropBorderColor(GetItemQualityColor(quality))
- end
- end
- end)
-
- hooksecurefunc('TradeFrame_UpdateTargetItem', function(id)
- local tradeItemButton = _G['TradeRecipientItem'..id..'ItemButton']
- local link = GetTradeTargetItemLink(id)
-
- tradeItemButton:SetTemplate('NoBackdrop')
- tradeItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
-
- if link then
- local tradeItemName = _G['TradeRecipientItem'..id..'Name']
- local quality = select(3, GetItemInfo(link))
-
- tradeItemName:SetTextColor(GetItemQualityColor(quality))
-
- if quality and quality > 1 then
- tradeItemButton:SetBackdropBorderColor(GetItemQualityColor(quality))
- end
- end
- end)
-end
-
-S:AddCallback('TradeFrame')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/TradeSkill.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/TradeSkill.lua
deleted file mode 100644
index 3a5284738..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/TradeSkill.lua
+++ /dev/null
@@ -1,189 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local strfind, unpack, select = strfind, unpack, select
-local hooksecurefunc = hooksecurefunc
-
-local GetItemInfo = GetItemInfo
-local GetTradeSkillNumReagents = GetTradeSkillNumReagents
-local GetTradeSkillInfo = GetTradeSkillInfo
-local GetItemQualityColor = GetItemQualityColor
-local GetTradeSkillItemLink = GetTradeSkillItemLink
-local GetTradeSkillReagentInfo = GetTradeSkillReagentInfo
-local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
-
-function S:Blizzard_TradeSkillUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.tradeskill) then return end
-
- local TradeSkillFrame = _G.TradeSkillFrame
- S:HandleFrame(TradeSkillFrame, true, nil, 11, -12, -32, 76)
-
- _G.TradeSkillRankFrameBorder:StripTextures()
-
- local TradeSkillRankFrame = _G.TradeSkillRankFrame
- TradeSkillRankFrame:Size(322, 14)
- TradeSkillRankFrame:Point('TOPLEFT', 23, -37)
- TradeSkillRankFrame:CreateBackdrop()
- TradeSkillRankFrame:SetStatusBarTexture(E.media.normTex)
- TradeSkillRankFrame:SetStatusBarColor(0.13, 0.35, 0.80)
- E:RegisterStatusBar(TradeSkillRankFrame)
-
- local TradeSearchInputBox = _G.TradeSearchInputBox
- S:HandleEditBox(TradeSearchInputBox)
- TradeSearchInputBox:ClearAllPoints()
- TradeSearchInputBox:Point('TOPRIGHT', -39, -54)
- TradeSearchInputBox:Size(120, 14)
-
- _G.TradeSkillExpandButtonFrame:StripTextures()
-
- local TradeSkillCollapseAllButton = _G.TradeSkillCollapseAllButton
- TradeSkillCollapseAllButton:GetNormalTexture():SetPoint('LEFT', 3, 2)
- TradeSkillCollapseAllButton:GetNormalTexture():Size(15)
-
- TradeSkillCollapseAllButton:SetHighlightTexture(E.ClearTexture)
- TradeSkillCollapseAllButton.SetHighlightTexture = E.noop
-
- TradeSkillCollapseAllButton:SetDisabledTexture(E.Media.Textures.MinusButton)
- TradeSkillCollapseAllButton.SetDisabledTexture = E.noop
- TradeSkillCollapseAllButton:GetDisabledTexture():SetPoint('LEFT', 3, 2)
- TradeSkillCollapseAllButton:GetDisabledTexture():Size(15)
- TradeSkillCollapseAllButton:GetDisabledTexture():SetDesaturated(true)
-
- S:HandleDropDownBox(_G.TradeSkillInvSlotDropDown, 140)
- _G.TradeSkillInvSlotDropDown:ClearAllPoints()
- _G.TradeSkillInvSlotDropDown:Point('TOPRIGHT', TradeSkillFrame, 'TOPRIGHT', -32, -68)
-
- S:HandleDropDownBox(_G.TradeSkillSubClassDropDown, 140)
- _G.TradeSkillSubClassDropDown:ClearAllPoints()
- _G.TradeSkillSubClassDropDown:Point('RIGHT', _G.TradeSkillInvSlotDropDown, 'RIGHT', -120, 0)
-
- _G.TradeSkillFrameTitleText:ClearAllPoints()
- _G.TradeSkillFrameTitleText:Point('TOP', TradeSkillFrame, 'TOP', 0, -18)
-
- local TradeSkillFrameAvailableFilterCheckButton = _G.TradeSkillFrameAvailableFilterCheckButton
- S:HandleCheckBox(TradeSkillFrameAvailableFilterCheckButton)
- TradeSkillFrameAvailableFilterCheckButton:Point('TOPLEFT', 18, -50)
-
- for i = 1, _G.TRADE_SKILLS_DISPLAYED do
- local button = _G['TradeSkillSkill'..i]
- local highlight = _G['TradeSkillSkill'..i..'Highlight']
-
- button:GetNormalTexture():Size(14)
- button:GetNormalTexture():SetPoint('LEFT', 2, 1)
-
- highlight:SetTexture('')
- highlight.SetTexture = E.noop
- end
-
- hooksecurefunc('TradeSkillFrame_Update', function()
- for i = 1, _G.TRADE_SKILLS_DISPLAYED do
- local button = _G['TradeSkillSkill'..i]
- local texture = button:GetNormalTexture():GetTexture()
- if texture then
- if strfind(texture, 'MinusButton') then
- button:SetNormalTexture(E.Media.Textures.MinusButton)
- elseif strfind(texture, 'PlusButton') then
- button:SetNormalTexture(E.Media.Textures.PlusButton)
- end
- end
- end
-
- if TradeSkillCollapseAllButton.collapsed then
- TradeSkillCollapseAllButton:SetNormalTexture(E.Media.Textures.PlusButton)
- else
- TradeSkillCollapseAllButton:SetNormalTexture(E.Media.Textures.MinusButton)
- end
- end)
-
- _G.TradeSkillDetailScrollFrame:StripTextures()
- _G.TradeSkillListScrollFrame:StripTextures()
- _G.TradeSkillDetailScrollChildFrame:StripTextures()
-
- S:HandleScrollBar(_G.TradeSkillListScrollFrameScrollBar)
- S:HandleScrollBar(_G.TradeSkillDetailScrollFrameScrollBar)
-
- _G.TradeSkillSkillIcon:Size(40)
- _G.TradeSkillSkillIcon:Point('TOPLEFT', 2, -3)
-
- for i = 1, _G.MAX_TRADE_SKILL_REAGENTS do
- local icon = _G['TradeSkillReagent'..i..'IconTexture']
- local count = _G['TradeSkillReagent'..i..'Count']
- local nameFrame = _G['TradeSkillReagent'..i..'NameFrame']
-
- S:HandleIcon(icon, true)
- icon:SetDrawLayer('OVERLAY')
- count:SetDrawLayer('OVERLAY')
-
- nameFrame:SetAlpha(0)
- end
-
- _G.TradeSkillHighlight:SetTexture(E.Media.Textures.Highlight)
- _G.TradeSkillHighlight:SetAlpha(0.35)
-
- S:HandleButton(_G.TradeSkillCancelButton)
- S:HandleButton(_G.TradeSkillCreateButton)
- S:HandleButton(_G.TradeSkillCreateAllButton)
-
- S:HandleNextPrevButton(_G.TradeSkillDecrementButton)
- _G.TradeSkillInputBox:Size(36, 16)
- S:HandleEditBox(_G.TradeSkillInputBox)
- S:HandleNextPrevButton(_G.TradeSkillIncrementButton)
-
- S:HandleCloseButton(_G.TradeSkillFrameCloseButton, TradeSkillFrame.backdrop)
-
- _G.TradeSkillSkillIcon:CreateBackdrop()
-
- hooksecurefunc('TradeSkillFrame_SetSelection', function(id)
- local skillType = select(2, GetTradeSkillInfo(id))
- if skillType == 'header' then return end
-
- if _G.TradeSkillSkillIcon:GetNormalTexture() then
- S:HandleIcon(_G.TradeSkillSkillIcon:GetNormalTexture())
- end
-
- local skillLink = GetTradeSkillItemLink(id)
- local r, g, b
-
- if skillLink then
- local quality = select(3, GetItemInfo(skillLink))
-
- if quality and quality > 1 then
- r, g, b = GetItemQualityColor(quality)
-
- _G.TradeSkillSkillIcon.backdrop:SetBackdropBorderColor(r, g, b)
- _G.TradeSkillSkillName:SetTextColor(r, g, b)
- else
- _G.TradeSkillSkillIcon.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- _G.TradeSkillSkillName:SetTextColor(1, 1, 1)
- end
- end
-
- for i = 1, GetTradeSkillNumReagents(id) do
- local _, _, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(id, i)
- local reagentLink = GetTradeSkillReagentItemLink(id, i)
-
- if reagentLink then
- local icon = _G['TradeSkillReagent'..i..'IconTexture']
- local quality = select(3, GetItemInfo(reagentLink))
-
- if quality and quality > 1 then
- local name = _G['TradeSkillReagent'..i..'Name']
- r, g, b = GetItemQualityColor(quality)
-
- icon.backdrop:SetBackdropBorderColor(r, g, b)
-
- if playerReagentCount < reagentCount then
- name:SetTextColor(0.5, 0.5, 0.5)
- else
- name:SetTextColor(r, g, b)
- end
- else
- icon.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
- end
- end
- end
- end)
-end
-
-S:AddCallbackForAddon('Blizzard_TradeSkillUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trainer.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trainer.lua
deleted file mode 100644
index 30982b8d5..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Trainer.lua
+++ /dev/null
@@ -1,80 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-local unpack = unpack
-local hooksecurefunc = hooksecurefunc
-
-function S:Blizzard_TrainerUI()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.trainer) then return end
-
- local ClassTrainerFrame = _G.ClassTrainerFrame
- S:HandleFrame(ClassTrainerFrame, true, nil, 11, -12, -32, 76)
-
- _G.ClassTrainerExpandButtonFrame:StripTextures()
-
- S:HandleDropDownBox(_G.ClassTrainerFrameFilterDropDown)
- _G.ClassTrainerFrameFilterDropDown:Point('TOPRIGHT', -40, -64)
-
- _G.ClassTrainerListScrollFrame:StripTextures()
- S:HandleScrollBar(_G.ClassTrainerListScrollFrameScrollBar)
-
- _G.ClassTrainerDetailScrollFrame:StripTextures()
- S:HandleScrollBar(_G.ClassTrainerDetailScrollFrameScrollBar)
-
- _G.ClassTrainerSkillIcon:StripTextures()
-
- _G.ClassTrainerCancelButton:Kill()
-
- _G.ClassTrainerMoneyFrame:ClearAllPoints()
- _G.ClassTrainerMoneyFrame:Point('BOTTOMLEFT', _G.ClassTrainerFrame, 'BOTTOMLEFT', 18, 82)
-
- S:HandleButton(_G.ClassTrainerTrainButton)
- _G.ClassTrainerTrainButton:Point('BOTTOMRIGHT', -36, 80)
-
- S:HandleCloseButton(_G.ClassTrainerFrameCloseButton, ClassTrainerFrame.backdrop)
-
- hooksecurefunc('ClassTrainer_SetSelection', function()
- local skillIcon = _G.ClassTrainerSkillIcon:GetNormalTexture()
- if skillIcon then
- skillIcon:SetInside()
- skillIcon:SetTexCoord(unpack(E.TexCoords))
-
- _G.ClassTrainerSkillIcon:SetTemplate()
- end
- end)
-
- for i = 1, _G.CLASS_TRAINER_SKILLS_DISPLAYED do
- local button = _G['ClassTrainerSkill'..i]
- local highlight = _G['ClassTrainerSkill'..i..'Highlight']
-
- button:SetNormalTexture(E.Media.Textures.PlusButton)
- button.SetNormalTexture = E.noop
-
- button:GetNormalTexture():Size(16)
- button:GetNormalTexture():Point('LEFT', 5, 0)
-
- highlight:SetTexture('')
- highlight.SetTexture = E.noop
-
- S:HandleCollapseTexture(button)
- end
-
- _G.ClassTrainerCollapseAllButton:SetNormalTexture(E.Media.Textures.PlusButton)
- _G.ClassTrainerCollapseAllButton.SetNormalTexture = E.noop
- _G.ClassTrainerCollapseAllButton:GetNormalTexture():SetPoint('LEFT', 3, 2)
- _G.ClassTrainerCollapseAllButton:GetNormalTexture():Size(15)
-
- _G.ClassTrainerCollapseAllButton:SetHighlightTexture(E.ClearTexture)
- _G.ClassTrainerCollapseAllButton.SetHighlightTexture = E.noop
-
- _G.ClassTrainerCollapseAllButton:SetDisabledTexture(E.Media.Textures.PlusButton)
- _G.ClassTrainerCollapseAllButton.SetDisabledTexture = E.noop
- _G.ClassTrainerCollapseAllButton:GetDisabledTexture():SetPoint('LEFT', 3, 2)
- _G.ClassTrainerCollapseAllButton:GetDisabledTexture():Size(15)
- _G.ClassTrainerCollapseAllButton:GetDisabledTexture():SetDesaturated(true)
-
- S:HandleCollapseTexture(_G.ClassTrainerCollapseAllButton)
-end
-
-S:AddCallbackForAddon('Blizzard_TrainerUI')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tutorial.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tutorial.lua
deleted file mode 100644
index 3ff43b64c..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/Tutorial.lua
+++ /dev/null
@@ -1,28 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:SkinTutorial()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.tutorial) then return end
-
- S:HandleFrame(_G.TutorialFrame, false)
-
- for i = 1, _G.MAX_TUTORIAL_ALERTS do
- local button = _G['TutorialFrameAlertButton'..i]
- local icon = button:GetNormalTexture()
-
- button:Size(35, 45)
- button:SetTemplate(nil, true)
- button:StyleButton(nil, true)
-
- icon:SetInside()
- icon:SetTexCoord(0.09, 0.40, 0.11, 0.56)
- end
-
- S:HandleCheckBox(_G.TutorialFrameCheckButton)
-
- S:HandleButton(_G.TutorialFrameOkayButton)
-end
-
-S:AddCallback('SkinTutorial')
diff --git a/Interface/AddOns/ElvUI/TBC/Modules/Skins/WorldMap.lua b/Interface/AddOns/ElvUI/TBC/Modules/Skins/WorldMap.lua
deleted file mode 100644
index cdf30f093..000000000
--- a/Interface/AddOns/ElvUI/TBC/Modules/Skins/WorldMap.lua
+++ /dev/null
@@ -1,39 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local S = E:GetModule('Skins')
-
-local _G = _G
-
-function S:WorldMapFrame()
- if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.worldmap) then return end
-
- local WorldMapFrame = _G.WorldMapFrame
- WorldMapFrame:StripTextures()
- WorldMapFrame.BorderFrame:CreateBackdrop('Transparent')
-
- S:HandleDropDownBox(_G.WorldMapZoneMinimapDropDown)
- S:HandleDropDownBox(_G.WorldMapContinentDropDown)
- S:HandleDropDownBox(_G.WorldMapZoneDropDown)
-
- _G.WorldMapContinentDropDown:Point('TOPLEFT', WorldMapFrame, 'TOPLEFT', 330, -35)
- _G.WorldMapContinentDropDown:Width(205)
- _G.WorldMapContinentDropDown:Height(33)
-
- _G.WorldMapZoneDropDown:Point('LEFT', _G.WorldMapContinentDropDown, 'RIGHT', -20, 0)
- _G.WorldMapZoneDropDown:Width(205)
- _G.WorldMapZoneDropDown:Height(33)
-
- _G.WorldMapZoneMinimapDropDown:Point('RIGHT', _G.WorldMapContinentDropDown, 'LEFT', 20, 0)
- _G.WorldMapZoneMinimapDropDown:Width(205)
- _G.WorldMapZoneMinimapDropDown:Height(33)
-
- _G.WorldMapZoomOutButton:Point('LEFT', _G.WorldMapZoneDropDown, 'RIGHT', 3, 3)
- _G.WorldMapZoomOutButton:Height(23)
- _G.WorldMapZoomOutButton:Width(100)
- _G.WorldMapZoomOutButton:SetFrameLevel(_G.WorldMapFrame.BlackoutFrame:GetFrameLevel() + 2)
- S:HandleButton(_G.WorldMapZoomOutButton)
-
- S:HandleCloseButton(_G.WorldMapFrameCloseButton, WorldMapFrame.backdrop)
- _G.WorldMapFrameCloseButton:SetFrameLevel(_G.WorldMapFrameCloseButton:GetFrameLevel() + 2)
-end
-
-S:AddCallback('WorldMapFrame')
diff --git a/Interface/AddOns/ElvUI/Wrath/Libs.xml b/Interface/AddOns/ElvUI/Wrath/Libs.xml
index a43c1b6f9..66b197c49 100644
--- a/Interface/AddOns/ElvUI/Wrath/Libs.xml
+++ b/Interface/AddOns/ElvUI/Wrath/Libs.xml
@@ -18,8 +18,8 @@
-
-
+
+
diff --git a/Interface/AddOns/ElvUI_OptionsUI/Bags.lua b/Interface/AddOns/ElvUI_OptionsUI/Bags.lua
index 35d438458..6bba6d9ba 100644
--- a/Interface/AddOns/ElvUI_OptionsUI/Bags.lua
+++ b/Interface/AddOns/ElvUI_OptionsUI/Bags.lua
@@ -22,7 +22,7 @@ Bags.args.cooldownShortcut = ACH:Execute(L["Cooldown Text"], nil, 3, function()
Bags.args.general = ACH:Group(L["General"], nil, 1, nil, nil, function(info, value) E.db.bags[info[#info]] = value B:UpdateLayouts() B:UpdateAllBagSlots() end, function() return not E.Bags.Initialized end)
Bags.args.general.args.strata = ACH:Select(L["Frame Strata"], nil, 1, { BACKGROUND = 'BACKGROUND', LOW = 'LOW', MEDIUM = 'MEDIUM', HIGH = 'HIGH' })
-Bags.args.general.args.currencyFormat = ACH:Select(L["Currency Format"], L["The display format of the currency icons that get displayed below the main bag. (You have to be watching a currency for this to display)"], 2, { ICON = L["Icons Only"], ICON_TEXT = L["Icons and Text"], ICON_TEXT_ABBR = L["Icons and Text (Short)"] }, nil, nil, nil, function(info, value) E.db.bags[info[#info]] = value B:UpdateTokens() end, nil, E.Classic or E.TBC)
+Bags.args.general.args.currencyFormat = ACH:Select(L["Currency Format"], L["The display format of the currency icons that get displayed below the main bag. (You have to be watching a currency for this to display)"], 2, { ICON = L["Icons Only"], ICON_TEXT = L["Icons and Text"], ICON_TEXT_ABBR = L["Icons and Text (Short)"] }, nil, nil, nil, function(info, value) E.db.bags[info[#info]] = value B:UpdateTokens() end, nil, E.Classic)
Bags.args.general.args.moneyFormat = ACH:Select(L["Gold Format"], L["The display format of the money text that is shown at the top of the main bag."], 3, { SMART = L["Smart"], FULL = L["Full"], SHORT = L["SHORT"], SHORTSPACED = L["Short (Whole Numbers Spaced)"], SHORTINT = L["Short (Whole Numbers)"], CONDENSED = L["Condensed"], CONDENSED_SPACED = L["Condensed (Spaced)"], BLIZZARD = L["Blizzard Style"], BLIZZARD2 = L["Blizzard Style"].." 2", HIDE = L["Hide"] }, nil, nil, nil, function(info, value) E.db.bags[info[#info]] = value B:UpdateGoldText() end)
Bags.args.general.args.moneyCoins = ACH:Toggle(L["Show Coins"], L["Use coin icons instead of colored text."], 4, nil, nil, nil, nil, function(info, value) E.db.bags[info[#info]] = value B:UpdateGoldText() end)
diff --git a/Interface/AddOns/ElvUI_OptionsUI/DataTexts.lua b/Interface/AddOns/ElvUI_OptionsUI/DataTexts.lua
index 0dc9cfa6e..4c18b1fbe 100644
--- a/Interface/AddOns/ElvUI_OptionsUI/DataTexts.lua
+++ b/Interface/AddOns/ElvUI_OptionsUI/DataTexts.lua
@@ -240,7 +240,7 @@ local function CreateDTOptions(name, data)
elseif name == 'Time' then
optionTable.args.time24 = ACH:Toggle(L["24-Hour Time"], L["Toggle 24-hour mode for the time datatext."], 5)
optionTable.args.localTime = ACH:Toggle(L["Local Time"], L["If not set to true then the server time will be displayed instead."], 6)
- optionTable.args.flashInvite = ACH:Toggle(L["Flash Invites"], L["This will allow you to toggle flashing of the time datatext when there are calendar invites."], 7, nil, nil, nil, nil, nil, nil, E.Classic or E.TBC)
+ optionTable.args.flashInvite = ACH:Toggle(L["Flash Invites"], L["This will allow you to toggle flashing of the time datatext when there are calendar invites."], 7, nil, nil, nil, nil, nil, nil, E.Classic)
elseif name == 'Durability' then
optionTable.args.percThreshold = ACH:Range(L["Flash Threshold"], L["The durability percent that the datatext will start flashing. Set to -1 to disable"], 5, { min = -1, max = 99, step = 1 }, nil, function(info) return settings[info[#info]] end, function(info, value) settings[info[#info]] = value; DT:ForceUpdate_DataText(name) end)
elseif name == 'Friends' then
diff --git a/Interface/AddOns/ElvUI_OptionsUI/ElvUI_OptionsUI_TBC.toc b/Interface/AddOns/ElvUI_OptionsUI/ElvUI_OptionsUI_TBC.toc
deleted file mode 100644
index b33bf4fb4..000000000
--- a/Interface/AddOns/ElvUI_OptionsUI/ElvUI_OptionsUI_TBC.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Title: |cff1784d1ElvUI|r |cfd9b9b9bOptionsUI|r
-## Notes: Powers the configuration window.|n|cffff3333Does not store any profile data.|r
-## Author: Elv, Simpy
-## Version: 1.08
-## Interface: 20504
-## RequiredDeps: ElvUI
-## LoadOnDemand: 1
-
-Load.xml
diff --git a/Interface/AddOns/ElvUI_OptionsUI/Maps.lua b/Interface/AddOns/ElvUI_OptionsUI/Maps.lua
index a9d0f31e1..2db30d834 100644
--- a/Interface/AddOns/ElvUI_OptionsUI/Maps.lua
+++ b/Interface/AddOns/ElvUI_OptionsUI/Maps.lua
@@ -135,7 +135,7 @@ Maps.args.minimap.args.icons.args.battlefield.args.scale = ACH:Range(L["Scale"],
Maps.args.minimap.args.icons.args.battlefield.args.xOffset = ACH:Range(L["X-Offset"], nil, 3, buttonOffsets)
Maps.args.minimap.args.icons.args.battlefield.args.yOffset = ACH:Range(L["Y-Offset"], nil, 4, buttonOffsets)
-Maps.args.minimap.args.icons.args.difficulty = ACH:Group(L["Instance Difficulty"], nil, 8, nil, nil, nil, function() return E.Retail and not E.db.general.minimap.clusterDisable end, E.Classic or E.TBC)
+Maps.args.minimap.args.icons.args.difficulty = ACH:Group(L["Instance Difficulty"], nil, 8, nil, nil, nil, function() return E.Retail and not E.db.general.minimap.clusterDisable end, E.Classic)
Maps.args.minimap.args.icons.args.difficulty.args.position = ACH:Select(L["Position"], nil, 1, buttonPositions)
Maps.args.minimap.args.icons.args.difficulty.args.scale = ACH:Range(L["Scale"], nil, 2, buttonScale)
Maps.args.minimap.args.icons.args.difficulty.args.xOffset = ACH:Range(L["X-Offset"], nil, 3, buttonOffsets)
diff --git a/Interface/AddOns/ElvUI_OptionsUI/UnitFrames.lua b/Interface/AddOns/ElvUI_OptionsUI/UnitFrames.lua
index d15c45f9a..48a1b1f01 100644
--- a/Interface/AddOns/ElvUI_OptionsUI/UnitFrames.lua
+++ b/Interface/AddOns/ElvUI_OptionsUI/UnitFrames.lua
@@ -771,7 +771,7 @@ local function GetOptionsTable_RaidIcon(updateFunc, groupName, numUnits, subGrou
end
local function GetOptionsTable_RoleIcons(updateFunc, groupName, numGroup)
- local config = ACH:Group(L["Role Icon"], nil, nil, nil, function(info) return E.db.unitframe.units[groupName].roleIcon[info[#info]] end, function(info, value) E.db.unitframe.units[groupName].roleIcon[info[#info]] = value updateFunc(UF, groupName, numGroup) end, nil, E.Classic or E.TBC)
+ local config = ACH:Group(L["Role Icon"], nil, nil, nil, function(info) return E.db.unitframe.units[groupName].roleIcon[info[#info]] end, function(info, value) E.db.unitframe.units[groupName].roleIcon[info[#info]] = value updateFunc(UF, groupName, numGroup) end, nil, E.Classic)
config.args.enable = ACH:Toggle(L["Enable"], nil, 0)
config.args.options = ACH:MultiSelect(' ', nil, 1, { tank = L["Show For Tanks"], healer = L["Show For Healers"], damager = L["Show For DPS"], combatHide = L["Hide In Combat"] }, nil, nil, function(_, key) return E.db.unitframe.units[groupName].roleIcon[key] end, function(_, key, value) E.db.unitframe.units[groupName].roleIcon[key] = value updateFunc(UF, groupName, numGroup) end)
config.args.position = ACH:Select(L["Position"], nil, 2, C.Values.AllPoints)
diff --git a/Interface/AddOns/HandyNotes/CHANGELOG.md b/Interface/AddOns/HandyNotes/CHANGELOG.md
index 52280e143..47fd1b7f5 100644
--- a/Interface/AddOns/HandyNotes/CHANGELOG.md
+++ b/Interface/AddOns/HandyNotes/CHANGELOG.md
@@ -1,6 +1,6 @@
# HandyNotes
-## [v1.6.9](https://github.com/Nevcairiel/HandyNotes/tree/v1.6.9) (2022-10-25)
-[Full Changelog](https://github.com/Nevcairiel/HandyNotes/compare/v1.6.8...v1.6.9) [Previous Releases](https://github.com/Nevcairiel/HandyNotes/releases)
+## [v1.6.10](https://github.com/Nevcairiel/HandyNotes/tree/v1.6.10) (2022-10-31)
+[Full Changelog](https://github.com/Nevcairiel/HandyNotes/compare/v1.6.9...v1.6.10) [Previous Releases](https://github.com/Nevcairiel/HandyNotes/releases)
-- Update TOC for 10.0
+- Clamp alpha into the 0..1 range to avoid errors from misbehaving plugins
diff --git a/Interface/AddOns/HandyNotes/HandyNotes.lua b/Interface/AddOns/HandyNotes/HandyNotes.lua
index 23ea8a7e6..d015f3868 100644
--- a/Interface/AddOns/HandyNotes/HandyNotes.lua
+++ b/Interface/AddOns/HandyNotes/HandyNotes.lua
@@ -34,7 +34,7 @@ local defaults = {
---------------------------------------------------------
-- Localize some globals
-local floor = floor
+local floor, min, max = floor, math.min, math.max
local pairs, next, type = pairs, next, type
local CreateFrame = CreateFrame
local Minimap = Minimap
@@ -373,7 +373,7 @@ function HandyNotesWorldMapPinMixin:OnAcquired(pluginName, x, y, iconpath, scale
local size = 12 * db.icon_scale * scale
self:SetSize(size, size)
- self:SetAlpha(db.icon_alpha * alpha)
+ self:SetAlpha(min(max(db.icon_alpha * alpha, 0), 1))
local t = self.texture
if type(iconpath) == "table" then
@@ -448,7 +448,7 @@ function HandyNotes:UpdateMinimapPlugin(pluginName)
scale = ourScale * (scale or 1.0)
icon:SetHeight(scale) -- Can't use :SetScale as that changes our positioning scaling as well
icon:SetWidth(scale)
- icon:SetAlpha(ourAlpha * (alpha or 1.0))
+ icon:SetAlpha(min(max(ourAlpha * (alpha or 1.0), 0), 1))
local t = icon.texture
if type(iconpath) == "table" then
if iconpath.tCoordLeft then
diff --git a/Interface/AddOns/HandyNotes/HandyNotes.toc b/Interface/AddOns/HandyNotes/HandyNotes.toc
index a4891002c..433c9b7e9 100644
--- a/Interface/AddOns/HandyNotes/HandyNotes.toc
+++ b/Interface/AddOns/HandyNotes/HandyNotes.toc
@@ -3,7 +3,7 @@
## Notes: Handy notes for your maps
## Notes-frFR: Notes pratiques pour vos cartes.
## Author: Xinhuan
-## Version: v1.6.9
+## Version: v1.6.10
## DefaultState: enabled
## X-Category: Map
## X-eMail: xinhuan @ gmail DOT com
diff --git a/Interface/AddOns/HandyNotes/HandyNotes_TBC.toc b/Interface/AddOns/HandyNotes/HandyNotes_TBC.toc
index 485442a66..b8b3996aa 100644
--- a/Interface/AddOns/HandyNotes/HandyNotes_TBC.toc
+++ b/Interface/AddOns/HandyNotes/HandyNotes_TBC.toc
@@ -3,7 +3,7 @@
## Notes: Handy notes for your maps
## Notes-frFR: Notes pratiques pour vos cartes.
## Author: Xinhuan
-## Version: v1.6.9
+## Version: v1.6.10
## DefaultState: enabled
## X-Category: Map
## X-eMail: xinhuan @ gmail DOT com
diff --git a/Interface/AddOns/HandyNotes/HandyNotes_Vanilla.toc b/Interface/AddOns/HandyNotes/HandyNotes_Vanilla.toc
index 545b5f181..6d509a239 100644
--- a/Interface/AddOns/HandyNotes/HandyNotes_Vanilla.toc
+++ b/Interface/AddOns/HandyNotes/HandyNotes_Vanilla.toc
@@ -3,7 +3,7 @@
## Notes: Handy notes for your maps
## Notes-frFR: Notes pratiques pour vos cartes.
## Author: Xinhuan
-## Version: v1.6.9
+## Version: v1.6.10
## DefaultState: enabled
## X-Category: Map
## X-eMail: xinhuan @ gmail DOT com
diff --git a/Interface/AddOns/HandyNotes/HandyNotes_Wrath.toc b/Interface/AddOns/HandyNotes/HandyNotes_Wrath.toc
index 18e6ea010..aa36a448b 100644
--- a/Interface/AddOns/HandyNotes/HandyNotes_Wrath.toc
+++ b/Interface/AddOns/HandyNotes/HandyNotes_Wrath.toc
@@ -3,7 +3,7 @@
## Notes: Handy notes for your maps
## Notes-frFR: Notes pratiques pour vos cartes.
## Author: Xinhuan
-## Version: v1.6.9
+## Version: v1.6.10
## DefaultState: enabled
## X-Category: Map
## X-eMail: xinhuan @ gmail DOT com
diff --git a/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua b/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua
index d7845998a..2393611b7 100644
--- a/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua
+++ b/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua
@@ -1,6 +1,6 @@
-- HereBeDragons-Pins is a library to show pins/icons on the world map and minimap
-local MAJOR, MINOR = "HereBeDragons-Pins-2.0", 10
+local MAJOR, MINOR = "HereBeDragons-Pins-2.0", 11
assert(LibStub, MAJOR .. " requires LibStub")
local pins, _oldversion = LibStub:NewLibrary(MAJOR, MINOR)
@@ -493,7 +493,7 @@ pins.updateFrame:SetScript("OnUpdate", OnUpdateHandler)
local function OnEventHandler(frame, event, ...)
if event == "CVAR_UPDATE" then
local cvar, value = ...
- if cvar == "ROTATE_MINIMAP" then
+ if cvar == "rotateMinimap" or cvar == "ROTATE_MINIMAP" then
rotateMinimap = (value == "1")
queueFullUpdate = true
end
diff --git a/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons.toc b/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons.toc
index cd3271b86..7c0348c7c 100644
--- a/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons.toc
+++ b/Interface/AddOns/HandyNotes/Libs/HereBeDragons/HereBeDragons.toc
@@ -1,4 +1,4 @@
-## Interface: 90207
+## Interface: 100000
## Title: Lib: HereBeDragons
## Notes: HereBeDragons is a data API for the World of Warcraft mapping system
## Author: Nevcairiel
@@ -6,7 +6,7 @@
## X-Category: Library
## X-License: BSD
## X-Website: http://www.wowace.com/addons/herebedragons/
-## Version: 2.10-release
+## Version: 2.11-release
## X-Curse-Project-ID: 94348
LibStub\LibStub.lua
diff --git a/Interface/AddOns/Hekili/CHANGELOG.md b/Interface/AddOns/Hekili/CHANGELOG.md
index 156f7a09d..5f10c16ba 100644
--- a/Interface/AddOns/Hekili/CHANGELOG.md
+++ b/Interface/AddOns/Hekili/CHANGELOG.md
@@ -1,12 +1,11 @@
# Hekili
-## [v10.0.0-03](https://github.com/Hekili/hekili/tree/v10.0.0-03) (2022-10-29)
-[Full Changelog](https://github.com/Hekili/hekili/compare/v10.0.0-02...v10.0.0-03) [Previous Releases](https://github.com/Hekili/hekili/releases)
+## [v10.0.0-05.3](https://github.com/Hekili/hekili/tree/v10.0.0-05.3) (2022-10-31)
+[Full Changelog](https://github.com/Hekili/hekili/compare/v10.0.0-05.2...v10.0.0-05.3) [Previous Releases](https://github.com/Hekili/hekili/releases)
-- Balance priority tweaks.
-- Balance: Fix Starsurge cost; disable Tier 28.
-- Resolve omissions.
-- Minor Balance tweaks.
-- Testfixes for #1778, Ret paladin Still not recommending Final Reckoning Or Radiant Decree #1763
-- Add more information to Snapshots.
-- Arms: Fix QueueAuraExpiration calls (testfix for #1725)
+- Ele: Eye of the Storm became Tempest.
+- Remove duplicate auras/abilities.
+- Feral APL fixes.
+- Unholy APL fixes.
+- Fix #1813
+- Survival.
diff --git a/Interface/AddOns/Hekili/Classes.lua b/Interface/AddOns/Hekili/Classes.lua
index 65f68ebe1..2541d6bdd 100644
--- a/Interface/AddOns/Hekili/Classes.lua
+++ b/Interface/AddOns/Hekili/Classes.lua
@@ -270,9 +270,9 @@ local HekiliSpecMixin = {
end ]]
for element, value in pairs( data ) do
- if type( value ) == 'function' then
+ if type( value ) == "function" then
setfenv( value, state )
- if element ~= 'generate' then a.funcs[ element ] = value
+ if element ~= "generate" then a.funcs[ element ] = value
else a[ element ] = value end
else
a[ element ] = value
@@ -320,7 +320,7 @@ local HekiliSpecMixin = {
if self.pendingItemSpells[ a.name ] then
local items = self.pendingItemSpells[ a.name ]
- if type( items ) == 'table' then
+ if type( items ) == "table" then
for i, item in ipairs( items ) do
local ability = self.abilities[ item ]
ability.itemSpellKey = a.key .. "_" .. ability.itemSpellID
@@ -346,16 +346,18 @@ local HekiliSpecMixin = {
if data.meta then
for k, v in pairs( data.meta ) do
- if type( v ) == 'function' then data.meta[ k ] = setfenv( v, state ) end
+ if type( v ) == "function" then data.meta[ k ] = setfenv( v, state ) end
class.knownAuraAttributes[ k ] = true
end
end
- if type( data.copy ) == 'string' then
- self.auras[ data.copy ] = a
- elseif type( data.copy ) == 'table' then
- for _, key in ipairs( data.copy ) do
- self.auras[ key ] = a
+ if data.copy then
+ if type( data.copy ) ~= "table" then
+ self.auras[ data.copy ] = a
+ else
+ for _, key in ipairs( data.copy ) do
+ self.auras[ key ] = a
+ end
end
end
end,
@@ -408,7 +410,7 @@ local HekiliSpecMixin = {
RegisterStateTable = function( self, key, data )
for _, f in pairs( data ) do
- if type( f ) == 'function' then
+ if type( f ) == "function" then
setfenv( f, state )
end
end
@@ -547,14 +549,14 @@ local HekiliSpecMixin = {
end
local item = data.item
- if item and type( item ) == 'function' then
+ if item and type( item ) == "function" then
setfenv( item, state )
item = item()
end
if data.meta then
for k, v in pairs( data.meta ) do
- if type( v ) == 'function' then data.meta[ k ] = setfenv( v, state ) end
+ if type( v ) == "function" then data.meta[ k ] = setfenv( v, state ) end
end
end
@@ -577,7 +579,7 @@ local HekiliSpecMixin = {
end
for key, value in pairs( data ) do
- if type( value ) == 'function' then
+ if type( value ) == "function" then
setfenv( value, state )
if not protectedFunctions[ key ] then a.funcs[ key ] = value
@@ -648,7 +650,7 @@ local HekiliSpecMixin = {
else
if self.pendingItemSpells[ a.itemSpellName ] then
- if type( self.pendingItemSpells[ a.itemSpellName ] ) == 'table' then
+ if type( self.pendingItemSpells[ a.itemSpellName ] ) == "table" then
table.insert( self.pendingItemSpells[ a.itemSpellName ], ability )
else
local first = self.pendingItemSpells[ a.itemSpellName ]
@@ -672,9 +674,9 @@ local HekiliSpecMixin = {
end
if data.copy then
- if type( data.copy ) == 'string' or type( data.copy ) == 'number' then
+ if type( data.copy ) == "string" or type( data.copy ) == "number" then
self.abilities[ data.copy ] = a
- elseif type( data.copy ) == 'table' then
+ elseif type( data.copy ) == "table" then
for _, key in ipairs( data.copy ) do
self.abilities[ key ] = a
end
@@ -780,9 +782,9 @@ local HekiliSpecMixin = {
if not a.unlisted then class.abilityList[ ability ] = class.abilityList[ ability ] or a.listName or a.name end
if data.copy then
- if type( data.copy ) == 'string' or type( data.copy ) == 'number' then
+ if type( data.copy ) == "string" or type( data.copy ) == "number" then
self.abilities[ data.copy ] = a
- elseif type( data.copy ) == 'table' then
+ elseif type( data.copy ) == "table" then
for _, key in ipairs( data.copy ) do
self.abilities[ key ] = a
end
@@ -849,10 +851,10 @@ local HekiliSpecMixin = {
CommitKey( token )
self.pets[ token ] = {
- id = type( id ) == 'function' and setfenv( id, state ) or id,
+ id = type( id ) == "function" and setfenv( id, state ) or id,
token = token,
spell = spell,
- duration = type( duration ) == 'function' and setfenv( duration, state ) or duration
+ duration = type( duration ) == "function" and setfenv( duration, state ) or duration
}
local n = select( "#", ... )
@@ -927,7 +929,7 @@ function Hekili:RestoreDefaults()
if not existing or not existing.version or existing.version < v.version then
local data = self.DeserializeActionPack( v.import )
- if data and type( data ) == 'table' then
+ if data and type( data ) == "table" then
p.packs[ k ] = data.payload
data.payload.version = v.version
data.payload.date = v.version
@@ -989,7 +991,7 @@ function Hekili:RestoreDefault( name )
if default then
local data = self.DeserializeActionPack( default.import )
- if data and type( data ) == 'table' then
+ if data and type( data ) == "table" then
p.packs[ name ] = data.payload
data.payload.version = default.version
data.payload.date = default.version
@@ -1018,10 +1020,6 @@ ns.isDefault = function( name, category )
end
--- Trinket APL
--- ns.storeDefault( [[Usable Items]], 'actionLists', 20180208.181753, [[dq0NnaqijvTjPKpjrrJssPtjr1TufQSljzyk0XqjldPQNHsPAAiLsDnukLTHuk5BOunouk5CQcLMNKk3tQSpjfhucAHivEOefMisPYfvfSrvHmsukQtkbwPu4LOuKBkrj7uv6NQcflvI8uvMkQ0vLOuBfLc9vKsH9s6Vsvdw4WGwScEmctgvDzOnlL6ZOy0iLCAIvJuQ61OuWSv0Tb2Ts)wvnCKILJONlA6uDDKSDuX3vfQA8sOZRkA9iLIMVu0(PSYs5QhTdBdPMUsNEVqaQxzNWHjArbocs9kKWL)Mkx9LLYvVhw4We5v607fcq9ODKqkgA5w8BBX9PMPEfS8cb0)K6T)f1ReoryI6l9JSyN1OELW8trsGPYvD9kCqMI)upEsifdT8(F7(8tnt9ocsHgxV6Tir3LLjR4LeomrElAzH1as4chShxeiyArnDwKO7YYKvazfafWIwwynQ1IeDxwMScalkakGfDDwmArZMwajCHd2JlcemTOUols0DzzYkaSOaOawuU66l9kx9EyHdtKxPtVJGuOX1REls0DzzYkEjHdtK3IwwynGeUWb7XfbcMwutNfj6USmzfqwbqbSOLfwJATir3LLjRaWIcGcyrxNfJw0SPfqcx4G94IabtlQRZIeDxwMScalkakGfLRxjm)uKeyQCvxVchKP4p1RnKA6p7j(uRJKaeMuKOEfS8cb0)K6T)f1ReoryI6l9JSyN1OEVqaQ3JGut)PfLXNADKeGWKIevxFz7kx9EyHdtKxPtVJGuOX1REls0DzzYkEjHdtK3IwwynGeUWb7XfbcMwutNfj6USmzfqwbqbSOLfwJATir3LLjRaWIcGcyrxNfJw0SPfqcx4G94IabtlQRZIeDxwMScalkakGfLR3leG69iC(4EmYe5TOGTnsUWPfLfKGwYI6v4Gmf)PETX5xMiFVSTrYfo7bqcAjlQxjm)uKeyQCvxVs4eHjQV0pYIDwJ6vWYleq)tQ3(xuD9L2w5Q3dlCyI8kD69cbOEp6tYGTfC5lZ0IhbhifcO)j1ReMFkscmvUQRxHdYu8N61(tYGTfC5Z(2WbsHa6Fs9ky5fcO)j1B)lQxjCIWe1x6hzXoRr9ocsHgxV6Tir3LLjR4LeomrElAzH1as4chShxeiyArnDwKO7YYKvazfafWIwwynQ1IeDxwMScalkakGfDDwmArZMwajCHd2JlcemTOUols0DzzYkaSOaOawuU66lBt5Q3dlCyI8kD6DeKcnUE1BrIUlltwXljCyI8w0YcRbKWfoypUiqW0IA6Sir3LLjRaYkakGfTSWAuRfj6USmzfawuaual66Sy0IMnTas4chShxeiyArDDwKO7YYKvayrbqbSOC9EHaup28NCT432c2iC(j1RWbzk(t9O1NC7)T75aNFs9kH5NIKatLR66vcNimr9L(rwSZAuVcwEHa6Fs92)IQRV0wkx9EyHdtKxPtVJGuOX1REls0DzzYkEjHdtK3IwwynGeUWb7XfbcMwutNfj6USmzfqwbqbSOLfwJATir3LLjRaWIcGcyrxNfJw0SPfqcx4G94IabtlQRZIeDxwMScalkakGfLRxjm)uKeyQCvxVchKP4p1JnitApe5Xn7hOixzz6F8ssl9ky5fcO)j1B)lQxjCIWe1x6hzXoRr9EHaup2KmltApe5XTmtlOJICLLXcAdjPL66l7kx9EyHdtKxPtVxia1RSegA5w8BBbBI8NuPELW8trsGPYvD9kCqMI)upGWqlV)3UNnq(tQuVcwEHa6Fs92)I6vcNimr9L(rwSZAuVJGuOX1REls0DzzYkEjHdtK3IwwynGeUWb7XfbcMwutNfj6USmzfqwbqbSOLfwJATir3LLjRaWIcGcyrxNfJw0SPfqcx4G94IabtlQRZIeDxwMScalkakGfLRU(Ywkx9EyHdtKxPtVJGuOX1REls0DzzYkEjHdtK3IwwynGeUWb7XfbcMwutNfj6USmzfqwbqbSOLfwJATir3LLjRaWIcGcyrxNfJw0SPfqcx4G94IabtlQRZIeDxwMScalkakGfLR3leG6vswgl(TTOm(ZjKMuwglEeLtrIPEfoitXFQhPSm9)29e)5estkltFBkNIet9kH5NIKatLR66vcNimr9L(rwSZAuVcwEHa6Fs92)IQRVpwLREpSWHjYR0P3rqk046vVfj6USmzfVKWHjYBrllSgqcx4G94IabtlQPZIeDxwMSciRaOaw0YcRrTwKO7YYKvayrbqbSORZIrlA20ciHlCWECrGGPf11zrIUlltwbGffafWIY1ReMFkscmvUQRxHdYu8N6L0Geos2)B3pGoj8jCQxblVqa9pPE7Fr9kHteMO(s)il2znQ3leG6D0GeosAXVTf0Hoj8jCQU(YAu5Q3dlCyI8kD6DeKcnUE1BrIUlltwXljCyI8w0YcRbKWfoypUiqW0IA6Sir3LLjRaYkakGfTSWAuRfj6USmzfawuaual66Sy0IMnTas4chShxeiyArDDwKO7YYKvayrbqbSOC9ky5fcO)j1B)lQxHdYu8N65Fa2)B3tTKqo4uwM(eUI)uVsy(PijWu5QUELWjctuFPFKf7Sg17fcq94(bOf)2wu2ljKdoLLXIdUI)uD9LflLREpSWHjYR0P3rqk046vVfj6USmzfVKWHjYBrllSgqcx4G94IabtlQPZIeDxwMSciRaOaw0YcRrTwKO7YYKvayrbqbSORZIrlA20ciHlCWECrGGPf11zrIUlltwbGffafWIY1ReMFkscmvUQRxHdYu8N6rbgiHZEW)VmtOWbt9ky5fcO)j1B)lQxjCIWe1x6hzXoRr9EHauVYgmqcNwuw))YmHchmvxFzrVYvVhw4We5v607iifAC9Q3IeDxwMSIxs4We5TOLfwdiHlCWECrGGPf10zrIUlltwbKvaualAzH1Owls0DzzYkaSOaOaw01zXOfnBAbKWfoypUiqW0I66Sir3LLjRaWIcGcyr56vcZpfjbMkx11RWbzk(t94iWz)VDpbctCIz27)IYM6vWYleq)tQ3(xuVs4eHjQV0pYIDwJ69cbOESrboT432IYaHjoXmTG7VOSP6QRxjCIWe1x6hzXwJ0pYwvSyNTX(iBP3rqk046PhBw45XvPtVJgKqGtH2e6YF13r1vfa]] )
-
-
function Hekili:NewSpecialization( specID, isRanged, icon )
if not specID or specID < 0 then return end
@@ -1456,7 +1454,7 @@ all:RegisterAuras( {
aura.expires = endCast / 1000
aura.applied = startCast / 1000
aura.v1 = spell
- aura.caster = 'player'
+ aura.caster = "player"
return
end
@@ -1468,7 +1466,7 @@ all:RegisterAuras( {
aura.expires = endCast / 1000
aura.applied = startCast / 1000
aura.v1 = spell
- aura.caster = 'player'
+ aura.caster = "player"
return
end
@@ -1477,7 +1475,7 @@ all:RegisterAuras( {
aura.expires = 0
aura.applied = 0
aura.v1 = 0
- aura.caster = 'target'
+ aura.caster = "target"
end,
}, ]]
@@ -1897,76 +1895,76 @@ all:RegisterPotions( {
-- 8.2
potion_of_empowered_proximity = {
item = 168529,
- buff = 'potion_of_empowered_proximity',
- copy = 'empowered_proximity'
+ buff = "potion_of_empowered_proximity",
+ copy = "empowered_proximity"
},
potion_of_focused_resolve = {
item = 168506,
- buff = 'potion_of_focused_resolve',
- copy = 'focused_resolve'
+ buff = "potion_of_focused_resolve",
+ copy = "focused_resolve"
},
potion_of_unbridled_fury = {
item = 169299,
- buff = 'potion_of_unbridled_fury',
- copy = 'unbridled_fury'
+ buff = "potion_of_unbridled_fury",
+ copy = "unbridled_fury"
},
superior_battle_potion_of_agility = {
item = 168489,
- buff = 'superior_battle_potion_of_agility',
+ buff = "superior_battle_potion_of_agility",
},
superior_battle_potion_of_intellect = {
item = 168498,
- buff = 'superior_battle_potion_of_intellect',
+ buff = "superior_battle_potion_of_intellect",
},
superior_battle_potion_of_stamina = {
item = 168499,
- buff = 'superior_battle_potion_of_stamina',
+ buff = "superior_battle_potion_of_stamina",
},
superior_battle_potion_of_strength = {
item = 168500,
- buff = 'superior_battle_potion_of_strength',
+ buff = "superior_battle_potion_of_strength",
},
superior_steelskin_potion = {
item = 168501,
- buff = 'superior_steelskin_potion',
+ buff = "superior_steelskin_potion",
},
-- 8.0
battle_potion_of_agility = {
item = 163223,
- buff = 'battle_potion_of_agility',
+ buff = "battle_potion_of_agility",
},
battle_potion_of_intellect = {
item = 163222,
- buff = 'battle_potion_of_intellect',
+ buff = "battle_potion_of_intellect",
},
battle_potion_of_stamina = {
item = 163225,
- buff = 'battle_potion_of_stamina',
+ buff = "battle_potion_of_stamina",
},
battle_potion_of_strength = {
item = 163224,
- buff = 'battle_potion_of_strength',
+ buff = "battle_potion_of_strength",
},
bursting_blood = {
item = 152560,
- buff = 'potion_of_bursting_blood',
+ buff = "potion_of_bursting_blood",
copy = "bursting_blood",
},
potion_of_rising_death = {
item = 152559,
- buff = 'potion_of_rising_death',
+ buff = "potion_of_rising_death",
copy = "rising_death",
},
steelskin_potion = {
item = 152557,
- buff = 'steelskin_potion',
+ buff = "steelskin_potion",
},
-- 7.0
prolonged_power = {
item = 142117,
- buff = 'prolonged_power',
+ buff = "prolonged_power",
copy = "potion_of_prolonged_power"
}
} )
@@ -2197,7 +2195,7 @@ all:RegisterAbilities( {
-- usable = function () return race.troll end,
handler = function ()
- applyBuff( 'berserking' )
+ applyBuff( "berserking" )
end,
},
@@ -2343,7 +2341,7 @@ all:RegisterAbilities( {
-- usable = function () return race.lightforged_draenei end,
- toggle = 'cooldowns',
+ toggle = "cooldowns",
},
@@ -2392,7 +2390,7 @@ all:RegisterAbilities( {
listName = '|T136243:0|t |cff00ccff[Call Action List]|r',
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
essential = true,
},
@@ -2401,7 +2399,7 @@ all:RegisterAbilities( {
listName = '|T136243:0|t |cff00ccff[Run Action List]|r',
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
essential = true,
},
@@ -2410,7 +2408,7 @@ all:RegisterAbilities( {
listName = '|T136243:0|t |cff00ccff[Wait]|r',
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
essential = true,
},
@@ -2419,7 +2417,7 @@ all:RegisterAbilities( {
listName = "|T136243:0|t |cff00ccff[Pool Resource]|r",
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
},
cancel_action = {
@@ -2435,7 +2433,7 @@ all:RegisterAbilities( {
listName = '|T136243:0|t |cff00ccff[Variable]|r',
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
essential = true,
},
@@ -2444,7 +2442,7 @@ all:RegisterAbilities( {
listName = '|T136243:0|t |cff00ccff[Potion]|r',
cast = 0,
cooldown = function () return time > 0 and 3600 or 60 end,
- gcd = 'off',
+ gcd = "off",
startsCombat = false,
toggle = "potions",
@@ -2530,7 +2528,7 @@ all:RegisterAbilities( {
name = "Cancel Buff",
listName = '|T136243:0|t |cff00ccff[Cancel Buff]|r',
cast = 0,
- gcd = 'off',
+ gcd = "off",
startsCombat = false,
@@ -2605,7 +2603,7 @@ do
listName = "|T136243:0|t |cff00ccff[Use Items]|r",
cast = 0,
cooldown = 120,
- gcd = 'off',
+ gcd = "off",
} )
@@ -2618,7 +2616,7 @@ do
end,
cast = 0,
cooldown = 0,
- gcd = 'off',
+ gcd = "off",
item = 158075,
essence = true,
@@ -5006,28 +5004,28 @@ all:RegisterAbility( "the_horsemans_sinister_slicer", {
-- LEGION LEGENDARIES
-all:RegisterGear( 'rethus_incessant_courage', 146667 )
- all:RegisterAura( 'rethus_incessant_courage', { id = 241330 } )
+all:RegisterGear( "rethus_incessant_courage", 146667 )
+ all:RegisterAura( "rethus_incessant_courage", { id = 241330 } )
-all:RegisterGear( 'vigilance_perch', 146668 )
- all:RegisterAura( 'vigilance_perch', { id = 241332, duration = 60, max_stack = 5 } )
+all:RegisterGear( "vigilance_perch", 146668 )
+ all:RegisterAura( "vigilance_perch", { id = 241332, duration = 60, max_stack = 5 } )
-all:RegisterGear( 'the_sentinels_eternal_refuge', 146669 )
- all:RegisterAura( 'the_sentinels_eternal_refuge', { id = 241331, duration = 60, max_stack = 5 } )
+all:RegisterGear( "the_sentinels_eternal_refuge", 146669 )
+ all:RegisterAura( "the_sentinels_eternal_refuge", { id = 241331, duration = 60, max_stack = 5 } )
-all:RegisterGear( 'prydaz_xavarics_magnum_opus', 132444 )
- all:RegisterAura( 'xavarics_magnum_opus', { id = 207428, duration = 30 } )
+all:RegisterGear( "prydaz_xavarics_magnum_opus", 132444 )
+ all:RegisterAura( "xavarics_magnum_opus", { id = 207428, duration = 30 } )
all:RegisterAbility( "draught_of_souls", {
cast = 0,
cooldown = 80,
- gcd = 'off',
+ gcd = "off",
item = 140808,
- toggle = 'cooldowns',
+ toggle = "cooldowns",
handler = function ()
applyBuff( "fel_crazed_rage", 3 )
@@ -5048,7 +5046,7 @@ all:RegisterAbility( "faulty_countermeasure", {
item = 137539,
- toggle = 'cooldowns',
+ toggle = "cooldowns",
handler = function ()
applyBuff( "sheathed_in_frost" )
@@ -5064,11 +5062,11 @@ all:RegisterAura( "sheathed_in_frost", {
all:RegisterAbility( "feloiled_infernal_machine", {
cast = 0,
cooldown = 80,
- gcd = 'off',
+ gcd = "off",
item = 144482,
- toggle = 'cooldowns',
+ toggle = "cooldowns",
handler = function ()
applyBuff( "grease_the_gears" )
@@ -5086,7 +5084,7 @@ all:RegisterAbility( "ring_of_collapsing_futures", {
spend = 0,
cast = 0,
cooldown = 15,
- gcd = 'off',
+ gcd = "off",
readyTime = function () return debuff.temptation.remains end,
handler = function ()
@@ -5106,7 +5104,7 @@ all:RegisterAbility( "forgefiends_fabricator", {
spend = 0,
cast = 0,
cooldown = 30,
- gcd = 'off',
+ gcd = "off",
} )
@@ -5115,8 +5113,8 @@ all:RegisterAbility( "horn_of_valor", {
spend = 0,
cast = 0,
cooldown = 120,
- gcd = 'off',
- toggle = 'cooldowns',
+ gcd = "off",
+ toggle = "cooldowns",
handler = function () applyBuff( "valarjars_path" ) end
} )
@@ -5131,11 +5129,11 @@ all:RegisterAbility( "kiljaedens_burning_wish", {
cast = 0,
cooldown = 75,
- gcd = 'off',
+ gcd = "off",
texture = 1357805,
- toggle = 'cooldowns',
+ toggle = "cooldowns",
} )
@@ -5144,7 +5142,7 @@ all:RegisterAbility( "might_of_krosus", {
spend = 0,
cast = 0,
cooldown = 30,
- gcd = 'off',
+ gcd = "off",
handler = function () if active_enemies > 3 then setCooldown( "might_of_krosus", 15 ) end end
} )
@@ -5154,12 +5152,12 @@ all:RegisterAbility( "ring_of_collapsing_futures", {
spend = 0,
cast = 0,
cooldown = 15,
- gcd = 'off',
+ gcd = "off",
readyTime = function () return debuff.temptation.remains end,
handler = function () applyDebuff( "player", "temptation", 30, debuff.temptation.stack + 1 ) end
} )
-all:RegisterAura( 'temptation', {
+all:RegisterAura( "temptation", {
id = 234143,
duration = 30,
max_stack = 20
@@ -5171,7 +5169,7 @@ all:RegisterAbility( "specter_of_betrayal", {
spend = 0,
cast = 0,
cooldown = 45,
- gcd = 'off',
+ gcd = "off",
} )
@@ -5197,8 +5195,8 @@ all:RegisterAbility( "umbral_moonglaives", {
spend = 0,
cast = 0,
cooldown = 90,
- gcd = 'off',
- toggle = 'cooldowns',
+ gcd = "off",
+ toggle = "cooldowns",
} )
@@ -5207,8 +5205,8 @@ all:RegisterAbility( "unbridled_fury", {
spend = 0,
cast = 0,
cooldown = 120,
- gcd = 'off',
- toggle = 'cooldowns',
+ gcd = "off",
+ toggle = "cooldowns",
handler = function () applyBuff( "wild_gods_fury" ) end
} )
@@ -5223,8 +5221,8 @@ all:RegisterAbility( "vial_of_ceaseless_toxins", {
spend = 0,
cast = 0,
cooldown = 60,
- gcd = 'off',
- toggle = 'cooldowns',
+ gcd = "off",
+ toggle = "cooldowns",
handler = function () applyDebuff( "target", "ceaseless_toxin", 20 ) end
} )
@@ -5253,14 +5251,14 @@ all:RegisterAura( "extracted_sanity", {
duration = 24
} )
-all:RegisterGear( 'aggramars_stride', 132443 )
-all:RegisterAura( 'aggramars_stride', {
+all:RegisterGear( "aggramars_stride", 132443 )
+all:RegisterAura( "aggramars_stride", {
id = 207438,
duration = 3600
} )
-all:RegisterGear( 'sephuzs_secret', 132452 )
-all:RegisterAura( 'sephuzs_secret', {
+all:RegisterGear( "sephuzs_secret", 132452 )
+all:RegisterAura( "sephuzs_secret", {
id = 208051,
duration = 10
} )
@@ -5274,31 +5272,31 @@ all:RegisterAbility( "buff_sephuzs_secret", {
usable = function () return false end,
} )
-all:RegisterGear( 'archimondes_hatred_reborn', 144249 )
-all:RegisterAura( 'archimondes_hatred_reborn', {
+all:RegisterGear( "archimondes_hatred_reborn", 144249 )
+all:RegisterAura( "archimondes_hatred_reborn", {
id = 235169,
duration = 10,
max_stack = 1
} )
-all:RegisterGear( 'amanthuls_vision', 154172 )
-all:RegisterAura( 'glimpse_of_enlightenment', {
+all:RegisterGear( "amanthuls_vision", 154172 )
+all:RegisterAura( "glimpse_of_enlightenment", {
id = 256818,
duration = 12
} )
-all:RegisterAura( 'amanthuls_grandeur', {
+all:RegisterAura( "amanthuls_grandeur", {
id = 256832,
duration = 15
} )
-all:RegisterGear( 'insignia_of_the_grand_army', 152626 )
+all:RegisterGear( "insignia_of_the_grand_army", 152626 )
-all:RegisterGear( 'eonars_compassion', 154172 )
-all:RegisterAura( 'mark_of_eonar', {
+all:RegisterGear( "eonars_compassion", 154172 )
+all:RegisterAura( "mark_of_eonar", {
id = 256824,
duration = 12
} )
-all:RegisterAura( 'eonars_verdant_embrace', {
+all:RegisterAura( "eonars_verdant_embrace", {
id = function ()
if class.file == "SHAMAN" then return 257475 end
if class.file == "DRUID" then return 257470 end
@@ -5313,44 +5311,44 @@ all:RegisterAura( 'eonars_verdant_embrace', {
duration = 20,
copy = { 257470, 257471, 257472, 257473, 257474, 257475 }
} )
-all:RegisterAura( 'verdant_embrace', {
+all:RegisterAura( "verdant_embrace", {
id = 257444,
duration = 30
} )
-all:RegisterGear( 'aggramars_conviction', 154173 )
-all:RegisterAura( 'celestial_bulwark', {
+all:RegisterGear( "aggramars_conviction", 154173 )
+all:RegisterAura( "celestial_bulwark", {
id = 256816,
duration = 14
} )
-all:RegisterAura( 'aggramars_fortitude', {
+all:RegisterAura( "aggramars_fortitude", {
id = 256831,
duration = 15
} )
-all:RegisterGear( 'golganneths_vitality', 154174 )
-all:RegisterAura( 'golganneths_thunderous_wrath', {
+all:RegisterGear( "golganneths_vitality", 154174 )
+all:RegisterAura( "golganneths_thunderous_wrath", {
id = 256833,
duration = 15
} )
-all:RegisterGear( 'khazgoroths_courage', 154176 )
-all:RegisterAura( 'worldforgers_flame', {
+all:RegisterGear( "khazgoroths_courage", 154176 )
+all:RegisterAura( "worldforgers_flame", {
id = 256826,
duration = 12
} )
-all:RegisterAura( 'khazgoroths_shaping', {
+all:RegisterAura( "khazgoroths_shaping", {
id = 256835,
duration = 15
} )
-all:RegisterGear( 'norgannons_prowess', 154177 )
-all:RegisterAura( 'rush_of_knowledge', {
+all:RegisterGear( "norgannons_prowess", 154177 )
+all:RegisterAura( "rush_of_knowledge", {
id = 256828,
duration = 12
} )
-all:RegisterAura( 'norgannons_command', {
+all:RegisterAura( "norgannons_command", {
id = 256836,
duration = 15,
max_stack = 6
@@ -5642,7 +5640,7 @@ local function storeAbilityElements( key, values )
end
for k, v in pairs( values ) do
- ability.elem[ k ] = type( v ) == 'function' and setfenv( v, state ) or v
+ ability.elem[ k ] = type( v ) == "function" and setfenv( v, state ) or v
end
end
@@ -5658,7 +5656,7 @@ local function modifyElement( t, k, elem, value )
return
end
- if type( value ) == 'function' then
+ if type( value ) == "function" then
entry.mods[ elem ] = setfenv( value, Hekili.State )
else
entry.elem[ elem ] = value
@@ -6076,10 +6074,10 @@ function Hekili:SpecializationChanged()
end
end
- state.GUID = UnitGUID( 'player' )
- state.player.unit = UnitGUID( 'player' )
+ state.GUID = UnitGUID( "player" )
+ state.player.unit = UnitGUID( "player" )
- ns.callHook( 'specializationChanged' )
+ ns.callHook( "specializationChanged" )
ns.updateTalents()
-- ns.updateGear()
@@ -6163,7 +6161,7 @@ do
local item = k
local buffs = LIB:GetItemBuffs( k )
- if type( buffs ) == 'table' then
+ if type( buffs ) == "table" then
for i, buff in ipairs( buffs ) do
buff = GetSpellInfo( buff )
if buff then
@@ -6175,7 +6173,7 @@ do
class.trinkets[ k ].buff = ns.formatKey( buff )
end
end
- elseif type( buffs ) == 'number' then
+ elseif type( buffs ) == "number" then
local buff = GetSpellInfo( buffs )
if buff then
all:RegisterAura( ns.formatKey( buff ), {
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightBlood.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightBlood.simc
index f5895efeb..394681af8 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightBlood.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightBlood.simc
@@ -1,11 +1,8 @@
-## Blood DK
-## 27 October 2022
-
-# Executed before combat begins. Accepts non-harmful actions only.
actions.precombat+=/fleshcraft
# Interrupt
actions+=/mind_freeze
+actions+=/strangulate
actions+=/variable,name=death_strike_dump_amount,value=70
# Since the potion cooldown has changed, we'll sync with DRW
actions+=/potion,if=buff.dancing_rune_weapon.up
@@ -15,7 +12,7 @@ actions+=/deaths_caress,if=!buff.bone_shield.up
actions+=/blooddrinker,if=!buff.dancing_rune_weapon.up
actions+=/call_action_list,name=racials
# Attempt to sacrifice the ghoul if we predictably will not do much in the near future
-actions+=/sacrificial_pact,if=!buff.dancing_rune_weapon.up&(pet.ghoul.remains<2|target.time_to_diegcd&charges_fractional>=1.8)|rune.time_to_3>gcd
actions+=/marrowrend,if=buff.bone_shield.remains=2&rune<=1)|dot.blood_plague.remains<=2
actions.drw_up+=/variable,name=heart_strike_rp_drw,value=(25+spell_targets.heart_strike*talent.heartbreaker.enabled*2)
actions.drw_up+=/death_strike,if=runic_power.deficit<=variable.heart_strike_rp_drw
actions.drw_up+=/consumption
-actions.drw_up+=/death_and_decay,if=(spell_targets.death_and_decay=3&buff.crimson_scourge.up)|spell_targets.death_and_decay>=4
+actions.drw_up+=/death_and_decay,if=(spell_targets.death_and_decay>2&buff.crimson_scourge.up)|spell_targets.death_and_decay>=4
actions.drw_up+=/heart_strike,if=rune.time_to_2=variable.heart_strike_rp_drw
actions.racials=blood_fury,if=cooldown.dancing_rune_weapon.ready&(!cooldown.blooddrinker.ready|!talent.blooddrinker.enabled)
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightFrost.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightFrost.simc
index b139b5967..191ad4821 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightFrost.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightFrost.simc
@@ -1,174 +1,181 @@
-## Frost DK
-## 27 October 2022
-
-# Executed before combat begins. Accepts non-harmful actions only.
actions.precombat+=/fleshcraft
-# Evaluates a trinkets cooldown, divided by pillar of frost, empower rune weapon, or breath of sindragosa's cooldown. If it's value has no remainder return 1, else return 0.5.
-actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=trinket.1.has_use_buff&(talent.pillar_of_frost&!talent.breath_of_sindragosa&(trinket.1.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.1.cooldown.duration=0))
-actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=trinket.2.has_use_buff&(talent.pillar_of_frost&!talent.breath_of_sindragosa&(trinket.2.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.2.cooldown.duration=0))
+# Evaluates a trinkets cooldown, divided by pillar of frost or breath of sindragosa's cooldown. If it's value has no remainder return 1, else return 0.5.
+actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=trinket.1.has_use_buff&(!talent.breath_of_sindragosa&(trinket.1.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.1.cooldown.duration=0)|talent.icecap)
+actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=trinket.2.has_use_buff&(!talent.breath_of_sindragosa&(trinket.2.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.2.cooldown.duration=0)|talent.icecap)
# Estimates a trinkets value by comparing the cooldown of the trinket, divided by the duration of the buff it provides. Has a strength modifier to give a higher priority to strength trinkets, as well as a modifier for if a trinket will or will not sync with cooldowns.
actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!trinket.1.has_use_buff&trinket.2.has_use_buff|trinket.2.has_use_buff&((trinket.2.cooldown.duration%trinket.2.buff_duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.buff_duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
-actions.precombat+=/variable,name=rw_buffs,value=talent.gathering_storm|talent.everfrost|talent.biting_cold
-actions.precombat+=/variable,name.twohand_check,value=main_hand.twohand&talent.might_of_the_frozen_wastes
+actions.precombat+=/variable,name=rw_buffs,value=talent.gathering_storm|conduit.everfrost|runeforge.biting_cold
-# Executed every time the actor is available.
-actions=mind_freeze
+# Interrupt
+actions+=/mind_freeze
actions+=/strangulate
-# Prevent specified trinkets being used with automatic lines actions+=/variable,name=specified_trinket,value=
+# Prevent specified trinkets being used with automatic lines
+actions+=/variable,name=specified_trinket,value=(equipped.inscrutable_quantum_device|equipped.the_first_sigil)&(cooldown.inscrutable_quantum_device.ready|cooldown.the_first_sigil.remains)|equipped.the_first_sigil&equipped.inscrutable_quantum_device
actions+=/variable,name=st_planning,value=active_enemies=1&(raid_event.adds.in>15|!raid_event.adds.exists)
-actions+=/variable,name=adds_remain,value=active_enemies>=2&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.remains>5)
-actions+=/variable,name=rime_buffs,value=buff.rime.react&(talent.rage_of_the_frozen_champion|talent.avalanche|talent.icebreaker)
-actions+=/variable,name=rp_buffs,value=talent.unleashed_frenzy&(buff.unleashed_frenzy.remains=3)&(!talent.improved_obliterate&!talent.frigid_executioner&!talent.frostreaper&!talent.might_of_the_frozen_wastes|!talent.cleaving_strikes|talent.cleaving_strikes&(active_enemies>6|!death_and_decay.ticking&active_enemies>3))
-# Formulaic approach to determine the time before these abilities come off cooldown that the simulation should star to pool resources. Capped at 15s in the run_action_list call.
-actions+=/variable,name=oblit_pooling_time,op=setif,value=((cooldown.pillar_of_frost.remains_expected+1)%gcd)%((rune+3)*(runic_power+5))*100,value_else=gcd*2,condition=runic_power<35&rune<2&cooldown.pillar_of_frost.remains_expected<10
-actions+=/variable,name=breath_pooling_time,op=setif,value=((cooldown.breath_of_sindragosa.remains+1)%gcd)%((rune+1)*(runic_power+20))*100,value_else=gcd*2,condition=runic_power.deficit>10&cooldown.breath_of_sindragosa.remains<10
-actions+=/variable,name=pooling_runes,value=talent.obliteration&cooldown.pillar_of_frost.remains_expected=2&(!talent.obliteration|talent.obliteration&(!buff.pillar_of_frost.up|buff.pillar_of_frost.up&!buff.killing_machine.react))
-actions+=/glacial_advance,if=active_enemies>=2&variable.rp_buffs&talent.obliteration&talent.breath_of_sindragosa&!buff.pillar_of_frost.up&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>variable.breath_pooling_time
-actions+=/glacial_advance,if=active_enemies>=2&variable.rp_buffs&talent.breath_of_sindragosa&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>variable.breath_pooling_time
-actions+=/glacial_advance,if=active_enemies>=2&variable.rp_buffs&!talent.breath_of_sindragosa&talent.obliteration&!buff.pillar_of_frost.up
-actions+=/frost_strike,if=active_enemies=1&variable.rp_buffs&talent.obliteration&talent.breath_of_sindragosa&!buff.pillar_of_frost.up&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>variable.breath_pooling_time
-actions+=/frost_strike,if=active_enemies=1&variable.rp_buffs&talent.breath_of_sindragosa&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>variable.breath_pooling_time
-actions+=/frost_strike,if=active_enemies=1&variable.rp_buffs&!talent.breath_of_sindragosa&talent.obliteration&!buff.pillar_of_frost.up
-actions+=/remorseless_winter,if=!talent.breath_of_sindragosa&!talent.obliteration&variable.rw_buffs
-actions+=/remorseless_winter,if=talent.obliteration&active_enemies>=3&variable.adds_remain
+actions+=/variable,name=adds_remain,value=active_enemies>=2&(!raid_event.adds.exists|raid_event.adds.exists&(raid_event.adds.remains>5|target.1.time_to_die>10))
+actions+=/variable,name=rotfc_rime,value=buff.rime.up&(!runeforge.rage_of_the_frozen_champion|runeforge.rage_of_the_frozen_champion&runic_power.deficit>8)
+actions+=/variable,name=frost_strike_conduits,value=conduit.eradicating_blow&buff.eradicating_blow.stack=2|conduit.unleashed_frenzy&buff.unleashed_frenzy.remains<(gcd*2)
+actions+=/variable,name=deaths_due_active,value=death_and_decay.ticking&covenant.night_fae
+# Apply Frost Fever, maintain Icy Talons and keep Remorseless Winter rolling
+actions+=/remorseless_winter,if=conduit.everfrost&talent.gathering_storm&(!talent.obliteration&cooldown.pillar_of_frost.remains|set_bonus.tier28_4pc&talent.obliteration&!buff.pillar_of_frost.up)
+actions+=/howling_blast,cycle_targets=1,if=!dot.frost_fever.remains&(talent.icecap|!buff.breath_of_sindragosa.up&talent.breath_of_sindragosa|talent.obliteration&cooldown.pillar_of_frost.remains&!buff.killing_machine.up)
+actions+=/glacial_advance,if=buff.icy_talons.remains<=gcd*2&talent.icy_talons&spell_targets.glacial_advance>=2&(talent.icecap|talent.breath_of_sindragosa&cooldown.breath_of_sindragosa.remains>15|talent.obliteration&!buff.pillar_of_frost.up)
+actions+=/frost_strike,if=buff.icy_talons.remains<=gcd*2&talent.icy_talons&(talent.icecap|talent.breath_of_sindragosa&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>10|talent.obliteration&!buff.pillar_of_frost.up)
+actions+=/obliterate,if=covenant.night_fae&death_and_decay.ticking&death_and_decay.active_remains<(gcd*1.5)&(!talent.obliteration|talent.obliteration&!buff.pillar_of_frost.up)
# Choose Action list to run
+actions+=/call_action_list,name=covenants
+actions+=/call_action_list,name=racials
actions+=/call_action_list,name=trinkets
actions+=/call_action_list,name=cooldowns
-actions+=/call_action_list,name=racials
-actions+=/call_action_list,name=covenants
-actions+=/call_action_list,name=cold_heart,if=talent.cold_heart&(!buff.killing_machine.up|talent.breath_of_sindragosa)&((debuff.razorice.stack=5|!death_knight.runeforge.razorice&!talent.glacial_advance&!talent.avalanche)|fight_remains<=gcd)
-actions+=/run_action_list,name=breath_oblit,if=buff.breath_of_sindragosa.up&talent.obliteration&buff.pillar_of_frost.up
-actions+=/run_action_list,name=breath,if=buff.breath_of_sindragosa.up&(!talent.obliteration|talent.obliteration&!buff.pillar_of_frost.up)
-actions+=/run_action_list,name=obliteration,if=talent.obliteration&buff.pillar_of_frost.up&!buff.breath_of_sindragosa.up
-actions+=/call_action_list,name=aoe,if=active_enemies>=2
-actions+=/call_action_list,name=single_target,if=active_enemies=1
+actions+=/call_action_list,name=cold_heart,if=talent.cold_heart&(!buff.killing_machine.up|talent.breath_of_sindragosa)&((debuff.razorice.stack=5|!death_knight.runeforge.razorice)|fight_remains<=gcd)
+actions+=/run_action_list,name=bos_ticking,strict=1,if=buff.breath_of_sindragosa.up
+actions+=/run_action_list,name=bos_pooling,if=talent.breath_of_sindragosa&!buff.breath_of_sindragosa.up&(cooldown.breath_of_sindragosa.remains<10)&(raid_event.adds.in>25|!raid_event.adds.exists|cooldown.pillar_of_frost.remains<10&raid_event.adds.exists&raid_event.adds.in<10)
+actions+=/run_action_list,name=obliteration,strict=1,if=buff.pillar_of_frost.up&talent.obliteration
+actions+=/run_action_list,name=obliteration_pooling,if=!set_bonus.tier28_4pc&!runeforge.rage_of_the_frozen_champion&talent.obliteration&cooldown.pillar_of_frost.remains<10&(variable.st_planning|raid_event.adds.exists&raid_event.adds.in<10|!raid_event.adds.exists)
+actions+=/run_action_list,name=aoe,strict=1,if=active_enemies>=2
+actions+=/call_action_list,name=standard
-# AoE Action List
+# AoE Rotation
actions.aoe=remorseless_winter
-actions.aoe+=/chill_streak,if=!variable.pooling_runic_power&active_enemies<19&fight_remains>4
-actions.aoe+=/howling_blast,if=buff.rime.react|!dot.frost_fever.ticking
-actions.aoe+=/glacial_advance,if=!variable.pooling_runic_power&variable.rp_buffs
-actions.aoe+=/obliterate,if=buff.killing_machine.react&talent.cleaving_strikes&death_and_decay.ticking&!variable.frostscythe_priority
-actions.aoe+=/glacial_advance,if=!variable.pooling_runic_power
-actions.aoe+=/frostscythe,if=variable.frostscythe_priority
-actions.aoe+=/obliterate,if=!variable.frostscythe_priority
-actions.aoe+=/frost_strike,if=!variable.pooling_runic_power&!talent.glacial_advance
-actions.aoe+=/horn_of_winter,if=rune<2&runic_power.deficit>25
-actions.aoe+=/arcane_torrent,if=runic_power.deficit>25
+actions.aoe+=/glacial_advance,if=talent.frostscythe
+actions.aoe+=/frostscythe,if=buff.killing_machine.react&!variable.deaths_due_active
+actions.aoe+=/howling_blast,if=variable.rotfc_rime&talent.avalanche
+actions.aoe+=/glacial_advance,if=!buff.rime.up&active_enemies<=3|active_enemies>3
+# Formulaic approach to create a pseudo priority target list for applying razorice in aoe
+actions.aoe+=/frost_strike,cycle_targets=1,if=cooldown.remorseless_winter.remains<=2*gcd&talent.gathering_storm
+actions.aoe+=/howling_blast,if=variable.rotfc_rime
+actions.aoe+=/frostscythe,if=talent.gathering_storm&buff.remorseless_winter.up&active_enemies>2&!variable.deaths_due_active
+actions.aoe+=/obliterate,if=variable.deaths_due_active&buff.deaths_due.stack<4|talent.gathering_storm&buff.remorseless_winter.up
+actions.aoe+=/frost_strike,cycle_targets=1,if=runic_power.deficit<(15+talent.runic_attenuation*5)
+actions.aoe+=/frostscythe,if=!variable.deaths_due_active
+actions.aoe+=/obliterate,cycle_targets=1,if=runic_power.deficit>(25+talent.runic_attenuation*5)
+actions.aoe+=/glacial_advance
+actions.aoe+=/frostscythe
+actions.aoe+=/frost_strike,cycle_targets=1
+actions.aoe+=/horn_of_winter
+actions.aoe+=/arcane_torrent
-# Breath Active Rotation
-actions.breath=remorseless_winter,if=variable.rw_buffs&variable.adds_remain
-actions.breath+=/howling_blast,if=variable.rime_buffs&runic_power>(45-talent.rage_of_the_frozen_champion*8)
-actions.breath+=/horn_of_winter,if=rune<2&runic_power.deficit>25
-actions.breath+=/obliterate,cycle_targets=1,if=buff.killing_machine.react&!variable.frostscythe_priority
-actions.breath+=/frostscythe,if=buff.killing_machine.react&variable.frostscythe_priority
-actions.breath+=/frostscythe,if=variable.frostscythe_priority&runic_power>45
-actions.breath+=/obliterate,cycle_targets=1,if=runic_power.deficit>40|buff.pillar_of_frost.up&runic_power.deficit>15
-actions.breath+=/death_and_decay,if=runic_power<32&rune.time_to_2>runic_power%16
-actions.breath+=/remorseless_winter,if=runic_power<32&rune.time_to_2>runic_power%16
-actions.breath+=/howling_blast,if=runic_power<32&rune.time_to_2>runic_power%16
-actions.breath+=/obliterate,cycle_targets=1,if=runic_power.deficit>25
-actions.breath+=/howling_blast,if=buff.rime.react
-actions.breath+=/arcane_torrent,if=runic_power<60
+# Breath of Sindragosa pooling rotation : starts 10s before BoS is available
+actions.bos_pooling=remorseless_winter,if=active_enemies>=2|variable.rw_buffs
+actions.bos_pooling+=/obliterate,cycle_targets=1,if=buff.killing_machine.react&cooldown.pillar_of_frost.remains>3
+actions.bos_pooling+=/howling_blast,if=variable.rotfc_rime
+actions.bos_pooling+=/frostscythe,if=buff.killing_machine.react&runic_power.deficit>(15+talent.runic_attenuation*5)&spell_targets.frostscythe>2&!variable.deaths_due_active
+actions.bos_pooling+=/frostscythe,if=runic_power.deficit>=(35+talent.runic_attenuation*5)&spell_targets.frostscythe>2&!variable.deaths_due_active
+actions.bos_pooling+=/obliterate,cycle_targets=1,if=runic_power.deficit>=25
+actions.bos_pooling+=/glacial_advance,if=runic_power.deficit<20&spell_targets.glacial_advance>=2&cooldown.pillar_of_frost.remains>5
+actions.bos_pooling+=/frost_strike,cycle_targets=1,if=runic_power.deficit<20&cooldown.pillar_of_frost.remains>5
+actions.bos_pooling+=/glacial_advance,if=cooldown.pillar_of_frost.remains>rune.time_to_4&runic_power.deficit<40&spell_targets.glacial_advance>=2
+actions.bos_pooling+=/frost_strike,cycle_targets=1,if=cooldown.pillar_of_frost.remains>rune.time_to_4&runic_power.deficit<40
-# Breath & Obliteration Active Rotation
-actions.breath_oblit=frostscythe,if=buff.killing_machine.up&variable.frostscythe_priority
-actions.breath_oblit+=/obliterate,cycle_targets=1,if=buff.killing_machine.up
-actions.breath_oblit+=/howling_blast,if=buff.rime.react
-actions.breath_oblit+=/howling_blast,if=!buff.killing_machine.up
-actions.breath_oblit+=/horn_of_winter,if=runic_power.deficit>25
-actions.breath_oblit+=/arcane_torrent,if=runic_power.deficit>20
+# Breath of Sindragosa Active Rotation
+actions.bos_ticking=obliterate,cycle_targets=1,if=runic_power<=(45+talent.runic_attenuation*5)
+actions.bos_ticking+=/remorseless_winter,if=variable.rw_buffs|active_enemies>=2|runic_power<32&rune.time_to_2=45|rune.time_to_3<=gcd|runeforge.rage_of_the_frozen_champion|spell_targets.howling_blast>=2|buff.rime.remains<3)|runic_power<32&rune.time_to_22&!variable.deaths_due_active
+actions.bos_ticking+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
+actions.bos_ticking+=/horn_of_winter,if=runic_power<=60&rune.time_to_3>gcd
+actions.bos_ticking+=/frostscythe,if=spell_targets.frostscythe>2&!variable.deaths_due_active
+actions.bos_ticking+=/obliterate,cycle_targets=1,if=runic_power.deficit>25|rune.time_to_4=4|variable.twohand_check&buff.cold_heart.stack>8)|buff.killing_machine.up&(!variable.twohand_check&buff.cold_heart.stack>8|variable.twohand_check&buff.cold_heart.stack>10))
-actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&buff.pillar_of_frost.up&buff.cold_heart.stack>=10&(buff.pillar_of_frost.remains15&(buff.cold_heart.stack>=10&buff.unholy_strength.up|buff.cold_heart.stack>=13)
+# Cold Heart Conditions
+actions.cold_heart=chains_of_ice,if=fight_remains=4+runeforge.koltiras_favor|main_hand.2h&buff.cold_heart.stack>8+runeforge.koltiras_favor)|buff.killing_machine.up&(!main_hand.2h&buff.cold_heart.stack>8+runeforge.koltiras_favor|main_hand.2h&buff.cold_heart.stack>10+runeforge.koltiras_favor))
+# Use during Pillar with Icecap/Breath
+actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&buff.pillar_of_frost.up&buff.cold_heart.stack>=10&(buff.pillar_of_frost.remains15&(buff.cold_heart.stack>=10&(buff.unholy_strength.up|buff.chaos_bane.up)|buff.cold_heart.stack>=13)
actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&!death_knight.runeforge.fallen_crusader&buff.cold_heart.stack>=10&!buff.pillar_of_frost.up&cooldown.pillar_of_frost.remains>20
+# Prevent Cold Heart overcapping during pillar
actions.cold_heart+=/chains_of_ice,if=talent.obliteration&!buff.pillar_of_frost.up&(buff.cold_heart.stack>=14&(buff.unholy_strength.up|buff.chaos_bane.up)|buff.cold_heart.stack>=19|cooldown.pillar_of_frost.remains<3&buff.cold_heart.stack>=14)
+# Potion
+actions.cooldowns=potion,if=buff.pillar_of_frost.up
# Cooldowns
-actions.cooldowns=potion,if=variable.cooldown_check|fight_remains<25
-actions.cooldowns+=/empower_rune_weapon,if=talent.obliteration&!buff.empower_rune_weapon.up&rune<6&(cooldown.pillar_of_frost.remains<7&(variable.adds_remain|variable.st_planning)|buff.pillar_of_frost.up)|fight_remains<20
-actions.cooldowns+=/empower_rune_weapon,use_off_gcd=1,if=buff.breath_of_sindragosa.up&talent.breath_of_sindragosa&!buff.empower_rune_weapon.up&(runic_power<70&rune<3|time<10)
-actions.cooldowns+=/empower_rune_weapon,use_off_gcd=1,if=!talent.breath_of_sindragosa&!talent.obliteration&!buff.empower_rune_weapon.up&rune<5&(cooldown.pillar_of_frost.remains_expected<7|buff.pillar_of_frost.up|!talent.pillar_of_frost)
-actions.cooldowns+=/abomination_limb_talent,if=talent.obliteration&!buff.pillar_of_frost.up&(variable.adds_remain|variable.st_planning)|fight_remains<12
-actions.cooldowns+=/abomination_limb_talent,if=talent.breath_of_sindragosa&(variable.adds_remain|variable.st_planning)
-actions.cooldowns+=/abomination_limb_talent,if=!talent.breath_of_sindragosa&!talent.obliteration&(variable.adds_remain|variable.st_planning)
-actions.cooldowns+=/pillar_of_frost,if=talent.obliteration&(variable.adds_remain|variable.st_planning)&(buff.empower_rune_weapon.up|cooldown.empower_rune_weapon.remains)|fight_remains<12
-actions.cooldowns+=/pillar_of_frost,if=talent.breath_of_sindragosa&(variable.adds_remain|variable.st_planning)&(!talent.icecap&runic_power>70|talent.icecap&cooldown.breath_of_sindragosa.remains)
-actions.cooldowns+=/pillar_of_frost,if=talent.icecap&!talent.obliteration&!talent.breath_of_sindragosa&(variable.adds_remain|variable.st_planning)
-actions.cooldowns+=/breath_of_sindragosa,if=runic_power>60&(variable.adds_remain|variable.st_planning)|fight_remains<30
-actions.cooldowns+=/frostwyrms_fury,if=active_enemies=1&(talent.pillar_of_frost&buff.pillar_of_frost.remains15+raid_event.adds.duration|talent.absolute_zero&raid_event.adds.in>15+raid_event.adds.duration))|fight_remains<3
-actions.cooldowns+=/frostwyrms_fury,if=active_enemies>=2&(talent.pillar_of_frost&buff.pillar_of_frost.up|raid_event.adds.exists&raid_event.adds.up&raid_event.adds.in>cooldown.pillar_of_frost.remains_expected-raid_event.adds.in-raid_event.adds.duration)&(buff.pillar_of_frost.remains5&target.time_to_pct_35<5&active_enemies<=2&(buff.breath_of_sindragosa.up&runic_power>40|!buff.breath_of_sindragosa.up&!talent.obliteration|talent.obliteration&!buff.pillar_of_frost.up)
-actions.cooldowns+=/sacrificial_pact,if=!talent.glacial_advance&!buff.breath_of_sindragosa.up&pet.ghoul.remains3
-actions.cooldowns+=/any_dnd,if=!death_and_decay.ticking&variable.adds_remain&(buff.pillar_of_frost.up&buff.pillar_of_frost.remains>5|!buff.pillar_of_frost.up)&(active_enemies>5|talent.cleaving_strikes&active_enemies>=2)
+actions.cooldowns+=/empower_rune_weapon,if=talent.obliteration&rune<6&(variable.st_planning|variable.adds_remain)&(cooldown.pillar_of_frost.remains<5&(cooldown.fleshcraft.remains>5&soulbind.pustule_eruption|!soulbind.pustule_eruption)|buff.pillar_of_frost.up)|fight_remains<20
+actions.cooldowns+=/empower_rune_weapon,if=talent.breath_of_sindragosa&rune<5&runic_power<(60-(death_knight.runeforge.hysteria*5)-(runeforge.rampant_transference*5))&(buff.breath_of_sindragosa.up|fight_remains<20)
+actions.cooldowns+=/empower_rune_weapon,if=talent.icecap
+actions.cooldowns+=/pillar_of_frost,if=talent.breath_of_sindragosa&(variable.st_planning|variable.adds_remain)&(cooldown.breath_of_sindragosa.remains|buff.breath_of_sindragosa.up&runic_power>45|cooldown.breath_of_sindragosa.ready&runic_power>65)
+actions.cooldowns+=/pillar_of_frost,if=talent.icecap&!buff.pillar_of_frost.up
+actions.cooldowns+=/pillar_of_frost,if=talent.obliteration&(runic_power>=35&!buff.abomination_limb.up|buff.abomination_limb.up|runeforge.rage_of_the_frozen_champion)&(variable.st_planning|variable.adds_remain)&(talent.gathering_storm.enabled&buff.remorseless_winter.up|!talent.gathering_storm.enabled)
+actions.cooldowns+=/breath_of_sindragosa,if=!buff.breath_of_sindragosa.up&runic_power>60&(buff.pillar_of_frost.up|cooldown.pillar_of_frost.remains>15)
+actions.cooldowns+=/frostwyrms_fury,if=active_enemies=1&buff.pillar_of_frost.remains30)|fight_remains<3
+actions.cooldowns+=/frostwyrms_fury,if=active_enemies>=2&(buff.pillar_of_frost.up|raid_event.adds.exists&raid_event.adds.in>cooldown.pillar_of_frost.remains+7)&(buff.pillar_of_frost.remains40)|!talent.breath_of_sindragosa&runic_power<=75
+actions.cooldowns+=/raise_dead,if=cooldown.pillar_of_frost.remains<=5
+actions.cooldowns+=/sacrificial_pact,if=active_enemies>=2&(fight_remains<3|!buff.breath_of_sindragosa.up&(pet.ghoul.remainspet.ghoul.remains))
+actions.cooldowns+=/death_and_decay,if=active_enemies>5|runeforge.phearomones
# Covenant Abilities
-actions.covenants=deaths_due,if=(variable.rw_buffs&cooldown.remorseless_winter.remains|!variable.rw_buffs)&(!talent.obliteration|talent.obliteration&active_enemies>=2&cooldown.pillar_of_frost.remains|active_enemies=1)&(variable.st_planning|variable.adds_remain)
+actions.covenants=deaths_due,if=(!talent.obliteration|talent.obliteration&active_enemies>=2&cooldown.pillar_of_frost.remains|active_enemies=1)&(variable.st_planning|variable.adds_remain)
actions.covenants+=/swarming_mist,if=runic_power.deficit>13&cooldown.pillar_of_frost.remains<3&!talent.breath_of_sindragosa&variable.st_planning
actions.covenants+=/swarming_mist,if=!talent.breath_of_sindragosa&variable.adds_remain
actions.covenants+=/swarming_mist,if=talent.breath_of_sindragosa&(buff.breath_of_sindragosa.up&(variable.st_planning&runic_power.deficit>40|variable.adds_remain&runic_power.deficit>60|variable.adds_remain&raid_event.adds.remains<9&raid_event.adds.exists)|!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains)
-actions.covenants+=/abomination_limb_covenant,if=cooldown.pillar_of_frost.remains65&cooldown.breath_of_sindragosa.remains<2|!talent.breath_of_sindragosa)
-actions.covenants+=/abomination_limb_covenant,if=variable.adds_remain
+actions.covenants+=/abomination_limb,if=cooldown.pillar_of_frost.remains65&cooldown.breath_of_sindragosa.remains<2|!talent.breath_of_sindragosa)
+actions.covenants+=/abomination_limb,if=variable.adds_remain
actions.covenants+=/shackle_the_unworthy,if=variable.st_planning&(cooldown.pillar_of_frost.remains<3|talent.icecap)
actions.covenants+=/shackle_the_unworthy,if=variable.adds_remain
actions.covenants+=/fleshcraft,if=!buff.pillar_of_frost.up&(soulbind.pustule_eruption|soulbind.volatile_solvent&!buff.volatile_solvent_humanoid.up),interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent
-# Obliteration Active Rotation
-actions.obliteration=remorseless_winter,if=active_enemies>3
-actions.obliteration+=/chill_streak,if=active_enemies>=2&active_enemies<=5&(!talent.cleaving_strikes|talent.cleaving_strikes&!death_and_decay.ticking)
-actions.obliteration+=/obliterate,cycle_targets=1,if=buff.killing_machine.react&!variable.frostscythe_priority
-actions.obliteration+=/frostscythe,if=buff.killing_machine.react&variable.frostscythe_priority
-actions.obliteration+=/howling_blast,if=!dot.frost_fever.ticking&!buff.killing_machine.react|!buff.killing_machine.react&buff.rime.react
-actions.obliteration+=/frost_strike,cycle_targets=1,if=!buff.killing_machine.react&variable.rp_buffs&!variable.pooling_runic_power&(!talent.glacial_advance|active_enemies=1)
-actions.obliteration+=/howling_blast,if=buff.rime.react&buff.killing_machine.react
-actions.obliteration+=/glacial_advance,if=!variable.pooling_runic_power&variable.rp_buffs&!buff.killing_machine.react&active_enemies>=2
-actions.obliteration+=/frost_strike,cycle_targets=1,if=!buff.killing_machine.react&!variable.pooling_runic_power&(!talent.glacial_advance|active_enemies=1)
-actions.obliteration+=/howling_blast,if=!buff.killing_machine.react&runic_power<25
-actions.obliteration+=/arcane_torrent,if=rune<1&runic_power<25
-actions.obliteration+=/glacial_advance,if=!variable.pooling_runic_power&active_enemies>=2
-actions.obliteration+=/frost_strike,cycle_targets=1,if=!variable.pooling_runic_power&(!talent.glacial_advance|active_enemies=1)
-actions.obliteration+=/howling_blast,if=buff.rime.react
-actions.obliteration+=/obliterate,target_if=max:(debuff.razorice.stack+1)%(debuff.razorice.remains+1)*death_knight.runeforge.razorice
+# Obliteration rotation
+actions.obliteration=remorseless_winter,if=active_enemies>=3&variable.rw_buffs
+actions.obliteration+=/frost_strike,if=!buff.killing_machine.up&(rune<2|talent.icy_talons&buff.icy_talons.remains=3&(buff.rime.remains<3&buff.rime.up|!dot.frost_fever.ticking)
+actions.obliteration+=/glacial_advance,if=!buff.killing_machine.up&spell_targets.glacial_advance>=2|!buff.killing_machine.up&(debuff.razorice.stack<5|debuff.razorice.remains2&!variable.deaths_due_active
+actions.obliteration+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
+actions.obliteration+=/frost_strike,if=active_enemies=1&variable.frost_strike_conduits
+actions.obliteration+=/howling_blast,if=variable.rotfc_rime&spell_targets.howling_blast>=2
+actions.obliteration+=/glacial_advance,if=spell_targets.glacial_advance>=2
+actions.obliteration+=/frost_strike,cycle_targets=1,if=!talent.avalanche&!buff.killing_machine.up|talent.avalanche&!variable.rotfc_rime|variable.rotfc_rime&rune.time_to_2>=gcd
+actions.obliteration+=/howling_blast,if=variable.rotfc_rime
+actions.obliteration+=/obliterate,cycle_targets=1
+
+# Pooling For Obliteration: Starts 10 seconds before Pillar of Frost comes off CD
+actions.obliteration_pooling=remorseless_winter,if=variable.rw_buffs|active_enemies>=2
+actions.obliteration_pooling+=/glacial_advance,if=spell_targets.glacial_advance>=2&talent.frostscythe
+actions.obliteration_pooling+=/frostscythe,if=buff.killing_machine.react&active_enemies>2&!variable.deaths_due_active
+actions.obliteration_pooling+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
+actions.obliteration_pooling+=/frost_strike,if=active_enemies=1&variable.frost_strike_conduits
+actions.obliteration_pooling+=/howling_blast,if=variable.rotfc_rime
+actions.obliteration_pooling+=/glacial_advance,if=spell_targets.glacial_advance>=2&runic_power.deficit<60
+actions.obliteration_pooling+=/frost_strike,cycle_targets=1,if=runic_power.deficit<70
+actions.obliteration_pooling+=/obliterate,cycle_targets=1,if=rune>=3&(!main_hand.2h|covenant.necrolord|covenant.kyrian)|rune>=4&main_hand.2h
+actions.obliteration_pooling+=/frostscythe,if=active_enemies>=4&!variable.deaths_due_active
# Racial Abilities
-actions.racials=blood_fury,if=variable.cooldown_check
-actions.racials+=/berserking,if=variable.cooldown_check
-actions.racials+=/arcane_pulse,if=variable.cooldown_check
-actions.racials+=/lights_judgment,if=variable.cooldown_check
-actions.racials+=/ancestral_call,if=variable.cooldown_check
-actions.racials+=/fireblood,if=variable.cooldown_check
-actions.racials+=/bag_of_tricks,if=talent.obliteration&!buff.pillar_of_frost.up&buff.unholy_strength.up
-actions.racials+=/bag_of_tricks,if=!talent.obliteration&buff.pillar_of_frost.up&(buff.unholy_strength.up&buff.unholy_strength.remains=2)|!buff.pillar_of_frost.up&(rune.deficit>=5&runic_power.deficit>=60)
+actions.racials+=/lights_judgment,if=buff.pillar_of_frost.up
+actions.racials+=/ancestral_call,if=buff.pillar_of_frost.up&buff.empower_rune_weapon.up
+actions.racials+=/fireblood,if=buff.pillar_of_frost.remains<=8&buff.pillar_of_frost.up&buff.empower_rune_weapon.up
+actions.racials+=/bag_of_tricks,if=buff.pillar_of_frost.up&active_enemies=1&(buff.pillar_of_frost.remains<5&talent.cold_heart.enabled|!talent.cold_heart.enabled&buff.pillar_of_frost.remains<3)
-# Single Target Rotation
-actions.single_target=remorseless_winter,if=variable.rw_buffs
-actions.single_target+=/howling_blast,if=buff.rime.react&talent.icebreaker.rank=2
-actions.single_target+=/frostscythe,if=!variable.pooling_runes&buff.killing_machine.react&variable.frostscythe_priority
-actions.single_target+=/obliterate,if=!variable.pooling_runes&buff.killing_machine.react
-actions.single_target+=/horn_of_winter,if=rune<4&runic_power.deficit>25&talent.obliteration&talent.breath_of_sindragosa
-actions.single_target+=/frost_strike,if=!variable.pooling_runic_power&(variable.rp_buffs|runic_power.deficit<25)
-actions.single_target+=/howling_blast,if=variable.rime_buffs
-actions.single_target+=/glacial_advance,if=!variable.pooling_runic_power&!death_knight.runeforge.razorice&(debuff.razorice.stack<5|debuff.razorice.remains25
-actions.single_target+=/arcane_torrent,if=runic_power.deficit>20
-actions.single_target+=/frost_strike,if=!variable.pooling_runic_power
+# Standard single-target rotation
+actions.standard=remorseless_winter,if=variable.rw_buffs
+actions.standard+=/obliterate,if=buff.killing_machine.react
+actions.standard+=/howling_blast,if=variable.rotfc_rime&buff.rime.remains<3
+actions.standard+=/frost_strike,if=variable.frost_strike_conduits
+actions.standard+=/glacial_advance,if=!death_knight.runeforge.razorice&(debuff.razorice.stack<5|debuff.razorice.remains=4&set_bonus.tier28_4pc|(main_hand.2h|!covenant.night_fae|!set_bonus.tier28_4pc)&talent.gathering_storm&buff.remorseless_winter.up|!set_bonus.tier28_4pc&runic_power.deficit>(25+talent.runic_attenuation*5)
+actions.standard+=/frost_strike
+actions.standard+=/horn_of_winter
+actions.standard+=/arcane_torrent
-actions.trinkets=use_item,name=gavel_of_the_first_arbiter
-# Trinkets The trinket with the highest estimated value, will be used first and paired with Pillar of Frost.
-actions.trinkets+=/use_item,slot=trinket1,if=(buff.pillar_of_frost.up|buff.breath_of_sindragosa.up)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|trinket.1.buff_duration>=fight_remains
-actions.trinkets+=/use_item,slot=trinket2,if=(buff.pillar_of_frost.up|buff.breath_of_sindragosa.up)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|trinket.2.buff_duration>=fight_remains
+# Trinkets
+actions.trinkets=use_item,name=inscrutable_quantum_device,if=!talent.breath_of_sindragosa&buff.pillar_of_frost.up&buff.empower_rune_weapon.up|talent.breath_of_sindragosa&((buff.pillar_of_frost.up&cooldown.breath_of_sindragosa.ready)|(buff.pillar_of_frost.up&((fight_remains-cooldown.breath_of_sindragosa.remains)<21)))|fight_remains<21|death_knight.disable_iqd_execute=0&target.time_to_pct_20<5
+actions.trinkets+=/use_item,name=gavel_of_the_first_arbiter
+actions.trinkets+=/use_item,name=scars_of_fraternal_strife
+actions.trinkets+=/use_item,name=the_first_sigil,if=buff.pillar_of_frost.up&buff.empower_rune_weapon.up
+# The trinket with the highest estimated value, will be used first and paired with Pillar of Frost.
+actions.trinkets+=/use_item,slot=trinket1,if=!variable.specified_trinket&buff.pillar_of_frost.up&(!talent.icecap|talent.icecap&buff.pillar_of_frost.remains>=10)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|trinket.1.buff_duration>=fight_remains
+actions.trinkets+=/use_item,slot=trinket2,if=!variable.specified_trinket&buff.pillar_of_frost.up&(!talent.icecap|talent.icecap&buff.pillar_of_frost.remains>=10)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|trinket.2.buff_duration>=fight_remains
# If only one on use trinket provides a buff, use the other on cooldown. Or if neither trinket provides a buff, use both on cooldown.
-actions.trinkets+=/use_item,slot=trinket1,if=(!trinket.1.has_use_buff&(trinket.2.cooldown.remains|!trinket.2.has_use_buff)|talent.pillar_of_frost&cooldown.pillar_of_frost.remains>20|!talent.pillar_of_frost)
-actions.trinkets+=/use_item,slot=trinket2,if=(!trinket.2.has_use_buff&(trinket.1.cooldown.remains|!trinket.1.has_use_buff)|talent.pillar_of_frost&cooldown.pillar_of_frost.remains>20|!talent.pillar_of_frost)
\ No newline at end of file
+actions.trinkets+=/use_item,slot=trinket1,if=!variable.specified_trinket&(!trinket.1.has_use_buff&(trinket.2.cooldown.remains|!trinket.2.has_use_buff)|cooldown.pillar_of_frost.remains>20)
+actions.trinkets+=/use_item,slot=trinket2,if=!variable.specified_trinket&(!trinket.2.has_use_buff&(trinket.1.cooldown.remains|!trinket.1.has_use_buff)|cooldown.pillar_of_frost.remains>20)
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightUnholy.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightUnholy.simc
index 911e68024..a426eb567 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightUnholy.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DeathKnightUnholy.simc
@@ -1,29 +1,14 @@
-## Unholy DK
-## 26 October 2022 (948f6a8)
-
-## Initial Dragonflight import.
-
-## Changes:
-## - Adjustments to DnD/Defile/Deaths Due to only count targets who are expected to live long enough to matter (aoe_setup #1).
-## - Disabled Sacrificial Pact because dead ghouls make for sad DKs.
-## - Using Wound Spender abilities more flexibly (at 4+ stacks instead of 5+); DPS neutral and may prevent some no-rec situations.
-## - Using Festering Strike in AOE if you have nothing else to do and won't overcap wounds is DPS neutral.
-## - Changed many 'fight_remains' conditionals to apply in boss fights only (less CD waste on trash).
-## - Added another Outbreak entry to set up stronger Epidemics.
-## - Relax ST vs. AOE logic since it relies on confabulated raid_events.
-## - TODO: Factor Strength procs into trinket logic.
-
actions.precombat+=/raise_dead
actions.precombat+=/army_of_the_dead,precombat_time=1.5*gcd
actions.precombat+=/fleshcraft
actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=trinket.1.has_use_buff&(trinket.1.cooldown.duration%%45=0)
actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=trinket.2.has_use_buff&(trinket.2.cooldown.duration%%45=0)
-actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!trinket.1.has_use_buff&trinket.2.has_use_buff|trinket.2.has_use_buff&((trinket.2.cooldown.duration%trinket.2.buff_duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.buff_duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
+actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!trinket.1.has_use_buff&trinket.2.has_use_buff|trinket.2.has_use_buff&((trinket.2.cooldown.duration%trinket.2.proc.any_dps.duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.proc.any_dps.duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
-## Executed every time the actor is available.
-actions=mind_freeze
+actions+=/mind_freeze
+actions+=/strangulate
# Variables
-actions+=/variable,name=apoc_timing,op=setif,value=((rune.time_to_3)%((debuff.festering_wound.stack+1)%4))+gcd+(talent.unholy_assault.rank*4),value_else=gcd*3,condition=cooldown.apocalypse.remains<7
+actions+=/variable,name=apoc_timing,op=setif,value=((rune.time_to_3)%((debuff.festering_wound.stack+1)%4))+gcd+(talent.unholy_assault*4),value_else=gcd*3,condition=cooldown.apocalypse.remains<7
actions+=/variable,name=garg_pooling,op=setif,value=(((cooldown.summon_gargoyle.remains+1)%gcd)%((rune+1)*(runic_power+20)))*100,value_else=gcd*2,condition=runic_power.deficit>60&cooldown.summon_gargoyle.remains<7
actions+=/variable,name=festermight_tracker,op=setif,value=debuff.festering_wound.stack>=1,value_else=debuff.festering_wound.stack>=4,condition=talent.festermight&(buff.festermight.remains%(4*gcd))>=1&cooldown.apocalypse.remains>variable.apoc_timing
actions+=/variable,name=build_wounds,value=debuff.festering_wound.stack<4
@@ -33,20 +18,18 @@ actions+=/variable,name=pooling_runes,value=talent.soul_reaper&rune<2&target.tim
actions+=/variable,name=st_planning,value=active_enemies<=3&(!raid_event.adds.exists|raid_event.adds.in>15)
actions+=/variable,name=adds_remain,value=active_enemies>=4&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.remains>6)
# Prioritize Soul Reaper, Outbreak and Maintaining Plaguebringer
-actions+=/wait,sec=cooldown.soul_reaper.remains,if=talent.soul_reaper&target.time_to_pct_35<5&fight_remains>5&cooldown.soul_reaper.remains<(gcd*0.75)&active_enemies=1
-actions+=/outbreak,cycle_targets=1,if=(dot.virulent_plague.refreshable|talent.superstrain&(dot.frost_fever_superstrain.refreshable|dot.blood_plague_superstrain.refreshable))&(!talent.unholy_blight|talent.unholy_blight&cooldown.unholy_blight.remains>15%((talent.superstrain.rank*3)+(talent.plaguebringer.rank*2)))
+actions+=/wait_for_cooldown,name=soul_reaper,if=talent.soul_reaper&target.time_to_pct_35<5&fight_remains>5&cooldown.soul_reaper.remains<(gcd*0.75)&active_enemies=1
+actions+=/outbreak,cycle_targets=1,if=(dot.virulent_plague.refreshable|talent.superstrain&(dot.frost_fever_superstrain.refreshable|dot.blood_plague_superstrain.refreshable))&(!talent.unholy_blight|talent.unholy_blight&cooldown.unholy_blight.remains>15%((talent.superstrain*3)+(talent.plaguebringer*2)))
actions+=/wound_spender,if=cooldown.apocalypse.remains>variable.apoc_timing&talent.plaguebringer&talent.superstrain&buff.plaguebringer.remains=4
-actions+=/run_action_list,name=generic,strict=1,if=active_enemies<=3
+actions+=/run_action_list,name=aoe,if=active_enemies>=4
+actions+=/run_action_list,name=generic,if=active_enemies<=3
## Hackish.
actions.garg_ua_opener+=/unholy_blight,line_cd=999
@@ -54,12 +37,12 @@ actions.garg_ua_opener+=/festering_strike,line_cd=999
actions.garg_ua_opener+=/festering_strike,if=prev.1.festering_strike&!prev.2.festering_strike
actions.garg_ua_opener+=/potion,line_cd=999
actions.garg_ua_opener+=/dark_transformation,line_cd=999
-actions.garg_ua_opener+=/summon_gargoyle,line_cd=999
+actions.garg_ua_opener+=/summon_gargoyle,line_cd=999,if=gcd.remains=0
actions.garg_ua_opener+=/death_coil,line_cd=999
actions.garg_ua_opener+=/apocalypse,line_cd=999
actions.garg_ua_opener+=/death_coil,if=prev.1.apocalypse
actions.garg_ua_opener+=/unholy_assault,line_cd=999
-actions.garg_ua_opener+=/empower_rune_weapon,line_cd=999
+actions.garg_ua_opener+=/empower_rune_weapon,line_cd=999,if=gcd.remains=0
## Hackish.
actions.garg_opener+=/unholy_blight,line_cd=999
@@ -67,15 +50,15 @@ actions.garg_opener+=/festering_strike,line_cd=999
actions.garg_opener+=/festering_strike,if=prev.1.festering_strike&!prev.2.festering_strike
actions.garg_opener+=/potion,line_cd=999
actions.garg_opener+=/dark_transformation,line_cd=999
-actions.garg_opener+=/summon_gargoyle,line_cd=999
+actions.garg_opener+=/summon_gargoyle,line_cd=999,if=gcd.remains=0
actions.garg_opener+=/death_coil,line_cd=999
actions.garg_opener+=/apocalypse,line_cd=999
actions.garg_opener+=/death_coil,if=prev.1.apocalypse
actions.garg_opener+=/death_coil,line_cd=999
-actions.garg_opener+=/empower_rune_weapon,line_cd=999
+actions.garg_opener+=/empower_rune_weapon,line_cd=999,if=gcd.remains=0
# AoE Action List
-actions.aoe=any_dnd,if=!death_and_decay.ticking&variable.adds_remain&(talent.festermight&buff.festermight.remains<3|!talent.festermight)&(death_knight.fwounded_targets=active_enemies|death_knight.fwounded_targets=8|!talent.bursting_sores&!talent.vile_contagion|raid_event.adds.exists&raid_event.adds.remains<=11&raid_event.adds.remains>5|(cooldown.vile_contagion.remains|!talent.vile_contagion)&buff.dark_transformation.up&talent.infected_claws&(buff.empower_rune_weapon.up|buff.unholy_assault.up))|fight_remains<10
+actions.aoe+=/any_dnd,if=!death_and_decay.ticking&variable.adds_remain&(talent.festermight&buff.festermight.remains<3|!talent.festermight)&(death_knight.fwounded_targets>=cycle_enemies|death_knight.fwounded_targets=8|!talent.bursting_sores&!talent.vile_contagion|raid_event.adds.exists&raid_event.adds.remains<=11&raid_event.adds.remains>5|(cooldown.vile_contagion.remains|!talent.vile_contagion)&buff.dark_transformation.up&talent.infected_claws&(buff.empower_rune_weapon.up|buff.unholy_assault.up))|fight_remains<10
actions.aoe+=/abomination_limb_talent,if=rune=0&variable.adds_remain
actions.aoe+=/apocalypse,cycle_targets=1,if=debuff.festering_wound.up&variable.adds_remain&!death_and_decay.ticking&cooldown.death_and_decay.remains&rune<3|death_and_decay.ticking&rune=0
actions.aoe+=/festering_strike,cycle_targets=1,if=!death_and_decay.ticking&debuff.festering_wound.stack<4&(cooldown.vile_contagion.remains<5|cooldown.apocalypse.ready&cooldown.any_dnd.remains)
@@ -86,14 +69,14 @@ actions.aoe+=/epidemic,if=!variable.pooling_runic_power
actions.aoe+=/wound_spender,cycle_targets=1,if=cooldown.death_and_decay.remains>10
# Potion
-actions.cooldowns=potion,if=(30>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(buff.dark_transformation.up&30>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=30|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=30)|fight_remains<=30
+actions.cooldowns+=/potion,if=(30>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(buff.dark_transformation.up&30>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=30|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=30)|fight_remains<=30
# Cooldowns
actions.cooldowns+=/army_of_the_dead,if=talent.commander_of_the_dead&cooldown.dark_transformation.remains_expected<4|!talent.commander_of_the_dead&talent.unholy_assault&cooldown.unholy_assault.remains<10|!talent.unholy_assault&!talent.commander_of_the_dead|fight_remains<=30
actions.cooldowns+=/vile_contagion,cycle_targets=1,if=active_enemies>=2&debuff.festering_wound.stack>=4&cooldown.any_dnd.remains<3
actions.cooldowns+=/raise_dead,if=!pet.ghoul.active
actions.cooldowns+=/summon_gargoyle,if=runic_power.deficit<60&(cooldown.dark_transformation.ready|buff.commander_of_the_dead_window.up|!talent.commander_of_the_dead)
actions.cooldowns+=/dark_transformation,if=variable.st_planning&(fight_remains<30|!talent.unholy_command|talent.unholy_command&(!talent.unholy_command.rank=2|pet.gargoyle.active|!talent.apocalypse|(pet.apoc_ghoul.active|cooldown.apocalypse.remains<1&debuff.festering_wound.stack>=4)&(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>4)))
-actions.cooldowns+=/dark_transformation,if=variable.adds_remain&(cooldown.any_dnd.remains<10&talent.infected_claws&((cooldown.vile_contagion.remains|raid_event.adds.exists&raid_event.adds.in>10)&death_knight.fwounded_targets5|!raid_event.adds.exists)|!talent.infected_claws)|fight_remains<25
+actions.cooldowns+=/dark_transformation,if=variable.adds_remain&(cooldown.any_dnd.remains<10&talent.infected_claws&((cooldown.vile_contagion.remains|raid_event.adds.exists&raid_event.adds.in>10)&death_knight.fwounded_targets5|!raid_event.adds.exists)|!talent.infected_claws)|fight_remains<25
actions.cooldowns+=/soul_reaper,if=active_enemies=1&target.time_to_pct_35<5&target.time_to_die>(dot.soul_reaper.remains+5)
actions.cooldowns+=/soul_reaper,cycle_targets=1,if=target.time_to_pct_35<5&active_enemies>=2&target.time_to_die>(dot.soul_reaper.remains+5)
actions.cooldowns+=/unholy_blight,if=variable.st_planning&((!talent.apocalypse|cooldown.apocalypse.remains)&talent.morbidity|!talent.morbidity)
@@ -107,7 +90,7 @@ actions.cooldowns+=/abomination_limb_talent,if=variable.st_planning&rune<3
actions.cooldowns+=/sacrificial_pact,if=active_enemies>=2&!buff.dark_transformation.up&cooldown.dark_transformation.remains>6|fight_remains16&(cooldown.apocalypse.remains|!talent.army_of_the_damned&cooldown.dark_transformation.remains)|fight_remains<11
+actions.covenants+=/swarming_mist,if=variable.st_planning&runic_power.deficit>16&(cooldown.apocalypse.remains|!talent.army_of_the_damned&cooldown.dark_transformation.remains)|fight_remains<11
# Set to use after apoc is on CD as to prevent overcapping RP while setting up CD's
actions.covenants+=/swarming_mist,if=cooldown.apocalypse.remains&(active_enemies>=2&active_enemies<=5&runic_power.deficit>10+(active_enemies*6)&variable.adds_remain|active_enemies>5&runic_power.deficit>40)
actions.covenants+=/abomination_limb_covenant,if=variable.st_planning&!soulbind.lead_by_example&(cooldown.apocalypse.remains|!talent.army_of_the_damned&cooldown.dark_transformation.remains)&rune.time_to_4>buff.runic_corruption.remains|fight_remains<12+(soulbind.kevins_oozeling*28)
@@ -119,14 +102,14 @@ actions.covenants+=/shackle_the_unworthy,if=variable.adds_remain&(death_and_deca
actions.covenants+=/fleshcraft,if=soulbind.pustule_eruption|soulbind.volatile_solvent&!buff.volatile_solvent_humanoid.up,interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent
# Generic
-actions.generic=death_coil,if=!variable.pooling_runic_power&(buff.sudden_doom.react|runic_power.deficit<=40|rune<3)|pet.gargoyle.active|fight_remains<(30%gcd)
-actions.generic+=/any_dnd,if=active_enemies>=2&death_knight.fwounded_targets=active_enemies
+actions.generic+=/death_coil,if=!variable.pooling_runic_power&(buff.sudden_doom.react|runic_power.deficit<=40|rune<3)|pet.gargoyle.active|fight_remains<(30%gcd)
+actions.generic+=/any_dnd,if=active_enemies>=2&death_knight.fwounded_targets>=cycle_enemies
actions.generic+=/wound_spender,cycle_targets=1,if=variable.pop_wounds|active_enemies>=2&death_and_decay.ticking
actions.generic+=/festering_strike,cycle_targets=1,if=debuff.festering_wound.stack<4&cooldown.apocalypse.remains20&(pet.gargoyle.active|!talent.summon_gargoyle.enabled)
+actions.racials+=/arcane_torrent,if=runic_power.deficit>20&(pet.gargoyle.active|!talent.summon_gargoyle.enabled)
actions.racials+=/blood_fury,if=(buff.blood_fury.duration>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(buff.dark_transformation.up&buff.blood_fury.duration>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=buff.blood_fury.duration|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.blood_fury.duration|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.blood_fury.duration
actions.racials+=/berserking,if=(buff.berserking.duration>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(buff.dark_transformation.up&buff.berserking.duration>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=buff.berserking.duration|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.berserking.duration|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.berserking.duration
actions.racials+=/lights_judgment,if=buff.unholy_strength.up&(!talent.festermight|buff.festermight.remains=2|(rune.deficit>=5&runic_power
actions.racials+=/fireblood,if=(buff.fireblood.duration>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(buff.dark_transformation.up&buff.fireblood.duration>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=buff.fireblood.duration|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.fireblood.duration|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.fireblood.duration
actions.racials+=/bag_of_tricks,if=active_enemies=1&(buff.unholy_strength.up|fight_remains<5)
-actions.trinkets=use_item,name=gavel_of_the_first_arbiter
+actions.trinkets+=/use_item,name=gavel_of_the_first_arbiter
# Trinkets
-actions.trinkets+=/use_item,slot=trinket1,if=((trinket.1.buff_duration<=15&cooldown.apocalypse.remains>20|trinket.1.buff_duration>15&(cooldown.unholy_blight.remains>20|cooldown.dark_transformation.remains_expected>20)|active_enemies>=2&buff.dark_transformation.up)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1))|trinket.1.buff_duration>=fight_remains
-actions.trinkets+=/use_item,slot=trinket2,if=((trinket.2.buff_duration<=15&cooldown.apocalypse.remains>20|trinket.2.buff_duration>15&(cooldown.unholy_blight.remains>20|cooldown.dark_transformation.remains_expected>20)|active_enemies>=2&buff.dark_transformation.up)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2))|trinket.2.buff_duration>=fight_remains
+actions.trinkets+=/use_item,slot=trinket1,if=((trinket.1.proc.any_dps.duration<=15&cooldown.apocalypse.remains>20|trinket.1.proc.any_dps.duration>15&(cooldown.unholy_blight.remains>20|cooldown.dark_transformation.remains_expected>20)|active_enemies>=2&buff.dark_transformation.up)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1))|trinket.1.proc.any_dps.duration>=fight_remains
+actions.trinkets+=/use_item,slot=trinket2,if=((trinket.2.proc.any_dps.duration<=15&cooldown.apocalypse.remains>20|trinket.2.proc.any_dps.duration>15&(cooldown.unholy_blight.remains>20|cooldown.dark_transformation.remains_expected>20)|active_enemies>=2&buff.dark_transformation.up)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2))|trinket.2.proc.any_dps.duration>=fight_remains
actions.trinkets+=/use_item,slot=trinket1,if=!trinket.1.has_use_buff&(trinket.2.cooldown.remains|!trinket.2.has_use_buff)
actions.trinkets+=/use_item,slot=trinket2,if=!trinket.2.has_use_buff&(trinket.1.cooldown.remains|!trinket.1.has_use_buff)
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterHavoc.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterHavoc.simc
index 712a81eba..36af69974 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterHavoc.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterHavoc.simc
@@ -1,7 +1,6 @@
actions.precombat+=/variable,name=trinket_sync_slot,value=1,if=trinket.1.has_stat.any_dps&(!trinket.2.has_stat.any_dps|trinket.1.cooldown.duration>=trinket.2.cooldown.duration)
actions.precombat+=/variable,name=trinket_sync_slot,value=2,if=trinket.2.has_stat.any_dps&(!trinket.1.has_stat.any_dps|trinket.2.cooldown.duration>trinket.1.cooldown.duration)
-# Use Eye Beam at low Fury with Blind Fury along with either Darkglare or Demon Blades unless using Agony Gaze
-actions.precombat+=/variable,name=use_eye_beam_fury_condition,value=talent.blind_fury.enabled&(runeforge.darkglare_medallion|talent.demon_blades.enabled&!runeforge.agony_gaze)
+actions.precombat+=/variable,name=use_eye_beam_fury_condition,value=0
actions.precombat+=/arcane_torrent
actions.precombat+=/fleshcraft,if=soulbind.pustule_eruption|soulbind.volatile_solvent
@@ -9,15 +8,11 @@ actions.precombat+=/fleshcraft,if=soulbind.pustule_eruption|soulbind.volatile_so
actions=disrupt
actions+=/consume_magic
# Without Chaos Theory or Darkglare, Blade Dance with First Blood or at 3+ (2+ with Trail of Ruin) targets
-actions+=/variable,name=blade_dance,if=!runeforge.chaos_theory&!talent.chaos_theory&!runeforge.darkglare_medallion,value=talent.first_blood.enabled|spell_targets.blade_dance1>=(3-talent.trail_of_ruin.enabled)
+actions+=/variable,name=blade_dance,if=!runeforge.chaos_theory&!runeforge.darkglare_medallion,value=talent.first_blood.enabled|spell_targets.blade_dance1>=(3-talent.trail_of_ruin.enabled)
# With Chaos Theory, Blade Dance when the buff is down, with First Blood at 2+ (1+ with Trail of Ruin) or with Essence Break at 4+ (3+ with Trail of Ruin) targets
-actions+=/variable,name=blade_dance,if=runeforge.chaos_theory|talent.chaos_theory,value=buff.chaos_theory.down|talent.first_blood.enabled&spell_targets.blade_dance1>=(2-talent.trail_of_ruin.enabled)|!talent.cycle_of_hatred.enabled&spell_targets.blade_dance1>=(4-talent.trail_of_ruin.enabled)
+actions+=/variable,name=blade_dance,if=runeforge.chaos_theory|talent.chaos_theory,value=buff.chaos_theory.down|talent.first_blood.enabled|!talent.cycle_of_hatred.enabled&spell_targets.blade_dance1>=(4-talent.trail_of_ruin.enabled)
# With Darkglare, Blade Dance at normal target count when buffed by a secondary effect, or always at 4T+ for non-Demonic
actions+=/variable,name=blade_dance,if=runeforge.darkglare_medallion,value=talent.first_blood.enabled|(buff.metamorphosis.up|talent.trail_of_ruin.enabled|debuff.essence_break.up)&spell_targets.blade_dance1>=(3-talent.trail_of_ruin.enabled)|!talent.demonic.enabled&spell_targets.blade_dance1>=4
-# Use Essence Break before Blade Dance if it is available and off cooldown
-actions+=/variable,name=blade_dance,op=reset,if=talent.essence_break.enabled&cooldown.essence_break.ready
-# With Agony Gaze and Cycle of Hatred, avoid using Blade Dance when there is the possibility to extend an AoE Sinful Brand
-actions+=/variable,name=blade_dance,if=runeforge.agony_gaze&talent.cycle_of_hatred,value=variable.blade_dance&active_dot.sinful_brand<2
actions+=/variable,name=pooling_for_meta,value=!talent.demonic.enabled&cooldown.metamorphosis.remains<6&fury.deficit>30
actions+=/variable,name=pooling_for_blade_dance,value=variable.blade_dance&(fury<75-talent.first_blood.enabled*20)
actions+=/variable,name=pooling_for_eye_beam,value=talent.demonic.enabled&!talent.blind_fury.enabled&cooldown.eye_beam.remains<(gcd.max*2)&fury.deficit>20
@@ -48,7 +43,7 @@ actions.cooldown+=/elysian_decree,if=(active_enemies>desired_targets|raid_event.
actions.cooldown+=/fleshcraft,if=soulbind.volatile_solvent&!buff.volatile_solvent_humanoid.up,interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent
actions.demonic=eye_beam,if=runeforge.agony_gaze&(active_enemies>desired_targets|raid_event.adds.in>25-talent.cycle_of_hatred*10)&dot.sinful_brand.ticking&dot.sinful_brand.remains<=gcd
-actions.demonic+=/essence_break
+actions.demonic+=/essence_break,if=!variable.waiting_for_momentum&(!cooldown.eye_beam.ready|buff.metamorphosis.up)
actions.demonic+=/death_sweep,if=variable.blade_dance
actions.demonic+=/fel_barrage,if=active_enemies>desired_targets|raid_event.adds.in>30
actions.demonic+=/glaive_tempest,if=active_enemies>desired_targets|raid_event.adds.in>10
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterVengeance.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterVengeance.simc
index 49ac537b2..ccd4c4d6b 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterVengeance.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DemonHunterVengeance.simc
@@ -23,17 +23,18 @@ actions.cooldowns+=/elysian_decree
# Defensives
actions.defensives=demon_spikes
-actions.defensives+=/metamorphosis,if=!buff.metamorphosis.up&(!covenant.venthyr.enabled|!dot.sinful_brand.ticking)|target.time_to_die<15
+actions.defensives+=/metamorphosis,if=!buff.metamorphosis.up&(!action.sinful_brand.known|!dot.sinful_brand.ticking)|target.time_to_die<15
actions.defensives+=/fiery_brand
# Normal Rotation
actions.normal=infernal_strike
actions.normal+=/bulk_extraction
actions.normal+=/spirit_bomb,if=((buff.metamorphosis.up&talent.fracture.enabled&soul_fragments>=3)|soul_fragments>=4)
+actions.normal+=/fel_devastation
actions.normal+=/soul_cleave,if=((talent.spirit_bomb.enabled&soul_fragments=0)|!talent.spirit_bomb.enabled)&((talent.fracture.enabled&fury>=55)|(!talent.fracture.enabled&fury>=70)|cooldown.fel_devastation.remains>target.time_to_die|(buff.metamorphosis.up&((talent.fracture.enabled&fury>=35)|(!talent.fracture.enabled&fury>=50))))
actions.normal+=/immolation_aura,if=((variable.brand_build&cooldown.fiery_brand.remains>10)|!variable.brand_build)&fury<=90
actions.normal+=/felblade,if=fury<=60
actions.normal+=/fracture,if=((talent.spirit_bomb.enabled&soul_fragments<=3)|(!talent.spirit_bomb.enabled&((buff.metamorphosis.up&fury<=55)|(buff.metamorphosis.down&fury<=70))))
-actions.normal+=/sigil_of_flame,if=!(covenant.kyrian.enabled&runeforge.razelikhs_defilement)
+actions.normal+=/sigil_of_flame,if=!(action.elysian_decree.known&runeforge.razelikhs_defilement)
actions.normal+=/shear
actions.normal+=/throw_glaive
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DruidBalance.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DruidBalance.simc
index 97e37f3fc..2b03c52f7 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DruidBalance.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DruidBalance.simc
@@ -29,7 +29,7 @@ actions.aoe+=/wrath,if=variable.cd_condition_aoe&set_bonus.tier29_4pc&eclipse.an
actions.aoe+=/starfall,if=variable.cd_condition_aoe&talent.orbital_strike&astral_power.deficit15
actions.aoe+=/convoke_the_spirits,if=buff.ca_inc.remains>4|(!talent.primordial_arcanic_pulsar&cooldown.ca_inc.remains>30|variable.no_cd_talent)&(buff.eclipse_lunar.remains>4|buff.eclipse_solar.remains>4)
actions.aoe+=/warrior_of_elune
@@ -55,7 +55,7 @@ actions.fallthru+=/starsurge
actions.fallthru+=/sunfire,cycle_targets=1,if=dot.moonfire.remains>remains*22%18
actions.fallthru+=/moonfire
-actions.st=starfall,if=talent.rattle_the_stars&variable.fourpc_starfall_st&buff.touch_the_cosmos.up&buff.rattled_stars.up&buff.rattled_stars.remains=550)&buff.rattled_stars.up&buff.rattled_stars.remainsvariable.passive_asp+3
actions.st+=/moonfire,cycle_targets=1,if=refreshable&astral_power.deficit>variable.passive_asp+3
@@ -64,10 +64,11 @@ actions.st+=/stellar_flare,cycle_targets=1,if=refreshable&astral_power.deficit>v
actions.st+=/variable,name=cd_condition_st,value=cooldown.ca_inc.remains<15&!buff.ca_inc.up&(target.1.time_to_die>15|fight_remains<25+10*talent.incarnation_chosen_of_elune)
actions.st+=/wrath,if=variable.cd_condition_st&set_bonus.tier29_4pc&eclipse.any_next
actions.st+=/starfall,if=variable.cd_condition_st&buff.touch_the_cosmos.up
+actions.st+=/starfire,if=buff.gathering_starstuff.stack=3&astral_power.deficit>variable.passive_asp+8
actions.st+=/celestial_alignment,if=variable.cd_condition_st
actions.st+=/incarnation,if=variable.cd_condition_st
actions.st+=/ravenous_frenzy,if=buff.ca_inc.remains>15
-actions.st+=/empower_bond,if=
+actions.st+=/empower_bond
actions.st+=/convoke_the_spirits,if=buff.ca_inc.remains>4|(!talent.primordial_arcanic_pulsar&cooldown.ca_inc.remains>30|variable.no_cd_talent)&(buff.eclipse_lunar.remains>4|buff.eclipse_solar.remains>4)
actions.st+=/warrior_of_elune
actions.st+=/force_of_nature,if=astral_power.deficit>variable.passive_asp+20
@@ -80,10 +81,12 @@ actions.st+=/new_moon,if=astral_power.deficit>variable.passive_asp+10&(charges=2
actions.st+=/half_moon,if=astral_power.deficit>variable.passive_asp+20
actions.st+=/full_moon,if=astral_power.deficit>variable.passive_asp+40
actions.st+=/starfall,if=buff.starweavers_warp.up|variable.fourpc_starfall_st&buff.touch_the_cosmos.up
+actions.st+=/starfire,if=buff.gathering_starstuff.stack=3&astral_power.deficit>variable.passive_asp+8
actions.st+=/wrath,if=buff.gathering_starstuff.stack=3&astral_power.deficit>variable.passive_asp+6+3*talent.soul_of_the_forest
-actions.st+=/starsurge,if=buff.ca_inc.remains<5&buff.ca_inc.up|astral_power.deficit70|talent.starlord&buff.starlord.stack<3|talent.balance_of_all_things&(buff.balance_of_all_things_arcane.stack>5|buff.balance_of_all_things_nature.stack>5)
+actions.st+=/starfall,if=buff.primordial_arcanic_pulsar.value>=550&astral_power.deficit70|talent.starlord&buff.starlord.stack<3|talent.balance_of_all_things&(buff.balance_of_all_things_arcane.stack>5|buff.balance_of_all_things_nature.stack>5))
actions.st+=/new_moon,if=astral_power.deficit>variable.passive_asp+10
actions.st+=/wild_mushroom,if=astral_power.deficit>variable.passive_asp+5&(!talent.fungal_growth|!prev_gcd.1.wild_mushroom&!prev_gcd.2.wild_mushroom&dot.fungal_growth.remains<2)
-actions.st+=/starfire,if=buff.warrior_of_elune.up&buff.eclipse_lunar.up
+actions.st+=/starfire,if=buff.warrior_of_elune.up&(buff.eclipse_lunar.up|buff.umbral_embrace.react)
actions.st+=/wrath
actions.st+=/run_action_list,name=fallthru
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/DruidFeral.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/DruidFeral.simc
index f02478824..6882df791 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/DruidFeral.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/DruidFeral.simc
@@ -1,20 +1,21 @@
actions.precombat+=/variable,name=swipe_v_shred,value=2
actions.precombat+=/variable,name=pw_v_fb,op=setif,value=0,condition=talent.tear_open_wounds.enabled&talent.rip_and_tear.enabled,value_else=4
-actions.precombat+=/cat_form
actions.precombat+=/prowl
+actions.precombat+=/cat_form
actions+=/prowl
actions+=/skull_bash
actions+=/soothe
actions+=/tigers_fury,if=energy.deficit>40|buff.bs_inc.up
+# Use Rake from Prowl for damage bonus, unless we can Berserk/Incarnation for the same bonus imminently.
+actions+=/rake,if=cooldown.bs_inc.remains>0&(buff.prowl.up|buff.shadowmeld.up)
actions+=/cat_form,if=!buff.cat_form.up&energy>50
-## actions+=/auto_attack,if=!buff.prowl.up&!buff.shadowmeld.up
actions+=/call_action_list,name=cooldown
actions+=/adaptive_swarm,cycle_targets=1,if=((!dot.adaptive_swarm_damage.ticking|dot.adaptive_swarm_damage.remains<2)&(dot.adaptive_swarm_damage.stack<3|!dot.adaptive_swarm_heal.stack>1)&!action.adaptive_swarm_heal.in_flight&!action.adaptive_swarm_damage.in_flight&!action.adaptive_swarm.in_flight)&target.time_to_die>5|active_enemies>2&!dot.adaptive_swarm_damage.ticking&energy<35&target.time_to_die>5
actions+=/ferocious_bite,if=buff.apex_predators_craving.up
actions+=/feral_frenzy,if=combo_points<2
actions+=/call_action_list,name=finisher,if=combo_points=5
-actions+=/call_action_list,name=bloodtalons,if=buff.bloodtalons.down
+actions+=/call_action_list,name=bloodtalons,if=talent.bloodtalons.enabled&buff.bloodtalons.down
actions+=/call_action_list,name=berserk_builders,if=combo_points<5&(buff.bs_inc.up|buff.shadowmeld.up|buff.prowl.up)
actions+=/call_action_list,name=builder_cycle,if=combo_points<5
actions+=/call_action_list,name=owlweaving,if=buff.bs_inc.down&energy<80
@@ -54,16 +55,16 @@ actions.cooldown+=/convoke_the_spirits,if=buff.tigers_fury.up&combo_points<3|fig
actions.cooldown+=/berserking
actions.cooldown+=/shadowmeld,if=buff.tigers_fury.up&buff.bs_inc.down&combo_points<4&buff.sudden_ambush.down&dot.rake.pmultiplier<1.6&energy>40&druid.rake.ticks_gained_on_refresh>spell_targets.swipe_cat*2-2&target.time_to_die>5
actions.cooldown+=/potion,if=buff.bs_inc.up|fight_remainsvariable.pw_v_fb
-# PW for applying Rip
+# PW for applying Rip.
actions.finisher+=/primal_wrath,cycle_targets=1,if=refreshable&spell_targets.primal_wrath>1
actions.finisher+=/rip,cycle_targets=1,if=refreshable
actions.finisher+=/pool_resource,for_next=1
-actions.finisher+=/ferocious_bite,max_energy=1,if=!buff.bs_inc.up
-actions.finisher+=/ferocious_bite,if=(buff.bs_inc.up&talent.soul_of_the_forest.enabled)
+actions.finisher+=/ferocious_bite,max_energy=1,cycle_targets=1
+actions.finisher+=/ferocious_bite,cycle_targets=1,if=buff.bs_inc.up&talent.soul_of_the_forest.enabled
actions.owlweaving=starsurge
actions.owlweaving+=/sunfire,line_cd=4*gcd
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/HunterBeastMastery.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/HunterBeastMastery.simc
index 5c0da66e9..979627fa6 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/HunterBeastMastery.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/HunterBeastMastery.simc
@@ -15,8 +15,8 @@ actions+=/call_action_list,name=cleave,strict=1,if=active_enemies>1
actions.cds=ancestral_call,if=cooldown.bestial_wrath.remains>30
actions.cds+=/fireblood,if=cooldown.bestial_wrath.remains>30
-actions.cds+=/berserking,if=(buff.wild_spirits.up|(!action.wild_spirits.known|!action.wild_spirits.known)&buff.bestial_wrath.up)&(target.time_to_die>cooldown.berserking.duration+duration|(target.health.pct<35|!talent.killer_instinct))|target.time_to_die<13
-actions.cds+=/blood_fury,if=(buff.wild_spirits.up|(!action.wild_spirits.known|!action.wild_spirits.known)&buff.bestial_wrath.up&buff.bestial_wrath.up)&(target.time_to_die>cooldown.blood_fury.duration+duration|(target.health.pct<35|!talent.killer_instinct))|target.time_to_die<16
+actions.cds+=/berserking,if=(buff.wild_spirits.up|!action.wild_spirits.known&buff.bestial_wrath.up&buff.bestial_wrath.up)&(target.time_to_die>cooldown.berserking.duration+duration|(target.health.pct<35|!talent.killer_instinct))|target.time_to_die<13
+actions.cds+=/blood_fury,if=(buff.wild_spirits.up|!action.wild_spirits.known&buff.bestial_wrath.up&buff.bestial_wrath.up)&(target.time_to_die>cooldown.blood_fury.duration+duration|(target.health.pct<35|!talent.killer_instinct))|target.time_to_die<16
actions.cds+=/lights_judgment
actions.cds+=/potion,if=buff.bestial_wrath.up|target.time_to_die<26
@@ -50,7 +50,7 @@ actions.cleave+=/barbed_shot,cycle_targets=1,if=target.time_to_die<9|charges_fra
actions.cleave+=/tar_trap,if=runeforge.soulforge_embers|runeforge.nessingwarys_trapping_apparatus
actions.cleave+=/freezing_trap,if=runeforge.nessingwarys_trapping_apparatus
actions.cleave+=/arcane_torrent,if=(focus+focus.regen+30)action.kill_command.cost+action.multishot.cost
actions.st=aspect_of_the_wild,if=(!action.wild_spirits.known|cooldown.wild_spirits.remains>20)&(!raid_event.adds.exists|!raid_event.adds.up&(raid_event.adds.duration+raid_event.adds.in<20|(raid_event.adds.count=1&action.resonating_arrow.known))|raid_event.adds.up&raid_event.adds.remains>19)
actions.st+=/call_of_the_wild
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/HunterSurvival.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/HunterSurvival.simc
new file mode 100644
index 000000000..6d7fb8f68
--- /dev/null
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/HunterSurvival.simc
@@ -0,0 +1,85 @@
+actions.precombat+=/summon_pet
+actions.precombat+=/fleshcraft
+actions.precombat+=/variable,name=mb_rs_cost,op=setif,value=action.mongoose_bite.cost,value_else=action.raptor_strike.cost,condition=talent.mongoose_bite
+actions.precombat+=/tar_trap,if=runeforge.soulforge_embers
+actions.precombat+=/steel_trap,precast_time=20
+
+# Executed every time the actor is available.
+actions+=/muzzle
+actions+=/tranquilizing_shot
+actions+=/carve
+actions+=/call_action_list,name=other_on_use
+actions+=/call_action_list,name=cds
+actions+=/call_action_list,name=st,if=active_enemies<3
+actions+=/call_action_list,name=cleave,if=active_enemies>2
+actions+=/arcane_torrent
+
+actions.cds=harpoon,if=talent.terms_of_engagement.enabled&settings.use_harpoon&buff.aspect_of_the_eagle.down
+actions.cds+=/blood_fury,if=buff.coordinated_assault.up|buff.spearhead.up|!talent.spearhead&!talent.coordinated_assault
+actions.cds+=/ancestral_call,if=buff.coordinated_assault.up|buff.spearhead.up|!talent.spearhead&!talent.coordinated_assault
+actions.cds+=/fireblood,if=buff.coordinated_assault.up|buff.spearhead.up|!talent.spearhead&!talent.coordinated_assault
+actions.cds+=/lights_judgment
+actions.cds+=/bag_of_tricks,if=cooldown.kill_command.full_recharge_time>gcd
+actions.cds+=/berserking,if=buff.coordinated_assault.up|buff.spearhead.up|!talent.spearhead&!talent.coordinated_assault|time_to_die<13
+actions.cds+=/muzzle
+actions.cds+=/potion,if=target.time_to_die<25|buff.coordinated_assault.up|buff.spearhead.up|!talent.spearhead&!talent.coordinated_assault
+actions.cds+=/use_items
+actions.cds+=/fleshcraft,cancel_if=channeling&!soulbind.pustule_eruption,if=(focus<70|cooldown.coordinated_assault.remains1|active_enemies=1&time_to_die>5*gcd)
+actions.cds+=/flare,if=(settings.allow_focus_overcap|focus+cast_regen4*gcd
+actions.cds+=/aspect_of_the_eagle,if=target.distance>=6
+
+actions.cleave=wildfire_bomb,if=full_recharge_timespell_targets%2
+actions.cleave+=/butchery,if=full_recharge_timespell_targets%2
+actions.cleave+=/mongoose_bite,cycle_targets=1,if=debuff.latent_poison.stack>8
+actions.cleave+=/kill_command,cycle_targets=1,if=(settings.allow_focus_overcap|focus+cast_regen8
+actions.cleave+=/carve
+actions.cleave+=/kill_shot
+actions.cleave+=/steel_trap,if=(settings.allow_focus_overcap|focus+cast_regen8
+actions.cleave+=/mongoose_bite,cycle_targets=1
+actions.cleave+=/raptor_strike,cycle_targets=1
+
+actions.other_on_use=use_items
+actions.other_on_use+=/use_item,name=jotungeirr_destinys_call,if=cooldown.coordinated_assault.remains>75|time_to_die<30
+
+actions.st=death_chakram,if=(settings.allow_focus_overcap|focus+cast_regen7&!talent.vipers_venom
+actions.st+=/flanking_strike,if=(settings.allow_focus_overcap|focus+cast_regenfocus.max-10
+actions.st+=/mongoose_bite,cycle_targets=1,if=focus+action.kill_command.cast_regen>focus.max-10|buff.spearhead.remains
+actions.st+=/explosive_shot
+actions.st+=/kill_shot,if=set_bonus.tier29_4pc
+actions.st+=/raptor_strike,cycle_targets=1
+actions.st+=/steel_trap
+actions.st+=/wildfire_bomb,if=!dot.wildfire_bomb.ticking
+actions.st+=/fury_of_the_eagle,interrupt=1
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/MonkWindwalker.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/MonkWindwalker.simc
new file mode 100644
index 000000000..4cad271bb
--- /dev/null
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/MonkWindwalker.simc
@@ -0,0 +1,140 @@
+actions.precombat+=/bottled_flayedwing_toxin
+actions.precombat+=/variable,name=xuen_on_use_trinket,op=set,value=equipped.inscrutable_quantum_device|equipped.gladiators_badge|equipped.wrathstone|equipped.overcharged_anima_battery|equipped.shadowgrasp_totem|equipped.the_first_sigil|equipped.cache_of_acquired_treasures
+actions.precombat+=/fleshcraft
+actions.precombat+=/expel_harm,if=chifight_remains|fight_remains-cooldown.invoke_xuen_the_white_tiger.remains<120&((talent.serenity&fight_remains>cooldown.serenity.remains&cooldown.serenity.remains>10)|(cooldown.storm_earth_and_fire.full_recharge_time15)|(cooldown.storm_earth_and_fire.charges=0&cooldown.storm_earth_and_fire.remains5&!buff.bonedust_brew.up&(runeforge.faeline_harmony|talent.faeline_harmony|soulbind.grove_invigoration|active_enemies<3&buff.storm_earth_and_fire.down)
+# Spend excess energy
+actions+=/call_action_list,name=spend_energy,if=!buff.bonedust_brew.up&!buff.first_strike.up&!buff.serenity.up
+# Use Chi Burst to reset Faeline Stomp
+actions+=/chi_burst,if=action.faeline_stomp.known&cooldown.faeline_stomp.remains&(chi.max-chi>=1&active_enemies=1|chi.max-chi>=2&active_enemies>=2)&!buff.first_strike.up
+# Cooldowns
+actions+=/call_action_list,name=cd_sef,strict=1,if=!talent.serenity
+actions+=/call_action_list,name=cd_serenity,strict=1,if=talent.serenity
+# Serenity / Default Priority
+actions+=/call_action_list,name=serenity,strict=1,if=buff.serenity.up
+actions+=/call_action_list,name=fallthru
+
+# Bonedust Brew Setup
+actions.bdb_setup=bonedust_brew,if=spinning_crane_kick.max&chi>=4
+actions.bdb_setup+=/rising_sun_kick,cycle_targets=1,if=combo_strike&chi>=5
+actions.bdb_setup+=/tiger_palm,cycle_targets=1,if=combo_strike&chi.max-chi>=2
+actions.bdb_setup+=/rising_sun_kick,cycle_targets=1,if=combo_strike&cooldown.fists_of_fury.remains&active_enemies>=2
+
+# Storm, Earth and Fire Cooldowns
+actions.cd_sef=summon_white_tiger_statue,if=pet.xuen_the_white_tiger.active
+actions.cd_sef+=/invoke_xuen_the_white_tiger,if=!variable.hold_xuen&action.bonedust_brew.known&cooldown.bonedust_brew.remains<=5&(active_enemies<3&chi>=3|active_enemies>=3&chi>=2)|fight_remains<25
+actions.cd_sef+=/invoke_xuen_the_white_tiger,if=!variable.hold_xuen&!action.bonedust_brew.known&(cooldown.rising_sun_kick.remains<2|!action.weapons_of_order.known)&chi>=3
+actions.cd_sef+=/weapons_of_order,if=(raid_event.adds.in>45|raid_event.adds.up)&cooldown.rising_sun_kick.remains(20+20*(runeforge.invokers_delight|talent.invokers_delight))&(!runeforge.xuens_treasure&!talent.xuens_battlegear|cooldown.fists_of_fury.remains)|fight_remains<35
+actions.cd_sef+=/storm_earth_and_fire,if=action.bonedust_brew.known&(fight_remains<30&cooldown.bonedust_brew.remains<4&chi>=4|buff.bonedust_brew.up&!variable.hold_sef|!spinning_crane_kick.max&active_enemies>=3&cooldown.bonedust_brew.remains<=2&chi>=2)&(pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>cooldown.storm_earth_and_fire.full_recharge_time)
+actions.cd_sef+=/bonedust_brew,if=(!buff.bonedust_brew.up&buff.storm_earth_and_fire.up&buff.storm_earth_and_fire.remains<11&spinning_crane_kick.max)|(!buff.bonedust_brew.up&fight_remains<30&fight_remains>10&spinning_crane_kick.max&chi>=4)|fight_remains<10&soulbind.lead_by_example
+actions.cd_sef+=/call_action_list,name=bdb_setup,if=!buff.bonedust_brew.up&action.bonedust_brew.known&cooldown.bonedust_brew.remains<=2&(fight_remains>60&(cooldown.storm_earth_and_fire.charges>0|cooldown.storm_earth_and_fire.remains>10)&(pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>10|variable.hold_xuen)|((pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>13)&(cooldown.storm_earth_and_fire.charges>0|cooldown.storm_earth_and_fire.remains>13|buff.storm_earth_and_fire.up)))
+actions.cd_sef+=/storm_earth_and_fire,if=fight_remains<20|!action.bonedust_brew.known&(cooldown.storm_earth_and_fire.charges=2|buff.weapons_of_order.up|action.weapons_of_order.known&cooldown.weapons_of_order.remains>cooldown.storm_earth_and_fire.full_recharge_time|cooldown.invoke_xuen_the_white_tiger.remains>cooldown.storm_earth_and_fire.full_recharge_time)&cooldown.fists_of_fury.remains<=9&chi>=2&cooldown.whirling_dragon_punch.remains<=12
+actions.cd_sef+=/touch_of_death,if=combo_strike&(fight_remains>60|buff.storm_earth_and_fire.down&(!action.bonedust_brew.known|buff.bonedust_brew.up)|fight_remains<10)
+actions.cd_sef+=/fallen_order,if=raid_event.adds.in>30|raid_event.adds.up
+actions.cd_sef+=/use_item,name=inscrutable_quantum_device,if=pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>60&fight_remains>180|fight_remains<20
+actions.cd_sef+=/use_item,name=earthbreakers_impact,if=!variable.xuen_on_use_trinket|cooldown.invoke_xuen_the_white_tiger.remains>20&pet.xuen_the_white_tiger.remains<20|variable.hold_xuen
+acitons.cd_sef+=/use_items,if=pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>60&fight_remains>180|fight_remains<20
+actions.cd_sef+=/blood_fury,if=cooldown.invoke_xuen_the_white_tiger.remains>30|variable.hold_xuen|fight_remains<20
+actions.cd_sef+=/berserking,if=cooldown.invoke_xuen_the_white_tiger.remains>30|variable.hold_xuen|fight_remains<15
+actions.cd_sef+=/lights_judgment
+actions.cd_sef+=/fireblood,if=cooldown.invoke_xuen_the_white_tiger.remains>30|variable.hold_xuen|fight_remains<10
+actions.cd_sef+=/ancestral_call,if=cooldown.invoke_xuen_the_white_tiger.remains>30|variable.hold_xuen|fight_remains<20
+actions.cd_sef+=/bag_of_tricks,if=buff.storm_earth_and_fire.down
+actions.cd_sef+=/fleshcraft,if=soulbind.pustule_eruption&!pet.xuen_the_white_tiger.active&buff.storm_earth_and_fire.down&buff.bonedust_brew.down
+
+# Serenity Cooldowns
+actions.cd_serenity=summon_white_tiger_statue,if=pet.xuen_the_white_tiger.active
+actions.cd_serenity+=/invoke_xuen_the_white_tiger,if=!variable.hold_xuen&action.bonedust_brew.known&cooldown.bonedust_brew.remains<=5|fight_remains<25
+actions.cd_serenity+=/invoke_xuen_the_white_tiger,if=!variable.hold_xuen&!action.bonedust_brew.known&(cooldown.rising_sun_kick.remains<2|!action.weapons_of_order.known)|fight_remains<25
+actions.cd_serenity+=/weapons_of_order,if=(raid_event.adds.in>45|raid_event.adds.up)&cooldown.rising_sun_kick.remains(20+20*(runeforge.invokers_delight|talent.invokers_delight))&(!runeforge.xuens_treasure&!talent.xuens_battlegear|cooldown.fists_of_fury.remains)|fight_remains<35
+actions.cd_serenity+=/bonedust_brew,if=!buff.bonedust_brew.up&(cooldown.serenity.up|cooldown.serenity.remains>15|fight_remains<30&fight_remains>10)|fight_remains<10&soulbind.lead_by_example
+actions.cd_serenity+=/serenity,if=pet.xuen_the_white_tiger.active|cooldown.invoke_xuen_the_white_tiger.remains>10|!talent.invoke_xuen_the_white_tiger|fight_remains<15
+actions.cd_serenity+=/touch_of_death,if=combo_strike&(fight_remains>60|buff.bonedust_brew.up|fight_remains<10)
+actions.cd_serenity+=/touch_of_karma,if=fight_remains>90|fight_remains<16
+actions.cd_serenity+=/fallen_order
+actions.cd_serenity+=/blood_fury,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/berserking,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/lights_judgment
+actions.cd_serenity+=/fireblood,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/ancestral_call,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/bag_of_tricks,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/fleshcraft,if=soulbind.pustule_eruption&!pet.xuen_the_white_tiger.active&buff.serenity.down&buff.bonedust_brew.down
+actions.cd_serenity+=/use_item,name=inscrutable_quantum_device,if=buff.serenity.up|fight_remains<20
+actions.cd_serenity+=/use_item,name=earthbreakers_impact,if=!variable.xuen_on_use_trinket|cooldown.invoke_xuen_the_white_tiger.remains>20|variable.hold_xuen
+actions.cd_serenity+=/use_items,if=buff.serenity.up|fight_remains<20
+
+# Default Actions
+actions.fallthru=whirling_dragon_punch,if=active_enemies>2
+actions.fallthru+=/strike_of_the_windlord,if=active_enemies=1&buff.bonedust_brew.up
+actions.fallthru+=/rising_sun_kick,if=active_enemies=1&buff.bonedust_brew.up&buff.kicks_of_flowing_momentum.up
+actions.fallthru+=/spinning_crane_kick,if=combo_strike&buff.dance_of_chiji.up
+actions.fallthru+=/fists_of_fury,cycle_targets=1,if=buff.weapons_of_order_ww.up
+actions.fallthru+=/rising_sun_kick,cycle_targets=1,if=combo_strike&buff.weapons_of_order.up
+actions.fallthru+=/fists_of_fury,cycle_targets=1,if=set_bonus.tier29_2pc
+actions.fallthru+=/blackout_kick,cycle_targets=1,if=buff.teachings_of_the_monastery.stack>=2
+actions.fallthru+=/strike_of_the_windlord,if=active_enemies<3|active_enemies>=3&buff.bonedust_brew.up&prev_gcd.1.spinning_crane_kick
+actions.fallthru+=/whirling_dragon_punch
+actions.fallthru+=/blackout_kick,cycle_targets=1,if=combo_strike&buff.weapons_of_order_ww.up&active_enemies<=3
+actions.fallthru+=/spinning_crane_kick,if=combo_strike&(buff.bonedust_brew.up|buff.weapons_of_order_ww.up)&active_enemies>1&spinning_crane_kick.modifier>2.1
+actions.fallthru+=/spinning_crane_kick,if=buff.bonedust_brew.up&spinning_crane_kick.modifier>2.9&(!talent.teachings_of_the_monastery|!talent.shadowboxing_treads|active_enemies>=9)
+actions.fallthru+=/blackout_kick,cycle_targets=1,if=combo_strike&buff.weapons_of_order_ww.up
+actions.fallthru+=/rising_sun_kick,cycle_targets=1,if=combo_strike&(!talent.xuens_battlegear&!runeforge.xuens_treasure|cooldown.fists_of_fury.remains)
+actions.fallthru+=/rushing_jade_wind,if=buff.rushing_jade_wind.down&active_enemies>=7
+actions.fallthru+=/strike_of_the_windlord,if=active_enemies<10|talent.thunderfist
+actions.fallthru+=/blackout_kick,cycle_targets=1,if=buff.teachings_of_the_monastery.stack=1&cooldown.rising_sun_kick.remains&(cooldown.fists_of_fury.remains|!talent.whirling_dragon_punch)
+actions.fallthru+=/fists_of_fury,cycle_targets=1,if=(raid_event.adds.in>cooldown.fists_of_fury.duration*0.8|active_enemies>1)&(energy.time_to_max>execute_time-1|chi.max-chi<=1|buff.storm_earth_and_fire.remains1&!talent.shadowboxing_treads|active_enemies>=6&spinning_crane_kick.modifier>=2.4)
+actions.fallthru+=/faeline_stomp,if=combo_strike&!buff.bonedust_brew.up
+actions.fallthru+=/crackling_jade_lightning,if=buff.the_emperors_capacitor.stack>19&energy.time_to_max>execute_time-1&cooldown.rising_sun_kick.remains>execute_time|buff.the_emperors_capacitor.stack>14&(cooldown.serenity.remains<5&talent.serenity|cooldown.weapons_of_order.remains<5&action.weapons_of_order.known|fight_remains<5)
+actions.fallthru+=/tiger_palm,cycle_targets=1,if=combo_strike&buff.bonedust_brew.up&chi.max-chi>=(2+buff.power_strikes.up)
+actions.fallthru+=/expel_harm,if=chi.max-chi>=1
+actions.fallthru+=/chi_burst,if=chi.max-chi>=1&active_enemies=1&raid_event.adds.in>20|chi.max-chi>=2&active_enemies>=2
+actions.fallthru+=/chi_wave
+actions.fallthru+=/tiger_palm,cycle_targets=1,if=combo_strike&chi.max-chi>=(2+buff.power_strikes.up)&buff.storm_earth_and_fire.down
+actions.fallthru+=/spinning_crane_kick,if=combo_strike&buff.chi_energy.stack>30-5*active_enemies&buff.storm_earth_and_fire.down&(cooldown.rising_sun_kick.remains>2&cooldown.fists_of_fury.remains>2|cooldown.rising_sun_kick.remains<3&cooldown.fists_of_fury.remains>3&chi>3|cooldown.rising_sun_kick.remains>3&cooldown.fists_of_fury.remains<3&chi>4|chi.max-chi<=1&energy.time_to_max<2)|buff.chi_energy.stack>10&fight_remains<7
+actions.fallthru+=/tiger_palm,cycle_targets=1,if=combo_strike&chi.max-chi>=(2+buff.power_strikes.up)
+actions.fallthru+=/arcane_torrent,if=chi.max-chi>=1
+actions.fallthru+=/flying_serpent_kick,interrupt=1,if=!action.bonedust_brew.known
+
+# Opener
+actions.opener=expel_harm,if=talent.chi_burst.enabled&chi.max-chi>=3
+actions.opener+=/tiger_palm,cycle_targets=1,if=combo_strike&chi.max-chi>=(2+buff.power_strikes.up)
+actions.opener+=/chi_wave,if=chi.max-chi=2
+actions.opener+=/expel_harm
+actions.opener+=/tiger_palm,cycle_targets=1,if=chi.max-chi>=(2+buff.power_strikes.up)
+
+# Serenity Priority
+actions.serenity=strike_of_the_windlord
+actions.serenity+=/blackout_kick,cycle_targets=1,if=buff.teachings_of_the_monastery.stack=3
+actions.serenity+=/spinning_crane_kick,if=combo_strike&(buff.dance_of_chiji.up&active_enemies>2|spinning_crane_kick.modifier>2.7&active_enemies>3)
+actions.serenity+=/fists_of_fury,if=buff.serenity.remains<2
+actions.serenity+=/whirling_dragon_punch,if=active_enemies>=3
+actions.serenity+=/rising_sun_kick,cycle_targets=1,if=combo_strike&active_enemies<3&buff.kicks_of_flowing_momentum.up
+actions.serenity+=/cancel_action,name=fists_of_fury
+actions.serenity+=/rising_sun_kick,cycle_targets=1,if=combo_strike&(active_enemies<5|talent.whirling_dragon_punch)
+actions.serenity+=/spinning_crane_kick,if=combo_strike&buff.dance_of_chiji.up
+actions.serenity+=/blackout_kick,cycle_targets=1,if=combo_strike&talent.mark_of_the_crane&!spinning_crane_kick.max&active_enemies>2
+actions.serenity+=/spinning_crane_kick,if=combo_strike&active_enemies>1&spinning_crane_kick.modifier>2.1
+actions.serenity+=/rushing_jade_wind,if=buff.rushing_jade_wind.down,if=!set_bonus.tier29_2pc|active_enemies>2
+actions.serenity+=/blackout_kick,cycle_targets=1,if=combo_strike
+actions.serenity+=/tiger_palm,cycle_targets=1,if=talent.teachings_of_the_monastery&buff.teachings_of_the_monastery.stack<3
+
+# Excess Energy
+actions.spend_energy=expel_harm,if=chi.max-chi>=1&(energy.time_to_max<1|cooldown.serenity.remains<2|energy.time_to_max<4&cooldown.fists_of_fury.remains<1.5|cooldown.weapons_of_order.remains<2)&(!buff.bonedust_brew.up|buff.bloodlust.up|buff.invokers_delight.up)
+actions.spend_energy+=/tiger_palm,cycle_targets=1,if=buff.teachings_of_the_monastery.stack<3&combo_strike&chi.max-chi>=(2+buff.power_strikes.up)&(energy.time_to_max<1|cooldown.serenity.remains<2|energy.time_to_max<4&cooldown.fists_of_fury.remains<1.5|cooldown.weapons_of_order.remains<2)
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/ShamanElemental.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/ShamanElemental.simc
new file mode 100644
index 000000000..83ffab5f9
--- /dev/null
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/ShamanElemental.simc
@@ -0,0 +1,125 @@
+# Ensure weapon enchant is applied.
+actions.precombat+=/flametongue_weapon,if=talent.improved_flametongue_weapon.enabled
+actions.precombat+=/potion
+
+# Executed every time the actor is available.
+# Interrupt of casts.
+actions+=/wind_shear
+# Enable more movement.
+actions=spiritwalkers_grace,moving=1,if=movement.distance>6
+actions+=/blood_fury,if=!talent.ascendance.enabled|buff.ascendance.up|cooldown.ascendance.remains>50
+actions+=/berserking,if=!talent.ascendance.enabled|buff.ascendance.up
+actions+=/fireblood,if=!talent.ascendance.enabled|buff.ascendance.up|cooldown.ascendance.remains>50
+actions+=/ancestral_call,if=!talent.ascendance.enabled|buff.ascendance.up|cooldown.ascendance.remains>50
+actions+=/bag_of_tricks,if=!talent.ascendance.enabled|!buff.ascendance.up
+actions+=/use_items
+actions+=/meteor
+actions+=/tempest,if=buff.call_lightning.stack>=10
+actions+=/run_action_list,name=aoe,strict=1,if=active_enemies>2&(spell_targets.chain_lightning>2|spell_targets.lava_beam>2)
+actions+=/run_action_list,name=single_target
+
+# Keep your cooldowns rolling.
+actions.aoe=fire_elemental
+# Keep your cooldowns rolling.
+actions.aoe+=/storm_elemental
+# Keep your cooldowns rolling.
+actions.aoe+=/stormkeeper
+# Spread Flame Shock using Surge of Power. Don't waste buffs by resets (resets are gone, but I'll keep that logic here).
+actions.aoe+=/primordial_wave,cycle_targets=1,if=!buff.primordial_wave.up&buff.surge_of_power.up&!buff.splintered_elements.up
+# Spread Flame Shock using Surge of Power. Don't waste buffs by resets (resets are gone, but I'll keep that logic here).
+actions.aoe+=/primordial_wave,cycle_targets=1,if=!buff.primordial_wave.up&talent.deeply_rooted_elements.enabled&!talent.surge_of_power.enabled&!buff.splintered_elements.up
+# Spread Flame Shock using Surge of Power.
+actions.aoe+=/flame_shock,cycle_targets=1,if=refreshable&buff.surge_of_power.up
+# Spread Flame Shock to gamble on Deeply Rooted Element procs.
+actions.aoe+=/flame_shock,cycle_targets=1,if=refreshable&talent.deeply_rooted_elements.enabled&!talent.surge_of_power.enabled
+# JUST DO IT! https://i.kym-cdn.com/entries/icons/mobile/000/018/147/Shia_LaBeouf__Just_Do_It__Motivational_Speech_(Original_Video_by_LaBeouf__R%C3%B6nkk%C3%B6___Turner)_0-4_screenshot.jpg
+actions.aoe+=/ascendance
+# Keep your cooldowns rolling.
+actions.aoe+=/liquid_magma_totem
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease.
+actions.aoe+=/earthquake,if=!talent.echoes_of_great_sundering.enabled|buff.echoes_of_great_sundering.up
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease. Spread Lightning Rod to as many targets as possible.
+actions.aoe+=/elemental_blast,cycle_targets=1,if=talent.echoes_of_great_sundering.enabled
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease.
+actions.aoe+=/elemental_blast,if=talent.echoes_of_great_sundering.enabled
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease. Spread Lightning Rod to as many targets as possible.
+actions.aoe+=/earth_shock,cycle_targets=1,if=talent.echoes_of_great_sundering.enabled
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease.
+actions.aoe+=/earth_shock,if=talent.echoes_of_great_sundering.enabled
+# Stormkeeper is strong and should be used.
+actions.aoe+=/lava_beam,if=buff.stormkeeper.up
+# Stormkeeper is strong and should be used.
+actions.aoe+=/chain_lightning,if=buff.stormkeeper.up
+# Power of the Maelstrom is strong and should be used.
+actions.aoe+=/chain_lightning,if=buff.power_of_the_maelstrom.up
+# Against 6 targets or more Surge of Power should be used with Lava Beam rather than Lava Burst.
+actions.aoe+=/lava_beam,if=active_enemies>=6&buff.surge_of_power.up
+# Against 6 targets or more Surge of Power should be used with Chain Lightning rather than Lava Burst.
+actions.aoe+=/chain_lightning,if=active_enemies>=6&buff.surge_of_power.up
+# Gamble away for Deeply Rooted Elements procs whenever Lava Surge makes Lava Burst more efficient.
+actions.aoe+=/lava_burst,if=buff.lava_surge.up&talent.deeply_rooted_elements.enabled
+# Cast Lava Burst to buff your immediately follow-up Earthquake with Master of the Elements.
+actions.aoe+=/lava_burst,if=cooldown_react&buff.lava_surge.up&talent.master_of_the_elements.enabled&(maelstrom>=60-5*talent.eye_of_the_storm.rank-2*talent.flow_of_power.enabled)&(!talent.echoes_of_great_sundering.enabled|buff.echoes_of_great_sundering.up)
+# Use Icefury if you can get the full benefit from Electrified Shocks. If more targets are present ignore it.
+actions.aoe+=/icefury,if=talent.electrified_shocks.enabled&active_enemies<5
+# Spread out your Frost Shock casts to empower as many Chain Lightnings as possible.
+actions.aoe+=/frost_shock,if=buff.icefury.up&talent.electrified_shocks.enabled&!debuff.electrified_shocks.up&active_enemies<5
+actions.aoe+=/lava_beam
+actions.aoe+=/chain_lightning
+actions.aoe+=/flame_shock,moving=1,cycle_targets=1,if=refreshable
+actions.aoe+=/frost_shock,moving=1
+
+# Keep your cooldowns rolling.
+actions.single_target=fire_elemental
+# Keep your cooldowns rolling.
+actions.single_target+=/storm_elemental
+# Use Primordial Wave as much as possible without wasting buffs.
+actions.single_target+=/primordial_wave,cycle_targets=1,if=!buff.primordial_wave.up&!buff.splintered_elements.up
+actions.single_target+=/flame_shock,cycle_targets=1,if=refreshable&!buff.surge_of_power.up
+# Keep your cooldowns rolling.
+actions.single_target+=/liquid_magma_totem
+actions.single_target+=/stormkeeper,if=!buff.ascendance.up
+actions.single_target+=/ascendance,if=!buff.stormkeeper.up
+actions.single_target+=/cancel_buff,name=lava_surge,if=buff.stormkeeper.up&buff.surge_of_power.up
+actions.single_target+=/lava_burst,if=buff.stormkeeper.up&buff.surge_of_power.up
+# Stormkeeper is strong and should be used.
+actions.single_target+=/lightning_bolt,if=buff.stormkeeper.up&buff.surge_of_power.up
+# Stormkeeper is strong and should be used.
+actions.single_target+=/lightning_bolt,if=buff.stormkeeper.up&!talent.surge_of_power.enabled
+# Surge of Power is strong and should be used.
+actions.single_target+=/lightning_bolt,if=buff.surge_of_power.up
+actions.single_target+=/icefury,if=talent.electrified_shocks.enabled
+actions.single_target+=/frost_shock,if=buff.icefury.up&talent.electrified_shocks.enabled&(!debuff.electrified_shocks.up|buff.icefury.remains<=gcd)
+actions.single_target+=/frost_shock,if=buff.icefury.up&talent.electrified_shocks.enabled&maelstrom>=50&debuff.electrified_shocks.remains<2*gcd&buff.stormkeeper.up
+# Windspeaker's Lava Resurgence is strong. Don't sit on it.
+actions.single_target+=/lava_burst,if=buff.windspeakers_lava_resurgence.up
+# Lava Surge is neat. Utilize it.
+actions.single_target+=/lava_burst,if=cooldown_react&buff.lava_surge.up
+# Use the talents you selected. Did you invest only 1 point in it? In this case this'll be a DPS decrease. Additionally Elemental Blast is stronger than EoGS. In this case don't use Earthquake on single target.
+actions.single_target+=/earthquake,if=buff.echoes_of_great_sundering.up&(!talent.elemental_blast.enabled&active_enemies<2|active_enemies>1)
+# Use Earthquake against two enemies unless you have to alternate because of Echoes of Great Sundering.
+actions.single_target+=/earthquake,if=active_enemies>1&(spell_targets.chain_lightning>1|spell_targets.lava_beam>1)&!talent.windspeakers_lava_resurgence.enabled&!talent.echoes_of_great_sundering.enabled
+actions.single_target+=/elemental_blast
+actions.single_target+=/earth_shock
+# Utilize present buffs.
+actions.single_target+=/lava_burst,if=buff.flux_melting.up
+# Spread out your Icefury usage if you can get more use out of accompanied buffs.
+actions.single_target+=/frost_shock,if=buff.icefury.up&talent.flux_melting.enabled&!buff.flux_melting.up
+# Spread out your Icefury usage if you can get more use out of accompanied buffs.
+actions.single_target+=/frost_shock,if=buff.icefury.up&(talent.electrified_shocks.enabled&!debuff.electrified_shocks.up|buff.icefury.remains<6)
+# Utilize the Power of the Maelstrom buff if your Lightning Bolt is empowered by Unrelenting Calamity.
+actions.single_target+=/lightning_bolt,if=buff.power_of_the_maelstrom.up&talent.unrelenting_calamity.enabled
+actions.single_target+=/icefury
+# Spam Lightning Bolt if Storm Elemental is active. But honor all previous priorities.
+actions.single_target+=/lightning_bolt,if=pet.storm_elemental.active
+actions.single_target+=/lava_burst
+# Use your Icefury buffs if you didn't improve the talent.
+actions.single_target+=/frost_shock,if=buff.icefury.up&!talent.electrified_shocks.enabled&!talent.flux_melting.enabled
+# Casting Chain Lightning at two targets is mor efficient than Lightning Bolt.
+actions.single_target+=/chain_lightning,if=active_enemies>1&(spell_targets.chain_lightning>1|spell_targets.lava_beam>1)
+# Filler spell. Always available. Always the bottom line.
+actions.single_target+=/lightning_bolt
+actions.single_target+=/flame_shock,moving=1,cycle_targets=1,if=refreshable
+actions.single_target+=/flame_shock,moving=1,if=movement.distance>6
+# Frost Shock is our movement filler.
+actions.single_target+=/frost_shock,moving=1
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorArms.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorArms.simc
index fc8821b5f..3dbc656b8 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorArms.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorArms.simc
@@ -1,12 +1,6 @@
-## Arms Warrior
-## 26 October 2022 (1fdb829)
-
-## Initial Dragonflight import.
-
actions.precombat+=/fleshcraft
-# Executed every time the actor is available.
-actions=charge
+actions+=/charge,if=time<=0.5|movement.distance>5
actions+=/pummel
actions+=/potion,if=gcd.remains=0&debuff.colossus_smash.remains>8|fight_remains<25
actions+=/blood_fury,if=debuff.colossus_smash.up
@@ -16,37 +10,42 @@ actions+=/lights_judgment,if=debuff.colossus_smash.down&cooldown.mortal_strike.r
actions+=/fireblood,if=debuff.colossus_smash.up
actions+=/ancestral_call,if=debuff.colossus_smash.up
actions+=/bag_of_tricks,if=debuff.colossus_smash.down&cooldown.mortal_strike.remains
-actions+=/sweeping_strikes,if=spell_targets.whirlwind>1&(cooldown.bladestorm.remains>15|talent.ravager.enabled)
-actions+=/call_action_list,name=execute,strict=1,if=talent.massacre.enabled&target.health.pct<35|target.health.pct<20|covenant.venthyr&target.health.pct>80|cycle_for_execute|cycle_for_condemn
+actions+=/use_item,name=gavel_of_the_first_arbiter
+actions+=/use_items
+actions+=/sweeping_strikes,if=spell_targets.whirlwind>1&(!talent.bladestorm.enabled|cooldown.bladestorm.remains>15)
+actions+=/call_action_list,name=execute,strict=1,if=talent.massacre.enabled&target.health.pct<35|target.health.pct<20|action.condemn.known&target.health.pct>80|cycle_for_execute|cycle_for_condemn
actions+=/call_action_list,name=hac,strict=1,if=raid_event.adds.up|spell_targets.whirlwind>1
actions+=/run_action_list,name=single_target
-actions.execute+=/cancel_buff,name=bladestorm,if=spell_targets.whirlwind=1&gcd.remains=0&(rage>75|rage>50&buff.recklessness.up)
actions.execute+=/avatar,if=gcd.remains=0|fight_remains<20
-actions.execute+=/condemn,if=buff.ashen_juggernaut.up&buff.ashen_juggernaut.remains1
-actions.execute+=/execute,if=buff.ashen_juggernaut.up&buff.ashen_juggernaut.remains1
+actions.execute+=/condemn,if=buff.ashen_juggernaut.up&buff.ashen_juggernaut.remains12
+actions.execute+=/rend,if=remains<=gcd&(!talent.warbreaker&cooldown.colossus_smash.remains<4|talent.warbreaker&cooldown.warbreaker.remains<4)&target.time_to_die>12
+actions.execute+=/thunderous_roar,if=buff.test_of_might.up|!talent.test_of_might&debuff.colossus_smash.up
actions.execute+=/warbreaker
actions.execute+=/colossus_smash
-actions.execute+=/condemn,if=runeforge.signet_of_tormented_kings&(rage.deficit<25|debuff.colossus_smash.up&rage>40|buff.sudden_death.react)
-actions.execute+=/overpower,if=charges=2
+actions.execute+=/spear_of_bastion,if=debuff.colossus_smash.up|buff.test_of_might.up
actions.execute+=/cleave,if=spell_targets.whirlwind>1&dot.deep_wounds.remains=2
+actions.single_target+=/spear_of_bastion,if=debuff.colossus_smash.up|buff.test_of_might.up
+actions.single_target+=/skullsplitter,if=dot.rend.remains>dot.rend.duration*0.95&(debuff.colossus_smash.up&rage<60|buff.test_of_might.up)
+actions.single_target+=/mortal_strike,if=runeforge.enduring_blow|runeforge.battlelord|dot.deep_wounds.remains<=gcd
actions.single_target+=/condemn,if=buff.sudden_death.react
actions.single_target+=/execute,if=buff.sudden_death.react
-actions.single_target+=/skullsplitter,if=rage.deficit>45
-actions.single_target+=/bladestorm,if=rage<30
-actions.single_target+=/overpower
+actions.single_target+=/thunderous_roar,if=debuff.colossus_smash.up|buff.test_of_might.up
+actions.single_target+=/bladestorm,if=debuff.colossus_smash.up&talent.unhinged.enabled|buff.test_of_might.up&talent.hurricane.enabled
+actions.single_target+=/shockwave
actions.single_target+=/mortal_strike
actions.single_target+=/rend,if=remains1
+actions.single_target+=/cleave
+actions.single_target+=/overpower,if=rage<70
actions.single_target+=/whirlwind,if=talent.fervor_of_battle.enabled|spell_targets.whirlwind>4|spell_targets.whirlwind>2&buff.sweeping_strikes.down
-actions.single_target+=/slam,if=!talent.fervor_of_battle.enabled&(rage>50|debuff.colossus_smash.up|!runeforge.enduring_blow)
\ No newline at end of file
+actions.single_target+=/slam,if=!talent.fervor_of_battle.enabled
+actions.single_target+=/impending_victory
+actions.single_target+=/wrecking_throw
+
+
diff --git a/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorFury.simc b/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorFury.simc
index 6b12205da..f6cbf6b4c 100644
--- a/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorFury.simc
+++ b/Interface/AddOns/Hekili/Dragonflight/APLs/WarriorFury.simc
@@ -13,13 +13,14 @@ actions+=/berserking,if=buff.recklessness.up
actions+=/lights_judgment,if=buff.recklessness.down
actions+=/fireblood
actions+=/ancestral_call
-actions+=/bag_of_tricks,if=buff.recklessness.down&debuff.siegebreaker.down&buff.enrage.up
-actions+=/avatar,if=talent.titans_torment&buff.enrage.up&(buff.elysian_might.up|!covenant.kyrian)
-actions+=/avatar,if=!talent.titans_torment&(buff.recklessness.up|target.time_to_die<20)
-actions+=/recklessness,if=talent.annihilator&cooldown.avatar.remains<1|cooldown.avatar.remains>40|!talent.avatar|target.time_to_die<20
+actions+=/use_items
+actions+=/bag_of_tricks,if=buff.recklessness.down&buff.enrage.up
+actions+=/avatar,if=talent.titans_torment&buff.enrage.up&(buff.elysian_might.up|!(talent.elysian_might.enabled|legendary.elysian_might.enabled)|!action.spear_of_bastion.known|cooldown.spear_of_bastion.remains>80)
+actions+=/avatar,if=!talent.titans_torment&(buff.recklessness.up|boss&fight_remains<20)
+actions+=/recklessness,if=talent.annihilator&cooldown.avatar.remains<1|cooldown.avatar.remains>40|!talent.avatar|boss&fight_remains<20
actions+=/recklessness,if=!talent.annihilator
-actions+=/spear_of_bastion,if=buff.enrage.up&(buff.recklessness.up|buff.avatar.up|target.time_to_die<20)
-actions+=/whirlwind,if=spell_targets.whirlwind>1&!buff.meat_cleaver.up|raid_event.adds.in<2&!buff.meat_cleaver.up
+actions+=/spear_of_bastion,if=buff.enrage.up&(buff.recklessness.up|buff.avatar.up|fight_remains<20)
+actions+=/whirlwind,if=spell_targets.whirlwind>1&(talent.improved_whirlwind.enabled&!buff.meat_cleaver.up)|raid_event.adds.in<2&(talent.improved_whirlwind.enabled&!buff.meat_cleaver.up)
actions+=/call_action_list,name=single_target
actions.single_target=rampage,if=buff.recklessness.up|buff.enrage.remains110&talent.overwhelming_rage)|(rage>80&!talent.overwhelming_rage)|buff.frenzy.remains<1.5
diff --git a/Interface/AddOns/Hekili/Dragonflight/DeathKnightBlood.lua b/Interface/AddOns/Hekili/Dragonflight/DeathKnightBlood.lua
index 9d4c7664c..19adc5f8a 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DeathKnightBlood.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DeathKnightBlood.lua
@@ -459,14 +459,25 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 3
},
+ death_and_decay = {
+ alias = { "death_and_decay_actual", "deaths_due" },
+ aliasMode = "first",
+ aliasType = "buff",
+ duration = 3600,
+ },
-- $?s206930[Heart Strike will hit up to ${$m3+2} targets.]?s207311[Clawing Shadows will hit ${$55090s4-1} enemies near the target.]?s55090[Scourge Strike will hit ${$55090s4-1} enemies near the target.][Dealing Shadow damage to enemies inside Death and Decay.]
-- https://wowhead.com/beta/spell=188290
- death_and_decay = {
+ death_and_decay_actual = {
id = 188290,
duration = 10,
tick_time = function() return talent.rapid_decomposition.enabled and 0.85 or 1 end,
max_stack = 1
},
+ deaths_due = {
+ id = 324165,
+ duration = 12,
+ max_stack = 1
+ },
-- Talent: The next $w2 healing received will be absorbed.
-- https://wowhead.com/beta/spell=48743
death_pact = {
@@ -484,18 +495,18 @@ spec:RegisterAuras( {
},
-- Weakened by Death's Due, damage dealt to $@auracaster reduced by $s1%.$?a333388[ Toxins accumulate, increasing Death's Due damage by $s3%.][]
-- https://wowhead.com/beta/spell=324164
- deaths_due = {
+ deaths_due_zone = {
id = 324164,
duration = 12,
max_stack = 4
},
-- Strength increased by $s1%.
-- https://wowhead.com/beta/spell=324165
- deaths_due_buff = {
+ --[[ deaths_due = {
id = 324165,
duration = 12,
max_stack = 4
- },
+ }, ]]
-- Talent: Haste increased by $s3%. Generating $s1 $LRune:Runes; and ${$m2/10} Runic Power every $t1 sec.
-- https://wowhead.com/beta/spell=47568
empower_rune_weapon = {
@@ -554,12 +565,23 @@ spec:RegisterAuras( {
},
-- Talent: Movement speed reduced by $s5%.
-- https://wowhead.com/beta/spell=206930
- heart_strike = {
+ heart_strike_206930 = {
id = 206930,
duration = 8,
max_stack = 1,
copy = 228645
},
+ heart_strike_228645 = {
+ id = 228645,
+ duration = 8,
+ max_stack = 1
+ },
+ heart_strike = {
+ alias = { "heart_strike_206930", "heart_strike_228645" },
+ aliasMode = "first",
+ aliasType = "debuff",
+ duration = 8
+ },
-- Talent: Your next Death Strike deals an additional $s2% damage.
-- https://wowhead.com/beta/spell=377656
heartrend = {
@@ -771,24 +793,6 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
- -- Surrounded by a vile swarm of insects, infecting enemies within $115994a1 yds with Virulent Plague and an unholy disease that deals damage to enemies.
- -- https://wowhead.com/beta/spell=115989
- unholy_blight = {
- id = 115989,
- duration = 6,
- tick_time = 1,
- type = "Magic",
- max_stack = 1
- },
- -- Suffering $s1 Shadow damage every $t1 sec.
- -- https://wowhead.com/beta/spell=115994
- unholy_blight = {
- id = 115994,
- duration = 14,
- tick_time = 2,
- type = "Magic",
- max_stack = 4
- },
-- Deals $s1 Fire damage.
-- https://wowhead.com/beta/spell=319245
unholy_pact = {
@@ -897,8 +901,6 @@ spec:RegisterGear( "uvanimor_the_unbeautiful", 137037 )
spec:RegisterTotem( "ghoul", 1100170 ) -- Texture ID
-local any_dnd_set = false
-
local TriggerUmbilicusEternus = setfenv( function()
applyBuff( "umbilicus_eternus" )
end, state )
@@ -922,24 +924,6 @@ spec:RegisterHook( "reset_precast", function ()
end
end
- if state:IsKnown( "deaths_due" ) then
- class.abilities.any_dnd = class.abilities.deaths_due
- cooldown.any_dnd = cooldown.deaths_due
- setCooldown( "death_and_decay", cooldown.deaths_due.remains )
- elseif state:IsKnown( "defile" ) then
- class.abilities.any_dnd = class.abilities.defile
- cooldown.any_dnd = cooldown.defile
- setCooldown( "death_and_decay", cooldown.defile.remains )
- else
- class.abilities.any_dnd = class.abilities.death_and_decay
- cooldown.any_dnd = cooldown.death_and_decay
- end
-
- if not any_dnd_set then
- class.abilityList.any_dnd = "|T136144:0|t |cff00ccff[Any]|r " .. class.abilities.death_and_decay.name
- any_dnd_set = true
- end
-
-- Reset CDs on any Rune abilities that do not have an actual cooldown.
for action in pairs( class.abilityList ) do
local data = class.abilities[ action ]
@@ -976,10 +960,6 @@ spec:RegisterAbilities( {
cooldown = 120,
gcd = "spell",
- talent = function()
- if covenant.necrolord then return end
- return "abomination_limb"
- end,
startsCombat = false,
toggle = "cooldowns",
@@ -1965,4 +1945,4 @@ spec:RegisterSetting( "blood_boil_drw", false, {
} )
-spec:RegisterPack( "Blood", 20221027, [[Hekili:TRvFpoUTr)pllcGp57fxl717MuyBGKlbT39eCbiBas)lltlrBZU6TsjTB8dm0N9odLefLejT3KRxBbkWHdRfP48cN538Bi1g3n)YMhci50nFA20zZCNo7(jU3pBX05BEi)ukDZdPe)hjhG)iMeb))3fMKeGp9uycjaF7SKcUpmYdSOIqsolj(9CY(8npSRGfM)H4n70lbx4vtP(WJxmDZdhzbb0Q5sZ8RLt52V))R8JZUVC7p5NNSJYl3IRXMhczz5zcvN)Sxrk8xFsyj0yYUqAWMVBZd(CwoLZiOESF)KDjXuVSJmAyWKSCWMk3UUC7IYTJk3YlIPWpxbREZVz(EPjpt5tcO7z(S8QHNpvo)9j8d0jGqIYsI9WN49mLKMepPrhEG4JodWpMeTllhK)MCWynQMvAXYYT3zrjavUDHPrIHvLokI5gfHt52bodonIWIZajVQYYMKZIOE5jEZl3E(C5wDVuThCzJhtmbYUKiwSicWlKfTBsrA52XI)zXEMnT1GIiCEYZCACaAh3E97Ownc5omoOBR0cOK8JzE(eonldf4c7c0pHCOimjfERtDL4b)GkFLyEm)tE5KWK4SbZQNW9YY5ShfXf3zu24B8e1JgtJyuyPqJqyu5eiemxAPP(5EZxi2uwOB8agv4WH9ZGK8jqABOhhcAG9dPA(gX7oUvnvMfQL33tl1nnfv)sAyFtRnf8pIU7FYpeElXkKHadGI)1gDV3alPyVGeh4fq9jNaP6)il(GqrCqDjKgdcLeFOGbXCh4jfX1B41JveFmj8KCKX93NLRnQlFJT8t4F(hrvpRhIut8RiFcfn6i2HOKEPHqGjTBW2m58GveWzddB8i1V0UewOcgyTq92ZR0CsyL8DN42XEAFz0uCN2ZwssHGbAE78FIawgmk(xHfuHnoBHy3QRwDKs451jeLBFT01kE(oyZ(ryZUwsIXNj0ly99QQmPUaE8upO0GqfnxyqlKe68Au6j6wtJPWUcS9Mr9H8)IO0AKAP4X5zfGURxPx4Ji7FElKBt9NmFOimupQgXf32VW6G7T3Anm11m(Bhe2zIeAjeOXINxNtvDqqlYrh5tGselQ3BPk)n1UKAu9GIkVHevw55TjkGpqzkd9MdkwaVU9Q4(jjHbjphpjGe7dGiDOgif86MDrfVvLxcIa(gGLX70K3M9mHhHlzeW(rKcmVQ(QcoS6uSZfaXq3XIdMKwKLxaaMuEHiATnjteg1mTNsqYDW8YscFctmLtdmJgNF)j5DSiIeNWce(swmiBukES9kkq)xQZeJIObmK94dkvU3hsZo6xXYSDUhct2rcXjAL8GKNLMDa4PUtviKKDe45Gftos9kIFoHdL(RIkt5uFGxhjxxujsHLZQZ9)HFJ6xKJoQDiRrq2vVi(7dq0WKYTFRVpnnhIlItIFhaehTViSQ6ycgTKehEAIwRxOkazS4acp4lhl4RKBBZK6tmSNd69GrYcq3pjiqu3vdX2YThPC6BX4mqniGxbvhOy0JzWd)(F(xl3gH4AuS(lM4tczhIRwTNOCyKz4icSMl7uqw42tFEzuqLqmgFdNAi03GHh1qiIATbCw8JcEoKGtQfg7mQAHXBL1aSzExGuEtADl)hqvHTqumE7cjb0kAdxfC3sBw)4)h)FR8))YtqTplFTmMQPhQIwI7iayapYoJ7)tQHM(CX)VMgAgW8(LqRvn4dO0eL6rIGaJ8Hj9YT0oL7BrOKdRMRpttaMcnzZ1Om3eYx3eRlYWosJsaOSmwMerRccDHG5K52D0YnUx)qZS1VJzIFg5Jps6m50qw2rpwSNyv74snHe7o1oj9(vOUQgWC)s0a2f6HWXGnBR)l5gOUSPL6CwkHDMr3VIwLMBFxWm6DNIr320QKX(D(K79xztKMXxngjQupGtszcdibOALXu59B3snF4fwobbtPtZmdI5ijK2uDWzyL9L9l9QNF799BtAytMGoZiHxOfZlq2rWpRsrV5cS4qf(MlWKBai0(c(jjnB5quEgLJSb6fGyM6QHIu1nVxNjzfu6oL8mc3NaEH0IWm6vWARMic47PXhYp2PhBGX(X8mV)ErWHiSpWgkzsrf7dvB4KqGZwyyp79o1zUNXP7QUPIotQtY1oYbVK9EquG)Jz9MO5SRR5CSR9jqHrELDKJjt7jfHxUDXp00pRcTyOlziTIs))12M1LH8VFQkoTPQ)xrdp6c8XDWowa0sUpefb9mxUnnbFwB2a0gh27gGveFGgaDU9m9vHaqr2PyF4hS8JIM5ATLQfqgy184ImQhOzr9336eVWjmyAG52pmWkz7bajAogO2EgmZvwEGug8zDsURZ(1f6jRfaX8Ev)WdV)RQBbREpTb)YgLwcOBy8kK)KcpS3U23MdUZuiwopb2oQNBZ24HJj4jsW2JByWUkNgW8ZbrCc30WnW4KCKkl0fEHpShYIRFZyaQTC7(I8co969on4OPqrEHS7ZV0cjarfHXA5iFvUY2ZB0ozvh12kBpME1I9RR1gRNV(xlz10V826ECfQkdKtsVgQO6BpU3k2THBlhm9LwszjTxw2Jf(H11gZXAcu8GCGMxjzPdzPCiHdWWGjKvnJlq2ZXupXkSJg0j94x2HDOPt)RLV41IAOz8w6JVCaCjKzrSXeJ67Axh5ZRkXsEoL1veFcOUGVvZ3fWDBE4zch3Qbu9F9B)5p9Hp9x(ZLBl3(liqcdiQYbmM9jaEYRQ0Lxb5m0)rbuSpapP6iyAKI8KiI44wRkYKnP8J)idZtDHf79jXGyfd)kU8A8)BVQc2t9rnbAWq4z1(d)0pcisU)2yy5k)4f0ojeYltbN3tbLNqUu)AFII65mRwR(GqjWx9UMtpUCR4tLagg2KkYpMWfFOgVx0)3FL(ilKHNLDYEgsx4R(QYTkF4f4ph8XxGccE(NPt1U8J1)EI8a1FZQ)u7jCxlnjPi58HzPqls9XnSFElg1TYezN3kOgT6(PI1)ZaLfvvOAjElB)kB14uEbjDg1h2sFr9PDWqrrCJgix1xqLFr78VSo1pxUYFwt0q41(cqzqvH6tG5sgZiNb0hwo785H0gwc41JVSPlZQh4DXAYO24GkWYvZg1LiWAy9hnKaW6vqX)XNp3TSpo5or5Ys0Y4jn1Hx27TgeLy7fpF(sXq9RXIR4fkqpqBAlbkCv6kcJBo6kapE01u6DGpy4uVuitN0VULcRHte1DEbz26dLAkfIWBnaGYWRvT31SI(QET2Np3)znUGBRhsZX)muqyoL6fgJs7AC0RNpsPl41RC(MPVZXYDv)65JhRx8Ta9OSnEL0NpB8YIhv5ESDXZVvZ1jVY9T9V44opsvB6V2g8KAUQy0OeqcDCylDNovDJVkMAL8Qu1MUkonR1leilRRqy6FmeRxnF6Owgm(d)2e7ltqT1CvRsT(oTszHMvPliLJrWMvDX6oFE4ufg6YzJedO5tkC8yTA1SPAuRRhfSNInQci310AwtOqUK6UAWLReqRIXhELGIr1S8k3eeU644TNv3k3rAVbQLl6)COQ2Ahd3S0Bwm(ccUZfoH5fiAVE52vbXiZ)WAIMQf3y4gqh5OVGHSqsNYl6ew7bslICDQltxNIHXaqfAtFQDqPEyuhtxNeKUQVQVRonPlVvnFKu1uwDMT4nMV5MxB5wBE9mZU72aAnzxlxz7J3sZAQCVfx3gSJ17Gz18rgQQbUFRV56v3QrbunIg0U2VNTkkrAbyT7gALunl5vThC)vuBLeCAKZnwU3aGNMLBmy8aXJH3YRhq3OQND)q0gihOIC6sxTqU3nv3A27q8LqKdp4FTAuNJ4x3mKhTVwZv9i9TyX1NmVHWDrXK23UHS2NNk0IoN(c)jpn0wqxrVARMnQL3PDbUYotguZ38mDGmV3yjb41wc)F9TJ1S016VbkdJUXXWh3011WHjlzSw)1Nr2i9x1p78rgiG)1wowrCYpPKEjNqDZPt1(gFPPmzq0)BH0KLab71XnDUyTPed(0Fgz(Z(z5mdBMDyxz4iqgv1eq)pQhaoyX7mrTAqDFfwxg0fnXXgivmY(3RJwWex9XMwj11qOZ9ZcHolHcoVioDJ1EgzgmqnE1lqiBU21XkLSBxAcCslrZFxB6smklFAm)UJX1dD33MfhF4A3roDH)x2IBpKVX9JhlUnLn)Zd]] )
\ No newline at end of file
+spec:RegisterPack( "Blood", 20221029, [[Hekili:DR1EpUnUr8pllkGJ8MnU(X6nxkSnWDPffj4qkW5d46FzzAjAB2vpC1JDRlm0N9odLefffjL386ouGGG1IuKZmCMFZVzO2mzZVUzTpjJU5tthpD6KXtF3OPtNpE2dBwND(eDZ6teVhjhG)iIec))pfeh7Jp9CqmXhF7048epyK1SW8asglo69jK9zBwVlNfK9HOn70Vd3dV6jQh845J3S(iZ3NwoxAQ3M1BwhWsZs5IxYZU5NG)6tCPLgr2fq938tBw7LWYOjmcUx73pAxCe1n9iJg4pkndK7ITRk2oVy7GITj5ru4Nll2oT(3mp3tXpttg5t3Z8yzLdpBSy(7JtoqhbBsyACKl(e3NPKtXrJQLH1epuHbBvC4U0my)3KbkKrXSukwuS9blcbiYnlmnKpS8UJBXmJBHtX2ogJeAiHfLc78YsnBuglK6Mf7oRy7LlfB19svwWf1wm(ei7Idzr8tz3aw4Ur5Nk2oK)pl6Z0Xnkuijjj(5eAKpQh3F9NOwvcXjmo4KMDZNsYoM66rsOPP4go3(g6ftoKheFcERZT3XdE(L2k(8yENDZibXrPDMLYM7MMLWEK7x8GX9gFJNOU0iAiJclfQeCLkJaUGzcn9KxM7S58dL56g3Nr5gC480poBeeAg4MaonW5HqmFn)Dh2iMsZcLY3QiL6MMKO3NeQQAnHGFjYU3zVa4T4Rqkcmac(py08EdSK8ZcsKVRp1JCg2vVhzrh4cIdklb0iytjrhYzGp3HK48i)648Yd(Q5KhDmo4CNzmu9CxSxOS9oBXRW)8oIQsQccvT)mp(cfb0WSdrGDpfaoQ02oFtfZdwraBniO2cv9s7IzbsyIvBQ7(KsjNeuU)tgnPL(08YOQmzSIUeFcCoOznZ)jcOzWO4FfKt564058tV2s1rkjjRkaPy7Tctm)57Gd)hHdFHf(2snKV(ULzJKxa3KtUqQcUiAorHwik04vl0J0TMgdPNWX6Rh1dWdYdpvHCl2ECEwbSBBvuCFkrqBGGRZhL6bjEH8tviW4XEFRdOM3B1nDIz84wiUt5b4cirJjtVoJQ8GGuKHI2EsEqMUC(i9GewLn(drG0LKFsY5dsp5dE0u6)TjxSacllbdWdq2iTpFupE63N(TJLDeL9lC9bFaxsiGpKDf548jrEasul(faDN2k6AwKheIKDe(VtX4ZGW344a)4NH)6ijLhnhDG6FxX2NPVkacLtph5b)GLDSy7F9x(TgDPCbezdRFCEk1fKSWufBZdYtkHWGPbQRVYSutB0c9TtYCubnMJ2kqUvBwlel)ew0JL50uHFfbSeiEP8hUiFZswNvNPaQiJeKQfZt4rraHdD4jbUat5mLJTFmdSNNGGHSy48OAU1NJhocP4k2Y2JNyWXAc1N5LbBXz8udpbJIZqm)ITH5EWHilQ6nJGaMIT7ZZYtOxV5Pox3jiPlFVLYEWryWq59SdhZCLhGhLpulS6vzg9IFcELOS0g8st4GnP8AsbkWCUNdeYLgR5U(bbCOkjXvk8ZkZRLro1dcTfQOkRyBYTwqt7BjlvGxCKZeZ0BRsTMHNV0i074qcj9u3szoeNaq4GkKwod(6AM6QtFeJKOozKEvz5d1aAA9FnAZ1LgRFWO(qq0moFLnJnDvll8CJbkv15I7YNfEfuWwKpjXVmfkaN4bfLsAsIwVi7dOPh9kRrxgcptAj(UvSDJyzTe66jPw)PcE77bcymFkaos895071u)mKVKMqVdDeaXatDIIdGf8y6D8mLaElsxccbk2IWMKa2HOYv7jAcmYuCeofM(nkyX(6yyCvybgkx3(B4uHG8APik5eIWSj(NL5B3Auz(23lWsTPE9u7pF4BKlZcev4ie3g3DbeFAZE(sqbmBfgAcr(Zcq())A3WV)1dBgGwYpQkJ(yjqc8ecajscTZteN(Fu6NIjS8)W3pLoKEFjvrBQGOUGbIJu9OandRWwTJdMuv5MZDzL34GMoHEKggdqCPSubsxj0kyVEJTUROTuCL2Vm1w7vmZq2y5)degZekqi4OllYLVQTmPMqONm2ozQxETXGzAY3J(90djBhd6ST29ioa1fnTqNXsYTZmA)v0zMz2pfmJMRwLKkbzL2RuXowqP0CpR6HRRoprP8cjKtmUceduWsz4g0TydDAQ5ELAPHLMcNMAgetuW5Q6SdoDZ0VqnvSEEVVT8wqmA0ZAANGvQ19q(HZBRuqVPh2Dv1pALHxhqO95jNf0VfdrtsPji7afheZuAnKKQUO8YijRGspifNrs8iGv4uEqk9kyXvribS90OdzhBv)vaw(BQ7)k3)qiTS9CT6bgy1PyxcdCXsTu03wncBplHUR8YqBnPwbx7ihCJ37cEbEpQ2wnZrxMPs3XMajgtk1JSnsDAXQpMOe4sYQ(5nHUQpxoL79stPBOFhoWWRRRqUR2vVAJb1EMQJsP)eed8UX8KXD6GE6ZKKqCjdHQJ5jsMPgF2Ak2DMrMt7ya32t5Pz5anjk2Xzj4SQm(1t7Py8AWH5Lgh8eg8jNeU24Roj3J5HKOywzdEy1912LTxsauFPwtmmK6Z4D2wcmuUw)M5EiiEhjaNO1OjrOQMtGfkeZtpcqHifYJu38ONJtGkA2u5xcfnNIts8baSzny9XkQHyIF7h)Lp9Hp93)lfBl2(RyZnzq6Ie4uBFmSnVQSPiVc2D6)ohc58rdDimnsEwCiOU(1D(oDuXh)zgkXtGf79XrW2Yh(vjI7Y)F(QYwXk)O6JhyicST)T)XpdEut(pdfl3pOSCvqQI1Q(3slKZu(7x8X(0UY754fQEp8TtGQBa0ltIM9ziqYw4VHkKat8ltJeHGczQ5j6KQpWfc8vFOSKnSTt8VOfyyiQjp7yCc)BM59yR6I3Zq6ZLtmDKO3DVE5FUjcgx3)uXwXDEv8XQ5dZs6wVKFS0fEj)4AYV3HSQxAQuT74S5x(2X8T9RWnqjlcLlXDS9lTDJfsVG42PKFyZTrj)0wDHb3IB00fD5xqMDuZ87xMuBhBP9SIOh3Q9D4cGADERCDu9PmdC6CzqlME5sRlbAbW)Dy)ATiqRJHfVHfuqCW9EXYPdAxWYky9h0Lz)QLqj5dVCPnHCCYT87fT3t4kPPjEluERooi2EXlx6Z9r9gtWvSNRBPJ00ude3uPR3AxUOVRCdhCnuP6yd6o1(8wAf51(ImQqs4jRFbb16DLQtcHaE1qIc3RLn8lLKxzQSxUyGg7I7RgstLRD3imCsMKiUBxJHE1SbsmLwT05DJFJJf(P3oB4q9BFd0pU3gPHE5IrcIdUPxYM3PHc5Yj3PswS1JKLg112GLud9quP4qcTmylaALYh8L(ulf3oK2WvEH4RMZrwwvIWOwb1QLZgpOH2Nx3VQt19eeBn3EKqQFq7UmxZQ0gKYXiyZY2yDxU0DQCfDX0b8b08XyoCOwPA6ynI11JcQiydkbYNyAnR4siwsD3YXILCOvd3UbFunlVutSXvhhVPndlNmqBZZxmx95(m6khdnf)1Zh2Zg3Qx5yCbI2RFFBlGON5xSKOjBXngUmNbo6tyisK0k9IUnRPxACpxNQ00vHyOpaKH20hLiKQhg1XuNWHWv9z9NOtsAtzvZNtwfBvNPZFT5MoFRLgoF7uZM7ghAnrxlwA7ZCtZAk1Y1R7a2XA7Jxvbh0nRgy(T)MlVxJaiRe1ODnF5FLuI0cWA3m0StveKx20ZXRi3kX)8aNBS0YtGNMLMDoSZ2JU3IoBQBu52o2fTbIbkjNUyIwi3hgRBnv6)OaISBpl1krT6oPUzi6kPw1vUBKw04QMkAWDNNmP5TRjR91jdnVOPVZFfhD1f0uOKB1SsT4bTlWvwzsNC(MNPde59Alba3AX9)27hQzPRKFduggCJJHVxJRRGdtAYqT2RVISrux1V68r6SbFBthlTDIBdxj4eYBoES2347nLjdB9VlKMS4iyppUPwI1es05RwyG5VyHftnCy2IDLHwGmOSia1Vhbaoy(BmrTQtEFjwxgKfn(XgivmW(NAGwWKj69nTsQRMq3KVke6S4k48I40nedxvDhxyqb1yv7Hq2mTRJvkz3VWe4KwIMFwh6cmkl3Q)NTpUEOBvDM3(Wvtg40g(FrdUDx(gVD4q(vqT5)9]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DeathKnightFrost.lua b/Interface/AddOns/Hekili/Dragonflight/DeathKnightFrost.lua
index 5d65225b7..b6838779b 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DeathKnightFrost.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DeathKnightFrost.lua
@@ -514,14 +514,6 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
- -- Movement speed reduced by $s5%.
- -- https://wowhead.com/beta/spell=206930
- heart_strike = {
- id = 206930,
- duration = 8,
- max_stack = 1,
- copy = 228645
- },
-- Deals $s1 Fire damage.
-- https://wowhead.com/beta/spell=286979
helchains = {
@@ -1652,4 +1644,4 @@ spec:RegisterSetting( "bos_rp", 50, {
} )
-spec:RegisterPack( "Frost DK", 20221027, [[Hekili:T3t7YnUns(S4k1Oin2XJOKL9mBz5QYMD3Bt2Cz2koxD7VmffjTe3HsuhjLDCkx6z)qdsacaIgaKstM727(ZUzebA0DJg9xOB4h8E4xE4(OGY4h(PjJNmXB8KBU07MPZ8E)d3x(YU4hUFxq4Ncwr(p2gSH8)(xYZkkpS4p93GV8sAwqeaHIS95HKVUUSCxXF4DVBvs569lVmmBZ7ks2SpnOmjBByEWJLW)o8DpC)Y9jPLF)2hwQF5F4(G9LRZYF4(7t28DeaNeffxn64Iqb04Wpm5Mdl(yyz2Y48dlaO8W9PjfLfu8kz7Q0y)YG8vXLKF4NO0B82GLPXrp8hjRsiGzpCFE8MS8I404Ic)Nt2wgNxTs5j7QgW9uiDyXVqb1Hf)Cwzq1xiJHm8KGhU)PaY)hbYxM)S)Y9p(yXdLe6szfBgomKlZt2qgFmbpoSyWHfLbPXBlVmjmEj5h)uC(L5bB)0HfZjKwd2Uo75uc(4VmnOOewKPOlYzhwWrRDzz0PLVFBCbD5OOWNssP)8MGW1jBfXg(mFey3fHVuUo2FxEsgb8V0GocFfqMRo5itZsLTmfagiXqwPzORea1dlU9WIROGM8ptc93L9mHHgf)ysycHaVJWtNjY15aNSuxwdwXVdBjLR9ZE0NixfLhSkRiGnoXnN8TWyQfJiO51DLHWWv6Ipuym57QeSoS41xrOQBROQrkBp(fL5jFIY1UbfDAwhIuzTimUq37pkYImMik78tBtwTU8syh7XmYHlIe)VreWcJzuFuC1jL6F(YIsIkjkHoRIpOoaYH5GKTf0HSkKSf(2dlMkXswLgeMeK6he9uW2qkx5dDLAIlWel9gF8YLMKN8u1IjbF9aCCdadYdd2sukMLNtKQPaexjLLTsuPmYz2WS0i)1Xb5g18gUg2RacmbSGiP097iq4WI)kfec40JGaJFRD5kPfohEsLWXzikw2VJndrsS85S1bBJ8dxhdYymTsnKct67U509qyf6XKpS49e5XQP)zb7OlqVroVXuSBKz7xNzxXjDj2rOTGCyhMkJWOndmwy9ROETaq35BYy9oS48dlcjcPrzpVTYM1ZVKVPW)X95VawsIErMRVF76S0xaH24TRkxlHzQFR1Ioctg2M9yBmne1IpgKsMNFy((IGOgLOMyXCEbkhe2SNjXSnUJGY14SuKPp1m)YOld24x4ws0XYStKNcMQO(2wulUBloqQMqnl7HxjniZBJRdYk8xguRkAK9D4pune7CNBPgJTStCLr5fI1aMVyaNYK5frFtLnU8hPqGIjFuGFFyX3sM6tX6DX3KYAZElRrvQgVhSVuKH8sipMMcGYnQWrjkdd(Zz8qik2GcoJoN3dVEW9IUxo9WLHoQWczcrMKzAfwOS0squurTZmMT3QX7CvNiPKn5a(veD6FdxZjjsLyGxcYJezZFdujUoyZojTlVTYNKEfKPOpx92RwvXVEC6OjY1ZSDCu7PiCrwllx)cugxI2i80UPF1m0LrnEpZmwSnVRglydaX(d2C9MPNFJhbPe5bwm4swepzbX)Ym)juylnY3rwRRBOWk3caVEJIddEXCyENMLuJgdRreEcw2whwBfJy)21NGSZziIr3n44zuJIex5AlQYf9y6OuO7URab0V5hVnEtsCLxFtnRaV1mMZ0yQ(LBNttUXaweG1kYj7dbpbSWQWSlA0EdNmToirFL5hkiczHFImCfhUihWPUgg8jDQ()cOBg37Kpl6MXnfaSWSYkO5)y8tKtmCw4a88nuJqMsjrdo7(zivBisKdlDmo4kNg(vtYgv20mKPYgzvLuSjlQQkVpNg9(i97845RuHn1W6SKf5tCQmr5yw40A1h0GLoKKYJF32f67Z0(QbJI2XBvdeY(wAZyOgxx9Sc2tzEt75(FllMoiayfn(CT9ArJTtQ38W1dB6UboVcXOUjPzu8CrWh3BTEBeAn6vNN7QuEuOZXdn(0ZgplvSaNTDkTbjpLKHZwgoMSlJ()B0PdxtPu8gQeb9Mn8FooyhzCnU1xDg5AM8Itz55g2O1fQRs2PjcV7sd2UTYrelrAmcLNj4LOg6XCqS0Lt7v8vZgC4waDLJoSTMMBglZRNw7uh5usL(PXsEOPJ8UFFbeN)J(RcJS610zDIGoLsrZCvkYp(x3fhwclrL4KrPIApRQXu1rWr2UZd)CMU2EE0OTOVNGHJGLzBs2srh)0KnlnNRbxLc6d2AgNWDS70kCE6XCC)f)CGlSjA8eMuY31niU0ItYqkISMtDIR7vhdXFMyXXegStcW5kzd7MXsHeRzgCwLwKUHxzKJyWdw8v2bb2oi(3hwQzAYPIlGYLVECVrbmrWPcwW1r7w86wVdQv4Onddd6WTnpbF4162TTl7Q1kbX)8GKi)4NGXdS5lJ)vOm3Qa1W2Fg2bQVE3ZB)1O9SCCjCojyzrw6(Yy)Flopt(awpb(it71kHV0Cx9wsoO24Mo2TzMoumUSgMaZXg98Mo4DZ3OhiA(zjo7GUvIet6mbIaf1AltzJd3NtB69oYTVbgRwgXmVHmBSPoW(Uz3pr78wh3R3JRCvyRlsiZZ5Lt3zwJfwrdhAodgzvwH6BnBaeXpIZ3K1osu(bggU3RkQvUJfErvUi43GYUWs)PZec)qvhYTI6qSgkOQLq2LJDMdZ1fld2oOysowGJxKTpLWBc2vFluU4Wn6M5a3iVDeU(Q1Kf2GHZwkWLmgueqWl4kOiyXoi9qaQBmdTOxPXamxtmO6u8uLPs8zMDvk8ZCAi4zs70gV0ge7DIXOS9f)OTrS8rr0GhSTuB(OyZGYYk8J23UMlRM9HfF7YeI4xcuNRnCBrN9KQNbUcY2xXwlDKAGGg)87)XdCheCtnosEozOOEFAL82vsyZsDuID3REtDeL5vuvhIBqhniCe85G8n0eVNyR2p6ZAkwYl4RPv)iSUGUOkhD)CaE9mWu3JQBbBIxBDIg8a7dAhbZ9TrUBbQ7X(2AVbpNyojUkBoaL)p0DzRwXMoRlK6TILlUtlPLee5qP9O9qq3stMjgNt7dtnMMerbG1eNeHR4zDS)(TpNLxU(fZjcZYHDe4zSlmSKlvWBNLKTQl3TVOCpb4X573124bFypLb9LgzCKGEPNN05QJ6G8xVFtW2SKiMVwulCWc5N8yLhxAbU0a3SjokHw0eEcUhtSyUM2JCIJDvA2YGuyGuB77YJdZ2SmqBnVkzh)p)RXH7PrxUe8EpgKiGjc)7vK9)lHQBjmEhO7yB22Vzn5e(J7tRm(LbYhzBtF5sT4NgZzz7ieFCjWde0tNNS9tGx4ExUoOWhsToWuvoBBkwpxpowdWM1Jl(3eX8BmCOOzueB9J5At7WABwtJewygn5iWi1D0Ncs3tKAiBnbCGu0SYxqCeo5PKi6E(lepXP0izFKWWPujza1jgMDBmvPgM87zKFQcXRgFdQ)1cRarM57jFmPe(raBiGGSXccqeispItlZ(84Y95esXdwX0I4MFz8LZUKQBWVQDsRPcFp)Ix2g2iSX0Ea)xKLXhGYd3tMD9puDGOLBjcsH6GK6QoPEv1iXo53zj2j)VdjwTOPOeRXTlvp60Q04mPdiT2fq3HOuV5TpRm83jnayQ(szCRUrJUSkTNkRg1EblbmcdVjRssIDSKJExlutRAH3jnaNrnVUHAEcOMQ6NIYKnAu)uRha04qSWSJarWjeIH9gjSkDk0FQEEQ6QOFRHE4dVA3d8EExEgmEWU1FnOchAiOnzrjpMaQEkjAIwrRztYawNSAn8Jnvon85MPXicc2aG85400Q)Rarq(iOCm5rrYMm2eySWxQ(V2Mr(XkE3ZjaS5vfIw9DTR)q9A884hGMOZT76dqOqHhQ0kYb848QemKLVrB40qPmQOptuJssjmDOFDyFxKWeB5DQZV1RpytWhYLklNQvhIRG5gAY7YK6mHNdkkBY)HrsSHrq9nkNM4kJz9yzAwwuv2hLfU)z6CrY5b)uICL7yoQESj1GlX5fX5qEQmhGTvavxxA72dsmgJB2kOsHnKc))5(OvBI3AjspRqdYFi5WwqQFyqAQJHfHbShtYJPBFMdjYwQHSegbsE2f21cwrfyZtc)uH5iGSLjRbwJO54Z6)B5X4zoFM3I1P8Q0BjxhM2dAvkdwf8uCk)CDsoj80G8LalObWggJMZvSzvV2e1IfPzLI)BPuuIYx5Cc08JiLiszd8nMZu81qm3NnzrSLX1gZq8ekkbOwM1H8wkDbhkAT(fUr4dl(fbRRmBqutOuJGWJLsCTb8OAB2xWSDTKmkIRsrWILdJKQMExa5exedu)DHGjOp(kxQtRLY20KpZBlEM2w8612YK2BlTCeuZ2IK04eDAH7OeSfVGr8KT1Lrkla3ac5OfmfpJ98ir70s1SNHF)NkYWqaLqMgG)3y4)HklkikZC8J6)fG9xWgbiDNvs9WdMMquQFS2JTTXjvF3o0wMrJ9veo6m)zrc3ephphfOBBQ78Fr32AjJdoLLfBntuFB2FUQtQaM7pcjqU5gF12TCN2QQ)2QMtFqRsqbsKFdQyRLNAqcQIkXUoPMfI0vqnlr364ARekFaS2orW4A7whO392Ql3qPPlGvKuOSh0wWs(v0P3VAsgzdoKmDZiPWxT6(NJGuMU78drKKqH1lYxHseExOC5zl6yAWB3QSquaQRTpjJnyFAxsgoCYeYdaTS6PwqiWNgGpys4PGKuk7Tzz3q8dHOmmo(3I56MyFdcUz7k45TtjAuSetAiqDv1wILUOHQVRw3d6TcQWi(750bDyrXU4qi)grhesLZYy6H2kFbR87lyFzgXPXKWdliYBXuxnROHIlR5(Np)DmQ5cW))5Cy7xd6lO04CX8fiETZ4zgSd8lPIa0ahbyy9Pe4QkzJrI0G4nB1RKZ0YsIuwMD6zBqWDaI0lHJscBw7xfEsbfnQlKbNM38nnAFTtm1RZ(TedffRJPhA2(BVO9c5BniBbU2AcnpcCtvDlkj8fFY)jiHQBTf(STvvyOYRNeFBxdxt16IZCTEvVJo66gdeM6Ca3atZO0blUbMgEt7eMPAV0zoKGjuTBRg63ADQkMEqBRfSbIpGiL1ysgHb8yEYkqtb1WcbXfpwPmWmQtL7qhH9SGQUhD8Vdad1wtAx34lRbh60mXPnx)dBRxRlpACVr7DaP2CCtNX87q0neBX4i3)ye3BKTf(xYYHNMwW0wWoY(orW5a9ccIIjObXUpZdHkNfyxJo5NG4fdyzkMEThqKOqaAn5IOCnCx70538e4s(VHsJmcUeIG6BRa8KdUG0Q3qx4(n(oc6ainaaVzKfizBnKima)Qdk(WBClz9cstLUGbQGRpZ7qaZrpAvFfd8AXHFIBOtfqIa3vSDBzfB87yxRv1M25mHK3Y(XMn4ZRmTY(S34XADh1Xl3TofsYSa7UAw)4Vz(srfnyaYtDIpAgIUXd9mWdNmwdtu1TyN13IMZ6oixCRqal6emB20KFxvl10KpoJ4wV6Bh3qerEnYus6ArzwikY(CZd5HcxA4ndqmYgLCYXk)i5BwHwr91TpqiXafzXQmZsxgSeEkN1d5f6FNqSLbG6T6h07)ceF2fhw89HVaV12P0crIMo6)dMhGWybxavIm20BYITyfmUl6Y28qZxSe69V00saM8HHAAT04JHaof2klr0F1gb56zjtu9GtA1OEN5JJgt6JH(hPNmoNzmFPPC88D1vk)m3jEBsx4snMjg8KTHM9K)pN4FRS6HNpX(X0CMP8LKQNGNlZos1)ol23IqWtAAhWmB24KO(NvVnbKBPP)V5mibKpqFJryfruDWrUFMwNLbXRXUaQQ4MGaVi(j1aAiqkXqRQ(JiICvBv93Zdm)CmcbE1Grbb2LkAeeSYBcaa2R(MfCG1xyaiSwcncVmZiU6O7DqwWBjZsL8SVm831wsvAuAYyADQev7w95AE03nZR5)Tpay24gUSQP02zjRAuuYzGeAYwya4uef3yHve9e5kTjtQJ6cvrVggRpqhDLV6Ifo3WsXvMIR4A616QMJsIWn0dqVBpAgocCczl83xP6lLJe9vbmv(FsNE4(NdYHB6Hyt5)8B)5F67)P)T)aVKLs2SllVSUkB)Aja(1qAX(V2xvgsf0KSvFDuWpeUoy7kiFz)Wpstv3mcm)USTKvN(5VUEd(F81vA75)B2Um53h69RJoM5djO7p)XFKdOd)GfYRrTq3OTjDh3KOTPh58V6iNFp4TUYsRod(7l789YZh(tugT4Vld(1Q2LGaKFCFqvnUxqD7iBhCuhW4HVBKc4(WPfCEJpvWZkZxuh2N)TGjce519y(g45DE(Eh7rkVz)UTlv75y32GU5iPV3375BLEQR7GUrp9rf00JuGtuGTp8ZPh38vnp1)nMBoTARMCI1wjbpVEqFshmpwvtE9XA5edQg6oa6JWQepOhsBYyqFKYKaWXQGEY4EaarmysFeKKaqFeKKiH(SlCLia6ZUGeg0NDbrEW0(Sl4OzaEVW)1DYqWeJ6Bev4SjlAF6(cj9nVrvFtF2KNAA(11(TNaiAkh8)H60NEAPM(4vJb0HJ6t0qntAtnxDATf0srSDE7vomDdeZmHPFSAX7X81BXVhwd6rKT1j48Oom6cQ9fpW2Ph3E0XU1in)(yHqug7ynq0h7dI8pvV)6oa6JeK4H8JpqU(idjHb9riqYxP(ifirc9xmWQIb2DNCK6fSR52ZbJQg0CB0kO9v3LPBy1pwDshPvpJlVDS)iTAzE(2XExMUvEVvbz(1N1nj5JokIEm)V0wi9oHYdhRUnvlu8xOloeA(L24GvPIGS4Ujp0h(XrAXTTZCFpLgG57nH1ppvxnoGOpCp0bpW9u7bV4yzpMavz5x9v8Q07p93o8dW)CYnhw8XWYSLq1nc32daBYVFIE7Xo8d1)7l5H6D(8318oKvTw)lYRILEI9jPgRQM6QFLEUiB3CA9qx3EvEx0uoYZjG8IWSTrjamN3OevSFIhmSwyr5AohCw9VR7(njtIdmohG1B8V5nOv2kBiZhp61xncFZ1guZszapilYOUWqN0xg6KtjdvZts1xegQg8OIHch3()FfOo0RxbQUioYWuvbYjIcKEcIJNHCaxVykrCbr81OOyZ3GbZFpmg92HExo7CzqslpcglMmcEDDjFIB0O7gAuFsZ3mTMAEKZ0TME1RPlBfSQGRMZxF(s5z0IFUJ)0z1CsS55YYHLt(p4a1RzRNoRb1WgVHXAz)1X2DMJIZfAka(psWwHoDMUcNY(i25(hweHuMrt3expw5IAzU3GHTBI678M96RNPVzGhHVycLMO2f7U5tgmebSV(Q(FFasFhF3mdisth7wJhvvrhVFI5MJm0jXCbwETWX)LMog2eoSt35e121DWqkQH12V3Ukm6TtF9v9dIwnG3oDKaIXAl3A42ULELGOAB8sGfobj3YQYKLQzDKAeJiuzAc67dx8jX(DnZdNm01(LYeJWiQzJAB)KxFvv6E6iI4nBRODdZYX32TiRWNYynfl)3W1Q1WAu7PvUiH6hgmubRVMaeKMADGYqNw7QZ)Y0FO4sjTBOmvxogo05Ev7CVrVHCSB0BgoeerpFkXgSqVOD(SrJER34XI(WaNsNi4hJWWVD6SbayUDYaNXGB9gJtRA6FadeRP(sqLq9ui0jJ7eLYAd178gpWP13izk1jLYN4fRwRoWun0(HoHgm6ugz0gQIBKVPwcHRrqIyvKRor0orhbVtjf5ec(qDrYJZn04KuyCmnbP4Yk1OLWcFgsprQQWJ6VIg2MEE5WZqn7H8HbNHBEzKKPyLY2hiI24AR(0zGo00Kyggfu)bKY62nPZ7mjDE6Ovd01)Jg9nMjeD7Jy7vI4Iytt1grio))ViIm9No)IlU0du)ZIOs7wiJQP0iBs3A1GUS)ewzDr0bMw(w3ayX)0abMjm2iBIRUAhBiLBPc7JKNZk7dTUYITpq(LN5Yqz9iHatR5hz2FA38zgZckjMLHABZS5Z4rgG2CzCrafLE8FNh8mjivPwh7wWXpjtCkUOl5Bkv0aOAJhm1jh5IKp(cBDj7G7byhcTZeebd25LEPf2UmxqMEdy2NPudlPtXwDk5A9iOYb9LKfFEBngsFhwEH3NuQklUIcnUAROx5wVpmqsS8URubFlNhRoQWZLeCib5f2qbsACmWmU2sZVkeBYTahX06l5aSKbGf4FdEPlDjhlHPoFH1aMBNwBzwq3WBvtVM3nqu11wEr859eaBDW66cSDYm1Pl)yEwpDTZJE65pspyxDacUvNFoRSkFjCWwD0xZ5ijwnZynIvwzGP7urdK45EvKIVB4vZ(MAgOHKU(23ps7I1twkhccsjHVeYvlr0cz5GJRcu8vsrw2aOpsiBC6sS(R6ohrhJ9QX4XXQnPn6wwffokR1TtP7PX8)6ep5oHV(gVR1ar9c2hjqBjEFKWR7CBTIX2SfPzkg1NC71Jv0Jm4WIpk4wHDflvUMn3fXEICsNK5RaTvUhYAHcTUYeXNiM)2gGGgfzoS1ZbGJwhy7QFhCjRl(Rq0bnGSjIH5e1Uqs9iyusLzBzx0jEOpyyLQwIxoy7PdB0rkDzTvUKk8yzqJQ4U5x96RDAcVFuTENJFTFFhxApPQLP5ZuVovyDAdggtFjcRXBC9foHK(v6L3n07CEgiOFT5VC8GaC0lJ43xO6FFCgO93fa(XrTibl(ij(aWgF((IGiWrkmUITSptmPuZF0Y6qi6AUHMPm94ixSGJvPxCmU)CIjJDf17sOO4C3R4xung7DDqwH)Ya65Yr488p86R2iUBNIYYUAexZMAQy41itX8DzWVi5KK8LxRMlcrnUCWqyMAUyzZSu93GD111D9aR3y4T3myOohWfuBjuqhJq9hRvYwKfxmtGqrpL94J(e1bcgyTKZfdPrfHNiEXG3EZ4kE00xFf8Q6wII3JaH7EslTV7nZ(UxZLJDd6odAXmGqVQ)zV2VA2D)GDNeRKfE8M0xCt7gqxqLoVWDFR)4rhf2n2EtxwOATTyfedxsu3aQ32CEBeh9p6TpHYHH(xqDPWsVzSybvbF1PlwPZBc1ax)5(tfLQhP0bwfN2V76XDAHu3vNIOzxXZqyvdcvR8p9QI071QOlOtWt3S20HJPZZq1aQVQepx9xz19At16TSilDFzS)VfNN1Q4bndKrT5U9K5sRCGUWDHt1owaKGfP2KLZgN(M2tU1pXzioeoYeNrCPzHCIrdNvRU0UXBhGeMilQwnZajorBSztY6w5LhrCBdo93H3iKTiY2kXHlcqJ0)DORXihGGsySvkfUB2G6I(HL8SDHL(tNrCVs(a0TWbiJoEkQdfsnP57S)uEnDYuBqyEcK2fcJBhzaIoH06srnII7iCLvqroQOQvrZcIkPGTV4hTnIU8y3QJoZmiNWzYCyXFod)OZOwLy6m8QrTLAZMa8QUxCH)Ytls41xA(CkPw4hTNgR7W23Nb)aBER8elCMT18g1LB2TTUF7QjungpsWlab79cEbiSPnsdRaKfFoaQ(2v(BsAL16M0Yp1k2rca3OJr6quhXi3GR27EYiCn6hNXJDAz7AVqdqlJ2Jq6g81OdgXQ4hA9L6(TWMQTU71CdFSvKuSpc8uRIjv6N0Y)gAAdrY93zUra0uqBaO9Ha7G82AIXu4Ihwh7VF7Zz5LRFrccs0Uvg3uLiFWopBBvTI3nTem9WhA2b4D69U9fL7jlzmu6UufE8p9uguk(KVrCWgesRnNP(Z(R3VjyBwseyk4Iewza7NSztCusqj0FEn)6Q0SLbPs)ebrrxZAJdUEfvIAPrUbCCRRIt(82LzsBL(QEWmRXgI7TNbMX7rOiwpUDS8oD32kRNWGTSa9d(UxT2gQEAS7RQcXQ8uwZn(PJuzfiIgMRP1OXLcEzBY)jDLxYqeVg14QG7SofcDao(IcZUwCp6iCdSPwhJ(SSz8fG1BcDet9T4DpOatT32B8TEUo)oV1Dc3m(9NH76HAb9LvOmyXztWV(h0hcn0ttT(sTHCObNS9NFHklw)mLo1gmtDPcpFzAwwepRhC(N8nx1AAqwgJjM1YbnIDCI1Yx72Nwe3XPMcKBH))CF0QnXkEtzF2WEn040P(qTJ2Xj)ysEmLx1X5Tmyf40drKn8tfcXm4u0)yxUStluNknaS7z1AoG4D1Rj31NYIV((eO8CHUOcocOZ5jPc4116hez6oCEDqJhXG)9WFoMZd2(jrDqQGuXteT6CiUu5IrAZEOOUWcQq616AIlPTuhVcPuh7A36yHx6CTWoSLr(xFvdgsmonQdsenaLxdP4ZUZg3SMhu96)VD2RVIO(NFI6OKtozcd4aY9Yg7KiEaQyyaI1DnZHBPNWm2u1DaRcEkoLQLekc4KCcWdYxcmlQ2PFH)Izu)2Iv28WYqFzAGFJ(81aT6tC9tVtu9RTZfSxDMLXS3Ad6su3RO7cQErYQa1FNQTS6n1H2MPx2g5jmao6xKMvY6ziQRoyjqTwBmsABOjyu6LHHzbt8rOrm7Lv5nKZ3lvEsCi(k1mtLxfM7KZcV7e4Ktdb6HqGEDIaNmsK1yMa)QQNEm41sd(FHxzGTuzbbrj2tMe9Llca3fSrasxzL03gjyACK8WIpw)whTnoP672H2Ym6RKMeCCEdOscd7vms3RsKWfrjjEXMuZRfI6LNzlTvefeUu(k2iPjYKuRhkmdYgi8HptKe9pAtp8Fd]] )
+spec:RegisterPack( "Frost DK", 20221030.1, [[Hekili:T3ZApoUns(BPrW4ypp6Xw2UNzcA3azZU52jxqsq6SyVp1YY2YT12YwosY9KoOH)TFfjfPiPk(qYEYMf3HdyVmwKfRxSEXISVB0D)YD3UkQm(UFiyyqWOHJhE5OGPVl4D3DB5t7JV729rlFi6E4)yx0w4)9BZZkkpo)V(Ft(YtPzrRiqOi7q(s4RBkl3x8vV9T3NuU5WIlxMT9TfjBpKgvMKTBzE06sY)E5BV72fhssl)4U7wGV8tU72OdLBYYV72Bt2(naKtwTkMn84IL3D7D3MMuuwqw8SfPjLX501iCFwwAYU7HF)hO0w8UOfPXRU7VaaCjze3DBE82S8I404IIWpLSdMkdO5j7zd4NyW448Vnl)48Fuc8F1X53wgLxwCC(OHhNxeVmB3k4FSiEDwE8X5)usAAemNS1WKzCkGhexq(f4N(M)6D3cldaTKO7U9Xi4)hGCxM)PWfhwVgg1ZpFCobnFmomEx82eYmVz2X5b3vcCin6Pgsf7Jttdbe7(4YIlVpnAzsuAy0QhJ2TmUcchN3748YO04DLxUMGAflFQCt8LCakypAtNSYJnUYe8(YhaQg4xHBJwUjzhqpXaSORxdAHJixCCUG8xfhvUPiC1H4q24RXfjeLGhtmirfAaX(HBWOEAzAmNJruvaOp1ivQtga)CeLme0afrdlkZtEioKOuCibGRkDu9zYsDLXLQwPiRC9YW8KTsSJnzFIsmlsJkkjW5DNUkr(HDjlHTnFkohKeRtwMaIURpo)QHwvjEVbrHcLkHpMwM3nexy8HwjQbOxruJPevFQg22OKDHBI2T6YGnS9wlZEeGjSdyx8Y8S0S8vA)(dpbWB3X5dy)EnCNqHRmeXX7rd9wlQgSDA3arlolDv4MyWGKn7Dl3ayDry26WeInAftDFdaHJZ)7eqaMNa92eYVxiJ2RtUFtziy0KafQm7(LR4Czgd6AQYeHHbuc62Ud7nkx6vnLAI5YIsWPJGb9k2YawyVp(YhYsltYJkcxh9ywo36fBX9gUhN)EpbBLEWzKM8FTBjjrCi5fCbAAaM)eF0x(hfG4E1HCQ7rU3UpbE7po)JlJxgT)T)LCIcSSc0fc)oYEQRXhovTNcoY6sv058xlkhesMjbqbqdD2xsh7ikFAj4KFv2N2XmD)PNY3cmQd5pr8qS6jvj)HDBYsFIyvlE39LBuWm9V1yrfqb4RzfHlIQvD0)5gZDaM3xFKt)4HYIKvXSir4YPdfXqKCNd5f1iv4d7iMgUSwJBDukmVWL5hkIwfNZTTzt6kedgfEev7PkYzVugWKzMefYYAdaFCLWqpeKwX2UOvCo3065G3gm0Kgfsir(O69t5XGZuQ7ejFlGd2CqDBp1Wb3acdVKzIEWbTrXo0qM85ud5d8qjCX0VMhLIduDaZjVmV4KsRrorgWprwzuLW0AekJvd0LNRI9esChgGEGdvc(KLpbbuLcHG00)G03WSShW5)0GVbPBACuXM4va7pE3V)Kc8Qvb0gKfaJpHkzgtMs9SAmOFt2XvJQ3FUisqV0HtYzWK2g9BCfDI5OSQSbdxd7AZVSmz5d0TMdWdV1Q5pBiRF5J4xiKRIz0s0VNLd2FKKbtzGqFays1jkYkKmCmNoik6vN0RkPkf0(jN)REAJN38FnNm5zp)x9ShTM)lctvzldVejMttwpzY2LMSvTKg575kr46WeIEmkfatDnyu8WHP(lzO04KrzGKjAIZsmJa773cQdzHbmAg2Kyi9wDVpDTYfJmL9HIUCtma0DHT77wfLV6KCgEBfqanlaVsJFdBvW9l2sVF224HqMwlWMjPMbl9w44MnD31DXMTqAoqxUn5)yTLBUEBIW1AQXiTumVtVSU0hv7cVhOXysSSaxjlFBZIPQZYmBJTDBFmBa1uH26ZsJ6vcCNnWOYY4Dh0c0(LuUVLqzmBqLB(cMXVdj0S)qAHW1DD1NR)Kynvmr1WLyToF9NK0vMGxUUI4YWfz7oua23IZdEF4K9lzJSpw1bVqUaH0QETokw8jCGnWd1bPnSnvYKcgdFf6zOgT3qPIGoltvTaX8JH78Qwql8auRyMVJKId3gR6qdKhAeK)3oItMCiY5s1HwwVrSaZSUMT1Mz)14eCQwZQ1Ep7FBPOxXBPS3qIku4NIJ2t(rTsLYrWwKVQinNR4g8e64adEp4cFhnCBfT)OvRkQk4kxbRVNjwoTXOxdkBBOh9MsA)SbwKDiDrcSfy)HIYdGV248d7vjcUUP7rkNJmw(5vFVz9KdgA3hyftEbTsveycUSxLhDFwreoZEQ(UgUfWRgEC(BQ87G6EAZtf0fvSFHpEzpyB3dwiclZJ2vSoguMxg3yBMKCJYpqXD(wFmoIYwvmLtRE0fzttkXxtVsgGNz)5(kbol63ORIG7iuXmYs1f9G2(KPAfNXWAqR8lY8Vs10PM2T9imqLfkH6JzoZYszogcxwJ6RtzKAhmvbxIwKTnzh7S0tt2UqTQyg)Q82J7JjOl4jmSYt)YnWwgDtfNO2Y5XJRlOyxMBoiSl6Go6v2pmdow72nqvbZLWDm0WEyCgZ4hf3WoCqJerpzoVnvvyu5rjRcPLtMQgCz8VrA6JkvoTVrupasF8qlEAgRfIt9X(GMlV9kJg4L8Yej0Zif4wcdb89oDpmoLjTezqolkR8oZHS5HO2HYcAO62MtJJn1npvWnBfdLoYt64bfRRHmHNjYe2NKQrQaTMCYCzlCZJi5bpvQilrjfXHaoTIczZbWzD3dYUuvzSnJOW83hdgW3aHNEwv5hBBhkYsQY4lIaINKNwuA4EsDFi8hZHR1G)iK51Y49KZikBB2U4IMb0X0la9DqASm6jwgvlYkolTdh7eIzhL8TcjaWf4TjhVKzhN)vqIcI(Jd(F49f3Fj72JZtGFi6XOKuck4H6HArlTu5nKmA9QACEAz4gQFdSQH2QY21PsZ5a5TuyG2wShk8(8D0fMZTaNgMrjIX)5IiA35VyKWcMIRozoWEtf1lyicfBPz)8szxYc)NXg)Rc19fJ8PhbBJRSB0o4JjM3prQVO)8zRmVwFArNFcbLvwsCMtqw0QVjsJinlBflscvpe)mDUhN)1lsGncGnCFQyhIHC3tQgxIbFw5KZQ2UH4(oJv0G3NbEfOzvLHu3F3O8tQF(k1I7uvxuA5W9WzGnMskjuQIW)1Hv3VLuJvR2DTrw0VHuLiLvJOudASGg(YO0u7fbXre1ZODfzp78AVqQ1j5Xu9u7guBJcHi3xFYmGj7RCyj1BpcpvQvEaBeMydAHNkNFF09KHbwpw(qbB7mOXfDifTVGv26(rsaFKs5wdTTqmEWsgh)7XInPIaBjv98EYf6q)Cb03cMbcLIyjWY93s(Vspet3Ag)Rhs2VpEfeynGthkjFp8xpeTR8Wwiu2hP50q4yIbslRusoXyzY9jPy1p0mS4v4tPokAqujKE7lDpViatThh4mzjKJarIdcUDpexsdyMgr9HcYpZ6tZOdLzBHWDwECoefiX2kWjdz3ghbmcRabMbe3scBA8gsbAuDsPMYWAGcMwxFpmZsThhvYHSLLkskhqeku7ysiaG7CDvcliYrd5z8vtHs1PeZwOBkKL(pVbTQjS2vA1ounwljs8EnIukDge7RUPrE35bblVkzjOvttdk7tnT(1ye11dPnD6xvryS0MF9v60pfQvoQS6(Hajiy3eUwg61nAxpSdDwgjAMEcsOV811zY8F9(9PpjUCAFlPP)EnREzL0cS)XLWx)fAxwcME2b8LhIJb1XFUgWhN)pPqMK4pnXu1awReWaGzUTKLgUQ3UqP3vndDhxmrdX4bQ7c82I6BG1a5T1mN6nBPax7jFKg6huKVLcZRZOJAm7K5T9S3MAg6DulLiMck0(7DMYUZEUAuyFYqZd(Tx8YEUppXAhjC)LUy(218SMBPJSPohS3ZdxZhT5wWzhEw5SkzIBVS2ynlupEr6Xn1R)TQOAm4pA0LtLcW1LzXZitqR3G0JOuTVy2KLrUvyFnDUKGujEwkZObvudssoIHS)riziSlWDLpooNK6CDKXBDInqWRFbbaMQtNvaWdcNcb9iB8cc1TWebeMpDy75(137Ea2(gn5d06CD2syNQ6SMNpOdUK4sRsytMlINnBe0mrtwsaGuWph2zCvjhgs1grAsTMpQxVyUEAfRV3gYUwKurpBPDf4oTlLKBTvdHQlrwloGmcsWru)z78ZGIW2BDJ95kCTwRiOCDQiOK1BXKXiiBFIzEe2zBeB9T18mDtM6oF(2YGvK9T88HBTKnkJvVktVsewTkjUub0QNTppEz22fr11pteEGODk1Q)LUAuvkHjRvSTW8XCz5Ol3eveEOiMEQMn9W706tFrvJiatO4S6a)(99clQt1Jcy019ltlwB7w1uWc7OjgcOhB5aTio(BKCQHytizOkx8mo4HeAxL8yYkYCx8e)AMYoa71SeFjpSllKox7AK)lLa0Lq(WWhtkj)inr(JZb52X57ir3q3tsVSU5XLhYbIzeSYXPKGH4)YWlNEPCY8viB4OWIN2T0y9ccjq5UBHzlkGa6bolPKHbj9vnOAvruidoNkKb)NHcjkA6PcPvXKHkWQAl4cLTgn4(gLmu8YUyZPS4TkdGm1W6poq8qjCz1XVRUAup18gAsA4c3rQQBhR6g6BAGAOgeERYa8g1g1ouBKeQPBDPOmzlI1LQ9)edkGVH9rSRWoTTc4KbZwc9NQMNUPi63QPhXWzspsrx3NNrgFby75VhXWHAcAB2ks5(Zz5xDp9IXadydeso5h3NNaXQx(e7Z1tJtea2qa5NIttz)xrYGCnXOyYAzYMCgeKXMLZ)V2Lro6ckVJD8eIKEqTZXXixw6gj2af0TJhWvLfLlymsTjvRA(IeAzNjzQuhNPurWR7fPswyhUoLTVo7VDC(plUzHIOzAwTwKijAKAcf3)J457QBDjJhx0qTlZyfD14oTAQSQiAik2vBCsk6byssATQldBe7Psxc7XDjuHlu3ch6fafRPoAk)vlnx7UZHkACFl8PdPrKtnmApytbKTmRclj(hzMn2xeFyvMIzJQlblRgoudcrKdmG1MFIkbqYzOkA7p)xOrx7S7XL34D6pI0)e7cmZvSWmWQrtB3FXtIunw9U22ZrM6DO(TVPcr2hy)Ga6MeXVltUDcSRxNsucCSCkJ62quZBKvCvmctBCMQkQd7oI6HwV1Z2v28DYd1Xv2uuXuxU)(f(aREerT1SeQbi7zca2kEe9B4TnuRZYOV9LYvT(KFyXCak2IPvR134EjQ7DfspwoIh8TXBedziKVOu93vjfuztYVUkm(3IxEG4WGLyupUtcrdhUFjeP)qwZpvR6yreJeIdtT4(OhJtf1rJ2Pnr5lsOAPIntMhdsKov12zzuEbJddwcY3b7fjBxwlzqX8qqcOHpjTgcY3QzArHKJX6qgjGhbsW2BbbyuKMvk)VXTQ2OLHCUbsPoawo3pKB4ikyRp8UzAf9(Ig5AwNzLwAVYXqvFG)nYZRo0gwpnnqdqnYWKGtk7s0nLjLChpfiAgC0CWirnfxL)4QQugFnp1PfX8g7IkARAVI9rj5KFJbQgpGWxAlKZk8i4)0L1JSjRh1jzDqtzDJcDGiRv2dfGfG75DFhkJqVCoov7BUVPged89eHUrCTZvBquagz7i9mug521t4BhkK3dWlybnLcYA(A(iiBlYkPvMGmnPQQ(JvvAyxCc77UH2ImATALHdwEdN2wduBqgfhM0mTjr7G4OHojPVIehyUL(1Voa6gpLfSzBOJ97FE61GgPD1IRHcwM5cl49CC6xpIF1XTxBftjfmASNOS4sd2I4wXObPGs(uu(wALzsyjjBUqoDznLByvZRPZhzcNlyF)oOCC5zpZ9M6KH2e3wM4voNOLlg6hqhH4msfwaCsY(gjVfzJ5IG5L6QANFzK)33FDRCK3nd)j1Rpk9gq61skFnA0EAkWIBcPsnOBcWGLhf6cHX5LCySRdBsOaSjA5dK07H0doS7tz5LBEYEXZCSz3a8C)8Ezo8rpEOGieRyypMr(RdcmUISu6(jz9j(YPpOWnh2gTllzfVX1s4xJLqYHSze4kdC724vj0sdj1GbYNVF9yVpnBruk709kvBMil(FT(ugI76Hv33(SxSM2vikVUZ2FDv1ifNfHvFI1LW19FHseNHIYBU0yXFKjuEJjVwBKVf8ZEvnJd)Crm7978SQnVe9D4Om6RBeCw9RpKc(mwQ15up9jV6Mi6EiNVjQSXvFCiAwDgCofAT4iAqp2Pkti)z52BB(OXWlYQxxEBMmV6L(rxD4MQ3DvdfQ1QD(pFCTw)hIf0qUcW2cmHhfIHYwBUhnB3zlz58g0v9No0y1Vz)F3(yCEb5ZI)GvD3TqyzeF(qou)ZV(N)Hp(d)xF1X5hNtRuuY29z58Js7lXAnUVK0Sq)6bwrGkYiMrQUXFKFa24V7EsZa8DFFcj97GVI(NPfajOF(lR8p8)aqHC4EI)n3qb87rWY)3(XVhmnn63gaa6435alRBq32HBJ0WTAlAc0t6NKWW(tOiwNPWkcJn)XN48NCIZFANNVtbJS6t7enNktvF(8oPqaaXpyccJg2buiWp(Iu4yTJTORX6dozHTq(lvhT5ykJ(nwNMba57peX6biIvdiGS9ebibT7)2b2vDpvWn5Zk4AX2BpvVf106ZVqm4)JBWrM(FxhMV86)bT5ls(saH6FPdBU5nMD7ukUQ9eLUFsgGEF7bKvUJpZFSFCgP7wr7yo)7qJZtBaIgVVDuKDdXY262MT6q6HcftDVyWzWKWyBZV60agjbI6di4)rF629d0AQPlgOSGocupaHAcAsnNb3qb2mx6M3oXJPBHyMEwu9XNV3orXToPdU2exMZ9IIo79K2l2AwK(8BN)KURYBZNU3IPt1ZUFIzpaKY87G3qL5FQHiOp)UXo7IRuLuq6sKIkaOZHa36CWRSb1YTEDHador9mRZ3TTzRQ5UTnhCIA5wNVBS3NPBb7TUhZ9Q7Z09K31imx3RUpt3jT7CJq17yw72h0upM2XIJUu6DCsGxk)KvZMEVD3A(v(5Jo4en8n2Y89dduS81LQ3m(uT9kh32OUewHca6smbYsHrDjvqLSk6ctujYOoWeXdOiOlCtRaW)9gEUXpklUDB67ajHZCoBHT1bhs)5PieN82)rN6UxUIYhP6fKPr6fl2PZWUIseHp7rq8UFiy6iY92pBDsQ4SGkUuupHxn7T1hT)XV7la28)zDlYp(Dy0e)GWEnPVXNvrev3U1xNTFg9wh)A6IoB0RRVXLZaq(6L8)E)pR2DVC3k2R)fvYfSUWPx)6z14E8(Ix48UEpB4GNF2k897oD)IxybpKxewJ1mOnmYGUYid6eJe5UA)VfgjcEGYij7I()VT0h70TLUnQHCmvxrmqwrCKKA4fg2qJREccwdQTw1mR)MsF1p4L9hD50xPcsA3uWzXWiA08(SDAdgCtFRMvQ)MT1e5XaaBnhvTM(ik4DavfNVANG2n185NBCfZF(5CSRvoXVgS7r86llqbyHLE)LL)zPNEz6Cp5hsyzGRsSnAo(kQUVhp3Xp)SPhm5bsgImpF21KJWjRgAj(7Z8aZluppqtleFDxCwr2Q972Sr9638ru6MrtF(5lWBl4bMxmP2YeDXUzwa48ahSGQf6V3e9Qyz3mLycVzQW3mA4al4yDp2uHI19t2H9eSZNoxtEFGLH1dPbIU59wqo5B)Q4j6Tcpn9yd3Jsa4pWWZcQ3eR)SbZMNPht4R7F)YvVmWcU2OPRQWtdpyK9qEFjjB8)C8e(kJ0n7(YxNSEwdlB9WTbwhRJC7Q0ZvJq)8Zyp1A9Wa1fg6azfoVstG9AL2ld8uc0ZfgEnEHOXKJYb2uBRt(7zjUlr8sTIrurEn7osfYt7oLtii60A(iVE9mQAzpbvXhqpRVvUudpACcBXy6vl(tns2zrQ8w9orWTHESl19KAhEcuBD)vY29PBkONjRg2FIzzwPGGLgGVrT1ymyqY6laRmnP)c8Xmlk67h3dT6rE19afbc5CKIiY9zO8gJKisQ4t1)iWqnS11QQgii6J((SoJerHJxLvikiLBWkv5xrpkx9ftKrjsDm3RzVYImJIwV0s(a0Q(rrI)0HDxoYxLtQqulOrIfyosmPWkny(fGApdHv1CPiOGt2I8gPMm7M7PW851QfrwiCbQxv)czd15Rp8V(y3ikJrRIYw9lwAuwruwScBUra1U3OZ75SQS0uE9UQtwewOznJvs574EQR4RYDPV2KK(Kqtb9Ui07cZT0Voqvdjcalsx0ZL5INIlpiNluYhqLDF9SXp)SMeymLP(hXdufkBLhbbsmHcL7MI16OlcEjyI1qWVDHL7q2BikBgph7DGstcCtqB0ruJ6W88yRV(Bz11teE68hFBRqcjdXR7pA6RQw4C9Rk3lNoWblUB8h)qTB6h0kut)pzfMX82W3AQxkF1I0)Q6fFPYi4NL)kWwVYsbpGyuf1o(Zp38(jIbpNInlMxD5UJymdFjB3wF156V5Funo7Bg6z8UI5RPcRilggnR)4)qrP2VlDwWutadXJhMjOGHUtO2P2KrKOlgfbmQ7licv7ey5kxUpmDZRN4Ml1vwW5b9CyTt)(tRISvPunZB9VRN1FINUhKG)RmvJUg2dBe7fXQP86poONcBj4APV(IrxzA91kYGoz1vW6JrtiNVAyDZSjtzLwU(M0sZb2Z6n)8ZwUe1uUvDWT8iahp48Wd9Xkpeo3zX2y9Q2vxHMfzYHs0q)(QHQmNX3qUX7(Xr(dLYX8keORBn5AlyVpkVMMRAix6CXPCZsFd5OdN)3jvBI2pnSJ7vkSN6QrnduXbTvIOjHz)wTqrKKyi7KIVoGxJBeLV(xqgD4gyN(LbByrXl93TiAu)WEWxvVz7HS0YK8OIW1rpML)8ZEm)3BC6dQ2)1vmZmK9cXgn0mMXk95)OG1Hc0iG5pEFSJB9J0Qm)2kpjisiqS3qgHE2jMkuKbPbPcmOtrs0)Y(JELWHj9RF6P8Tf0)4EZobwoR)WUnzPpfYphDX6Q)7saVAMaXb64lIyYl9FsA8mw5pEOSizvmZNlNvEOigmEF(zPgkR66O0uI3H8dfrRIZnw3B3bwnAALqWI8PjRfJZXfeiaA8GtIjyQ4Y6CbZ0r35pbdvBIbflBzpgd2d3VNURIV7QQ)78KGBZPyywsn5CjP(GhvEESrg9Kbv2))Pm1GofhEXS90ViCHJ8(mX8FKPDyh1Ga4IipkTM4LuphxzQuVIFvQ)gKB)dtSGPsJPUDnRZwPNXxxkWhMXVXLliNFL(XNqulBpNb9moOCOPYPzCD)Rg(M(g20T5PIsYBsce0)B6lh7629r7kdjn)tX6yq)BzmmKbvkMgocLMK1GUqxSdkfFMAmtxCJoQOy7aGQKQMofj5Seijj4cMGppL5C1ud8mZuoJFz0otBbNYgo1SEgpTAv0FQ6QnnH(fVskAqlLw4L8L3k3wk9lSP1(CnibWKGuVCERqCLPyKiiLlZuGZDdiMwKueCsnb8zJWJMtoQCtEPq9H7FZHLS7MXdByWBChjeA)HyKd69r9DJlE9RE3a3rZ69cQg0PNeokB3OqsoTcEIviJtj7dxmbslc4MhyisfNHRdqV79Faj29VGFRmuzLBEAp91FElzxxECrS6XFAYPPWBzvPdUE2yxo7CzANTRDcr73AJ4Ru5I3nfxdb0PkIdb(YkFQ641ZmaMIOL5jKYmeLgUhgGHTyA7wD1oA93hdgt3arcDs7pgJTvTbOhyypesXb1OSPYEI2tc2nBBgTLKRctL1rqsVp1YRuv7cj1pLKLOfTZut(SlXOEHuNnQDojrqFIoG8d6RPIqnAStSdKxw1RXqupXi)GR8dOSFW1ASI2vXXOg0dcBYqCPb6GVY4GnSh5dg6tObU2J6L1kdAm6b15Ljiw)qIY267P5qiAy)WBA1eTa0wqxTq7c5DmwbckKSt(1yZxzSwTQoX76uCRJEfR8ewY614tDCv(b2E5Kh8AKxdzs1W1E3Jv(jarnUMvMV)r5oxRUVaeSazBXEEy)J7z5S(LH3RA2NWMlUnV83cPTOvHPtbP3IPBLSCdb4LlYWveOA64dI1cnJL9QQrzUBQDtKkHsVreiL6Xz1R(3OPKP3y8vNsHz0YypH580SAE6V2olc0OuVgILq)dYS7jMXBkr6vBwCYNeL2kF6hcNdDE9OvQ3(ipsXfMXtnUe8dK1(rO2g1gxAh(r)yBmQ2Il6RrJxZcH1aPHIq0YnFunNix5CGVzMYPf2bwBhuGevkUQTS(wspskBr(Roo)wr3zDCErmrjqQlTA8NGk6n4LCbFZi362V5VIJuH27ElFAnb7aUBAm8g1uApRZLXF7cAKqhmge6Bxl1wJcM6CMZLXHWU2QBNrzlsC8xF1qNlLlJfyG9DUbRD5NWdSwfIQVzpXlZZsZYxj9Bp8eWi3X63ey2tukBKtestpwF)2e7ARuZi)mLNJMhE1DXz2I0SSvIILzig2gtdqVfXGzIC6DqPDtSQzj2FiTOkZFtro3WeZalLKJgoyDhbofnnXzxjFuk14ukPonfH)RdRUFBmRdoAdfbk0K73DAi5cjyzYvxDv8)AMIa41j5XubKrykQt17T3Nb(VMlIUNmDYvW4HcB0sd7q2lY5uUTCPtiT6CcQZ5S53SxW9X8Jw9w(D(G8kUCFA8BkRUQbnZFHF9q81vxZz(k9oT3hR7st2hlU9qc1hfy6Uh81BGeiWYaWrLJpdHZBHge543uevRX73n5OLSDVqpmpmEFhgmQeXSSTMDyEuRJxwFDYK)zPGxBXn7G7dc7kL98Z9vDRDrZBSk5i6rM6atxKCMsGHZne9ETHzW277FHbXLbfb87pH0qqVef)I(1sL)wKumJ8ORaYYTSBGwIXhUc5SzqRAxhSI745dY4HD5QIGS2iZ407RE6gVXf4yfg96Grdg0SXngrSBizXb5VH1Zg2Jzux7VD1xpTP8aKGQseZ)HN2JjB8pV0Em3s1h3KohCWxu9m7vw)yf9z)pEX2jpYFyt53uBww61fSv)fOXOAT4yF0Uv)v9IHnN)KwyJEn4vEQI4AHYVksYUtyhhKatRgK4nAA2Ob1Zu7zk6g1EW1FUtWFc4oJmWDA(xbxBCNGbY8v7CNVG9W59N0)6d7V0ZPUTotU(b4YMkOMElFsd8Obwu6hmxOVtLp9DqnrFmDed0SNOp9pgx39)c]] )
diff --git a/Interface/AddOns/Hekili/Dragonflight/DeathKnightUnholy.lua b/Interface/AddOns/Hekili/Dragonflight/DeathKnightUnholy.lua
index 96d7ec2ca..f4f1384a6 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DeathKnightUnholy.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DeathKnightUnholy.lua
@@ -11,9 +11,9 @@ local roundUp = ns.roundUp
local FindUnitBuffByID = ns.FindUnitBuffByID
local PTR = ns.PTR
-local spec = Hekili:NewSpecialization( 252 )
+local me = Hekili:NewSpecialization( 252 )
-spec:RegisterResource( Enum.PowerType.Runes, {
+me:RegisterResource( Enum.PowerType.Runes, {
rune_regen = {
last = function ()
return state.query_time
@@ -162,10 +162,10 @@ spec:RegisterResource( Enum.PowerType.Runes, {
end
end
} ) )
-spec:RegisterResource( Enum.PowerType.RunicPower )
+me:RegisterResource( Enum.PowerType.RunicPower )
-spec:RegisterStateFunction( "apply_festermight", function( n )
+me:RegisterStateFunction( "apply_festermight", function( n )
if azerite.festermight.enabled or talent.festermight.enabled then
if buff.festermight.up then
addStack( "festermight", buff.festermight.remains, n )
@@ -182,11 +182,11 @@ local spendHook = function( amt, resource, noHook )
end
end
-spec:RegisterHook( "spend", spendHook )
+me:RegisterHook( "spend", spendHook )
-- Talents
-spec:RegisterTalents( {
+me:RegisterTalents( {
abomination_limb = { 76049, 383269, 1 }, -- Sprout an additional limb, dealing 6,258 Shadow damage over 12 sec to all nearby enemies. Deals reduced damage beyond 5 targets. Every 1 sec, an enemy is pulled to your location if they are further than 8 yds from you. The same enemy can only be pulled once every 4 sec. Gain Runic Corruption instantly, and again every 6 sec.
acclimation = { 76047, 373926, 1 }, -- Icebound Fortitude's cooldown is reduced by 60 sec.
all_will_serve = { 76181, 194916, 1 }, -- Your Raise Dead spell summons an additional skeletal minion.
@@ -249,7 +249,7 @@ spec:RegisterTalents( {
pestilent_pustules = { 76160, 194917, 1 }, -- Bursting a Festering Wound has a 10% chance to grant you Runic Corruption.
plaguebringer = { 76183, 390175, 1 }, -- Scourge Strike causes your disease damage to occur 100% more quickly for 5 sec.
proliferating_chill = { 76086, 373930, 1 }, -- Chains of Ice affects 1 additional nearby enemy.
- raise_dead = { 76188, 46584 , 1 }, -- Raises a ghoul to fight by your side. You can have a maximum of one ghoul at a time.
+ raise_dead_2 = { 76188, 46584 , 1 }, -- Raises a ghoul to fight by your side. You can have a maximum of one ghoul at a time.
raise_dead = { 76072, 46585 , 1 }, -- Raises a ghoul to fight by your side. You can have a maximum of one ghoul at a time. Lasts 1 min.
reaping = { 76177, 377514, 1 }, -- Your Soul Reaper, Scourge Strike, Festering Strike, and Death Coil deal 20% addtional damage to enemies below 35% health.
replenishing_wounds = { 76163, 377585, 1 }, -- When a Festering Wound pops it generates an additional 2 Runic Power.
@@ -281,7 +281,7 @@ spec:RegisterTalents( {
-- PvP Talents
-spec:RegisterPvpTalents( {
+me:RegisterPvpTalents( {
dark_simulacrum = 41 , -- (77606) Places a dark ward on an enemy player that persists for 12 sec, triggering when the enemy next spends mana on a spell, and allowing the Death Knight to unleash an exact duplicate of that spell.
doomburst = 5436, -- (356512) Sudden Doom also causes your next Death Coil to burst up to 2 Festering Wounds and reduce the target's movement speed by 45% per burst. Lasts 3 sec.
life_and_death = 40 , -- (288855) When targets afflicted by your Virulent Plague are healed, you are also healed for 5% of the amount. In addition, your Virulent Plague now erupts for 400% of normal eruption damage when dispelled.
@@ -297,7 +297,7 @@ spec:RegisterPvpTalents( {
-- Auras
-spec:RegisterAuras( {
+me:RegisterAuras( {
-- Talent: Absorbing up to $w1 magic damage. Immune to harmful magic effects.
-- https://wowhead.com/beta/spell=48707
antimagic_shell = {
@@ -518,14 +518,8 @@ spec:RegisterAuras( {
ghoulish_frenzy = {
id = 377588,
duration = 15,
- max_stack = 1
- },
- -- Damage and attack speed increased by $s1%.
- -- https://wowhead.com/beta/spell=377589
- ghoulish_frenzy = {
- id = 377589,
- duration = 15,
- max_stack = 1
+ max_stack = 1,
+ copy = 377589
},
-- Dealing $w1 Frost damage every $t1 sec.
-- https://wowhead.com/beta/spell=274074
@@ -550,14 +544,6 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
- -- Movement speed reduced by $s5%.
- -- https://wowhead.com/beta/spell=206930
- heart_strike = {
- id = 206930,
- duration = 8,
- max_stack = 1,
- copy = 228645
- },
-- Talent: Damage taken reduced by $w3%. Immune to Stun effects.
-- https://wowhead.com/beta/spell=48792
icebound_fortitude = {
@@ -776,13 +762,6 @@ spec:RegisterAuras( {
duration = 4,
max_stack = 1
},
- -- Embrace the power of the Shadowlands, removing all root effects and increasing your movement speed by $s1% for $d. Taking any action cancels the effect. While active, your movement speed cannot be reduced below $m2%.
- -- https://wowhead.com/beta/spell=212654
- wraith_walk = {
- id = 212654,
- duration = 0.001,
- max_stack = 1
- },
-- PvP Talents
doomburst = {
@@ -810,7 +789,7 @@ spec:RegisterAuras( {
} )
-spec:RegisterStateTable( "death_and_decay",
+me:RegisterStateTable( "death_and_decay",
setmetatable( { onReset = function( self ) end },
{ __index = function( t, k )
if k == "ticking" then
@@ -824,7 +803,7 @@ setmetatable( { onReset = function( self ) end },
return false
end } ) )
-spec:RegisterStateTable( "defile",
+me:RegisterStateTable( "defile",
setmetatable( { onReset = function( self ) end },
{ __index = function( t, k )
if k == "ticking" then
@@ -838,22 +817,22 @@ setmetatable( { onReset = function( self ) end },
return false
end } ) )
-spec:RegisterStateExpr( "dnd_ticking", function ()
+me:RegisterStateExpr( "dnd_ticking", function ()
return death_and_decay.ticking
end )
-spec:RegisterStateExpr( "dnd_remains", function ()
+me:RegisterStateExpr( "dnd_remains", function ()
return death_and_decay.remains
end )
-spec:RegisterStateExpr( "spreading_wounds", function ()
+me:RegisterStateExpr( "spreading_wounds", function ()
if talent.infected_claws.enabled and buff.dark_transformation.up then return false end -- Ghoul is dumping wounds for us, don't bother.
return azerite.festermight.enabled and settings.cycle and settings.festermight_cycle and cooldown.death_and_decay.remains < 9 and active_dot.festering_wound < spell_targets.festering_strike
end )
-spec:RegisterStateFunction( "time_to_wounds", function( x )
+me:RegisterStateFunction( "time_to_wounds", function( x )
if debuff.festering_wound.stack >= x then return 0 end
return 3600
--[[ No timeable wounds mechanic in SL?
@@ -869,30 +848,15 @@ spec:RegisterStateFunction( "time_to_wounds", function( x )
return fw ]]
end )
-spec:RegisterHook( "step", function ( time )
+me:RegisterHook( "step", function ( time )
if Hekili.ActiveDebug then Hekili:Debug( "Rune Regeneration Time: 1=%.2f, 2=%.2f, 3=%.2f, 4=%.2f, 5=%.2f, 6=%.2f\n", runes.time_to_1, runes.time_to_2, runes.time_to_3, runes.time_to_4, runes.time_to_5, runes.time_to_6 ) end
end )
-spec:RegisterPet( "ghoul", 26125, "raise_dead", 3600 )
-spec:RegisterTotem( "gargoyle", 458967 )
-spec:RegisterTotem( "abomination", 298667 )
-spec:RegisterPet( "apoc_ghoul", 24207, "apocalypse", 15 )
-spec:RegisterPet( "army_ghoul", 24207, "army_of_the_dead", 30 )
-
-
-local ForceVirulentPlagueRefresh = setfenv( function ()
- StoreMatchingAuras( "target", { count = 1, [191587] = "virulent_plague" }, "HARMFUL", select( 2, UnitAuraSlots( "target", "HARMFUL" ) ) )
- Hekili:ForceUpdate( "VIRULENT_PLAGUE_REFRESH" )
-end, state )
-
-local After = C_Timer.After
-
-spec:RegisterHook( "COMBAT_LOG_EVENT_UNFILTERED", function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID )
- if sourceGUID == GUID and subtype == "SPELL_CAST_SUCCESS" and spellID == 77575 then
- After( state.latency, ForceVirulentPlagueRefresh )
- After( state.latency * 2, ForceVirulentPlagueRefresh )
- end
-end, false )
+me:RegisterPet( "ghoul", 26125, "raise_dead", 3600 )
+me:RegisterTotem( "gargoyle", 458967 )
+me:RegisterTotem( "abomination", 298667 )
+me:RegisterPet( "apoc_ghoul", 24207, "apocalypse", 15 )
+me:RegisterPet( "army_ghoul", 24207, "army_of_the_dead", 30 )
local any_dnd_set, wound_spender_set = false, false
@@ -926,7 +890,7 @@ local TriggerERW = setfenv( function()
gain( 5, "runic_power" )
end, state )
-spec:RegisterHook( "reset_precast", function ()
+me:RegisterHook( "reset_precast", function ()
if buff.runic_corruption.up then
state:QueueAuraExpiration( "runic_corruption", ExpireRunicCorruption, buff.runic_corruption.expires )
end
@@ -955,6 +919,14 @@ spec:RegisterHook( "reset_precast", function ()
summonPet( "skeleton" )
end
+ if query_time - action.unholy_blight.lastCast < 2 and debuff.virulent_plague.down then
+ applyDebuff( "target", "virulent_plague" )
+ end
+
+ if query_time - action.outbreak.lastCast < 2 and debuff.virulent_plague.down then
+ applyDebuff( "target", "virulent_plague" )
+ end
+
rawset( cooldown, "army_of_the_dead", nil )
rawset( cooldown, "raise_abomination", nil )
@@ -1023,7 +995,7 @@ local mt_runeforges = {
}
-- Not actively supporting this since we just respond to the player precasting AOTD as they see fit.
-spec:RegisterStateTable( "death_knight", setmetatable( {
+me:RegisterStateTable( "death_knight", setmetatable( {
disable_aotd = false,
delay = 6,
runeforge = setmetatable( {}, mt_runeforges )
@@ -1077,7 +1049,7 @@ Hekili:RegisterGearHook( ResetRuneforges, UpdateRuneforge )
-- Abilities
-spec:RegisterAbilities( {
+me:RegisterAbilities( {
-- Talent: Surrounds you in an Anti-Magic Shell for $d, absorbing up to $ magic ...
antimagic_shell = {
id = 48707,
@@ -1158,8 +1130,6 @@ spec:RegisterAbilities( {
id = function () return pvptalent.raise_abomination.enabled and 288853 or 42650 end,
cast = 0,
cooldown = function () return pvptalent.raise_abomination.enabled and 120 or 480 end,
- cast = 0,
- cooldown = 480,
gcd = "spell",
spend = 1,
@@ -1227,7 +1197,7 @@ spec:RegisterAbilities( {
spend = 1,
spendType = "runes",
- talent = function() return not spec.frost and "chains_of_ice" or nil end,
+ talent = "chains_of_ice",
startsCombat = true,
handler = function ()
@@ -1581,7 +1551,7 @@ spec:RegisterAbilities( {
if spec.frost and talent.empower_rune_weapon.enabled then return 2 end
end,
cooldown = 120,
- charges = function()
+ recharge = function()
if spec.frost and talent.empower_rune_weapon.enabled then return ( level > 55 and 105 or 120 ) end
end,
gcd = "off",
@@ -1770,7 +1740,7 @@ spec:RegisterAbilities( {
raise_dead = {
id = function () return IsActiveSpell( 46584 ) and 46584 or 46585 end,
cast = 0,
- cooldown = function () return level < 29 and 120 or 30 end,
+ cooldown = 30,
gcd = "spell",
talent = "raise_dead",
@@ -1782,8 +1752,8 @@ spec:RegisterAbilities( {
usable = function () return not pet.alive end,
handler = function ()
- summonPet( "ghoul", level > 28 and 3600 or 30 )
- if talent.all_will_serve.enabled then summonPet( "skeleton", level > 28 and 3600 or 30 ) end
+ summonPet( "ghoul", talent.raise_dead_2.enabled and 3600 or 30 )
+ if talent.all_will_serve.enabled then summonPet( "skeleton", talent.raise_dead_2.enabled and 3600 or 30 ) end
end,
copy = { 46584, 46585 }
@@ -1890,8 +1860,6 @@ spec:RegisterAbilities( {
aura = "soul_reaper",
- talent = "soul_reaper",
-
handler = function ()
applyDebuff( "target", "soul_reaper" )
end,
@@ -2033,7 +2001,7 @@ spec:RegisterAbilities( {
} )
-spec:RegisterOptions( {
+me:RegisterOptions( {
enabled = true,
aoe = 2,
@@ -2055,7 +2023,7 @@ spec:RegisterOptions( {
} )
-spec:RegisterSetting( "disable_iqd_execute", false, {
+me:RegisterSetting( "disable_iqd_execute", false, {
name = "Disable |T2000857:0|t Inscrutable Quantum Device Execute",
desc = "If checked, the default Unholy priority will not try to use Inscrutable Quantum Device solely because your enemy is in execute range.",
type = "toggle",
@@ -2063,4 +2031,4 @@ spec:RegisterSetting( "disable_iqd_execute", false, {
} )
-spec:RegisterPack( "Unholy", 20221027, [[Hekili:T3t)ZTnUX(3IMoHH02vruF4ljpjntEjx77A77UBoN(A)jtrjrzXgjsvsk74B8O)2F7ccq8bbaPKSNMEt)H7CejWIf7xy3flaV1)2pF7nldlIU9h73RFF)E9)UU(Vf)ZT3u84UOBVzx4IVeEh8psc3c)))AY60npIp(XnPHlXUNNUpBb8Q1ff7YF)BEZDXfR3pV7I0TVjpE7(nHfXPjlYcxvG)EXBU9M57J3u8dj3ox7y7)waM7IwapEuFaSXlxgv22O8f3EZT3SjoVihh57cZUliDxusug8ZFKmzIscNVjA5T)33Et4cCKV9M9eCoy(M47wxGDpjkyXYBV5DV7D3waJIHUTkkViklo5UG8IS4VevVNdu65ISyShHa5jl6(U(DvbXHzohM15WmYR7x71wgBy0gAap3Lw(xvSBKH2Vmm7lbfzHj5RsZ2gQVZxBOZ573UnnjaP8PpUrdn57mnQrHfRdwKgVPEFERH(eUlDr4Mh3LRzCExt0EXoRbjaq437eWvFtszrB3L(quwq2EOdpebdFDYAbvMDF4)rS9)i2(Cl2sfycZZd3VrJeZ5k6UinDZY0hsY1j1YNiUhMnO3HztNacmrfDz08UzrBdJtYjctsVarJ7bHmVdZE6PdZCjYAfHBIsk6QW46shXYwYqOATQAOMEy219iq2Ha457xTQRgjPU73rAcdXn2UkiJJpolcZ2(yWDRt3VPAE4u7nv9A8KYXOQ3a32qV5VPwVPeQvOHHaL3wUmzw8Usw7pt1Yu06Sy)GG2PRckwhfacElva4hRecey5uMfSK)2WKLGKKq)5SmhboMfABq0xHv)lWEm(WSHLZvUerZdcTHYQd6rdL2WPLhM53tDKTaWwJEM5BAmmZyj3hVbufttkcVJ8BoHVuOjawkzBCuEPSBFcgTmIidZTi)q6(KLDZla)5kB3qzsryYJblHwisdgaJ1JlGbVa0SIaNUa1EnM054thQQTGenFAKfgNtLP0yNNdeWmu8IaIjPUlJwfViUGGnOMCPACdIrHlFSKstibA5ibpeNaqGO3FuYxEMxurZ6p8j19HWFGhdCGGDBctsaEcB6OkqWTrut4JIDYcun0ehfBQkTdOEGerPGdZUunBZYidFrkzeX1OvnjZ1cDxsJR9cUE1NvN)kfLW1tIhRZRdnUlOHphUCzoLNwtSvNUMFprJxXjRi2adwSj8HCvEPiSKnoiVafOXTmi6EcldqNUrFfdDIaf1xHy50sSWJYhqNo(sckB2DfHjaOd1qabJvn(ilJOGxCfi2KqfdezfJQGMPPGN64zIIzyXsqCFuJSzvp8mB4Dct8TKa1TiEly1mny3IIGbJiJ3iDVFzCezcd0JLPGqmOZaiz4oW0xfUEjPVIgE4TsNpL6AM0I12XqZRPCo4UU1rQ5jB7mx62gtrwn24jQQTnnBE8Y4IhLbqhBnWZuyA6CZUjJdgep9TngQEV1ok3zs2WfMQzlZOfvAmJ6wnXPDwTBHXDEmdKvnuCrB5(mIU8)MgnsZtPxY4uSp6NEem2HRNnl21vjyb7I6eMCFwnU4Z395XvTZTX17CAXA1WC7UflBH)4cU1AsUrsuSCrCWlpWl2fHpwFenzz2uwBetpHz6ijKMwqh5HH42SoMtBuXAPzJ6EnxlQoJsH(JmqZmhrJrBYAd1bmt0Vkuht2pT4NDlM)CdWsH7hUnjsoWHgmDCoiqN2IdnkUFSJNTwzDWmN4frtt6sNgkF0IGdvdAWc20841IGu0ipgXI8VsLFE624eYWgSjE7CcSBVNXCBQDAEfV2KFOY1rnPDEhMYYkpGdb8c1Qc3eSdEinf8yM3Jxyl37IP9vk9x)rAFLZ5rf9ChG)Ovob9APf7Z3JBMvWY00TyEkwuqJttBgpqJJ9QAqeBfap(IVAdtVonHMr23uzZxt6)AddSHqcNOg7GGmu5Iz2sYfbCb57IWCVOvyDx6UYLpO25Bcr5l7veV4laBPDzZIHq13Mdoo1G7b1tUMEVP569OHuiUkJiPPDfXgswbDC)wxsjDAbpj5(qm2HjfAtUFL(0dGPACW2cbHxlXWLa4WSpmpEtCbH)3otoAxc0)AMMJvQOS9)gwjPDMxmVYVVTeNBJ4CtemPkspmBFoOLgUQaTlGtNdZIbyJo((XpbpjVSv4EbfHKsGMMTiC3ocX6x(5dZEyn4c5Hz5rffKNH2n)4NETeP2k9QKKAw1rNRCJSZO6rcZxduVGyNUmChZH(wdxAAarJIE6mL0cPnqubZtX8yqBDdMh45pge91WT7uCd4FnID0vGRYWYqY8LyQPKySinlB)U6r4PrwTpJRunF)s09WBdst)1iCrkokc8P(VvkPg6wZ3Cw)nsTBlPgtFKuoocWNiUEVVVknxQ9Nc52(S9eCMVzcnD22YyI6ukna4(DGAdhhZdwLfL8Rk5RQLnTPvLAGSCc(WESs02rGtWP2M0LNQBZ(EUuPnhdz16gRb(oUImms7tEinRy9J2t(ST9yWGRpuzetPChTY7puojZgqlZvWqL8)U95f7HUgX4SscQvn7(uS2WG2LNUHGtkrRrKsuBuW69BdtsJxscbkobgBCucIxjGaQDsQHB3gTmgl7SBeIzB1MO81KIutST3TjDE4gSHeFKGLLxKUDEyrLpsSUlS1Mc0MJAx2Rao6hiICDhDbgmdBDoDyQ0qPAFofOpGFciHH1xMGd5FfuwrFGBJjFjQiWpi)XePaBOVPBHF31H5bGRlbilHjPj8AU2qvE8EfyfBejMaYQ1WaUzpirSbtCuVUJOpOK0wZy7rI69nJ69TJ69pBux1G4rI67YItbS(rLakTr6no3ij1Y(eVX5(BKAa21aPCZEbbgGSjX7cLrRme3cyfN7kwl08k7vYmmwYENwd10kr9gPg0AuZ)4qnFbutM17xX47xAoiletSG1aMcbV3tWf(YYiMHKck4xO9VPsFO58b2YKG1qG)SKumFtA6YGv7ZE83eBGIXPZl(MNODKRG5PTXjgH5rNneBPZ00qXLS5V0EKyvcvrz5rz44(BdHkttNxEHkDJ85kuzcMVacv1hkbHQQxApGtcKObaYmQZypsIgLXyTvoere9eIaR8TIENRRohQ6K6W2uhfCPMeQAEW)y)Y72IlhynmtCTSr)BQkcdXFjvg8hDoI9SE)SkGlgvxyYcq6klCtaeV5g7HoBajOCrs8ZCNbAiFCtOSQA(GSBp6fJ1iOzC2vXzre77)MWuTPzZlPWPXb(0LyTcYNvXydJKqiOS3zpnfQi1ewnY5AWukB)CRNVe56FBE4DKyNZG5sEPV4u3316mEzex3fEF0gwi3WmiViimBoIRCaBPnwILNo2q8b5Bsle)TKQLRT4xy2KCAoxv97PeQxnGnTcwU1R1DAct1bX2KulHQZN2tVMebTQL6jUOTC4Km0rz6ke3QKMATq5yXwZK84LwKfs3efXpLy2(mtoZYozsHEFl8)AHwFo8)Aa7F75)(24)(Ne)VVw(FDsxD(VKsDFB7ySof)gsMJHeYinXQRzWbHxnJow2SyDcM2aUJXSYye)uNIQ4hn1jG)kKAXtnpQBJHfQwLff9RrnKivH8S1YD(ewg57u0M))OIm5IPMtAV4ziMyo84PeIuofxqQwgAQHC5USXIcOSKnEdljx239NlzwQEJW5r4sAHBuUFE6RBTYtXXfL9sN1PwMys0PRaAzS0Mmtrpuon77wj5xh1RVc1ZTnGtKqvwvlc04YYLPQjxWEiVMCUSY2LhRj(96DgPrxiws0m3IVOw09MJhvWJiTrKwoTgsqs2u1R0uLFRwXqFzMiYkAXwswXKAUT2YPVrvQMa8ykoWi4sf1I5eXBz86yIYro)yoY5hwd)T06xliheGjS1IgQ9EdqsT04SCMfhiDgISCEf1VxPTy6qTViWh4vLLUGlBMl0SQUyHsjAEsCU2Mk9ncMrjqa5H3LMyyhXTgoy1XFOJEVDginANz9GpqngFYtPwB7ONdkZwQvjI6IwRz(dJalC6EeNlvvMO2JiuTdxKsODT70d1sUiTbKyNJZxBT0hAIrp0aTmkx3EG3mvuvEHxH8LU(A6yUHtCthvVrkAIIscfAoDvhpwkvF(hjwA5SgkLphLjHqjnqMeQbZlF62l9Wp(xbrWBaU(Hz)crc6QdZ(P9fZbXjWMvycW7)Fb4va)hXSXpVj8U9rZrZB4Q05rlendvxqKtXEimUqZY6MuooETbLqa1QvuwrVmVN6197gXcJsxgxiurtPUiLsLucvfviVpoBpo5qzkGAbdpOpLVgbHK(y(Ea5WmDgNORSUwLLcYLRaUFwGytRboSXLBQu5aAU1EkrnATEWeW0wuXyMJrg12Q8VuZuVY)7bmx25TBNO8gVLvHKA6q4yEx1ofp(eTrkJrAmIAIRsCoqz(iixkv99Yv0DHMtvKCbehUbuG)WIYaX)lKl5PkyHjrpO8hbBi1xl()LlMcIP5ANcNwbb2w5xy9yAymHMn5esR8jdTsCGv6MxqPLyvDVaXQwori(hXVEHkSEmqoN5tnfVx2PKW8X01UJvGWuykzXMoX0nacwfYJPJW8rxw7IOAN2G)eghTWuYM1038HjwRlfh94WommK0YGdQTQzHEkoK1B)q63lR2QKEjJ7aHJPQc3r04PPqMnhVm)Gs2WgbxTkYXEWwyHk1uVERkAmFpyufDLmpfwpZGcLPihovVSi5w2VrpXO7iQBlIprEsz)MEOP9OJce7x4feGO5CUvTLrI7NeZsen9Yg2OlmHp6sSOukVIyLbObzvbDdn1QSPniq)HO1E4)g1uAqdJhXJPJcSJ8XlJlzRhGCQIEVwoLJtvdZHMtmetoPrj3XvY52t9d)TQhdBdoRDkhqRgM2Tz(mv8UsPj9r9yUP7mpJhiVJ601z27JoT7CtQKGHAR6rEHK72XB3LbRvJOh7uCYjcxw1m854E9Um6(qquQqIwXBwwArruce(2(fRLSTjt0J2fVeqPfsKBgPu(c8Z8oM3ajHdq2OPlzenY)A2Ka5erOLFsCtaILlhhc29261yGXzyS1Gh7)Tp8l)4p8J)X3Fy2HzFEnW6a2rAwbyaof4PVM6P9RbgB0)CFCgsPYtr3ed3xKclnGpyX6qi0I8Uh(t)LyK73hG2httGXL86xtP5)Dak4XLR63mIp8Cx)V6v1)bNz)hEM9F0z2)V7K7)H)ud8dQ)Fhh)WxgFUjE7hHE9iyX5RKYNhrQ)Y(qW8w89X5ehdbh4ZclWH09nETh9QC6(SqWJGG98iWO2)QtMsfe4preg9Fgf6u7FBXbBcU8dzwfqeEKPzIkuofm50vbk7)7orCOF7KtRo9ohNC6qRksIAsBtxUFZ(CjfPx51KDk62Y7lqN47u)FVb(05In1S6rh6(AWM(1XMRpFJmwaxBOndBr3Tmzg1orhiO7JtO5umUD9)IxnAy7OfSm5DCeKAUh0mRDGW8Xu3BPCAT1kAE0Bt3Tm6dopv(2yXOLZDtQ4TCUFcwiAPFd0cm6SKJoxlodEEbN91kAf4Eo9PTMbXw0)(NPverb)3EM93)umJksa8FgexSbVwHqsZOtXRvrwI)5Yt9pfMAl9WQkd(hNo95YLpfMYONXfBpfwYWNr1m)ENlaofk4WZvSwsX6um1jnfofM41uX6FGifJDdVKjcP7tc5Byd8E8C)NUkgRbJF3V7WSYpVohM9P)8H)e(7(xFy2pTOiDoMpmmBlaGF3W3U66W36HahBZpKexehUb6ugwtmRi7Dnt7PlRvFSuV49L)63Fy2hw(p2NxGNdT8YzXNs(0B(ueIlWFclwdp(t7JkFxAcIvls3Jxkrv7WXdRHxfMbTHxu4yR3qoplBsX8ygLKU)U1LphurlWjIl4YBqEubMA7FNpsMO40NIZj0pWyk)MB7WSFoeVO0MhTiKC9jH3xchMrkZNCeO4hOeInIC85F6pNZb4FnNKm1)gMkmaOL5cdWz2nufgjdI)R2e91454C0negQHxcadZUm0G4K8cYaMUc0MV07)cgIF(MdZsI2JhVlA9LSn8rHRTPsRsjP)EiQq4xXf7jPxSoI9hyzhgqUIYp1kyA9)Wp99W)agVht3Fy26W7jqRynPHyfBwspxMsh9hstEn)2Ic)D5TKgE3sjIS8XVuCGG4jaM)APDh51iRozzmIZHBOIhH72H0he9MNMNt3qLCMSH7Mi8H4Ty1dHWKQ8sTcg081cm4pSCjoOH4Kbze8Q0bOBzpwos54LLfkBKxKLILyWHzFpnFNcuWFjAdUo7nF(WS7HhxsZ2KExmHINSajLf4sfBi8zeBGj1QW54xKkej47fMau)8p9PFISc0FaK5qzQBQUZaaf1fe5behPULshrIwwPQDE3QubC5K3WVxq0)E1RbKRKVfqMqVeq03z(nbI(3ZsL8v4o9oHIX0l4GRs3nHuvZxrk9Rj(xXlh4j96o6QkbGjCF6flTFhx(Z5juMEokE1RgoAspVJbT6FQOvFdOLMR3ItaTyNHeveRViI5lGwDmqU0JUp9KPPH15b)DshFfVlCbbMlLbjzRZyhXoOf3R)Y4WZBQRvwk)D2gtn32g6gtF6yYwD67)A0I9eTsSqXq7aKkhPaDdKQiI2YcVpmEdbqv8WjchzeawhMvDMoQAsnMRqrrPYxDDLp7gEVY1122pEPV3Rg65DjOKEPl1nanNmJlg6jkWaT(IbccnwkNRXFN55HyXqxFI42uLvJ4oGj4ueN0WpVWvy3MUSFpppVl871tf17lG6AoxitVUNttJTTPLMsTxD2zJLmv2QH9Mou0Isj7ty4DCnvLjVYDiAyg0AM47yH9nvBL4zCQlEOgAXuD8qZGIxx(ua1X4oE74A7yo80tnqTD6qPCC4ASp7350Wbzy8GEoAvKC0vY7nGCd9SrGQTbRukvJcVApocmSwPtGj(YNlv46oTPs0hpWPJ8(DpDYGk4jVn)onuQaaSeMOJbv0o6ONTICfXePyZyEvkJds04(oAR85XJCK8ZCQRHk))YrEgiB0hQuJ)TJAArzrGcqNAY09Xtg442rFXx90t1lq)P(JSi5jucpAhnWS0rmALp3XqPDn9ApYYIphLkV4mcRe(RYJwmXwTQFv8kDYiTt4yKJnqp2fxjcl(DphzQ3eFr8KvH7xjvmdWseaQ52qDUxjdkun0oUTSQ2bltTSI298aUTSjVYcqVA8LEAndOYvRoi6blOxhXl9dzGxLBk1Rk9l675jj2kvcjif7yxPZr3y5OHQAUUYhtI)bZGr96dxexvRDxj)4BrlPfMsP)O8gNh9p3hbrtIZEv5mdw81V8LGlBv1N97L4GVxTwXQ)GYpFJVxJvU3RGeVNxZrVNZSeFQm69Envx5ZbTOtteJVbOec)tTuHMeDKzQxvwb2LMyAlzsVhpOfYX(9LsbGDS4mqb9CQJdhQssFBAkTYEeBQsLQtxUmnYYecwSSriqlYjlqbwGNfl6)d44i4AbpeZUY8xyqKewVI(LYDY7E37S0hvj4tTBaQB4Z0SthdFGMTa(s1OwIlAu2AzpvK1AzV46LTSdC17w2bHrGtx5qPzraM9S2nCASUi3tRsGhT43Pi79sk41EPUtuK7eK3ooHTJts7efZoruQncxG)tQNwho4a7StOL7oIMDmuN3o6okcoUAYEIPKNmgcITt92dUbB9i1OyYgd93wRFlFqKp2nvR0jhP8Xgz14j((gJ6A0tp52qe5C0t(9EowoYmSfVLpUm08uP)aY80t6pCmEqm2srCn2VNKWakMRCQwckhEu8ahKj90kmudkCLfnrHzotrAf0mkw2uzTxMAIbmXM6aOCgPI81SdQzkyeNSN8oNMergdIrMZANPZOI3Z6uOjCef1niiRIhYHtQvuq)PHrboYMt7y7it44stiLI7E9RcdwZPf5s6R0CcryVs8uH4XjaSZLrTPo7fnIWhnnRjX(POwDzkGiR6YhGkN1NqxpgtjYGEtNO7E(0rZD8jmXRsCrTSE2usuNEDppQDldM6quX47RmIQ9c60r)LZj4LFpApuV)nD0F3BI9OMDs4zLzKOw0oCA6LA2CxE2W0(rMVvzXS6(3B8qUyNEWPpEUMs)UFpoCv6Q1Htlrshzr2iHorAzD1Pt6B1okMTutMchpqpoW3xEIcjr2w8YyvBNuDQSCrq1D)ctTUBdCsW6nDvzTKYGhItGEtw72kn3tpIQZPzaz1LVFhxzU2G6CF6iRMms6JRL6s6ZjjuCs)sTnf7g8HqChJC1QxAAbqQWAtsgcPw94TqnumDOhffwYZyJcN(9m5oxtl62AFvXTIaSZA1t5XQ(vBYVuxlE7Ay7kewBuEowZOA)rg0645(3q2S0Vzc1Vl2TTDtnp2AStzAORB)65azKJ63O(SRoDll6qEmzWQpZ9Cww1JoAusqbOgJ23kWyzuX4e8iNFJh40yLq40rJvkJ7NRbdkO3q6I0IvPmFZ4xLDK852JlBJ2X6lMnyvpC2wkOD2oGmgEVRwtMnUP83TyPfFxO(iONnkijyWZFe6guCThrUsSstg00QSoU6LwBSmGmQmP6TbLzvpLfgw1qxYWmzrrxjm1hCItNnbd(OyywWmHu)JjOQ6YPb(oMHVvjNMGN6ZTaS6bhzsTRjwIOptwgqdc0MtuLjEEKPGdu)QHR3IqhBMyBtKCtVwL0r2InAKL1(yklIR0DoBI0NC4Js(2)Ar)sRTOPGh61fTAZKRUIQpzI9I)HqwdzczPQeklZDh36mBvlIJ0tu7DPsFV4ApTzX8PNugd9aCypp9ZNAI7SxAuiOJPVfVVWYbos1t7WPeTMmdF6xRj00)sxtFvDVO)BF2ioMPnw)Yep13Vw0YQ1OJnAZZo6RqICSw6Y462DYS9vdgIY02RTv3RN1CtCLGJr8XGUVMpKTMJUWYCAQyQXov9b7oWCeyTukgmK486PjOAvA)Hgyr8tvcoCg)M((0tg)A7sxA02xU3R0894f99u5lVR0JeXgvytx28pgrQZd(eJw4htoQDmGG957xUmkb02t3cenaEeLHAj7BYWELAjJh4zixxY8B3b9ELSF5uCe1o4B(QUiqA)wJQd4nUrccefwLJxBzQk8WYE0WhY2SVtnSdz2cSxxbhEQOrfSeRaFQu1VWQmqgOPLk4e5VURgYhSPqjm6fo7qK6vBaH5c)ZUjoCLIQA(oD(TvUg0IGVi5zqZiDs5yqlCATUq9yImbuTS4QpcMcS46F1m)gJfRdbFzyX1hPtJfRdoNnlwZhsvnSyLpeOiFwm1w58piE80DkuOm08cPRYAQNOz5Y)ix5ZwQMoO1UJ8NZsIGP)OVzebru55wyZF0XkwH94meGe9euGWl817uRJbaLL4JmB5gdXMo56EAzSvFlh5gBQ)PF8BggTr875M7ByGowrcJG5mKtmatTlLi(HYu7UN5AWUJ6OoYt8iUZovftWZRCCr0wwfOB6ZNjXpQpREwmQGdMuEgKWpxCSJTr5P0X1WrpgvzSE2l73JF(Qv67uOR8y90FqAWU3My6QkjdOhE6yTwKOj7pDM451MnIIhn8kSOsAUYFv2jQMDq1N4JBeIPz9e5Bb7wZi6lZi6FgmI(F7Zi8nWiQ)bq0gJOViJqDwFQmIYA1tgrTE3huHOkIzSo51(XUV0yB6ExqhrYacJ3qY7lwNMD7n3eVfVxoa84JyQhi3ZW3()p]] )
\ No newline at end of file
+me:RegisterPack( "Unholy", 20221030.3, [[Hekili:T3ZAZnUns(Br1wdhrBxEeLSMhBj5QYn5Q92u7Mn14S79ntrlrjXDKi1rszhNYL(TFaGeK4r3aqVMzs2uLNeBsGUB0Vq3nEW7dU)NV)UzrLX3)J971VFqVb9UU)GEVB47U)UYN3eF)DBIM(5OfKFjnAn5)(ptxMT6z6JFEvw0mA3lY2MpL8QLLLBk(ZV5nlskxU9HRNMT(nfjR3UkQmjlDAE08s6Fp9n3F3dBtwv(xtV)byC3NaZnXtjpM(RltMnlUQTXftV)U7VBvsrzbfZlIYxeMTjonoN8N)iBWeNg9WQ4z3)FD)DrtPy((72YO5WhwLSyzjT7PXHtND)DF4dF4(scwq6284IY48K0fHfL5jFowVNdu6508eApIiSN84hVo4AvqSBI3UjD2nH96(AV2aUjy7ge6Ctw1)xL6gI0(zr5FoSmpkTyEw(6i4o)wKoxSD96S0qkNp75vXIJ5ftNDDE86OK0IDtgVBspDO(omskoQCz40SKv6959i9jAt20OvpVPaqW8bBcgXodqeeqe07aO1amvW41BYEkopmFlPdpftqF6(X6kR123g9hk8)Hc)xuf(ATPOIIOTRauNoRk9ZINZWkxBNd71jPZcNNhh)RXI4MRD3i9OI9f05GuBMQQC2gsRJltMlsItZYwnl7Pub2xljpA3K3vnPuEYMk09VIiDJaXI7V7XO8WQPmP9nSmHqXlAjShRBj93wTnomEfvYqyj7MCXUjdQF8931D3eYpuo41eqehwMfoy3e)DtEd7fKFMf)W25ZfmTEkBB6SRlkjtCVBYL7MeWB)nSFXN9qgMUKbGYOvXPLxllMVUM1WihAhHmif4zqJlodG54AdHvY4aTCxYOkzAith5AICozAs5Uj3UBYB7XCB0W8vmbvLaqmW(kmWUUaorEfdqISzQiqOjxWFiFeWEx)ECwCvtc61dYXKJ8Tkr6AQtCQ7RPFM41xG9vl3eAvRqZJrEckgvVVzOwnSUHrK8Hk5NBhZgFImFinFImItVxlPDlkkmRxsX0nncj7TnaYhDnFe1QYgGhvtdCgonU0zvnPaY7TD81bJZfn7zUuPH1biF3n5LxSzs3kK60y8kGRgDadqA7gzHSITVOb2GkJrloj8egwfLHBwfLMsqNtdNA)lcYHnzBeKcQZhAxky3uFKa9k6EsCSQ2zjgBDBIjJO0OvHrlYsFwID0qdarFiZG5Is6W5rI1tA86K4Ik58ajS9yYkY0JzPLrlOqbeDkTrhts(Sg14TTdSeuwSW4rHcqak2d7YhodoB7QqIPXgI)FXXsLRwcP1VwCKViUSz6VntldhmK9(HS3pNzaj6CIoRyMm8fDYpK5RZjPyDdwSKaQKIL0ios)1duqFdcVmUam8l7SrvfMrJ5Y4Um5zEuYSW4hz(hMnR464FHM4C1ix9DjPmoxWqftrrvbOy92FQK55)aPs(780FLO8)TkdcAdQvqydc1eGKIH7NYtYiZXM8ReDW7iI9Dt(etf6QDt(hBlFGOprCAfLse()Dc8kj)J534NwfTyB8du)B0PPlINk6hsxteyMCm7H93ayOsauqgcJycaEat9U(DvMfE6oIyt)2iGFkkPKXfvJGM3GSAUK4iS2I8XK8T0HkvNIWTiedXGQyjfesgKfBjKkn29Ku1yAOGzEEgrVCor6Nhk2unWrB8dRYYMvJq8w7Zh8DfNwvkrAWjaqAbWKR1nrumrT2AcW00q)cMHTVse7Bev5KAC)MWqjcHNNsMrOshQGMffv2PgjVJP8Ge4NORseIYZQSLfJGCVf1vxqtlSrhKgCqyXM40zvZbfOgITKj9hJwrmJ)owN3n5VXkFydSidsINF2FesRSyv9fR9CusOKpt5BuCGvIaJqGexxs0QkaOgpzlxhYKZPyrCk0mQNdgtmOppI)Rxh9lS0JtMsPmhhmkLGI2t1OZonJjntWZ)WsymPgrJtaHB4We19XkMIfqqMplkTsDRV6uT4C26KP44GetbkkIYyLwRV6uG4aNfvHBaFbLdMmTQYn8)WqDkfRcMKb7FPUVcKLy8PabIY9DZ8IuSLUKbHZYYwtt9AAzD0eq1BGo8UPxtdI5rkxhH4gYeVnAOvSMQxOmPB1SP0KLAkEqtXOCIntLHvX7wXv(CkB6I5mxDXZ4oWRAyLp96(2YpJsFoCw6mOYBb75uGEeyU8KVQgO2iusOqHZINg9mjaLPFUQepat5Gvmx9sc3st2ZExEMwKQ0bxRciIeRcYMiYgOlv9aiWxkAHBWSO4POCkngUMzGjpvwnaitN9qYksyQXfGeJus4Ei6(0qqEl3YXixKQiiuTH81phMnpSCzC4SO1PXZoGmI8XSJccGSCCH5CxmzqvMTBY2cIvA08sQFb6Wz3KecSPt()XVN8KIQwrlnEmLvs4P5tJ2SHXS(0pTBYtltObfssSPK9mA9s(43)6cNduQILIB6a5KDOzbvpE0FQ99IQeEy9UvvVnLheZyBiK6u0hYvIdABevfAohpKqSwxfhnl8HNdJ)LO1BuMM)RJANNsb1VHnEzUAQygtZYZ3UrUFi6Q95sLMX7NJFK82WSSFnMojLCC5VNfsEJ)6hYiQYr1tMU(bi)KoWTDLvtZgskzKq6tKsijqLN7q(nMz3MhTQoC3NrlkJ2ZH1fPTkeDQ0gi0(cIztlnwOvShEico0uBZkzHTOMPbaBrYa)a0Onta4zQGkxSzlx7d78ysJyDouyEJLe5oDgzcM2M(uwE5YNHQUSdS6UOH(ax1QwsIMc0nssFmYcFbDB0)3STOClnmqUKvsrTPzpMr3boK2vKTIrtXY5zX0suBu4YTRJsZsOlvW93LKsWnflH0LScfYsnC964zjSLDvilS5RIlwY2kqITDXQShIwrBilgjY0YtZw)qK(I(sySfe9eIxorEJHGfKuVyDRb404aPe31dVGwAb(8CquQeQoW1aTUqcHbHfpNkLyt9BUUm46LrfHKqxcPIeUMMWRBTg2MZmb2n5veVydRw986AE2UaC9UEytrybJUDpj9(4KEFZKE)JM0rw5pxj9nv109zLeknX6rhBSI)zEGBDS)gPgq7Ay7lBwDzIUjl6cuS10YgxvYYQML1vJQavMEJudCMQuzE4uvGavjlWdAe39RCcWlBMH0KIiXSNsNUlpN58rkvGpv3Fh2Ub97XLBOj73XErRSKUpV0evvJE(28Nfy80GrKWTyEeGev9uEDDI0OT0(sIwVXlAQcoJCHM3TEXJnpCq7Tua10XgZhnBb2AgDEAVrAkuCm3atAI(WWS9n7bm37AGGguIbu1Qz3(sZ5F1OufNxeNtX7VpuQWgoNFLkimFSkvyW8mOuPJkbLQMxAontgKQt7ROK4ADr5sU4rs1aCJhrjpH8Uu22rJ2PUyMZsIf6KkAT1rHaPzjOwe(V3oBXA60bgtUSB1AV9BsteoHFongO44Wv759(KQGlMlxu60y6kiUkKUCkMtygHiQLISSMBdgWsv4gxlQ0IbzZwAumgZBMlzNNKhZ8V)7cx1yJMZPYjkIpCnwJG8KQgJGjHep5VZCXjujQX8fxTlIRuQudUkjdL0OFiAblJ5CYyPOkw8MfbhiyC(cO(y8kEI2Krqrzyu(duATfWgAJHm4RXnj)GIvzLI)TKPvxtPUW9j5zVcv97PKGNgWUTbwDDApEWHOlLYkm(x2epTKAZEBZMj2SkOrRuPD0ICsKCYrz4kKTQKLQwQC8mQ5AE(n0Qbw3yf1pLC2(zHnBb26xwd9(gK)AjuFmYFnG9BE5FGj5FWbj)7dk)1zD6YFjJ6(MwNyidFlLWbPmmsdmDldHczO50XWsedPyAc4EOfKbL(0k0ca)R8EHnIcG)AjRg62v43KXEWj8Zzygd6DmrumONPOag0tDtNMjhfq9rCBVkTTY(eGReiwV2kH10S1RJO7)dX(V3R7IGZQQDIbxD1vKyFdEP6Ef68jOVMsgaOZKhUCZWCtYB9EhscXZ9vPSDIRQ94Jepya42nXqo(DQnTf0ObxLfJjrdVDQAoqbDTQgXotmuonJfakrcFkjLaHMOxDwakUeBkNGt3wFvGL3up05bykF1uNScLLM4P4tvPDeU3N5Z2Y9lzPy1yNkOUOE1KCxJSDQcCxX1xFuD8Zu0CmgfKXqhXx3wgBGf31OTwG05HkjDoZhy40vrpvOkl76W5YHoS3JJ5a)CA0mBPLDl4iLnlOQkc2rkQrYz6CwmSbAyJaFv8HXWqMRKOTp0Qu(aYs22rQaQyJUDWIe8702kOv0hQzsZvBMcXNs5yODWdlG6Ez2nVLDDXtKrFn(IwARZYFizgjJdza0XudeegYxjcLaNKjB(gqupdmHd81d0eN7izBJeofy2DOwfve4KjEU502bF7TPmiwBkEeA)EOqOghsNZ0umJ9dpbgZW13KhBDtc(DhrPHJnM61mXXh98OM21168DEomv9O6D2V1WXfIQftVrsvuToYAy01JXvtYHBAVTpW5JTNxuNcMtIpA6W7y3eZr3g6bnRLuhQwiD9Ia5zhWwo9a35i6wyWHP7WH7YY(K0IRJJHa64knyvDFFXNPwzRSNq6eJLDnbD70ucCk)SfxGzQXo(Cihfa9XyEI)nM8a7I394W516tTJ9z8CP8qvZJIzDkDAolIi0f1QkAv4gYdRkJj9KQzA3FvFwNKl713L9FlFqpvQ6b6k25HD2jK86HDxRi49uFhpmqv9heknHBSVh)RkOBPxKo9EvY4HT5f0J3syrwECbIri28L7zARswHbbMBtBMLUMaTD613MHQO3wZz1ZacG1CJJoOqNQ9lHpDvpOI9kvSTy(MLfrx1SVaSWUGdvW89gdQLIflm7b84jFimB1SHbylxXTkGYh0MopFwgdoEMeDrZDuJEoC(C87mi8GnrIl8qogJwg2UmEKQiKn7rykh7i2JESv3RZGk(uTDC70fRCZ0Ofqn7fs3rdjR3KN9ymL84N15wMWLnnJ(CASvZIFmIOkvkXRABwEwzzCAyz22Pl1IbULPhVjzgHKMcwje5B9p8ieSWsecSPgBMkYfQ8ZUlbw1obLNSWeEmoVGIcH7qw6DusonyPI7V7)97(0p(x)X)YFE3KDt(5LeHhrGKLtcFN47F3KxxVnZFnr0g))TnjNYRkYOxRarBlZitoqFW0LrPliZqU7h(Bju5FFc0(ywkbZSx)A44vjWKEitrElx0qAv3GFXVb2doJW(gyyleoIcCbcurfMdpJ077olWE3pyrNO(Ily)0jcuO1xXjR3ShyU50HFC4gnFnfwfEcD20kXoXPCey7ePAd(FbhbkNIuTraYPm1MT1PMdHy7kvYzfMd4r31M97PMVOcFJNFwosC6q2(1dti(LoHARFatQOEMp1elyhkuNXG6H6uddyNN09WpxZHWC)8ZPzduVXOK3xunmD4TnLvdRgG2gAsDzVbGmuB(Ac(x1oVZBCVTVYMTeNK6BMtR9AhbQDwbCB(AcEtCA82QXPF75qNgdOhL47lmqpjcTVWGhkOpBecj9WPvj2VPWeXG1UtmAOcPW9h8uzmRUi8ZBaIEGABoXGFFvZorEH)cd(9xnlWr5pE7oXO5GuZcCqpaUnNyWRRMznKNOmAO)7rWoij1DujR)feMYlUGcyHx5bhHSCffvGmC5g)Qdz5fuqbYWR2GkKrk0YjGMrsNbOYLQeoETnDehaL9ubhgkmQJ4qSMPkahQCQocvErpvGOALx3dpe1(y2ZA)OvlY92vStE8pE0y0J)Xd(VLhfYN4onOQ9AhbAtCd1LkhaWan5RpWDNB)TGqvR0KnSi3aVJrUF8O5)GhfbMnW0ETJa1Qnayt(6dC352Fliu)IwvVtIJTVsa)ikZYx065Ds0T)kb8dsLZAOD1Fe7E9EfzNQzN)R62Lts(VH97gnt9FvBRT1w5vmQEpl9A5qBH3bU2uFnrf6T18iejfOJk9vTs12qbVrd)yR7tZE2rb96NEdhH4jqo8EyiFKRDUryl9vusbYGFHLCeUNGuCvxTl(4T9SqPYjY0(u84impAUacCv(euPazKpqvQWoGgS8)mTy7gQ7jk4JQ3RSVM(z9jK4UQnoj5EDQzFbO70LMppmAANAF4yCfOh9YK)LdWc(abCb(fLRj9X4rbSGFMF0amYUw4Sb4JJnCE2VrMb(jWvFW50xpgWpk62AatCFq7zXWqQ(6jHrG4de8AiqbdgVQc(gdphLC9ReKp58gKanp54rBLOKyg1GcMtPC7r8vhYhrqWiq8Ky1IT2gh)6XGa5tqWQNpAoO3jx4HbYMtJVce1oL(NFaI414yg0NZDa(VHbosCKNaBc8a(of09xdGFcMom4CU57Xa(jCxU(h0)bq)hjW39d)118C)PxIq88)PFfhPbst)cPKnpzvZ9bwX1n7w3lh)M27gSD)a07vVv6Us(7TY46p3kWDU9BUc875hhPROx6SJRllB9hvIRY2mM9bb5k23rIXbx1(5LyCVRhEfXfdzwccmhdxTxVUaLyMVMfV6v3mCCp)9HS6FOKvFeYcy)iEaKf)E7uLW6lsybcKvhe2fm5(YlyddJJdllPK)fDjkoxkdAPnQfPfiFdu89VTRrrB77Cb3aBsmiChuJBQbxTWHiswNKoJwHU4Fnw8X0YsKUy7kssT7(H)0Uj)RAOvi2izXj7kDO6lzPQKSBxPpfydOvv30Hw9Ya)xDJV)LeZYl7co)Zf34lQDqA4fde0qAyP6xgrJEh(qG6JkS(GfQpg62avvxA1GMs2ekHo6OJxYFErxHJN4L97577FrqVEQKEFbsh4I94232ZZgUnnSewZb6HmF6NJZvhDMKg3k7IWCtVr09rLKta9EDf6R01sWR6Ed1lmX0yCGNbX3TTh07w9n8HU4havhgQJUbhuTFeARbuhyYmA2ZETwFa8(xEXc32RJwy)O9z7MwULsiACnJb98aTH8GUmpSqC34BIbPDICR5uwvEBOerlqp4aii(ZREU0sx0YfmCbGmAGxh5di9TJh0ap5W(Bbi8zlNalHb6iIjAhWlhfxyxXCvk(iUDTkOijEuFpW7EVrd9KU2gUTlY1P3Ld9ryB1puzXACJBAWyrGdup0K57JgpWRBh4BRJxEr)gM82GHg08eUZhaXgXT0EGTQN7HCxGC7B9zZi(tvrTKqM3CYDeM3UjFIXYVA3K)X2Yhi8)ptcLnLet7FN0TsY)y3Bb)K4AjioI0wSRAgzRW8QK5qkiUPzmuygeD9JrDPtd1763n03tM1noqKiZQhzxjD03jZpqinMU3Jj5BPuyy1AMqGprHQyjvu1OakSUhESonppJOVmNWRZdfxuePotBy1hHQkqJ1sFFIOw2Fx1YD1GFPNQ59u((YNO3rMnxNWVyGFtKjslp0f999L0uLUMbO8P9DYnpi04bWlzUTLxRkU4LLFdrP9JrRwjFzejfqh9txJ4xsFP40DOL1xDb2BiZn)2OWSn0d2(v0R(JPLvQrQQFiZcGmLg1kyuqFAOexVo6xCKsocYOZjIoAwEjxAA9rYxSPKPj0BzuwS(yH4m0AhRVVb07mXVnn)H)erx6)HepazgJRBt1twQsGTKj1vKz7iZJoB8h(Whm0h1leMdTBesN(XuNKDK6R86WErFTxya8vx(9oslaZz6ypv0Ue7fDar1MQnPh3Zeb0C4hCeVTUICSdcyOLr3cf76e1gkoIoGR2kl8gJ6O7Tc6HODEovnDxV8avkpfAK7N64(PlEGkIhijDqQFK5zvV5)AHpXZmDOwD5zr7FhKBnkpOl2mVUaPwJLz9isgoD0BpjmjJxqF3ow6k9JMxOHwp(9Tir(O01mdPCAu7By3JgheGgs(WxEPRL01Ajp537xX3GVa(4t6lVuM1fXa(627LxyVujv8TB8jjGjfr(OGEAQdk3rEHvONQEqrY4EGkdAqP1(bikD8YiaQOHQw2MGi8LKvvERd4Qn6aOAePs8A(kbgcO0K5k74ztfzerncVKoTVr(gVZ)KoeSrJuvDefzv6qoXdqvb47wpf4i7HTJPlGnVU1vRqjOX(n5kbC(mVS(vahRs(RepuK(Tma(jBuBOZFHvcEV5z2u7VnG78V6ZNulcAcWVDwBAsZd6D7yORxEpGRVzYqVj1wTIIzRgB3(2E(1EUqC2rjf0334gf8ED2d(6GNKTqV6EOEFp7bFrVt7HMNsYZQYEvlhjjUQ2c91wVeWTaLtf5Q5tk1OBAv8GbhCMG2QoBqVw4Q0vJOdKjbXwKDtaPulBTE74(g9KslMgMZWrdGPH21OLzsQ(HEcUtQHEwnnO6IJqR8AxlssI)765LT8fDYIi2hMqHcTMqSqLd2RRSuBGU0VgZQLRQ(XAf3s8BX04(vwBk(nArH4ck0f0UeBkWALvBAgcfFB)9qDJyPZ2loSuSXOkNb9WcOZ20UohTkTs1e)SgJvEKsG1ybM21q4UifZwyYr5HOMp1(drm6KR3SSRbwzWGR2S(x4htlgHDCd4Mcd16UVofeJCPbqnN7czAzWeYNRc2SjbBfznpAVjjb9FnbDGrGXRdd6aCphFJg4zDDY96a4KcD1(q8Nqdgckvl(MK4BMWQmtKN6aUmHT9numtWspFwhv0o64pgrEFxqxMwxY2ftNzi0L6qeGfJcAciH(tHoIHR5uYvswA8aBtY61fwB16Meb1ysnyJAHLEnlqM1aQazyEuG2Gl9jXWb5tajefKrb3fI(2Lu1C5WaFhC4BuZXg8uFUbGPNBeMzNnrIyitgqiIcnELQWK5Xy5gO(Pwb2JqhtUyDjrUBFRkRJTOO1jwwTIA7M8DpKSkPmjwkfZ6LBJsRprK9udY10LkBF0WdERyGPAtBkeIUUYLldpDt1a2q7U4YQTJ72I4DtIMxs)YbqX)Ujjf7MqRm9h)EYtkQAfTa6XugbzqNpnAZgAbHM8PFA3KNws8PUBsrCzj7z0V7gF87FTRmkdJDVU6IBvFIdHzQ9UuPVx8wFWcz(Ylk4agG30ZhE8OPWZFjQsqhSRt7ZSEGN0wT8MBz2nvJ1Pz58RG5g0PO00)YUyxN2x0)9NmMdoVHgMUuCUH0NWTHdc0sxwDBCyI3CYjFfwKNXD1kDM7ogVDVjPzA61M2xKh1ytCUG9r9bX2FjzWsdYHO5Un9PS8YLpJNFHHX0TI1g7qThmhcZEq1s1yaP2561jOzE6GBqerThXak6qV10F5f0R786jhvFC4YTRJsZsORUZvjPefskOctwVoEwsujDp13(0fRYEiAL0JePgvyxpX5FjMTprAhy1BCK9Dzdy0FX2zZItj27zRjSncezMdA17B8n9QStgnWhPCxYs8Ud69k5yZBPsHvGfkle3xFuiGBD1eeyk89wS2evn0HHfQPfLUS4twwMmtj3dT)0ouYObwI7r7A9QpPSrYUUENLXQY)0OuQZP884M1g11ekqJfNFQK8Hqz12oC(2CMdHkL12N9nAfhajWZs1gaW0bvPbq44S1GEMryafuehNxeNtHJGiU5zFRkIHiWZJiwhthMigcohTiwhOqIywCIfH)7TZwSU2ZHybU4hDkk3TrYjSFzQRoe0gSrVCZY7cKgqJ3bq)orPtJP7T3vH0ncktXmy43mQGus5uRSfmCFvRO94iuGeJguBoMnBxvaUbA7t4SS4K5t3GKF6432duWopjpM5yQ1ztZJ(g1xde9DQL(iiAFvjqbZrONGatWPsIwWYtHej0NlaxdTUi(DuX6qXZQj)CCYkPErCysz8A(wy)X4v8uJi0ij9QO8hOFndzXs9ZQBFFqivSkRKVt)RoohDTCkuPgpgpPE971E0BrGXTeq0Mbi8jWGcgxY0RzNAq6HpKW2GooBzRZfpkVCmkE6HBOIg97Myy5hYw(zzECaDbsSn6hl)r31zbuFzbeYruEVeqiW4BrbuaIas)sw1KaQVOacB0FOcOQn5NmbB84Z3qWkQH8o57oU7lHBSJUpeZcHGPFOw3wUml)(7Ulzn9mHtOJpslyb7ZD69))p]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DemonHunterHavoc.lua b/Interface/AddOns/Hekili/Dragonflight/DemonHunterHavoc.lua
index 944768c53..a6fdb38d3 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DemonHunterHavoc.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DemonHunterHavoc.lua
@@ -203,12 +203,22 @@ spec:RegisterAuras( {
},
-- Talent: Taking $w1 Chaos damage every $t1 seconds. Damage taken from $@auracaster's Immolation Aura increased by $s2%.
-- https://wowhead.com/beta/spell=391191
- burning_wound = {
+ burning_wound_391191 = {
id = 391191,
duration = 15,
tick_time = 3,
max_stack = 1,
- copy = 346278
+ },
+ burning_wound_346278 = {
+ id = 346278,
+ duration = 15,
+ tick_time = 3,
+ max_stack = 1,
+ },
+ burning_wound = {
+ alias = { "burning_wound_391191", "burning_wound_346278" },
+ aliasMode = "first",
+ aliasType = "buff",
},
-- Talent: Stunned.
-- https://wowhead.com/beta/spell=179057
@@ -316,7 +326,8 @@ spec:RegisterAuras( {
felfire_haste = {
id = 389847,
duration = 8,
- max_stack = 1
+ max_stack = 1,
+ copy = 338804
},
-- Branded, dealing $204021s1% less damage to $@auracaster$?s389220[ and taking $w2% more Fire damage from them][].
-- https://wowhead.com/beta/spell=207744
@@ -329,15 +340,9 @@ spec:RegisterAuras( {
-- https://wowhead.com/beta/spell=391430
fodder_to_the_flame = {
id = 391430,
- duration = 25,
- max_stack = 1
- },
- -- The buff from standing in the pool.
- fodder_to_the_flame = {
- id = 330910,
duration = function () return 30 + ( conduit.brooding_pool.mod * 0.001 ) end,
max_stack = 1,
- copy = 391430
+ copy = 330910
},
-- The demon is linked to you.
fodder_to_the_flame_chase = {
@@ -485,7 +490,7 @@ spec:RegisterAuras( {
-- https://wowhead.com/beta/spell=204598
sigil_of_flame_dot = {
id = 204598,
- duration = function() return talent.felfire_heart.enabled and ( 8 or 6 + talent.extended_sigils.rank ) + ( talent.precise_sigils.enabled and 2 or 0 ) end,
+ duration = function() return ( talent.felfire_heart.enabled and 8 or 6 ) + talent.extended_sigils.rank + ( talent.precise_sigils.enabled and 2 or 0 ) end,
type = "Magic",
max_stack = 1
},
@@ -602,7 +607,8 @@ spec:RegisterAuras( {
vengeful_retreat = {
id = 198813,
duration = 3,
- max_stack = 1
+ max_stack = 1,
+ copy = "vengeful_retreat_snare"
},
-- Conduit
@@ -611,12 +617,6 @@ spec:RegisterAuras( {
duration = 10,
max_stack = 1,
},
- -- Conduit
- felfire_haste = {
- id = 338804,
- duration = 8,
- max_stack = 1
- },
-- PvP Talents
chaotic_imprint_shadow = {
@@ -781,16 +781,6 @@ spec:RegisterStateExpr( "fury_spent", function ()
return furySpent
end )
-spec:RegisterHook( "spend", function( amt, resource )
- if set_bonus.tier28_4pc > 0 and resource == "fury" then
- fury_spent = fury_spent + amt
- if fury_spent > 60 then
- cooldown.metamorphosis.expires = cooldown.metamorphosis.expires - floor( fury_spent / 60 )
- fury_spent = fury_spent % 60
- end
- end
-end )
-
spec:RegisterHook( "reset_precast", function ()
last_darkness = 0
@@ -830,13 +820,6 @@ spec:RegisterCycle( function ()
end )
--- Tier 28
-spec:RegisterGear( "tier28", 188898, 188896, 188894, 188893, 188892 )
-spec:RegisterSetBonuses( "tier28_2pc", 364438, "tier28_4pc", 363736 )
--- 2-Set - Deadly Dance - Increases Death Sweep and Annihilation / Blade Dance and Chaos Strike damage by 20%.
--- 4-Set - Deadly Dance - Metamorphosis duration is increased by 6 sec. Every 60 Fury you consume reduces the cooldown of Metamorphosis by 1 sec.
-
-
-- Gear Sets
spec:RegisterGear( "tier19", 138375, 138376, 138377, 138378, 138379, 138380 )
spec:RegisterGear( "tier20", 147130, 147132, 147128, 147127, 147129, 147131 )
@@ -919,7 +902,7 @@ spec:RegisterAbilities( {
gcd = "spell",
school = "physical",
- spend = function () return 35 - ( talent.first_blood.enabled and 20 or 0 ) end,
+ spend = 35,
spendType = "fury",
startsCombat = true,
@@ -1057,7 +1040,7 @@ spec:RegisterAbilities( {
hasteCD = true,
gcd = "spell",
- spend = function () return talent.first_blood.enabled and 15 or 35 end,
+ spend = 35,
spendType = "fury",
startsCombat = true,
@@ -1092,6 +1075,7 @@ spec:RegisterAbilities( {
startsCombat = true,
notalent = "demon_blades",
+ cycle = function () return ( talent.burning_wound.enabled or legendary.burning_wound.enabled ) and "burning_wound" or nil end,
handler = function ()
if talent.burning_wound.enabled then applyDebuff( "target", "burning_wound" ) end
@@ -1275,23 +1259,6 @@ spec:RegisterAbilities( {
end,
},
- -- Rush forward, incinerating anything in your path for $192611s1 Chaos damage.
- fel_rush = {
- id = 344865,
- cast = 0,
- charges = function() return talent.blazing_path.enabled and 2 or nil end,
- cooldown = 10,
- recharge = function() return talent.blazing_path.enabled and 10 or nil end,
- gcd = "off",
- school = "physical",
-
- startsCombat = false,
-
- handler = function ()
- -- trigger fel_rush [195072]
- end,
- },
-
fel_lance = {
id = 206966,
@@ -1587,11 +1554,6 @@ spec:RegisterAbilities( {
startsCombat = true,
- toggle = "interrupts",
-
- debuff = "casting",
- readyTime = state.timeToInterrupt,
-
handler = function ()
if talent.burning_wound.enabled then applyDebuff( "target", "burning_wound" ) end
if talent.mastery_of_the_glaive.enabled then applyDebuff( "target", "master_of_the_glaive" ) end
@@ -1698,4 +1660,4 @@ spec:RegisterSetting( "demon_blades_acknowledged", false, {
} )
-spec:RegisterPack( "Havoc", 20221027, [[Hekili:T3t)VnUnw(3sWI1J90uxB5KmThI9I25MTBl6nhWMEyVFYYkw0XcJSKp9rYKdb(V979ifPiPEus2jtZClwuG0msIp(((tjMLtx(7lVjmOGT8JEt88MoX7DJ9Mm9cVlwEtXJ7zlVzFW6pfCh8ljb7GF(3cUpDnE1hJtdcXvNNwMTgUZnr7kJdkIstEFwWMIL3CBzuCXVKS8wQDy2L)aS09S1l)4LV7DlVzBuyit8SSCydGTilDtuma4G1iqZhVpJToD3TbfFZ8V7(GSOGBJzNJy18ISOKpXk8ZFmzTFECAX53hexYMp98OnYBoE64Tb5(5fbfJdsE0pCF(GHNjVPxJB(0t1lCDAACy6djJdlZ4u4I51lSXnhD4xpDu2thLBIvAOCt6PgLjWQfTqoag)NoS6)kNDy1hEe(XpXc2DyvqXHvXPpCy1FTm7XdREiQylCR4OKq5LcIttUtEhg8tw2Hv)7bzF6U4GmaoP4)KTlnbxxaiypSQmjMLJ))8iCP)4DPjaG(5G)xwF4AL5mF2Jm)Bbe0FdGd(RttcJWLvX)kcIzjfJVfrt(tmMLGRpCWWSYe2M0S7yJdLOO)owyqCmSCG3jwziIV(3Yrx1ApRETbig7FhGWoKZbzRdsy(fPzza8OFMnaty7A0mbf3Gfu8Ta(oEFzErzmqIzL7l4iL6w3NI2wW9YtJVNdxUm7dFMTUSGbse29muKueTdy8GKaKoRlqbqeWTdUpikgjLXk8zEyuoUnQlaOfWmZl3bCLG7IwZH))aeQPLGIW73gKca633YsXTjvxqFEL4fVuYAMuH4VgLLxG3knnuScuJA23Cy1qVVr(q)EgGzWD3Cy1FVmc0exveaS5ICD8YujGlB8dXTc5EAYM1is6xWXXbNvjqnVyRkbM6qBq8h0ea0xQiacK9S4y)kCCSgQmDX8HZ(2QLwGuLF6g)mGMKlEKIJAXoBY)2YsQeI3wUzJqgIwSNtZBr(kYshoTf(kkae37d55m((8tzSGpjw(f4YN9ckwOLkkZm9lwX2rs146JrswTccXXGwLgETlnE6jLgYJRbdl4(BdkYy9e6x0BzTB7eKXNKMTliwYFpSADAjyDxPcGSe04(w0z7Hv5m0DxaAaYGBSU48k7Q4hcEmVsq(7GqCdE1K0KVL79fTLpAP2PzEmKle3Xkc2LMTFBAEu(4Y9kzijV6PNcz8LXe6L(3IQLWYg1UeOdRTA5BOGj0l56fAHcTmtUf5mmBzyeAEwy5Mf(vmkzkA7kJ22pzq6(5zSCgpUqf6BYwKeHkiU5THFe(OMYNEawbs9EuBxyA)3467NJiEAuOkOSdNriTJuj3V0(088OBJIJkWGoPGc5Nlyi4dGh(ht)WHv3eLSPmg5E422lI3qbSoq7aA70k1rj40fKdWD7E4FKwmoNJha7bqJR9CJi7bgkq((WU7JkWvG3LsKI)BQSNX2feLKF9vd4jFeY2eToQyXSj9BJ15gTqEdrGF97U8BDBl(wVjJ63EktOY082MEpZDMv1QIvqsXfgE36WX7c(8B9gzYp8AHF8qaKqNuqKUd20slCtE1AKt42rE5Y90waOMErbBhK1dxNft(2mLxudwzWc2dqLpvEtbQakWbEgzsZNxNmlpVgWVBViPA9Ax67snpBT3XfrR)eaMAgUXDLmDjp)cOybhAPOl5ktewcBxelF(uBVTsH51ZNPtyuPncHh8f)t)4O8cbnl3AKkruQc9MBi5l2ML(GpeNbqf8b5YXnmGKWuLZcrb6yOgN1FA(LdebxI2TlvuNPFaik40YzKHDm1)zj3XqMvgdCEeiCWcjlVy6GHkBmkvV64iYRi9hvGqhiEjihnGJg2xEST3FK(YkZ3IOGGMktUfc7h6ZZ(HtrTIsyvGcuWCHQaQ1YDBUfp(WOrdgcRaKZ5Z9GG2q8ZqF29cA8EgNPhLSy6KbA3jimmxC1rgmwqdUPWVY7Hwuml)jDcHQ8IeL58(amB3)dD5RiY7d8QnIHWm8KNGCKarCSHnDgBderDRitjCn84xqitmrlMSaP4DP4wauFwDjBsU4CdnlErho8so0PVqWL3tpTj6UTf(sdvVlh1CVa(rJD7u2mqhHk0XtpPwK2vvRRY3XO(IQ7t5UcLwUKXcx4DPn4UAcj0WY7Ja)ZvonZc2NJH7zXqQUzPyRoIw7dBjWmIqDJobrgA5aqyDACmamUDuzrjOpOqzE4aUbsv5gMy6S(GPRdwVLNysW6)NYii1eF0Wp3yFu3k4ZmWcFWWHwoGdz5ILk8)sz6D1eB32lSwfyyB(axpttI3i(mKJaPK(pH9TztqzCbgeeZ7dOvSBq3Pvlbf)i)CSxw5YoyXBaNsnSrpVMpDGRcggEA5DTyOb1S4V0sxV(ZEJAq9Z5CKHTGYEdoJOlBc3QGJx3R8y4BEDW38(dJVr0jXtJVnDWzeYItLVPN4d3FSZCLgs27oaxDBvGPRWtxDX8ztWyLhvAuK4leZXFleVPTyhN1Em)6BBxPISSBaLJslZ5eOiTiz5bA3Gg)yXpMhfK4hYwNX4zInSDhnp9eH)PztOHUJ2DA3tZQ04TVmW42fKafOc005rymBmbuFiZgwyuqbVn)QRExC6TbXgxQTTeZVqIWvYJ5Q6HCvo6PWA8u1Qzvf7BH8Pg4u7TXn01rBG6OGuVBaupqiKr6w)8hyS9goz0YgGAz8CYdYYGcIWLDcCa9iP1WvK6VpgfMLxCIGEkjOTRTyi28SYiGHckgGEty19uDNY66JAPW2RgqxYXGZK9Y6Z7tZbq9aMEoVGuczLMI2jq1TPsPN9xldnXQF2lMc(15Dwa0jPDhvBgqrrwnZHS3fUCMYdf0woTxAwPIKnixarctyYmJ6JQHubaCtKXsS6q4I6ojlDKYxFojOdssI2gjk5I7TN0TDhwBwvTXHJJIFRRfeTn3aAnDLJiTj0LKudy2ZrvedmAGZ8liT5YJUt0k2nXqIXDRytbdXiaYHeb(eRxCqhHgLkqUCNjlb3v596tcutRvtVuOW(IuiTHhA43Y9VfYl8CHLDfZsmpBT5yEBzwcsTCNmk3ygxfITiCizCvLFSloAMZzuChlViFbyknvSivIn7Y4C6yoAm4(4CGZ(sll4tyii5oMd356SnfHggbLTc6OaUjttZcudSzXK0pv7RAiBO21(qHeIu9eJeTI5ltErGFNND2pc8ZDYpQ7Fu5(Ow1lBQpkW(k7JxHhnZaRJcrojX8eQT(R0m0Q1N004)sWuU8pG00O479inTEiTE2jnPBH1JSmup(PNKHce2zPnKWfOExjOhmGoUE9Sjp9K7MGE9LJCKMs7mD7KHErquxOcI5NewQBO4EoHTL8ExQXKEZFvYtQf1WJnLeksXraix5JrXC1ZYQkrmSKqYO8TAlsNft75drI1VqPdPG9lq2qD5wtNnT8M7zz5WYuVdRxT8Mhc4kkWn)h)4F)J)Yh)5)TdR4VrxhwfTBFAwr1GJFJyNEdojkXiaoSkpfFl9ckls3fWF79aXeqr5Jp8R)wucCRPaWEFAcST8B)MAD5)73iMDT(LKkbVbFfW(8ifuU0ckvKMceY)TR1)Ux41ldVRaG6cUGW0jNak4PdGzNaamWGlEUa4QxAaCAkdt)HJhpWxSHp8F(BwqYZw7ShqYeaEpxaCcsvBA5WV2HDBOycyhNH7jGyguM96pnz9jdfAb(jyc0pa1B8Qv3A9gk0i1j4LRFaQ34LPDQTXrVbdnwDs(F86NjI6DA)4msA4)qnyWAKQ6sfIRz6t3XY9iwUxZL3W5ZXT7UwEp39t200ak2MaQbCPas9v6RzupHXr7hvMJ)XPJyzmDt0U3ZFH9kc(8Hv)zbc(BLbhwfgDFeMB2HvP7zzb8V5HHF3OUmY7wO3NL3IqxF5F)llX89ppIX1Y7jXyNhr)1GF2z21QFYEQ)2x12Q2LECATp3mJEzY7)u84326p(82pHyQTQJ1N1BeI4zlioLAN8EUHD)sK2)PikmI39CzLFLKT)VWTUX1F5HvIUaCyf((MIwVlVH)B43ZQOCD43(i)JJTcKl)PL3SolQGLffS8gQXFi38dRga7QylQ7j5HvlaV7w9LC1tpbExA00i(ZofWYrCy5A8i03SQJvhwD98dRUBDO87NfOKQM0TSy5h9qstDd9XMOtXWdoZjpGQRX1WuBuliyUWjyEMSPztQ3tTb1G75Lo3ZZeFzvetArk8GNOsPsoXLAXlInptSMlCRrCl8ar(RAd5BTBVVu6FtmqrZPeHy47CIHdXVHcYb5yYeR4WoFgH6VZr8aQ4qOk(ZifO2d7rEthJ8PM80BcisCF)Ro7)snvX(mJib0mMbJaqIBSH)bBdmS3nrYyDrjAnDxxdq39XpCIEf0ViaMPtCchPUr1WLmCU2Kib2K3HvFRsLYCKtAAuUL4tD7TxVb(W2b(vVW0RdNS4aX7z4NRgKMtwGdy3(HhQOA9wwBAP1TsRuhPMoVgDUkUH7XAXFSlP0OCm8OAIuFeCCs0DmIVWKy7ips3hp1Pp3oo15oAufP1CGz8D1H)bX(4lDo2tdAAR5P2bBQdIRglLL4WXS1i9V74jQsUPLPUXfqxa7S(W9W0YqC2D4N29O20ywpfcclVVxpvjdoIrIstD7tSozc7P2zlH1MChhNRME3HvVveqEqRgcMzcHZEJNQNBNSnMqMIrPS6TMohTBpp3(oBFlgsVlsTzNCTroiv3UF7qg4cnR3h7roY3p3EL7LyYkgubQFXN5av1haeaWVxSYJ(C)qtfw8bC2OkaJd)JoQcifueYzfACNk)o8FZxCubz4x0qsu79W44EqxGulVA7rQbeXXvqn)2G196DKMGmN4sMs5G4R2MiloJdOaHhlWSzME6oKhacOvcrLxphrxxYnnN(upaHG4W))9Kqrjn5EWACULyWniL02zYslO96JGwLcKK7tFIM0398I(SNuLy)YOCDC2YFvCaR0Bt7HoRuvtDXblhFchhvkY0P6HWTxEoSvOQAg(rPiDbvFmqne(bCYjPJuHnKNikwnlO5PIILUZxIZ4fQ(I8Yyt4OpJTBVtAT8vYjcJYIH8TpfPTQkMT7WjVQapQM00kNMVxTRq3(NiRw7MSQHqucrTW0U6rQoM0nU6KVmuVBoxA02dkVoqPdEIE5rJHD1tMUX0wyP1mChL32E39gYBHnEIeiOdPBUgcapNcaJcDTZPU30gzrdQUowFUZOJfuDHGSjr9YdHRc67NZIU8e8f(KXr3aS1XzOuhCmtdt9Hl06rQZprB6g2pN3zuQGMQpBm(euMv39n7cOSQ)3D7R0o9B4BSw)gSp6CeZHQsKRhvPL(hj(2VPoZC47MQrYoh5rvOEh5L0wptDpLcr9OI(pl2(E0DUoksxMZcIo6NVo6PTmOIoipeEAVA(wAPKK7zFo9iq7oOSbwtuI8m7rXau6XKNCpCACKeMQ2dnN7BSk)Yw6NuvpKABKpoBUYu3ZeHoaqnyYmpGFmuYRwezl06Z6RgxBv3teW61E2TEgrLDwm2BvS8b)RP8(YpL3N5EovBpBo9t3E((NGPF62r4ZKNECggdETN)jTvLB)Gotz3D(jvE1R8N7wyVGhiVPh(UMje1JETqqy6Q3Qma3tZqQ3(h3KzDpaJJAKCng4O7yeN91)lislJA(iMxTBh)Dta1GKyQzUdf0dzwdZtYc6QtIU)ZATFzyspLzl7yZZbIxNuY(NRb32HW5SULpKU)FnemUJr8cpD6FWOYuNtNULHa3(yETDg)Vg1RRaIh7OEvv3tuTICvg5ky1dN)qptuP5VuD8RZ0y8QEPImoabRtkrv3sN86tzJBMsPryheVuar7ogWr1bQrTtioKITwUvBVPvv5ptVLxP5MqCOSsvqwvRe74GvTgsD(KefGjxR7ZE1geS1zWQlAeDfkOGwGnrTzQ8eCFmT2aLSoUwLAoe9gyorMDUJBC1K(NF4ixTJ4A(u8muwjlp0Bs3kPvTASfwdrbHgoICEsXswAuZZ3ZQEXoORHJoSRbs218BeLJyXjw8xayw)XsPGHSz2hw9DYbp4Gvo3GrR3PtAA1tfZR(JSsTT1D5RQFGUbgKpaEMXcoff3zQw0g5vikx16z8ocPK3xhsjIZK2xEP00gsj7JT2ttk51E11DnGKHwV3tu9WSIaBZ3GORHQuoLPAA2E5tEQk6zSwthDxlF7dsS72S7QKrXRWREwOBmpQCvYrRUuyYxn6rH488TJ(i88BL8mZpddZZP3o6dGZt9wYPy22XU7YB0poDBbYgpO8a6D5nAUMQplG1FwXX2l(G8CJvFx5ujh39qBNAKYyT9R9FW80BMtTZLMpfVM4wJrGMpT7FYy(7n9sqK1B30PhjDsrbnPtkUHbDssfl6Ir0nzEuVlP6ZG3XBqWWE(AGA0AJ26Wt7oxhr(Ae9Q9xnrD2DlDhxvmGKjB(xPqRUf4U)zo)tvOjxUtppK(de)3nbLfBtZ4)bf998RS8)7p]] )
\ No newline at end of file
+spec:RegisterPack( "Havoc", 20221029, [[Hekili:T3r)VnUT1)wcgQp7R5CTLtYD3qSlwV2T1IUBalfO7NSmTfDSWjl5PpsUmy4)23JKIuKupkjBN7JcmuG0ejXhFF)PeV5JN)BZVlGKtN)EVrEEJh592HEtg)2jtMFx(t7OZVBhz1hi3d)smzl8Z)o5HKvSR(uucjGT6SKI0vWDUlCBrejpmj(DPK15ZVBzryu(phpFj2o8MRgdlDhD183F9RF9872egeqfplnd2aylstwhgbaMSIb0SH7sPRs2UKK)Tt)UhiPHKLr0lzy1080W4pqZ9ZEkELFwus(LpqIkOthFz4A5nhoE4gsMFwojFij(j)GDz96FH8ME1U5(9vlCvssuqYJXddks5u4SPvlS2nhC4xoDu2thLRJvAOCD6PcLrWQznqoDcJlYO(0NO(lPKT(RlsFYFvsCqiBzL4(iCWqsxrIP(5jPP04C8NzDenBZkMEdJ(bvQOLHXbd3vKLxeb7BAXo2I2VxDRhsykBW9YsIEGd3d)YF6WIF6J0vf50GdlOpqtF6WI8WTu4NBGFaBCs6HfHzWV(ajmIrBdv4Z0GWm22OUaGwafMvSL6VLCF4ko8)9W8njf5hw8UnKeaq)2gAcBBya(hjPF4(isk9Ydl(HisaLDP4vW)7ryvhw8xdtZYz3kjjqScc8Nt(2dl679TYh63sbmdU76dl(xfHGOzroj9EAEMoEzkzwY2l)a2wX4ExKwetxNalA4kgs6NZXXEAxpqIP(BPbKOOkzyojcyMdxZqv)LmmDinMTvbaVFhnkYVeDgQTRJNnT)KxvU0Cgb4NS2pfqF5IhOyEwCU6SQn04s51YI1RfIlM26L4SrglKX96pUbwiJxlU3pLLr57ZpKsjFqS8RylFYZOeaxaaMNcoK(flz7ms146dzKSAfOIJlKG7PvGzaWW3qYtPQhOxJIRR6S4YTwnJ3fNKULejzrhwSkPaSflLImQIzkUemqihwKrzEmimZfkCJv5xwAfe9i5PSszXVbYH1SRgNe)QFKUnjMz5D0m(ttdVpxoSLMt2MKUBtswy2WIDkXakVA)(akFzuHQL)sMMfSSbnlbAXGPs(giycDsUELBw1oWRFy89(a)XNrHLSdx7IkiHj3iLULegND7n9yHaGvToCvy(SjJ62gRlVe7V8z1jKE9za)2xF9RClSEP3ObDBpLbTmL)20RKpSewxap(wDwHeskUq)7xfmCl5JV0BGj)WRb(XJeiOPuqKSf20clCtE1kKtOxkVCXon7Z)Y9jXGf1FJ8FzwOK8C6wii2I8eWGdsUaC59eZDhG2WDJdyMOcY5WIImiZUsZnGkGe4GNrMuaaSIyiSCPH5eWWStKeHHp(3ZqhdlsTRxQ5fKKpmlmEDreyZaO2W8WvFaatfd34UsMUKNFfKmKdTuMnldxFasDiMUnKMnDST5OuyE70j6egwwaG)dFXF6hfMLlOz5wZOsgkvIEtnK85BstE0hCebOc7b5YX1uGKyz(KgWeOdHC4w9HPx3t49jC72erE0(equWPLlq9lzQ)tJVNYywPuikaHNhfl3NzJ71xzJHP6v5OrELEshtmOdeVeKd6Xrd7lZdvPJkm6lTiBddfe0ur8siUqGppchNIAeLyz5kqbZfwf6tj3T5wacf80Gb96dRaKZzt9aV6Gd2aF6dcA8bkNPhgpB8OEA3HeeKjU6adglObxx4x69GZKr9N0kekdCkYA9Dewgn)dD5lK4dKaYJ8KhJGaS8ORqquqehzytNsxNcjplcLYwdp3jiselsmvMVB02e2wauFAvg4sU4udnlEoKo8s23PVqWL3(9RdVFtUV0q176b13lGFuB3oLnd0rWcDSFVArAxvTUsFhd6kQUlH7kuA5IglCM312G7MrOqJvcvi4FU0PzkzxglUpncYfknHvkx4kFylbMrit3OvqKYSCaiSkjkcag3oQiVa0huOmpCa3aPmLstmDsxW0vKvB4zysw9FkcHCm9zg(zg7J6wKpsbl8E97B5agQRxSuH)xmtVBgz72EM1QadBZh42jAs8AXNHCeqL0Gj3psxtkIYzbbbZfgTEyruY9AjBIXpYUKvREMScDEdguQH1QPF64EUYOS)PL31S(guZSVVHQ6)gVb1O(PCos)gqzVExG0fbHBvWXR7vEm8nVw4BEF24BiDk504BJ7DbIS4u5B6j(W9h7mxP(xGLIfGRUTkyPRWtxD20jJyXkpQ0OqXxiMJ)giEttXoUO5y(v32UsfzDzakhMuKXjqrArYYd0Ubo(rJEklKe7hqxLs5zI1Vzhn73J4FAYiCO7O7v2TOQmnE7ldmUTK4KWaGMUmKfZMLaQpKzdniKKZBJP6Q3hLSKezCPM2sw(fseUuEmvvpKJ0ZTDX2jwJNQwnR2r8siFQEo1ERDdDD0AOotqQxKnxBRTmjXSdaJY97BjNATnnaYYDJF2Ju6odhxAzyGTmEE(K0uOil2YobUQE05k4kkNWNfzNMLFIGEmkOTRxPpRJnfHGqcu2aDXGY7PAjI11h0qXY30dVmMExiBGYh3LKbG6rwk)8ICrK)AkVNav3KAQEgLn0SBR(GoBmeRG3TcqphxzSY0cJISAHfA)qC5GMRj3uEYxBw9JKnixassySeKqncSvnKkaGRNuASvBPM137vwoN5Rpdf0K44WnHIY4mTPD07imGyvjihookOUQ(sMT5AqRPT8oXnHUgLAaZEoQYWaJMcn9kuBUSW7f9)BDeKSD7k2yWq064mi5Ipq7eh0r4wPcKl3zYY6D1Ya(tl2NSEUC9(CvCUHhA43Y8xc5AEPWYUKzjMby)Q4CllsJzul3jJYnMXvH4vchsgxv5h7QJM5Cbg3XYlYNaMsDfluLyZoxofpMJgdUloh4SVKICEBTjX3tD4oxNTPi0GqOuyqhfWnzQFwGQNnlgL(XAjwnzd2U2fkerKQNSLO9oFAY1c87C2zujWp7eQqU)rL7JAvpVP(Oa7xyF8k8OEgyTLg6PS1JW26VsZqRsFstJ)tbt56pdPPHX37qAADqAD2jnPBH1HSmup(PNKHce2zP1hXfOENoWh2GoUE7KrOLHj1hVEGJ0uAMPBNm0ZcI6cvyy(jHL6gkUN9ytjV3MAmQ38Vi5j1GA4XMscgP4iaKR8XWyU6zzvMigRKq0O8nAlINftZ5dHI1ptPdPG9Zq2qT5wtNnn)UhOPzWYuV3FVE(Dps4kkWn)9)Y)69)87)B)5dl4VjqhweUDxsAE5WOFHyNEbB6wIXkCyrwc7f5IuKNSLWFbVaXeqrzdp8l)AymCRXaWExsmST8B)IkD5)9leZdx)ssLGxWE1H(4afuU2ckLKMceY)216F9Z86LH3vaqDbxqy8Otaf80bWKtaagyWvNlaU55gaNMYW43E84b7LL4N(N)QfK8S1o7aKmbG35cGtqQAtlh(LwSBdetv74mCTrSttwDYqbxGDcQWDdqDgVA0TuNHcosvZhX5cVtGDv6ZPvDk17j8XPvvZGtnDUkKQ8s5IRz6e0XY9qwUx9LxZA942DxlVJ7UT2IA(qQvxDLUQX1ryC0UmKPZECsxRWK3fU9D833TCYhpS4Bei4VwqoSii8HqwAihwKSJcfcZ2Z(F3G2IA3U4QllVbXL(YFZZlX8MZJyCT8osm2Hm7SNLZpjgdayBc1r93UQ2w2zWJtR9Ctc45jf3Zn5k71F8POEUjjFcPLz6C)SfeNszcgyW5keEUYW9uefgrQoxw5xjj2(ZCRB26VM)LcX9YYEDnzwVZVdmQ3KKY)k3E3874xN9XVjQtf(T3Z)s6k3G5)W87wLgMttdjZVdRV)su5WIEaoi2WQMXDyXmWxVvd5wSFp4RPw3s4pluK(IbCy5AUa43SSvnhwC70dlUFvG8JTdOKYUtnphQFNrAQBOpVaDkgEWjo5byTlTcMAZyGbMRCcMZKnnzu1EQnHc2EETZ98cX3XcYigKcp4jkvXKJAOs8YWMZeR5c3ke3cpyi)nnH8n2MZNl9VrgOO54ryy4RDIH9zFqcOtWWKjwYHD(mc1FNZ2auXHax8NrkqTNYH8MoM1rf5P39lgX9MV4S)R1uf7YWreqZy4dcajUb7H5mSxpsYyDrjADBwxdq39XBprVc6xeaZ4roHJu3OCQkgoxRtKaBY7WIxPuPmN1IMgLBj(y3E717CnSDGF1Rm96Wjloq8od)CvG0SL6Ca72pCFfvR3RwtlT2vAL6iv05TmNRIB4EEo8h7AmnkhtnPIi1N9eNeDhJ4tmj2mYZO7JN60hyfN6ChnQK0QpPi(U6W)GyF8Loh7ObnU18y3bBaoVJ5hH6k3XtuMhtdtwIllUsp9b1KGa0rFQwS0Yy4S7Wpn7rTUXSEkeiwEVrpvjd8YirPXU9jwLmH94QSLWAJSIJZLJT6WIxkci3RrdbZmHydDINQNBNS1gnKIrPS6TglfUBpp3(oBEl6JVlsTzNCTboiv3UFBrg4cnR2h7zTX3p3EL7KyYkguot)I3SDSQpaiaGFNyLh9zIGMkS4RHSwvaghmcTufqcOiKrZ14oL(D4)MV4CfXWVi)7dvXwq(4FrYFX4dHwyRckmt0d0J(HwZ1pmyxF5oIhS0bXpgbmufnEkKV5DLAeszvNSCHBfw7WkWW3UtzwLPLJJTG6jTHlzV6eLSh(J75pbEtfW1n0KfypawjVNS(qBY8(ol4sdlDiczpHJZxbzQcDqzPtUbSvql7W7rPyEfQg3xbhHg46oT4XWovVg1q4QcnZ9A(B0tReDR8UePDvPeANXnwhgAhxrFf(kRJUQc4Rnkvetfhs3Yt0)dCm0Qow7Uf0oI2ahTIF7OIGMBisFEx)yFr0cYqAsvJ)75K)3uL(DM0qtZs1NMQJ9cDKaRUn0(e0j)AUkbQsVUXoRQyZoAVQjF(kT2148tVeV3Ht5nPbZXN6t3G3m3jOoI(8DwH01gGx1nf7uoTQyYoBDvMOwhoh6BS2XYbNZns05(srUK2APLjIp9uSJSdomvTEZztIlJQ4ieytDzYDtoezWl6yNy77q)mAPSgz4rg6OF8EOhHSxjDGEgG0C9pn0udj3Z(ycrG2DQdQv0g6rgIIbOm3qp4q404ajmvfupL7ASmvMgQaVSQ7MAsUZYrR1xf5dLAE6H4QUXQadgk5L3dTlio3bT1xoGRY6nfW6l90U8mIj7SoIxQy59(eoxmuMq79xSU)FZVroN9s1YNH544qQ(URDB)R6zWDM75yT9S(SPASHM)rF2uU785zYtpoJWEFPNofUfS7j35S4a3PSvA3wg7WTWEgpPH6rtARJ9yp6TcbHzyfRcoC3RzPE7NV5M5U9Yh1atQnoi3XJU4R)X33WGapIPj62XF7eqfirMPH7qbDqMvZ8eT2XQS57(KW6w2S4ZaSxZHE)Ai9Vv)HESATiCUOD5dQ7)Vecg3XiEMND4BnQc25SdByeDnpeoBNX))bX5kG4XoiovNeASYOM7nAR5m4v((vyCWKvLbqf(zKvIvBG(SEqt2CnsNlVOEkLgHDySkfq0UJbCunLBWjXBBSCRMEpykZFgFlVrZnH48NeRGSY2w2YzizfKA9jrkatShUpKjRGEtpJflX6aP0fxaCwIuBwzN7CFEuQLkrtpKfozD4vkvUqAvXuKK)ChA5MrDpfYbU6oYT85xzOpJwbP3Ow1JBSGqLDu9JOWY2o3RTz51VT5N12eGeLzyH(Z(EaMvFWkkyi7(8HfFNC2foO)PgCh9ULItREQyzvFOlQTTQtHL9u0nWS8(68mhfYhGD8ycoffqySw0g5vqkx1CrE1wK3riE9(6q8ICEC(8lEhxt8AFKD2rXBJvx32mJ6B96BG1V0s6PjdFrhkvPCkt10Sv2U7ArldAspJ1k6O9A5BEMLT3CuxLmkEbl1ZcDT5PcQsSz1Lct(QrpkehDPT0hHZVT1tmFj5npssBPpaopGprNyAtNWOZVt)KdTbiB8GYZI053P5AQ6ypv)zfNqPShKNBS6R3fl542hq8y9H0I4FvlFYkBz7)HrsVtpvoAQ)u8QOBmqdZ2QzFvdWY6TD6074PtmkOoDIXnmOtuQywBmIbyj)2ozA8Ae0qlGvz8kHK5)iszvsS7Me58FjPmDX2Q5fQsF1)n))n]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DemonHunterVengeance.lua b/Interface/AddOns/Hekili/Dragonflight/DemonHunterVengeance.lua
index bf007776c..a255e2c69 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DemonHunterVengeance.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DemonHunterVengeance.lua
@@ -317,7 +317,8 @@ spec:RegisterAuras( {
sigil_of_flame_active = {
id = 204596,
duration = 2,
- max_stack = 1
+ max_stack = 1,
+ copy = 389810
},
-- Talent: Suffering $w2 $@spelldesc395020 damage every $t2 sec.
-- https://wowhead.com/beta/spell=204598
@@ -327,13 +328,6 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
- -- Talent: Sigil of Flame is active.
- -- https://wowhead.com/beta/spell=389810
- sigil_of_flame_active = {
- id = 389810,
- duration = 2,
- max_stack = 1
- },
-- Talent: Disoriented.
-- https://wowhead.com/beta/spell=207685
sigil_of_misery_debuff = {
@@ -588,7 +582,7 @@ spec:RegisterHook( "reset_precast", function ()
else sigils[ sigil ] = 0 end
end
- if IsSpellKnownOrOverridesKnown( class.abilities.elysian_decree.id ) then
+ if action.elysian_decree.known then
local activation = ( action.elysian_decree.lastCast or 0 ) + ( talent.quickened_sigils.enabled and 2 or 1 )
if activation > now then sigils.elysian_decree = activation
else sigils.elysian_decree = 0 end
@@ -634,13 +628,6 @@ end )
-- Gear Sets
-
--- Tier 28:
-spec:RegisterSetBonuses( "tier28_2pc", 364454, "tier28_4pc", 363737 )
--- 2-Set - Burning Hunger - Damage dealt by Immolation Aura has a 10% chance to generate a Lesser Soul Fragment.
--- 4-Set - Rapacious Hunger - Consuming a Lesser Soul Fragment reduces the remaining cooldown of your Immolation Aura or Fel Devastation by 1 sec.
--- Nothing to model (2/13/22).
-
spec:RegisterGear( "tier19", 138375, 138376, 138377, 138378, 138379, 138380 )
spec:RegisterGear( "tier20", 147130, 147132, 147128, 147127, 147129, 147131 )
spec:RegisterGear( "tier21", 152121, 152123, 152119, 152118, 152120, 152122 )
@@ -954,7 +941,7 @@ spec:RegisterAbilities( {
cast = 0,
charges = function() return talent.blazing_path.enabled and 2 or nil end,
cooldown = function() return ( talent.meteoric_strikes.enabled and 12 or 20 ) * ( 1 - 0.1 * talent.erratic_felheart.rank ) end,
- charges = function() return talent.blazing_path.enabled and ( ( talent.meteoric_strikes.enabled and 12 or 20 ) * ( 1 - 0.1 * talent.erratic_felheart.rank ) ) or nil end,
+ recharge = function() return talent.blazing_path.enabled and ( ( talent.meteoric_strikes.enabled and 12 or 20 ) * ( 1 - 0.1 * talent.erratic_felheart.rank ) ) or nil end,
gcd = "off",
school = "physical",
@@ -963,8 +950,8 @@ spec:RegisterAbilities( {
sigil_placed = function() return sigil_placed end,
readyTime = function ()
- if settings.infernal_charges == 0 then return end
- return ( ( 1 + settings.infernal_charges ) - cooldown.infernal_strike.charges_fractional ) * cooldown.infernal_strike.recharge
+ if ( settings.infernal_charges or 1 ) == 0 then return end
+ return ( ( 1 + ( settings.infernal_charges or 1 ) ) - cooldown.infernal_strike.charges_fractional ) * cooldown.infernal_strike.recharge
end,
handler = function ()
@@ -995,9 +982,8 @@ spec:RegisterAbilities( {
handler = function ()
applyBuff( "metamorphosis" )
- gain( 8, "fury" )
- if IsSpellKnownOrOverridesKnown( 317009 ) then
+ if action.sinful_brand.known then
applyDebuff( "target", "sinful_brand" )
active_dot.sinful_brand = active_enemies
end
@@ -1152,9 +1138,6 @@ spec:RegisterAbilities( {
talent = "soul_barrier",
startsCombat = false,
- handler = function ()
- applyBuff( "soul_barrier" )
- end,
toggle = "defensives",
@@ -1413,4 +1396,4 @@ spec:RegisterSetting( "infernal_charges", 1, {
} )
-spec:RegisterPack( "Vengeance", 20221027, [[Hekili:LI16UTnUs4NLGfWrgBHIDsDCBrCao9YUObf5auxS7(ljrlrztekrVKuU1fg6zFhsQluYu2PxqrQchYz(Ml8JZ0GPbFjyzcsIdE86jxF90jxp3)6jtNpzEWs5(T4GLBrXpHwdFKJYGF(x481yuESwYEkdLO0GGvWvlTrk3kEZvxTMi3uSYpMLDLGKvqrsclpMJsLQFp(QGLRkiu5hZdw528tbDUfhh84SxbFUHKKGn7flIdwc2MZsjuWIOyLQf(B5yWARqYFFXvPuSyJ2AVGKUaWgDfjpXFBHqwqXHyEXw1HoCOr0oMcIGmbJUdNllFO8HFRm6dFdhxiXjLr4Dy((Yijjdd)Cd8dWWmEzeraFUdrOOvuSF5dv4bqrcrOmK9sXW)uKHdZqRjX2c2H4eLcEHkiVyfhLNeQIqjVyhIwGxiruav(O1SCY3j5RdtPWgf(4C1PsgvjFvbpxjfrj7W9fgVbX54KqD0PwOniKB4SVgUMIGdRcCRkst9tX0WvQalpjtPfHeQhwmBKNwkjlJzsUHOcoYVy7HdxOLKHLOmgF7gMGiG1h3joGO0qZVgsjcPLBRmCD0W3kqC(JNGtX5ca7IZV3ygJMW(A(ZyR5mEgIwvq8heDzWBv4Qm6ZmP23BuIbWlsv7ku)DprGv6fYu(Bct6BDgFjj(jinQSz9PBa8ITmJjb08ECkQGklJsbKVcYlWxQAYcHk6b1MsCMW3HsayuiWHA5Ufli5Pf0WMuYfkmAVyliDDC4gs4MICPBPy6EbbLhMGJ5yCvO99hN(8BtPq2ndIyITKNCVbqTDk50G2zL4iVlIzWLCeunRURVzpV(2au8oKFo(WbjIVgl9vCaHswycbF30zdGLoLaA)7rtDKJIgtf2cWOyEoIgkKCWl7lhu6Qc6tH4Vj5gjo2beF4eP(cRka455ocuXiKQuubVLPqXhgcRUwDvxC)IBgB4iTx7LJDzx1MIPyKH5WZRYcw4zaJSycyJlgE7Jh1OSJGBAbF)9lMnd0G3fNEtZvMPUgutQLG3HeMuHphNHi5I7poddAEGIOZGQBEoOA2KXWFCepDqs455IwCuRpzrGu7pt1bxxNBSgb3T41tCyDi8SIIs0PsZ2U152QCQFWm(D6YkVtKZhnuDRbmMeUJDOIdv7z(qrwbznHgYsnVGQzj8AOdEApePYBGbVihdeQRX(C03XuYtBeqzJQVdLJ4u7BWiUJ1TFAnyj0lHaK30ZZTbl)ks)YTiy5F))(8JF8X)8nLrLrFr1ObjBlJlRO2VSPpNllJ44)TGWvTNiyQ(sqfswgs3Vc8yp0NMI8)tKCq0uqFVJLdwwl(YMoF(hqpswNvQ9FqI30Vn(xvhia7F4))PgLv(WzCXwI0FmF86E4RjTAJgnoBLC5ZhwMK5pgKE1VeKCRJ2QYM4U1shN8kF4JA)qD4B19TQE7is1HJcObl1FP6IxZpaF8OEQGkff8wtx3CIUP5GLU7bQUt8GLwerbsOgVNUafjXW1mqRUB7Pvt9ybbTjvyr30ZzH5pCV7T2TQZ9g0xVEN23TTmSXB6Hf2wycgSS9W1SWQVGw6HXRoDp9LrJa0EI(6T3GZE712m0m2Mf1VcTVCWKYWn9xgTOmAM2QELrd0(Fz0HdLrxujVpbEz042ashoratZgetUEaZkR0RTDtbTTFR0(T90(Z60Tmrkvm)Nrfn99Q0WR(z0GH3Xu83W(7Q8VnGn4iVT1oQ00GJ)2wb1CPUzKAdqADRAGuVtZ8j9UD0NeOZn1N3ymTwOz0fx37Adcqr4qnZ3QlBPnxmARqntX0ZzMzVNUZY0DNYovqNJWQDailMiRPEonz6Wx5m3xb59N6P5U6GZ2fn2SNJ7lUm6oOHGzTiTJDBsmUEtOFiQQ((CHN(Zpz9mr3bNoI2U3ytNH4UnK61s05mQoqV9AzDB5Tm6EG78MM4PlPVSd5OvxXNMV2aYH7L2jAaZnPbmxC6JpUUcY70ESQVBJNmBwJU9Sv)zo28wiDUb1Gd4UOSYMN8MWZ2pU5NZpMz8JQ)ALsBNr(0p3zWOZ)tWuw6ut8Pdmt7KBDRNXwG(oa0VEYPA76OxpBbBRkU1sf1tq66zZFXA376CtY7S1Vnj9HlkA9HULUdmIzVZmFG8DDzIRh(7WB7zrnBMavBHtp9P1fu7xZShUvz4xBteQNoTh930jDFXZEo1Ue1QEzlKByGgGsK3Pxj4)c]] )
\ No newline at end of file
+spec:RegisterPack( "Vengeance", 20221029, [[Hekili:LIvFVTTnt8plgdWvgRqXojkPPioap9Ln0GI8auxST)ss0su2eHs0JKYTPWqF23rszjkzk7002axhEK397EHh)DnCw4xdxKIK4WhoF65NpB6534F(fZME51HlKpTbhUydk5r0k4lfOC4Z)cxScJks0sEIYqPkniyLC1sRLYnI3E2zRiY1Ll9ty5Nji5LuKKWks4OmP63tolCXYscv(PIWLUnFaOZn4KWhcEZmqTK0uSzVyrs4cW2CwgHcweLOuTWFdhdwBjs(7ZplJIfR1w71KS5a2OljfP(BkfYskocZl3Oo0UDnI2YuqeKjy0T4cz19v3)BvXF874KsjoTkgVfZFQkwsYXWNRHpadZ4vXeb81TicfTKI9RUVgpaksjcLHSxkb(NYCCuoAfjXwWweNOuWRvb55l5OI0ivek91Br0s8CjIcOYhTIvq(bPyvugf2OWhxOov64A5ll5fkPikzlUVWK1iohNgPJo7fAdc5Ao7BrROi4WQa3YYSm)mmnAPkWYtZvAriH6H5bJ90sj55mtYncvYr(LB2TBKwsowIYz8nRzcIawFsN4aIsJm)AeLiKwUTYW7Jg(wbItF8uCgUqayxC69MWy0u23kEgBTGXZr06cI)GOldENcxvXFHj1(EJsmaEEMAxr6V3teyLEHmL)MYK(wNXxssEesJkBU)0naE(gMXKaA(aodvsLvXzaYxc5f4BQAYsHk6b1MsCUW3HsayukWrA5UflifzL0OMuYifgTxSfKUooCdjADzH0Tum9jbbveLIt4yCDO9dhM(8BtPq2nhIyInKhDVbqTDk50G2zL4yVrMJ31FESaqhu9oKJoz3ojIVcl9vnbIKSOuc(2zbdaMo1aAh8btHKJQgtj2CWOyEbIgjKCWn7lhu6Ys6Jr4Vl5gjo2beG4eP(gRkc455oeu3sitPOsEBRcvdXiy1vQ76I7MFXetts71UCId7QAtKI3IeU9nfYuQjHIrMMlEE1yWcXdaJ5tbumA4TpzCJYoWHYk5pD38GaqdEJo(MUwzM9LP(9CiFoohrke3DynaO5bQZobQU45GQGPtG)4iE6OpINNRoNJB9jREm79Nz6GRRZnrJGBNFZu357LuuQovA22vo3wTt9tMXVvx45DKC(4HQSnGXKWDSdvCOEpxpuKvqwrOrSmZJS6gjE1Dm625Y0ZymVSad9DxH95OFGPKhxlGnOONOCgNwyngXDSU9lWHlakhcqEd1iGs23q6h4fHl(7)3xE4tp8NVTkUk(Rk(iK8nmUS(fGx1qh6vvXC8)ws4kwmcMI(cQuYYrAAnaNaGoN6nIptkarZa99EwbyzT4x1qq6Fa9izDwzFQaK4n77t(v1bcW(h))FUrzv3Fcx0e1(58VB6HT2uxd4Sw6qpS6(pPXG6WxP5aQA2fRylOmcqhTuUMXdxSGK)(Wf61v8J1xRGV8GMVDTAdFNHplNOPJgUWn7I9CCdxyD)nucLf90fOijgUhdA1nHIwn1R5bOnPclA6eNeM)0SIBTBnN4g0VF9oeJTTmSXl6Hf2gy2aSS9W7BEP(gqwggC54SLRIhdO9imMT3GtwZABgzgiYQJPcTxoyszy60vXZRId0w1RkEaI1vX72vfpQwE)(EvXtAdiDAJaykyqm5QVVvwPhHytbTTFR0(v90(Z60TCLuQ46xIkAyuQ0WBEjAW0bXu830W0v5FBaBWHjBRDuPPbhSSTcQ5sDZWQgG06w7bY(DAy(372r)MaDUP(8gqO1cndf46ExBqakchILCRUSL2CXOTc1mFqpNjWEpDFRT7oLDQGovdR2rlS6eznpXXBMo8voZ91r7FhWX8enxAhC8P4jM9CiVYQ4BHhtdAHCha0KHC94q)yvDH(PIt9NqX69IUJMCq)7EdMCIo4TXwV2oEodVdWnwlRlLXQ47GMOx0epDj9YoDjTyvEq9zp2)UktpI)mmTvNahq20gCp64hFY(QoVJhCuuCnoDqqJU9Sv)jo21Tq6uZebhWD9BTnp6TNNTFCXlZpcm(r9pwz)2XrD9iw)uQZ)lPuw6ydxPdmZ6KBDRNjwG(wa03m9yu1o45YwW2QIRM2PAwpSMRhk)fRDVTZLoVtw)2K0hUOO1h6w6oW0C9oZ1dKV3xMOIb3CSE9EnTZDnSN2AhFGpRlR2VgAptPceZMA3WrpryV2mZM19jt7zd72G383W)l]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DruidBalance.lua b/Interface/AddOns/Hekili/Dragonflight/DruidBalance.lua
index 5dafab605..a055961c8 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DruidBalance.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DruidBalance.lua
@@ -68,80 +68,80 @@ spec:RegisterTalents( {
balance_of_all_things = { 88214, 394048, 2 }, -- Entering Eclipse increases your critical strike chance with Arcane or Nature spells by 16%, decreasing by 2% every 1 sec.
celestial_alignment = { 88215, 194223, 1 }, -- Celestial bodies align, maintaining both Eclipses and granting 10% haste for 20 sec.
circle_of_life_and_death = { 88227, 391969, 1 }, -- Your damage over time effects deal their damage in 25% less time, and your healing over time effects in 15% less time.
- convoke_the_spirits = { 88206, 391528, 1 }, -- Call upon the Night Fae for an eruption of energy, channeling a rapid flurry of 16 Druid spells and abilities over 4 sec. You will cast Wild Growth, Swiftmend, Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form.
+ convoke_the_spirits = { 88206, 391528, 1 }, -- Call upon the Night Fae for an eruption of energy, channeling a rapid flurry of 12 Druid spells and abilities over 3 sec. You will cast Starsurge, Starfall, Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form.
cyclone = { 82213, 33786 , 1 }, -- Tosses the enemy target into the air, disorienting them but making them invulnerable for up to 6 sec. Only one target can be affected by your Cyclone at a time.
denizen_of_the_dream = { 88218, 394065, 1 }, -- Your Moonfire and Sunfire have a chance to summon a Faerie Dragon to assist you in battle for 30 sec.
- eclipse = { 88223, 79577 , 1 }, -- Casting 2 Starfires empowers Wrath for 15 sec. Casting 2 Wraths empowers Starfire for 15 sec. Eclipse (Solar) Nature spells deal 15% additional damage and Wrath damage is increased by 20%. Eclipse (Lunar) Arcane spells deal 15% additional damage and Starfire critical strike chance is increased by 20%.
+ eclipse = { 88223, 79577 , 1 }, -- Casting 2 Starfires empowers Wrath for 15 sec. Casting 2 Wraths empowers Starfire for 15 sec. Eclipse (Solar) Nature spells deal 15% additional damage and Wrath damage is increased by 40%. Eclipse (Lunar) Arcane spells deal 15% additional damage and Starfire critical strike chance is increased by 40%.
elunes_guidance = { 88228, 393991, 1 }, -- Incarnation: Chosen of Elune reduces the Astral Power cost of Starsurge by 5, and the Astral Power cost of Starfall by 8. Convoke the Spirits' cooldown is reduced by 50% and its duration and number of spells cast is reduced by 25%. Convoke the Spirits has an increased chance to use an exceptional spell or ability.
feline_swiftness = { 82239, 131768, 2 }, -- Increases your movement speed by 15%.
force_of_nature = { 88210, 205636, 1 }, -- Summons a stand of 3 Treants for 10 sec which immediately taunt and attack enemies in the targeted area. Generates 20 Astral Power.
frenzied_regeneration = { 82220, 22842 , 1 }, -- Heals you for 32% health over 3 sec.
friend_of_the_fae = { 88234, 394081, 1 }, -- When a Faerie Dragon is summoned, your Arcane and Nature damage is increased by 4% for 30 sec.
fungal_growth = { 88205, 392999, 1 }, -- Enemies struck by Wild Mushrooms are damaged for an additional 70% over 8 sec and slowed by 50%.
- fury_of_elune = { 88224, 202770, 1 }, -- Calls down a beam of pure celestial energy that follows the enemy, dealing up to 1,101 Astral damage over 8 sec within its area. Damage reduced on secondary targets. Generates 40 Astral Power over its duration.
+ fury_of_elune = { 88224, 202770, 1 }, -- Calls down a beam of pure celestial energy that follows the enemy, dealing up to 4,551 Astral damage over 8 sec within its area. Damage reduced on secondary targets. Generates 40 Astral Power over its duration.
heart_of_the_wild = { 82231, 319454, 1 }, -- Abilities not associated with your specialization are substantially empowered for 45 sec. Feral: Physical damage increased by 30%. Guardian: Bear Form gives an additional 20% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has 2 charges. Restoration: Healing increased by 30%, and mana costs reduced by 50%.
hibernate = { 82211, 2637 , 1 }, -- Forces the enemy target to sleep for up to 40 sec. Any damage will awaken the target. Only one target can be forced to hibernate at a time. Only works on Beasts and Dragonkin.
- improved_barkskin = { 82219, 327993, 1 }, -- Barkskin's duration is increased by 4 sec.
+ improved_barkskin = { 82219, 327993, 1 }, -- Duration increased by 4 sec.
improved_rejuvenation = { 82240, 231040, 1 }, -- Rejuvenation's duration is increased by 3 sec.
improved_stampeding_roar = { 82230, 288826, 1 }, -- Cooldown reduced by 60 sec.
improved_sunfire = { 82207, 231050, 1 }, -- Sunfire now applies its damage over time effect to all enemies within 8 yards.
- incapacitating_roar = { 82237, 99 , 1 }, -- Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within 10 yards for 3 sec. Damage will cancel the effect.
+ incapacitating_roar = { 82237, 99 , 1 }, -- Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within 15 yards for 3 sec. Damage will cancel the effect.
incarnation_chosen_of_elune = { 88206, 394013, 1 }, -- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, and 10% critical strike chance. Lasts 30 sec. You may shapeshift in and out of this improved Moonkin Form for its duration.
incarnation = { 88206, 394013, 1 }, -- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, and 10% critical strike chance. Lasts 30 sec. You may shapeshift in and out of this improved Moonkin Form for its duration.
innervate = { 82243, 29166 , 1 }, -- Infuse a friendly healer with energy, allowing them to cast spells without spending mana for 10 sec.
- ironfur = { 82227, 192081, 1 }, -- Increases armor by 448 for 7 sec.
+ ironfur = { 82227, 192081, 1 }, -- Increases armor by 452 for 7 sec.
killer_instinct = { 82225, 108299, 3 }, -- Physical damage and Armor increased by 2%.
light_of_the_sun = { 88211, 202918, 1 }, -- Reduces the remaining cooldown on Solar Beam by 15 sec when it interrupts the primary target.
lunar_shrapnel = { 88232, 393868, 1 }, -- Starfall's stars have a chance to deal an additional 25% damage to nearby enemies when they damage an enemy afflicted by Moonfire. Deals reduced damage beyond 8 targets.
lycaras_teachings = { 82233, 378988, 3 }, -- You gain 2% of a stat while in each form: No Form: Haste Cat Form: Critical Strike Bear Form: Versatility Moonkin Form: Mastery
- maim = { 82221, 22570 , 1 }, -- Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: 1 point : 58 damage, 1 sec 2 points: 116 damage, 2 sec 3 points: 173 damage, 3 sec 4 points: 231 damage, 4 sec 5 points: 289 damage, 5 sec
+ maim = { 82221, 22570 , 1 }, -- Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: 1 point : 219 damage, 1 sec 2 points: 439 damage, 2 sec 3 points: 658 damage, 3 sec 4 points: 878 damage, 4 sec 5 points: 1,096 damage, 5 sec
mass_entanglement = { 82242, 102359, 1 }, -- Roots the target and all enemies within 15 yards in place for 30 sec. Damage may interrupt the effect. Usable in all shapeshift forms.
- matted_fur = { 82236, 385786, 1 }, -- When you use Barkskin or Survival Instincts, absorb 1,189 damage for 8 sec.
+ matted_fur = { 82236, 385786, 1 }, -- When you use Barkskin or Survival Instincts, absorb 4,517 damage for 8 sec.
mighty_bash = { 82237, 5211 , 1 }, -- Invokes the spirit of Ursoc to stun the target for 4 sec. Usable in all shapeshift forms.
- moonkin_form = { 82212, 24858 , 1 }, -- Shapeshift into Moonkin Form, increasing the damage of your spells by 10% and your armor by 125%, and granting protection from Polymorph effects. While in this form, single-target attacks against you have a 15% chance to make your next Starfire instant. The act of shapeshifting frees you from movement impairing effects.
+ moonkin_form = { 82212, 24858 , 1 }, -- Shapeshift into Astral Form, increasing the damage of your spells by 10% and your armor by 125%, and granting protection from Polymorph effects. While in this form, single-target attacks against you have a 15% chance to make your next Starfire instant. The act of shapeshifting frees you from movement impairing effects.
natural_recovery = { 82206, 377796, 2 }, -- Healing done and healing taken increased by 3%.
natures_balance = { 88226, 202430, 1 }, -- While in combat you generate 1 Astral Power every 2 sec. While out of combat your Astral Power rebalances to 50 instead of depleting to empty.
natures_grace = { 88222, 393958, 1 }, -- After an Eclipse ends, you gain 15% Haste for 6 sec.
natures_vigil = { 82244, 124974, 1 }, -- For 30 sec, all single-target damage also heals a nearby friendly target for 20% of the damage done.
- new_moon = { 88224, 274281, 1 }, -- Deals 406.8 Astral damage to the target and empowers New Moon to become Half Moon. Generates 10 Astral Power.
+ new_moon = { 88224, 274281, 1 }, -- Deals 1680.8 Astral damage to the target and empowers New Moon to become Half Moon. Generates 10 Astral Power.
nurturing_instinct = { 82214, 33873 , 3 }, -- Magical damage and healing increased by 2%.
orbit_breaker = { 88199, 383197, 1 }, -- Every 30th Shooting Star calls down a Full Moon at 80% power upon its target.
- orbital_strike = { 88221, 390378, 1 }, -- Celestial Alignment blasts all enemies in a targeted area for 834 Astral damage and applies Stellar Flare to them.
- power_of_goldrinn = { 88207, 394046, 1 }, -- Starsurge has a chance to summon the Spirit of Goldrinn, which immediately deals 282 Arcane damage to the target.
+ power_of_goldrinn = { 88207, 394046, 1 }, -- Starsurge has a chance to summon the Spirit of Goldrinn, which immediately deals 1,165 Arcane damage to the target.
primal_fury = { 82238, 159286, 1 }, -- When you critically strike with an attack that generates a combo point, you gain an additional combo point. Damage over time cannot trigger this effect.
primordial_arcanic_pulsar = { 88221, 393960, 1 }, -- Every 600 Astral Power spent grants Celestial Alignment for 12 sec.
- protector_of_the_pack = { 82245, 378986, 1 }, -- Store 10% of your damage, up to 539. Your next Regrowth consumes all stored damage to increase its healing.
+ protector_of_the_pack = { 82245, 378986, 1 }, -- Store 10% of your damage, up to 1,783. Your next Regrowth consumes all stored damage to increase its healing.
radiant_moonlight = { 88213, 394121, 1 }, -- Full Moon becomes Full Moon once more before resetting to New Moon. Fury of Elune's cooldown is reduced by 15 sec.
- rake = { 82199, 1822 , 1 }, -- Rake the target for 76 Bleed damage and an additional 549 Bleed damage over 15 sec. While stealthed, Rake will also stun the target for 4 sec and deal 60% increased damage. Awards 1 combo point.
+ rake = { 82199, 1822 , 1 }, -- Rake the target for 289 Bleed damage and an additional 2,473 Bleed damage over 15 sec. Awards 1 combo point.
rattle_the_stars = { 88236, 393954, 1 }, -- Starsurge and Starfall reduce the cost of Starsurge and Starfall by 5% and increase their damage by 10% for 5 sec, stacking up to 2 times.
- rejuvenation = { 82217, 774 , 1 }, -- Heals the target for 558 over 12 sec.
+ rejuvenation = { 82217, 774 , 1 }, -- Heals the target for 2,505 over 12 sec.
remove_corruption = { 82205, 2782 , 1 }, -- Nullifies corrupting effects on the friendly target, removing all Curse and Poison effects.
renewal = { 82232, 108238, 1 }, -- Instantly heals you for 30% of maximum health. Usable in all shapeshift forms.
- rip = { 82222, 1079 , 1 }, -- Finishing move that causes Bleed damage over time. Lasts longer per combo point. 1 point : 348 over 8 sec 2 points: 522 over 12 sec 3 points: 696 over 16 sec 4 points: 871 over 20 sec 5 points: 1,044 over 24 sec
- shooting_stars = { 88225, 202342, 1 }, -- Moonfire, Sunfire, and Stellar Flare damage over time has a chance to call down a falling star, dealing 75 Astral damage and generating 2 Astral Power.
+ rip = { 82222, 1079 , 1 }, -- Finishing move that causes Bleed damage over time. Lasts longer per combo point. 1 point : 1,566 over 8 sec 2 points: 2,349 over 12 sec 3 points: 3,132 over 16 sec 4 points: 3,915 over 20 sec 5 points: 4,699 over 24 sec
+ shooting_stars = { 88225, 202342, 1 }, -- Moonfire, Sunfire, and Stellar Flare damage over time has a chance to call down a falling star, dealing 310 Astral damage and generating 2 Astral Power.
skull_bash = { 82224, 106839, 1 }, -- You charge and bash the target's skull, interrupting spellcasting and preventing any spell in that school from being cast for 4 sec.
solar_beam = { 88231, 78675 , 1 }, -- Summons a beam of solar light over an enemy target's location, interrupting the target and silencing all enemies within the beam. Lasts 8 sec.
solstice = { 88203, 343647, 2 }, -- During the first 6 sec of every Eclipse, Shooting Stars fall 100% more often.
soothe = { 82229, 2908 , 1 }, -- Soothes the target, dispelling all enrage effects.
soul_of_the_forest = { 88212, 114107, 1 }, -- Eclipse increases Wrath's Astral power generation 50%, and increases Starfire's area effect damage by 150%.
- stampeding_roar = { 82234, 106898, 1 }, -- Shift into Bear Form and let loose a wild roar, increasing the movement speed of all friendly players within 15 yards by 60% for 8 sec.
- starfall = { 88201, 191034, 1 }, -- Calls down waves of falling stars upon enemies within 40 yds, dealing 471 Astral damage over 8 sec. Multiple uses of this ability may overlap.
- starfire = { 82201, 194153, 1 }, -- Call down a burst of energy, causing 319 Arcane damage to the target, and 103 Arcane damage to all other enemies within 10 yards. Generates 8 Astral Power.
+ stampeding_roar = { 82234, 106898, 1 }, -- Shift into Bear Form and let loose a wild roar, increasing the movement speed of all friendly players within 23 yards by 60% for 10.6 sec.
+ starfall = { 88201, 191034, 1 }, -- Calls down waves of falling stars upon enemies within 45 yds, dealing 1,945 Astral damage over 8 sec. Multiple uses of this ability may overlap.
+ starfire = { 82201, 194153, 1 }, -- Call down a burst of energy, causing 1,318 Arcane damage to the target, and 424 Arcane damage to all other enemies within 10 yards. Generates 8 Astral Power.
starlord = { 88200, 202345, 2 }, -- Starsurge and Starfall grant you 2% Haste for 15 sec. Stacks up to 3 times. Gaining a stack does not refresh the duration.
- starsurge = { 82202, 78674 , 1 }, -- Launch a surge of stellar energies at the target, dealing 477 Astral damage, and empowering the damage bonus of any active Eclipse for its duration.
+ starsurge = { 82202, 78674 , 1 }, -- Launch a surge of stellar energies at the target, dealing 1,971 Astral damage.
starweaver = { 88236, 393940, 1 }, -- Starsurge has a 20% chance to make Starfall free. Starfall has a 40% chance to make Starsurge free.
- stellar_flare = { 91048, 202347, 1 }, -- Burns the target for 52 Astral damage, and then an additional 438 damage over 24 sec. Generates 8 Astral Power.
+ stellar_flare = { 91048, 202347, 1 }, -- Burns the target for 215 Astral damage, and then an additional 2,143 damage over 24 sec. Generates 8 Astral Power.
stellar_innervation = { 88229, 394115, 1 }, -- During Solar Eclipse, Sunfire generates 100% additional Astral Power. During Lunar Eclipse, Moonfire generates 100% additional Astral Power.
sundered_firmament = { 88217, 394094, 1 }, -- Every other Eclipse creates a Fury of Elune at 20% effectiveness that follows your current target for 8 sec.
- sunfire = { 82208, 93402 , 1 }, -- A quick beam of solar light burns the enemy for 83 Nature damage and then an additional 653 Nature damage over 18 sec. Generates 2 Astral Power.
- swiftmend = { 82216, 18562 , 1 }, -- Consumes a Regrowth, Wild Growth, or Rejuvenation effect to instantly heal an ally for 1,562.
+ sunfire = { 82208, 93402 , 1 }, -- A quick beam of solar light burns the enemy for 345 Nature damage and then an additional 3,196 Nature damage over 18 sec to the primary target and all enemies within 8 yards. Generates 2 Astral Power.
+ swiftmend = { 82216, 18562 , 1 }, -- Consumes a Regrowth, Wild Growth, or Rejuvenation effect to instantly heal an ally for 6,112.
swipe = { 82226, 213764, 1 }, -- Swipe nearby enemies, inflicting Physical damage. Damage varies by shapeshift form.
+ syzygy = { 88221, 390378, 1 }, -- Celestial Alignment blasts all enemies in a targeted area for 3,448 Astral damage and applies Stellar Flare to them.
thick_hide = { 82228, 16931 , 2 }, -- Reduces all damage taken by 6%.
thrash = { 82223, 106832, 1 }, -- Thrash all nearby enemies, dealing immediate physical damage and periodic bleed damage. Damage varies by shapeshift form.
tiger_dash = { 82198, 252216, 1 }, -- Shift into Cat Form and increase your movement speed by 200%, reducing gradually over 5 sec.
tireless_pursuit = { 82197, 377801, 1 }, -- For 3 sec after leaving Cat Form or Travel Form, you retain up to 40% movement speed.
twin_moons = { 88208, 279620, 1 }, -- Moonfire deals 10% increased damage and also hits another nearby enemy within 15 yds of the target.
- typhoon = { 82209, 132469, 1 }, -- Blasts targets within 15 yards in front of you with a violent Typhoon, knocking them back and dazing them for 6 sec. Usable in all shapeshift forms.
+ typhoon = { 82209, 132469, 1 }, -- Blasts targets within 20 yards in front of you with a violent Typhoon, knocking them back and dazing them for 6 sec. Usable in all shapeshift forms.
umbral_embrace = { 88216, 393760, 2 }, -- Dealing Astral damage has a chance to cause your next Wrath or Starfire to become Astral and deal 25% additional damage.
umbral_intensity = { 88219, 383195, 2 }, -- Solar Eclipse increases the damage of Wrath by an additional 10%. Lunar Eclipse increases the critical strike chance of Starfire by an additional 10%.
ursine_vigor = { 82235, 377842, 2 }, -- For 4 sec after shifting into Bear Form, your health and armor are increased by 10%.
@@ -151,8 +151,8 @@ spec:RegisterTalents( {
warrior_of_elune = { 88233, 202425, 1 }, -- Your next 3 Starfires are instant cast and generate 40% increased Astral Power.
wellhoned_instincts = { 82246, 377847, 2 }, -- When you fall below 40% health, you cast Frenzied Regeneration, up to once every 120 sec.
wild_charge = { 82198, 102401, 1 }, -- Fly to a nearby ally's position.
- wild_growth = { 82241, 48438 , 1 }, -- Heals up to 5 injured allies within 30 yards of the target for 443 over 7 sec. Healing starts high and declines over the duration.
- wild_mushroom = { 88220, 88747 , 1 }, -- Grow a magical mushroom at the target enemy's location. After 1 sec, the mushroom detonates, dealing 584 Nature damage and generating up to 20 Astral Power based on targets hit.
+ wild_growth = { 82241, 48438 , 1 }, -- Heals up to 5 injured allies within 30 yards of the target for 2,057 over 7 sec. Healing starts high and declines over the duration.
+ wild_mushroom = { 88220, 88747 , 1 }, -- Grow a magical mushroom at the target enemy's location. After 1 sec, the mushroom detonates, dealing 2,413 Nature damage and generating up to 20 Astral Power based on targets hit.
} )
@@ -518,21 +518,16 @@ spec:RegisterAuras( {
prowl = {
id = 5215,
duration = 3600,
- max_stack = 1
- },
- -- Stealthed.
- -- https://wowhead.com/beta/spell=102547
- prowl = {
- id = 102547,
- duration = 3600,
- max_stack = 1
+ max_stack = 1,
+ copy = 102547
},
-- Cost of Starsurge and Starfall reduced by $w1%, and their damage increased by $w2%.
-- https://wowhead.com/beta/spell=393955
rattled_stars = {
id = 393955,
duration = 5,
- max_stack = 2
+ max_stack = 2,
+ copy = "rattle_the_stars"
},
-- Heals $w2 every $t2 sec.
-- https://wowhead.com/beta/spell=8936
@@ -1646,7 +1641,8 @@ spec:RegisterAbilities( {
-- Talent: Celestial bodies align, maintaining both Eclipses and granting $s1% haste for $d.
celestial_alignment = {
- id = 194223,
+ id = function() return talent.syzygy.enabled and 383410 or 194223 end,
+ known = 194223,
cast = 0,
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * 180 end,
gcd = "off",
@@ -1668,7 +1664,7 @@ spec:RegisterAbilities( {
if pvptalent.moon_and_stars.enabled then applyBuff( "moon_and_stars" ) end
end,
- copy = "ca_inc"
+ copy = { 194223, 383410, "ca_inc" }
},
-- Talent / Covenant (Night_Fae): Call upon the Night Fae for an eruption of energy, channeling a rapid flurry of $s2 Druid spells and abilities over $d. You will cast $?a24858|a197625[Starsurge, Starfall,]?a768[Ferocious Bite, Shred, Tiger's Fury,]?a5487[Mangle, Ironfur,][Wild Growth, Swiftmend,] Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form.
@@ -1980,12 +1976,10 @@ spec:RegisterAbilities( {
talent = "innervate",
startsCombat = false,
+ texture = 136048,
toggle = "cooldowns",
- startsCombat = false,
- texture = 136048,
-
usable = function () return group end,
handler = function ()
active_dot.innervate = 1
@@ -2409,7 +2403,7 @@ spec:RegisterAbilities( {
spend = function ()
if buff.oneths_perception.up or buff.starweavers_warp.up or buff.touch_the_cosmos.up then return 0 end
- return 50 * ( 1 - 0.05 * buff.rattle_the_stars.stack ) * ( 1 - ( buff.timeworn_dreambinder.stack * 0.1 ) )
+ return ( 50 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 8 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - ( buff.timeworn_dreambinder.stack * 0.1 ) )
end,
spendType = "astral_power",
@@ -2421,7 +2415,7 @@ spec:RegisterAbilities( {
handler = function ()
if buff.starweavers_warp.up then removeBuff( "starweavers_warp" )
else removeBuff( "touch_the_cosmos" ) end
- if talent.rattle_the_stars.enabled then addStack( "rattle_the_stars" ) end
+ if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end
if talent.starlord.enabled then
if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end
addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 )
@@ -2499,7 +2493,7 @@ spec:RegisterAbilities( {
spend = function ()
if buff.oneths_clear_vision.up or buff.starweavers_weft.up then return 0 end
- return ( 40 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 5 or 0 ) ) * ( 1 - 0.05 * buff.rattle_the_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack * 0.1 )
+ return ( 40 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 5 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack * 0.1 )
end,
spendType = "astral_power",
@@ -2511,7 +2505,7 @@ spec:RegisterAbilities( {
handler = function ()
if buff.starweavers_weft.up then removeBuff( "starweavers_weft" )
else removeBuff( "touch_the_cosmos" ) end
- if talent.rattle_the_stars.enabled then addStack( "rattle_the_stars" ) end
+ if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end
if talent.starlord.enabled then
if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end
addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 )
@@ -2666,21 +2660,6 @@ spec:RegisterAbilities( {
end,
},
- -- Sprout thorns for $d on the friendly target. When victim to melee attacks, thorns deals $305496s1 Nature damage back to the attacker. Attackers also have their movement speed reduced by $232559s1% for $232559d.
- thorns = {
- id = 305496,
- cast = 0,
- cooldown = 0.5,
- gcd = "off",
- school = "nature",
-
- pvptalent = "thorns",
- startsCombat = false,
-
- handler = function ()
- end,
- },
-
-- Sprout thorns for $d on the friendly target. When victim to melee attacks, thorns deals $305496s1 Nature damage back to the attacker. Attackers also have their movement speed reduced by $232559s1% for $232559d.
thorns = {
id = 305497,
@@ -2689,17 +2668,13 @@ spec:RegisterAbilities( {
gcd = "totem",
school = "nature",
- spend = 0.18,
+ spend = 0.12,
spendType = "mana",
pvptalent = function ()
if essence.conflict_and_strife.enabled then return end
return "thorns"
end,
-
- spend = 0.12,
- spendType = "mana",
-
startsCombat = false,
texture = 136104,
@@ -2959,4 +2934,4 @@ class.specs[0].abilities.cancel_buff.funcs.usable = setfenv( function ()
end, state )
-spec:RegisterPack( "Balance", 20221028, [[Hekili:TZ1EVnoUr8plbfNxBNnowY2jzpyNIEfhkUfh2c0CaT)LLPLPJfISKREKSPWWF27WhIIKIuYY23EhApCajzLiNz4W5XVzi1n3z(Vm)PvOm88V4o011zO7ddChn(tJ)08NYEFhE(t7q(VGEg(Ji0w4N)akef5tF(7HXOvK5NgNNqE0MSSDPF)T3UKnMBsd26p45GSn5lheeFlFQ38uW2)6TBxnyt22W)86Gq8m(egK91S5pTmpim7NIMV0SG9W8Nq5zBItM)eHqaxdwTcZgoo1F(tZFkminlLUWWRr5HzWF(f6cfhHwgIxn)hyJnjyxwqC08N(XVI9ZZWRoSa)ko59dlYc2IHFUb(bYplo5WIGu4pFffesOWaqg8ztnnoeL4TeJ2opdevcxkFvmqbzUcJyKMCacrgojabQBkpNEyHZHfDoSOlim(Hb7sXdqrV7fH)A2Hf73x(0W8iGZSN3RKRVLGY2q40ynofVdejCw5iFfb8fEl5VcZHFLUdhg6LHsEgNLoif(J1OWWdlEeKj6W9y2abPEOymHhtUe8iibBKh(Hy0Ru2CxRzZDhwC7HfmMTbLMbC4AydffIJYgeHYYtWPEfMDCklpK4KLbzEltWOxWjLdO)HfRIZgSnooIi2dYc8Fji6z6lGnSL5RxRnvyf6)cD55ob2NOJC8q5v6ouAAWRypu6oYA9ERgiuQ7J8cI8hKVJzmuSWhef75VYJj9SxTo45nzEj4TOGOuMH1Ksn2sCskoHi8eM(WVEm1vIP7IP)gy4N0yyXiYscIEbN5ilcc2fh5LNI94J5WIRMv4SCfSXXE6Gm3bGQF17E(XXHRIFlIjyDLeBD6WiJYkZWqgr3(6W3LplvYWM5gyIKggdHXkvjGAZzy96n3JwV5wrV5yuVvNm6(BO6WLQoCKJ3sMdS23MQfY1X1Q1TGL8qAcALKh5X(Bps2ewofUdlp2NJEO8JzUW)K8FpTlb7hVDjYyUPMdVDLiqLpoeNMfGc9qHbphTL8mr4k(omBKW(dkbc9rKl)nXP4iV41EyinIicOCyj5DorQTwjKC(IWqwWeIecrBwfcrCgKGIErYcQug3f)goHiwpd2GWgDKjjBna3yNVxr(jpQoTsI1MLpLOWQ2C2YFIwTQUfCPReKZHspIZbDnk9UchSbRYtqcszvomLJTE5ORs0q7IIBvrPifLB9Y0DY(DKSHWwR364KTAUE2tMDUWBYy(Hg8EeWVYP5OLzAcEnK3FdzOfySyirgqaF5Lf7TkaEZnhwiIp1JM7(b6WbCejGzm1iDaGTmWpiJ(AryePC5u0eJaU)oGJPaWdrAn4ljRj)9QmBlAhAfcqrdZp9nez)VuYVIbwsDaERqBHYjkroX8)zuZYyj2wHK0gfkaZuEdgfwsxITKTbj0uGEGHkZYO5cahe3ukiGo1ns58AnnwUOAwD3E07xvnvm3Cr2oHGZEi1Czc1rxgVlIelnj4fjeX2W0rTuieQFBYVq9KlJRa5x8JJwfqNILkkmKRwFA01jOB8wghLNcQvCI7N8gVZN(c9OmgQusV8IJLNnO7S69nTgVVhOQuLQKy7c092S4C)nEq(uqAs3gNc7Ysb84jeRpWR1LujHmGPO(IeocAkzDyc)FjTkNcEldoaSTUYi4xZvPi7ClxXtcumzuCEQhepn6)8Ej(XwrXXIYjKqTKeSnozfvHL4JIc892LhMIsuSfe5Anq1r6qGvXn3RWvMkvClApAgstcNYOOnOqFusjuH9RxJFbtnQs3fakG0sqZcxfussqCIWHwhHT9UA0(8pUdl5laPWht4kRKDkV0JmEo86Ej7d(Sby5BZJ4MPo2dhzg9IHniEG4626MksasJjnaZ6hLhjYTH4vo2dy1EvWdsA78K3l3IjmYEyK2Zis2cMvS)gsGTuPkaGQHOpZt0eSjm9P8qhPy3gHFZJGxIkN2dn1E509YkNBqHRlfu7X9AVGow2rjhYxuWfx7bkBpxkvhLb8wNh9mqLNtIFJyTkdwageuB7REp7VAGZG3ccx5TnpDtsC82cSEI37A49e4sQKxb4bpVBv8VWs4E1cfKjnvRypyFrK1Nr0svJEMwCzAg5zCSFS9vHlE(2Le9iM8lFm1hV3jI3UBrs)U02qbpz4GX0hq5KEO3cE1tlXFal8ORTAlsZaifa0R1Wpo3cmUrdHIuFCpVApEWs9s101CZ2cJvYyQNXL0lu7nVYkOTU1JB7Agv73yM6PhvMA2O6jkpzj3Am5nsBXts9alJDcHM7zsEFiGfrb5HyM03OumJUveh(O7LmjRZqZrTDTNCT9mrg1Gsixx7jlRQrXRZQaPonhSWOu6EzircNovOqU6PIeWpRPRGe1E2MKCwFne)ldn34iADPY(OUeZwmQISTk7n0afLd)qgtP4Vj9oYLE4lowCMhlltLD8qwKYOnkT2Lp3EhGeLfYbVswEk29cvu1ogw6xyOKQYxYi)koTT)gzNwsMTTOVwZgYjVGUSYKWWUfga6jlAVJQL2lPhWPQbY3aHqpGKO0G)Ohx)A0Jl9iZTgQs734TetsVoNM72M1Q5PNZAXw(r2qUjFlB0w6j1mhEiZZPnB2R9Pww2UgFvttISXLsczPXx10MOMPPwJVQ5Wip1MyzhCC58Q0ln7a8()(oFnrgGstD(6s2kMM681LSBmn25l9aenhs8i6igBlXuhXQw8dpDPPoIvgzdmsaRA6KNxF)vop8vc9OedpgGx8frrXcw6SNAzghrem5LT52aypKv7TvQRfHv63W5WOFfBrynTqO9YP9InVK1nBV)E2lCU(MeCQfezPwMgQSUXUPDsi4UJbGxgquACEiXOKiZqCtifE51gPcke3J7c2j7epP9TkYS4BUnoSMoiYU2CNJ0JDwEodnLd088lJkxThMSoRo8SAYK0u5x5sYUfXUlBdyEOgdUqdyCKmugyPBv5ePfT5PWsGQoLE2I9EjpibR996sEiatKQx83bDNVUgWpQHZV1yNUTzRBoT3iLleiZNxfW2iB9h)O7ph8kIFlzsfxn97P4eJiMBZF6F(x(hF5N(YF77pS4WIFHCdYdaS3jW24AY9i)d87K(hiz0(35GCdBnPXKuAO8S4Ti61qhYPfb50gC4Z)Cqe8Q7aQ9xb4Q4e6Rjx8DywVhLH(6HfFhSZhFyXpNJGnOGxdiI2HfX7WWYNWYU3cU1DD(ApBK7dCdN)1hyus8VlmEGN31vA(FsF(8BuMRejkVKzKNPWENHwMVJH57ip)dFUbTR4Ev2o9RZjOquwrTF(iqM)X)(pRri3lfHg3EvS8o8K2Vd7EC7qOyC72BQSsAwLOSuQoF6jg5iFMrcAP8OZ2NrXe5eSrunnQ410wcm6KjqJ7QfriB3w7OlvyTgLV0VXbeob)yL5F)fF(NKrVZP48PqGkPkAjbCpb)olHwpfDQCGe3tFTC4Z)e1CKmTjfDf4Wc6hQg8AY3dqm5lHRaos6arISRNDBb4VpsqJmtUbzFK26LzxX5SH(x2P4D1014dFUzUwTIroV5K3YT8FMRqaQC3(pg2QE1Z5SC4jmZ4DZqRwviZIKHYxo(oLpU69I)m5y3YeOgzPHRIFV(UM5Q89T38iOaF)yW6zD17j3(9vVF99i2N)jWLPTFfKcMdSS87Gu9PKpbs5NiencXN605yLqofMPQYzN9nxhB(Zx8rhz2xz6SpYq7uaYxuhfKkhJtJ7(oPV6WR52(AFXHfpw5tfSVPVSW(DPv)y4Bk8r3j96pEOSOv(n9ruWQ9Ry)EJDyF)ELdDAQZezcY(E9ozI5QqmXNN1hPFjxfoHoeYliNQp0vZCGWhcxe1VpT977AzAZCKeqTxnQxNtBTm0onhEelt3AxMULlt9pdp7S19B1kr(HALjZ8ci(GYlpMBzJtlnJe5PiagmJz8BCWhvoJ2zutePZ(Tt3Sk36RB4lVEp(qhtDr5rtDq56rkSNhB93wjq9C0njhx14XT35kgnB6Ug0PRjAjFhd2VVH7xWJt6zCmY3QGPJ604TjO2XuCHh0uvQHI1)2dkWgP6Ki25uGc)OZWBM0xoQmQ475OAqTRDg2Vzqv90LwrMpHDGUe3X0PR3PYXQPr3IeD1tAJRnJ2PtnAN(qFLKJ73B7Sc0fpdysRvs1NVKkUvZt(eVjtu)9ANKUEsUcZBPeIflOQhBSTjpgYrjG)A7OY7y54XFC0qlr071PR9djGWu7hbWJJRAxQ12v93RDs0K16XhEZDyL4BAh2C7O39v2oeUvvbsASXXDSR6MYJAw9iNROtKpg02TcEqNwfhnq7iJZWoD5N8jaeq5WrNoz)(IxnQY2T48kBh)Cpv(jo5Y2XVXvmCuopH2rmIWx4hQC8f73FLTZdPZv2ojKowpfKPUDQIl4X7ROtkQSGwIw9Nv6SrC74kFXb9AbkJUp0VRZ1dhmUVTtAPNbHu6w4Dg4HUXCvvTdMufVg5SEg05J5HivdPo1PkMzJPa7AwiU2XTFnHENwBO3PJ71J)Edhq)(9C7ZIJqTJHduDAv3Rtn6XflSGPng65PkskA6WUT4qujjTPYgk61SCXdfpBMr0qA1JigTS4A(T2RhX0vH)r(V776(DopyKIftrw4tZMPAotne0VPsDelNQ9IRJn0ySxOFLMm90cRu(vfxw603vTjGxkEDCfbE8gPJ0yWXwK3PZH)OiUJOioUHvlYYC8BipOXMAkvu0jBl4WN6mPZrwe5KlqXIPknW1C5oGdFllvu4exFLI1ejrJwTQSUuDj5OkQRYSoHs2OZZEPGSLY)ZuqhZ2XA9C0xFXkNJfO7IvnNb3uC5TCL7I2qnEfxKTo1GcJhuTUA8o3mEI1Q0cOU0GCrQaeutsvrLdMyJ(M9fPovkPovGMTUSrk3UaWr5kGZU6ZkHoTdH)uqOzlYFtLf2IKH3D9OICqvVQS1z2BQeQjhxfuMeetv)WQhacRwxzvM6zt(U6l2Yuma9IMF8(HhzDxIHz8oMYdF38vw9XjCHU5RQkGj7c5bQBHD69rzY3Q2OOV0Ld7r1Fg6GHzJetUx6WkQRit6)hR1N8DL5sV7NZ)V)]] )
+spec:RegisterPack( "Balance", 20221029, [[Hekili:TZ1EVTUTv8plbd1xBNBCSKTtYTW2dRdfd9II7awkW2FzzAz6yHil5Ph5XGH)SVdPOOiPi1dB30ITIcKKRi55Ci55XVZHKDH1IFzXJRrj4fFZEOTT1q7Vmy4xgF)KXlEm5994fpUh5(m6j4pcq7GF(diFuGl97V7hIwtgFCyAe5tBts2h)93E7QS(CtS3o3bp5LSnD1aVWBzd9Mh929xVD36bBt25)N345JNXgWGK3sw84Qup)KFkyXk9cM9IhrPjBdJw8iHqax9wVgN1DCS7Ihx8OVxCsmDIH3Gs9tG)8B0jkoaTYhVEXpK13iV9jEHblE8hFd7MMGxFCj(fC07hxM4Tdd)Cl8dKBsy0XLEXWF(cYZNqHbGm4Mn04qFuKZkmA3IequjCPOPqGcICf6Xif5aeIeCKhcwUP8C6XLwhx254YUGW467Tpgpaf8Uta(TKJlpCO4R(PbaNZ(EVcU(AekzlHtJv4u4EqKWjf98feWxOvYF5Nc)kEp233jbf9eojEqm8hBq((hxohKjA3DY0b8IDqHycpMCj4HxewlpC9XOxOS5UwZM7oU82JlZy2wuCcWHRHnuKpoizqakjnch7KR2XOSyxcJw5L4SkcJEghv0H(hxUomzWUWWaIypiXZ9zVGNOnaByRs3SrzOWm09z60ZEcSpr754HIZ09O4yVxWoO49K569gvqOu3f54f4oiDFMYq(eFqqOJ7ANmPpRPnEpTnXjcVd5feNPynPyfBfokghreEctF4xpMAlW09H0Fdm8lkmmVhjrEbpJtSefbo7cdCsJXoS(CC5vZYnwUc24Y(6Ge7bWs)63DCdd9xh(AqMG1vqSvPtgzKMzA6Yi62xh2U8zTKmSEUbQiX(HGBSILeyzZAy1RB2nEDZU06ML21TQKr7FdxoSPlhwI(BjJbM77IvC5AzBu7MZsMlnoTIsdCY(Bhs0KSykmdwMVplvx5nzSW)K8FpUpc7gUBfsBSP6DVDf3rLl2hhN4H8Dq(EpfSJ8nU7k2oCwpH9hue46JixUBdJXboHBCWqyeUhqr3sI7C8qBTsiz8fHHOGreje82S2h84micf8SGguHmUp8vCerSEc0bHn6aDs2gaUXExN84to010sbwRx(K8clRZzk(jA96QMWfMsqmhk9igh05OqB5gydwNgH4KYOCOlgB1YrxjVHMff7YIsEik7QLP7eT7irdHTwNnHr7um9mhm7CH3KKzhQX6Hd)kLgJwKPr4nqC)TKUMJXkdjYac4lNKqN1Eql3CCj3)upAS7hODhWrebQXuL0ba2spxVeAZC3icXYPOjgbC)DahtoGhI0QXwsCL83RYSjVDO1iafnm(4xrK9)cj)QmWsYDWznAhKorbYPm7)mQzOVeDlFsyJ8fa9uElg5xqxIUKPoXxPG1Hmuzg6ntayG4Msbb0PQEkgxRU(Yev9l3Th9(vLdfZuxe1ti4ShsvxMqn0fX7Ii(sJ8EwarSjmDunfcH63M4lul5c)kq8f3WG1E0HyiJcnXQvhgDEcRnoRcdsJHLvCK9xCgV3L2GQxgnzkPMErt5znRDgT(MwH13d0LuPSKY2fO7TjHPUBDG4PG0eVlmg2LfC4XciwTJxJtPccPbtr1jj0aAkODWX)N3gExwCFy)BTk2nvaV6Zmr0GwmlNiibYGW0yhWhAW)59cmJTIIJ5PqiGujYBxy0A6IuKlkWZ1zFQFmksA)NhFvdvhPc7vgRCVCZxQuX0IDOrf1jCs9Iwuc1Ejeef2JEj8zmvrkEVhSaexauMBEGII8cJ4gXQ7mMRKr7J5ypSGVamcxmHRzPPt5LQ3WZHx3lOFWgnafFxAat10YSli9iw0SbXC(w1w3uEqpQFOb4SAq5q8wRXhLLzNuTFj4bHv70O3l2IjmYSRJ2ZiseImTy3TeNzXcO(HmGOFZHx4RjzRNIDDKKEBa(vhcgjQCA2Du7Lt7lRCUf5VPqqvR1X5iOJfnusHye5CX2SJY2ZLILJchEBsdEcOYtrHVs0wfbiaDcYN9fNNCxpWAWRE(RD2LgVnkmCxo(oE72AANarsM8sGnyXAlJ5fMc3lNCGiPPRkMD2N7z9jen90GNOjugNq(gdVx2(k3epD3kY6iM8lxm1gV3jIXUBEG(U0spbFz4GX0pq5KQR3CE1tjyVxM7rBt5teNaWia4wBGFCUjvCJcQeHA3EE5B8GHCKQOs561fglfXunIlP(NMlyLrGADRgR21zuTFTrQN2Oi1z9QhpLKvmTXOxjLcpk2b0m2ZfAMLjPDFalIeYd(iPTiLaJQwedYO9LmiR1q9ETTnhCT9mre1GKlxBZbllVII3KucgDCkOHrP09IqI4gDYqHSvdfXHFwrLajl7jBJsZQLb)FPPGgnOCLs7JQsC2KrwKnLnVMIMiDGhIyk5)nPEr20dCXYGX8yrzQOkhIIucT4Ovo9z67aKOeFg4vY0tsVx0ETCHclmn0KjLGjNz090KTHPpeByYKHshjqMCTMjuIqaLBr0ANesCh6Tk2jp5vIlRmXTiAHMJAuM2BHBOwuQEQkRz9bieQEY45u8hfe7xJcIP6sV1yCA)gVbNzQjivFP5mwga6HYMVL3WQ3n5JSQCXNuLFyoApNAYzoPPkzz7QswDvxQ2Cdov1kDO4ROWuMMYfeYqj7AYrFAKMkLSRIc(CQLItcwqvvb0mQX)VVMDshfxD1S7swBN6Qz3LS(m1wZov3f17tUb1YlBlrxT8kN2glETUA5v4AfusafC6GxuDnBopaE81rbg2eKFSjrUxjd1KuobPg41sCA3ScyCo6kvvCZkkQq7z0VIf38IMlU50KVKjJBUYKTjzCXYBCQ5XPpwVDnxSUp0y9LQyWhIWCxw6mIWdJdt9jwiKfqWjoGHO4g3uctMTzqzTmRzJIVHJgv)w6OwE4GzwHD0xbqtfgQM6dQFXU5fsyAXks3AHomnViNA6K08OYYlQpyM(YzNvK9HNv9gfgk7g3s04igYjBbv8s1VHskT9mBnelCPANimP1pKmejYdPCP0lkVH54zT3GZuvqhDjJ3nrOia)o4SAQ64ygvtkeAp3dJiQL04voCMimiegpWKrsjEK5FtgP8itv3PXL0fAI4gHmi(lyGcqpGOwU4X)5F5F8TF6B)TV)4YJl)fYdnWdY)jcK5nKNBWNypDHprGs8Vtb5g2)IdjyjqPjH7q0xRaaMiaatm44x)zVaOP7aQ9xH8eWr0MjVpcyuVhKGE74YVdupcpU8NtrWUO3lEer74YW9yy6tyz3BbZIUwV1Ze5(et76F9PmkX)35AyW37Alm(VOoE2fp0wGef3frY3KyV1qdJ3sZ4Teh)XVwZQl)632U1xRtybrAg1(XJaz(h)7)ScHSVueAC7xIf3HN0(Dy7MTdHcXTBVP0mP(LePPs5XtpKrlXJzKtlPpD22msQiNGoISQrjRM2sGrNmbQDxn3dz72AhDPCRvR8f)b7q4eSJLg)9x8XFsk9wL8d0s548vAFO9eqVhXrNIOi6iz0PVPE8R)evDKmSj5LJ54s67zeAM8SrcjpyYC4iXd4bYUE2T5ie)mbnYmXkt(zAYgZUIXznflUtEBvCEbh)A9CTCQ6mEZiVHhdYmBUaKveyHNastyR8luGXYHNWid3pdTEDUmZdgk(gk6u85YpFIZKJDlcGQLLAEXg96BRNRIpld99Gc89ZEBM1vTyOhou(zy0JOF(NatM2(yz5mhyzXZLv(RKxkR4x4IgH4tT60ujKrHzYl5zxxc2AS(x56Clr2xA4zVfvZuaIxuffeYzJrJ7(oHhN61mDFLhMA(NLErP919au73LMeKMNE6C7j96pEOOOv80pjlWY1c5WbThTXHdsh34uRjIem7zDEYeZwIy8xX3NPp4VCJqlc55Kt2g6QzwG7dUjI8Zy8WHUgg2mlbbuPPr96CAZLHMP5WgmnTRCAAxmnvFTMMzR9h1mr8JkPjNzfqSbfNEzML1oS4eINNChyWiMXURjFw605Nrvreo1)oDtkDrbVHn96n)Ho6k1YCDLz56rsSN5B93wjq(guOtoUQ2lArNRYOzD3YKoD1rlXBxYHd1CZsMpPN2(iEFsMoQtT3JKk7t(vDrzPs2vS6tujhBKSrcFNtck8CRH3mPVOxzu(Z(PStTRTg2VEqv9uLwEKpUEGQe3r39QOtPZZuHU5b6QM0ANBA1tNQvp9H(sbhpCW0H0OkEAWKwPKQoEHL4wnoXBDGABkxzb1aC5Q2cbdZNmLpREtdEmeFId910Hf0XWDsy(OHg8M3RtxZhKaHPMpMG5JlRtQuxw12vo(FYCT5U2ShwY3MYj83o6DFPTdUjvzqKAlRChZlDtzEmlFo)Lwtep752ndEqLw5NDq7iJ1WoDzh3macq6ePNo5WH8MgvA7MFiXTJF2Nk)4hxC7434skosh4q7igr4ZTdLoFJdhUY0bM05kthvshJhtYu7oLXem)(sRj5zvqtpR6ZeE2iMECPhOsVwGWO7d97AD9WbJ7B6Oy6PrifU7LNbwOB0Nrv7GivYQrmINM18XmxKYUuNAvgVS2WFD1lexBz3VcxVtR0170X96XAxZTI4WbM(z(XS2rZHUoTS51P694I5wq3gd9ax5bf1DU7gmikfKwxkd51zwmXH8VntlsiLCr49wuC13Q5Cr09YjMZ(DFB7VZ6bTumFiIcFCYmz1zQIG61dRtHsz5cX1XeumMgxnxvH5ZMmzilRy1lDMUVMRsZEnbItfvvatZMlfVAw2InxJEKcdAA2GNoh(JS9Aq2EmfRwesQ5BipOWMkYPKxYBdG2NAnPtdZ2CYfiRYyPk9QpViW5qlZPKBexDkLv41rhTy4DQdUZzSV1Q0mJvNWnkjZsJ6esJKoo9PMMnn(FMemZupnMFjT5lw6Lz(sVyzxQXtaU4QoZ8cutoN5x(UovGkK53UQCop3GQ85QWeOQiTmrk3QToPk3YwhBu3SVi5ntj1Pc8T1PXs52faEmBb4SZgUK3zZPuCkag)TX1npg2fKh3D9O8OPLVj01TE2eaZnV0PvzlRlp1jLst1uMugsGvNq0SubMsMyDRmlxDLqJlJgY9vNlq1Aym)(HnmnyE30ETGzrVQ)wgpFctOR)2fdOEv9jCQEGuv9p96An5JQSwQt9sEf0urjTyi4Qj6UsVAb2QI3QQkcSG8)bQDjp9tB6L0DX)9]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DruidFeral.lua b/Interface/AddOns/Hekili/Dragonflight/DruidFeral.lua
index 2adc804ee..2e758cd07 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DruidFeral.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DruidFeral.lua
@@ -283,11 +283,12 @@ spec:RegisterAuras( {
},
-- Heals $w1 damage every $t1 seconds.
-- https://wowhead.com/beta/spell=102352
- cenarion_ward = {
+ cenarion_ward_hot = {
id = 102352,
duration = 8,
type = "Magic",
- max_stack = 1
+ max_stack = 1,
+ dot = "buff"
},
-- Your next Shred, Thrash, or $?s202028[Brutal Slash][Swipe] costs no Energy$?s236068[ and deals $s3% increased damage][].
-- https://wowhead.com/beta/spell=135700
@@ -415,7 +416,6 @@ spec:RegisterAuras( {
infected_wounds = {
id = 58180,
duration = 12,
- max_stack = 1,
type = "Disease",
max_stack = function () return pvptalent.wicked_claws.enabled and 2 or 1 end,
},
@@ -792,12 +792,6 @@ spec:RegisterAuras( {
duration = 3600,
max_stack = 1,
},
- thorns = {
- id = 305497,
- duration = 12,
- type = "Magic",
- max_stack = 1,
- },
-- Azerite Powers
iron_jaws = {
@@ -1462,24 +1456,6 @@ spec:RegisterAbilities( {
end,
},
- -- Roots the target in place for $d. Damage may cancel the effect.$?s33891[ |C0033AA11Tree of Life: Instant cast.|R][]
- entangling_roots = {
- id = 339,
- cast = 1.7,
- cooldown = 0,
- gcd = "spell",
- school = "nature",
-
- spend = 0.06,
- spendType = "mana",
-
- startsCombat = false,
-
- handler = function ()
- applyDebuff( "target", "entangling_roots" )
- end,
- },
-
enraged_maul = {
id = 236716,
@@ -2567,4 +2543,4 @@ spec:RegisterOptions( {
} )
-spec:RegisterPack( "Feral", 20221027, [[Hekili:nR1wVnoUv4FlglGHDwpk2k2ZMPiYfykqb28WIf1lW(MOPLOTjIUbjQ4jfg63(EiLOePe1L2Mh6ltYqDUXdpx(oKXDJ7F4EWhZiU)M9AB7nRT)fRnFB7tp9K7b2hje3djyV3WxGFjchc)7)KKId4R(rqm2NZDwCEQh8LRmws2F7XhpHdWrEKVKrd9SUqzxZpzrJF87vlFGg(pEm036klm4VFMgqCQyWI9dM7Ht50a2Vg5EYSzz7EaNZUgN6EGliqRuFFsj5Kmp3dUhcOzSmUHDkio2NHdIJ4)3FtSvjr4tbeF3VdYXJrJJCpKIFdSEVp8ciigo9cb4gi(GxkLrsPy3dlkooR4iJ69gn6sXX73loclTXYU44dfhtiPzGkjrmuyEaJMeqjPfh37uC0pMzXfVvI6xwwlcUj8obDIHyP0lxabvCeydK78IJPKZPKSRC7vWZsXQNYpF2cyqiw)4BrLB8uAs5UPCxLzfFl4gb)oyW)SZJHXXrNPPKvb0icYZ3z7dx88DzG3TLtPztRPEfflLvLYLEXG8iCkIgLLqtXILaP)upUC21uC2vKhMnfnwsDL(6CobQzBVBcPioLMdbcOSGgbjTf1pXf2Urfw2nAs7TVynXgceXxhxextj(TfbFno7)Y4SpMf88OIqZPA4CbeY3gvi1bHIZlV4WtXOKyAedIJ3xCCBRKmUupCMgrZUsshkLmjLgcNj3GiPRTIV)JR8yK4aFi7HvC82vQ3vi3mU4ywcoS44V)NQgAwcjiqgTyPkwHb(ogOcuUvYn07OZNmLry2MgQCr744rmInT2H)(FwC8CmuNaNKe8HOIZ)IMmu6eWAp6FA5lG2qreO6lFFuVFJJdqGCkRUpyIXmzUAguaWZkpPrkNjPXE048m0jGA3dH4FGirK0lFuzl9NRSOTufotixfQ0AbMvak(megtqG5tYywvcbku2R6fbGG)aN6HZyGRDOGWrlsz252Ffv94G68v9iXYLFVScrpz3I4a9YgkAuEaBSaNgDvTB9jPiXoXK3OvsVQZZkLa6qjmmpcv(7iEp4YoXOsydAo9bYYQAgBoxI31uyfz58M(iC4PCOggpEZ0jrFPlDBv9FY57NtYZ)JbzFDAhWd0k5tly85rcgHnwdwK6iSAgalilpLJVuZW7l(ilxa(GhBjqY4EqcLHXlJEgd4S6OKKuWcmPGAP(wo4mo11)PNPfhdLBmLQz0dxwMZcmkQhT0XUDTsqSHQLmkhdi6CE6htRIlCgWl)fkRowQtHU2TUrUsYmvWTHgWf0B6leplGkyiMskaSporaNn7gguLEL8si0C8W6KH8XHW0fwAGR7NSusigsClo(IaLCjK4fdXbeG59MG(NkfUzZ4kbhiPL3twk7zLG0JJmYancDoGE5kByARmLPrTkzlRA5Xtsbxuiugig5tjLhWL7hUqaEHt(qkPe3LTubtWFRe0W9r7guJMlgncytCc5hOeOUaMfdb3EPIkbdHsyqSN6Om5XbAYbkec1oJ(3IeOnRNOyCeBUjLkuJFLl)r6wQmbAlK2dQc1bx5APFifDCg7KzeTHo1078kgmLqsGV(6IIKILwovZeQvrsFdvHHO0wB30DiBDQ6rdJcxjJnWx52UEWeLa8NxprLQ0ZQeOu7n743OW0BN))bygzkf5B3)SAVpuhuWFJtJeOPq43XGbZrNdnuHYnrT7z2FmI44tPlOSVwNyNQI5N51jrQDfudQIJEp(nIygbowpklZTd44YTg)yw3gh5AamyJgd96y4BBOvhfBnlMV0Ox4x40xB3KNdOGZsAo1VKjEH9m0fWFq8rWHrvSNG6EdMEq0Z4lYoh9x(VjasweXeKcZPJYQnDpZKbEskR)MzYT3Pc0w8tjSe5Y5zeeydHzDcYHgr8ZemZucCm0tkJOmsJmfJ)Bb5WpSfRvvJqpVZqECL8ONnlrPCK3(GIJRAmxgHNiLarj3IZJ8ZAgYTzuyy6FeoYhXPv(9k7frcYa5VT28x3Puqn0qdWARDYDXpl8LVZV5tGG67O19aGXicsMa)(VgMeNY4M63KiDkokUBwRIxfYKF5VsLWVxKQdMF25rPtAf3)4O5Mxj2jo2fVooJv(1vXjoItHkExVcQm4t5C7mIFE(a(4vnUyNTMnhPZ18xfU1IxR)yZsnl0mzI2QIjruxrPE0k6zh9zp2VD997Tsfv4vALCgN1ESI5LIA)U1fV(t)K8KKZgohQnGzCmZnCkrrmFMbWgA6uV3B5bMSqGkL64xxP1(0zdxZlwmBuGU3Vp6qfVyVC(IrgK4LNUF3KYAgFy)MLZNvA9dpYqFu1EyHEORHGLZ7wVE)U735S1myWE75J7LQoSF5PDgLP6XIoKD(XWWG9BXBnmDoNQnjFXE8Weje8286SBCEvWwxB0THPpbP0cnyNDXU5l0t4Qsa1siQwtMZSCc6vfkCxLoUaAG12S7BGSip)FETszjR2BwhoqdtjIQxwxVCZlFjrEWzQhqj7nJUDy5wsbuOQUo1uEhmfz2ei07MCXS6skl2yz)GXN)BVJjuClbwQYkvEYph75koULlN391vmzGW2PZfz26qOwsAVzxFsR5Qih5SDUH3qQpHQE3KnrCgEqU(eGwSIK7M3)Qx2eyfuzP(f3(K1KIBtHVj4AebykSuFCpxnPE)wTur18FNwx4EvpuLBAVw8DV2(EKP0UgocqwmR11W3VmLbGti6QFHODP6RK37UZM(5yYH09lc1a1(P6ZPIwBHklNjjq9u05)I9Mk)FwgDBzo4x1DMkKvH7t2xT7xaMvUIbJF3W4(1X)6JRRLGXH0PnJPsBuvX3Ctbg)CtJ9(uANMTAwX259CNaZn1j5LnwFvImF765Jp))(EoFFW(l2dJ1tDtwoTDBKdCGm6EWEgOVnz2M1s9W7vTYh)j)BeJeAOJ6ZS3n(w9R7B)xbGqPMFf(UkI7vuv1iTohWm2yu4WKNto)w1MgTwPcXTWY38g9L6AwpJooGi44K05A(OpC)s1kcnW2CQFIqtFLN5LB6VTj(nN6XFbGNe3vH7F9d]] )
\ No newline at end of file
+spec:RegisterPack( "Feral", 20221030.1, [[Hekili:nR1wVnoUv4FlbfWioJhfBh7zZwe5cmfOaZ8W2fR3fZBsIwI2Mi6gKOINuyOF79qsrjsjsj3Udq7l7KLINR8C57qAVvE)U3(ief79lRxUE9QLpT0z96NE2Bp99CS3(Cu4ROtWFKIsG)7)axGIzR(ECgkIrBzwvri8LZuAE5F9XhpGIrPH4pwsscDorONRo4qYE8ZnlVNK83FmjY5mnj(VDKeJDBiWH(DQ3(dvKy6xs9oysP(PTGAHQONZk82ZyeivsuewSDCzO3EV9XKsAjtXoeNLfrrXzPS)3FHBO4u0HyCK3Nb(esjzPE7lqVcAF47HXyFkQ4egOg28(WccfxqqE7VVo4U6akj8vs6P6GRxRdGLw5SUo4H6GCCrjisCk1pPkMsYJj4I6GDU1brzuhg7DYv)Y8wwWuH3W(hO(0cYPtaJQdaYa(oRoOaFSaxEMPVCAMZx9q1XJoabC2gLDjvy4fKCH1iSQsNSlXxWO3af(dUpMKLLEKuGxetsX(HrUBE4uyKhf8U9CkDgTM4veSKxncx6fJRsrf(K0YCsbIVeW9NS4YPNlqLN9dr0BrIID3iVbNtGy2y1iKS4qrfei4xg3XiPUO(jgZ2ojZkVqY7B(814geWIpnnloxGJ6Zc2AmY)PPjFkn45jzHMt1W5cWKFEsM0geYpVcZsoK5NNrsPqC8U6Gn9sYyCD)rskP8mUySuY8cscCMCbIKo3l((pkHGJFL)96GVX2qDWfc7)(BKCiJknQo43Xiin7dY)4FMJbf8BzvPrLoQMrzooowgl5OkuU6)gc2fOAo5x8FZ)4bt5lM14XkM0pkFcLyvp7)x)wDWXmWQq55XVZRhbgUZyzBaTwuGBlDceNFkgkoZmKwdoll2h4JO4VH8Me039XP4ItVRr3rCrwijRQ0)aOqMvG(5pwPTxazju)j0PkN7xHKAOKSdOGX(zhH4DSpyi4sQJKZMKnRGume1eIkPGZDSG0jlIz24SxXvpsOnFwpwuS8BIkiwY(5bc6LvuKO8e2ybqT910oocx4ZTetEJENbQopNcmidL4WQuFXF7Z6rl6u7lGvO50hjpRPzT5SjwxvUwuwXaf4Jsoub14QYnFsylFzyRS)toF)XK98Nmi7t32b8iTA(Hfm(8ebJGH1HvPncRLaqdkRky4p1uCBXhLvCWjSyloshV9sOouwH0Jiah2aHKxaAGjb0Y1xRaNXHH(p9mTSmOkJPunJEyrXrhqPiHeHJDZsLG42Yzkrdeggr)JvfVpwqJijzyBZFdwh6EuKLWAHc2CtRKiucGWheBwAv5I6GQ0yCj0c)cSwic6D(zqQ4IxF8lPHOIuEordPGbdTWGu4gQRdijjGRpLg)UwV2qiINHuqAwf4eeKIXn7L8c233y38tdEv8U85ZiG2eCCeF95MAs0jQ7AOccazL8tKDeeoCUe3USZBj3MP8HU9aN)wRD1yAEgaEjzakcLZX6xEbbIsF4cX8fSHf03MV4GXrBYd7BR1L(cFeI5sVQDkGSRWx57)jbZnRgNXOy5EzqsK8(oXemzPgjGK6FmMC6mD892Ok32Uv328M28SkuGlkbQbM5hrWIdyH9WycqlCYNqWIGT1sbCd(BLGgMpA7Os0CL4jarJYXF3phkkIOzqMDybVmOwsFpupSgjlTYuDm4SabngbTbGohP)lE5Jv27LRZgxU1Dt5cTO7z83ouNgWzktOlrLPm5NYh1htzunqDQFMs0Vl)i(QTA1HuGtARqu76D1SMFRQPOKQFdalHUAVzXqD9wLJgaoMqMAaxHz3ovNscWZlVrHQ0qxGISVXo91XC7yD()aa1uLMa9bx0y7JbVG01w1h9gcuy2elaAdOCuAFaf2JN5hFkqeK99ge70uS)iRoQVAxd1GQS03YEfZNBIbeMql9gm5GW0yhZ664eHyg0rJHEdu8nD7vhIFljMVXTxy3w3N6dcyJa3rurfjsqeRWFP)jWFGJ8HdJMyp(UTgm9aVNYhLDwS3EOlaswezCCmMQcn8mZkWkZBF9w1Pq4)7OZbCxVkCDuxvI9HDLuksaGMySZle1uYDgqxjwzwqz6h7VIRG)znFTM6h65KgYXB4h5Ozok5J8IBg25HIzjz5qe0fX9cP2(Pzpa4zFuAKpBVDxAaxF9XXLa)30Q(lhuMW0qfAzpT4o7vkb8sVXUszypTx(T3EaFskKOv6T)lj5zfuMQ(Zsus1b8l92P(RC5YUvDPCyxPuZbZhCFu6KwW8pUAU5fClXDD9xNMWg)6ISCx(PqdTlxavnIimQDNWppBeF8IoxS7gZQd35A(ts3A9xB)(acGf6gPtBv(iCQROuRAb5OR(qB72S861EPPF9Vuh8)KPTu1Aw1mM6AP4WULZUxlRUXk0G3mxLHsVkJP31F6QzcVYUTl1jrhHGi0rQrQ7uhf(cTM8URyI8(7VBs46xVo5OrVSE(S7NyCOxE66vtcRBiODRMp7oH2p(Gp22v)rESSVUnmF2WUk72E9kJSUXB2TE20EPMZQxEARrEQESOp4b7yy8rw6rB7SgIaXUw5VSE6We5Ce9P1D700QmbaJC7ZAmZ4Cg3Ga6bNDGbUTj9QTQGP8RM1KPGZVb5QILFOqNMbD4YBpnvWCjdnEEPsTtN(gRlV2IHCu1RI1k1SASsOtmISGQANz45JZxXo4fGLB7gEfufE2fiy1iV)U2Qn3VYz9dgF83DUMGHohiPjHv5bFDxptXXnF(SHVTMjfemNbxtDVdHwoP9IT24w3fnpXzBlBvEbrBmv9MN7I4m8CS2yGwSIK6Ux)0kzCanQK0(ER)GLKIBtHUBW1i7qp44EMAs9UnAPIQ5)U9EoLM2RkVJsl7h(Omw4PuVgpcqwmR3JSyNNYaWBi6Yot0EYKfYxvXDLDkU5qA7Sqnq1(U(XurRptLLZKBq9u09)cBtL(FukDFEo6x1DMkBRbsOSV6WVaeRChjg)UH7ROn(x)(g0sWyO90gswPnQk77UQdJFURXUnHoOzRMwSzMLl1yMPojVSY5tsm3BwoB6lWyNLZ3hw)X1Jddu1ifxxqFKdmGm6EqldD0FBRnlL2RvOBuJ2Bx9RDtx9N4NasNyLOmDv)zxmmFq9R76)RcHRsw(vzmusm3OQSMOx7i6XkJmhMN(MliOQttwCvzZ9MlO7h6biREY(wO3G6QhFnBYFkhQvt6G852(4XM(klRTY0Vko21ghYEKLN4xgJ3)(d]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/DruidGuardian.lua b/Interface/AddOns/Hekili/Dragonflight/DruidGuardian.lua
index ec478c163..ff53c927d 100644
--- a/Interface/AddOns/Hekili/Dragonflight/DruidGuardian.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/DruidGuardian.lua
@@ -237,21 +237,6 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
- -- Taking damage will grant $102352m1 healing every $102352t sec for $102352d.
- -- https://wowhead.com/beta/spell=102351
- cenarion_ward = {
- id = 102351,
- duration = 30,
- max_stack = 1
- },
- -- Heals $w1 damage every $t1 seconds.
- -- https://wowhead.com/beta/spell=102352
- cenarion_ward = {
- id = 102352,
- duration = 8,
- type = "Magic",
- max_stack = 1
- },
-- Talent / Covenant (Night Fae): Every ${$t1}.2 sec, casting $?a24858|a197625[Starsurge, Starfall,]?a768[Ferocious Bite, Shred, Tiger's Fury,]?a5487[Mangle, Ironfur,][Wild Growth, Swiftmend,] Moonfire, Wrath, Regrowth, Rejuvenation, Rake or Thrash on appropriate nearby targets.
-- https://wowhead.com/beta/spell=323764
convoke_the_spirits = {
@@ -370,14 +355,8 @@ spec:RegisterAuras( {
grove_tending = {
id = 279793,
duration = 9,
- max_stack = 1
- },
- -- Heals $w1 every $t1 sec.
- -- https://wowhead.com/beta/spell=383193
- grove_tending = {
- id = 383193,
- duration = 9,
- max_stack = 1
+ max_stack = 1,
+ copy = 383193
},
-- Taunted.
-- https://wowhead.com/beta/spell=6795
@@ -466,15 +445,8 @@ spec:RegisterAuras( {
id = 33763,
duration = 15,
type = "Magic",
- max_stack = 1
- },
- -- Healing $w1 every $t1 sec. Blooms for additional healing when effect expires or is dispelled.
- -- https://wowhead.com/beta/spell=188550
- lifebloom = {
- id = 188550,
- duration = 15,
- type = "Magic",
- max_stack = 1
+ max_stack = 1,
+ copy = 188550
},
-- Versatility increased by $w1%.
-- https://wowhead.com/beta/spell=1126
@@ -808,11 +780,6 @@ spec:RegisterAuras( {
duration = 3600,
max_stack = 1,
},
- sharpened_claws = {
- id = 279943,
- duration = 6,
- max_stack = 1,
- },
-- Azerite
masterful_instincts = {
@@ -1616,9 +1583,7 @@ spec:RegisterAbilities( {
talent = "moonkin_form",
startsCombat = false,
-
noform = "moonkin_form",
- talent = "balance_affinity",
handler = function ()
shift( "moonkin_form" )
diff --git a/Interface/AddOns/Hekili/Dragonflight/HunterBeastMastery.lua b/Interface/AddOns/Hekili/Dragonflight/HunterBeastMastery.lua
index bc2ec7022..665b8d93a 100644
--- a/Interface/AddOns/Hekili/Dragonflight/HunterBeastMastery.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/HunterBeastMastery.lua
@@ -673,14 +673,8 @@ spec:RegisterAuras( {
fortitude_of_the_bear = {
id = 388035,
duration = 10,
- max_stack = 1
- },
- -- Maximum health increased by $s1%.
- -- https://wowhead.com/beta/spell=392956
- fortitude_of_the_bear = {
- id = 392956,
- duration = 10,
- max_stack = 1
+ max_stack = 1,
+ copy = 392956
},
freezing_trap = {
id = 3355,
@@ -1685,24 +1679,6 @@ spec:RegisterAbilities( {
end,
},
- -- Heals you for $s1% and your pet for $128594s1% of maximum health.$?s270581[ Every $270581s1 Focus spent reduces the cooldown of Exhilaration by ${$270581m2/1000}.1 sec.][]$?s385539[ Exhilaration heals you for an additional ${$385539s1}.1% of your maximum health over $385540d.][]
- exhilaration = {
- id = 109304,
- cast = 0,
- cooldown = 120,
- gcd = "spell",
- school = "physical",
-
- startsCombat = false,
-
- toggle = "defensives",
-
- handler = function ()
- gain( 0.3 * health.max, "health" )
- if conduit.rejuvenating_wind.enabled or talent.rejuvenating_wind.enabled then applyBuff( "rejuvenating_wind" ) end
- end,
- },
-
-- Talent: Fires an explosive shot at your target. After $t1 sec, the shot will explode, dealing $212680s1 Fire damage to all enemies within $212680A1 yards. Deals reduced damage beyond $s2 targets.
explosive_shot = {
id = 212431,
@@ -1902,7 +1878,7 @@ spec:RegisterAbilities( {
-- Talent: You attempt to finish off a wounded target, dealing $s1 Physical damage. Only usable on enemies with less than $s2% health.$?s343248[ Kill Shot deals $343248s1% increased critical damage.][]
kill_shot = {
- id = 53351,
+ id = 320976,
cast = 0,
cooldown = 10,
gcd = "spell",
@@ -1990,7 +1966,6 @@ spec:RegisterAbilities( {
usable = function () return pet.alive and pet.ferocity, "requires a living ferocity pet" end,
handler = function ()
applyBuff( "primal_rage" )
- applyBuff( "bloodlust" )
stat.haste = stat.haste + 0.4
applyDebuff( "player", "exhaustion" )
end,
@@ -2209,7 +2184,7 @@ spec:RegisterAbilities( {
handler = function ()
removeBuff( "dispellable_enrage" )
removeBuff( "dispellable_magic" )
- if talent.improved_tranquilizing_shot.enabled then gain( 10, "focus" ) end
+ if state.spec.survival or talent.improved_tranquilizing_shot.enabled then gain( 10, "focus" ) end
end,
},
@@ -2323,4 +2298,4 @@ spec:RegisterSetting( "check_pet_range", true, {
} )
-spec:RegisterPack( "Beast Mastery", 20221028, [[Hekili:LZ1EpUnos(plngmESt3TJL64ojlS9IBxS4WmyUSaRhG72)XYYs0T1gzjp6rs6ad)zFls9IKQi1dB3jZEdg0X2KSyvfRh)yjrUYy1VTAPRDcz1hmNyAAmX8DJNaFyQXQLjpFGSA5bBNpA)e8Ha79WF)le74KtR)FG)sIEM28Z(H2UuYehMg5aD5hoTExsYH4)0RF9tEj7s3m2jC)RJ92N6BN4fg4ezVnH(DNxVA5Mup)KFoy1gu2W4TRwANMSlmA1YLE7)RRwUZZ1LK1DsSZQLRw67fNeZedYw7u)e4JFGjwKa7n(e3v)LS(g5DGo7Rw(3(cXjnH4EAn5tGmCADI3Ec83DWFSDscJoT2lg(4NS98PuymWdozd1jmnaKBR4DHjRsaMLopfnMezh87G449vVGNY6chpa9(bjUcLQlbgf(IN9QLrPbKTHrprghtoSl9RXwhIcD8T3ZuJJZP0P1hpEAnO8934f4ooW7z7yRKWqFO7HEXYDC4P1oHbUPEjJJOYFSTVv4wlyEsGPRQVdoT(MtRBllmIUoeqSCCxT8HjuH9nscBLyLj2WSd8gqgqxzhff(5XFmi8ZbSj2b4Ex4lJ3qIt8ag8Zr2j7GrS32liwSl1itzVOs7nSL0ZA6ad7KipNeQvv1sMTVVv2xSOgGzMHwz(iq3d(ibmkHXmv1AUoc44Yg7JAvHFIyrci79iGOo70AZUZNXmB4326zzXP1gDFwC8j2FISIoxlperGybBSRCslirC6(9WOpqKDAeCX2eMKaTyT13(zI7NPlMjHFXlaZrRymB9jX7yXCK6LSfkL5GWAw0WbRwAmEkNRTDKf4EFqH3j47X(Kfz)gWJs0HRQFbK4yGL)SD0ZXmYDGznE4GnyVLwommZgn8MGrlpdc2(j2(KGKXXoWFPE5B8ddD14JRqqYw8YxircVkmNr2EUwqKfyETDDbA8fAa6CDHuBL(QlMd2wtY6unZU51hilK5P1VIz3xOjSJpqCyYjel36ZE(U1mGywQ8DODrO3yhTbm7KdqVjD72XBJibF95XPhy6t(FQu6MbsWto52dSEqNBR4dEaPIlgQZoBq1hBTnkBAT9ZC5g)gwZvltqhEApOkIlKeIVlK(Woa8n4w0w68mSKzLqPkemcw10gwMXG3NZFBOP5TYwX5wLoTEYytoBpiLEIxrYqzBwmxLdHPo7OSDK9xdJSkLebBYmDi1fpk2AVD0hbnu1C(rpyjSyovhIS9ZjFOcAyLsIRoYyZUmmbPiSbNLqUHaFwhywJiYDbj2dWrVtjhvov5gtnZHcIDena9hEpVRc5lh8dJPEIiqzmMie8oHq8Zdqk2nHy8UeicLfyM)Xi79Y9087Zyk8oQm(SJHi2McwRqWBMVTvgstmJafiDO8Et9biNH5P13wrvTH9XJlyOoWW5O)NEMQFXKBu(uDuMVL8Pm6sgRQo4uEmw(LtQFlLfYwwgtTuaSnwUEzgmgt5D3S3FG4YCznuhKcnveecNKT)NCSeLg6WUDez)3jIIQk0OKNRquJQOZsW4MOWVjMeDGAMgtvEcXyjaVhVJoaCtwtHGlmB84De5u6Mc5)TT2NgrtwcEfoGGgl3Bz37(QoHWbr0TntPPAxRTHoPzuXjKUT6Bl3UszM1X0wK0Vag692bzOBu7pGyK5Y2YJgZmECL2pXWxaO9)il0N5JcbZ9IiwmycYQqzlYgIqQGtEFEWpvGImZJFMTvw2QVpjHAePpqNP6COnNZSVi6rtMB((wWjDEgalucRaeftZdYEEvtZWtRZTaVn)tGL9tKa23FasDoITuK1YE7VW5hf5yhqxVIahcgyPhe8gDc3ezJehGUY7gRFpenLVBbL34yLahOFrq)OG7lr8Fji9wWgNzzHT3ab1ioO(86TuvecHEKxacXYuG1JrvOIRNZiRXH4E0leqpebXA)i1bXnnIv)g26C1xYz3CcTJy7dZXbNeMrWdtlz1C4f0qrqKuqXbEDojCfdI9)6sM9aFg(c2s)2t(MQKVeQFQDK120ON)2R(FukTjJTk3cxrt(EpTd2J5)k1LTFjPW8xsWnMCm0Hq2)YcveJwmxbBIMx2lxbe6aVlV5eU1XgqrI0CUbYW6TiSql3OxqMSpPCLxbst62yyZqUGQQsMvR7k4q1iGHz49SI4wgu9IxkL)Wu1em4kAJm1gydxJIbOg53fPyacO9uUd)32gm4QHC1BVTZXvRLKu09GBNssLe49TCFstAZ(KeRyI(AWOgNtB2RsrqRw8Ku4muhYNcsK9ebjNLfGblpnoPixPyEynrYA3EuQVPv1HDAc7xEzuEfEiL2wDLmo)cu1hvBlszaQSk4u0O2AT1P9m23ctie)OP9DRPmgdvI9shx99qkDT5ZVyPQrl9K6iUdBdIidU6HP)zN26aitLqJPUZviY0A21sK)dAzaN)FI1s9cQwV8DfLxsQUoQRJWfVstIp2aLvAsobyzCOwutXcmzyBARyztrfK0wjG8cQCpxj9eQSYRe9z4v4vRB3xSOVO00vOJzKwWFcNqlyeQi51OsFgnruznfq0w1PQD(k88J)D7d(2wKiIBAGfmyRqAmFXuJkmhEaT2rjAREQ66bCwvnur(1RxLwZlM2Hu)4Scg3MNQ5ltjkBZJaTZZqTsuQPMSAlrjnjq7lrzc3BMdszfcpqdCWvQ9pzdCWg6tF4t2(PK8L5APqe8BKDPyuP41T55ahR0dRqQqzZZDZzIvZDQREv7GJRA8ccxsui9TERsgLJsMlJEBXLsmcv(gy1ORwUEc2tFmPjO(wpLcwSLA2wGiz2FUjm750ePobxnXot)FTeAScm0wrrHmO1k7AklqS)oSakh8TmUywSddPOt0k2M1Y4eJX7SJTsJb4kW6vBHqln8c(KdsAHwESOxghI1MNLB4MiZEXN1PqfRYs0v1i3sc)wAvPNQQRGooKB4L0VcGn9r1JXbv9yekxujdnOKgCX4GBAZkQo(yytSY9S9BnJFE4CkZ4cfnTOjA)Ayll1vMnYLxCL53v6bP1mSab6Lgb5fD(gvtKf8ZSDFwuTIonzkKfkL6bkBzwtKotFKBFRNhvkevB)rEzRE6rjMfRd5vs4szP0vEwMzBCPHw1QB1TcOxCpFR56uGRUTTq8x0el2ZLcvsREcr3xa9zy2blMBBIMlQrtzlE8KBxP1fP)xZ(nvWaJALa0kegdBmDWqPCFfcsJwxlyMei4HWC3BKAnfeCeQAbxKUCGI6FAbPQxY1FV4Xo2o7i0YRz787PErexyx3e740isCfWp5Zss1E(kh1NP1vQyXsEmlkEe13OCyJGng4hcB9UciDs9xXAjW2MAaB3pqSkxSUAGT73McQtbf2vgnBx1KD7vcTccxujdnOKAmBzR5GUb2gp4TEwPPm)TmTSgqv47CrdxEXvMFxPhEz2ROAOkiGT1aK5CbB3aSGBAIhvkeViGT7TLsx5zLGTvT08Ya2UHTk1myB1IFxbB32LIgbBJsOZeSnECPgbBJNC7kTUCnaBJiaTcHrdfxPTGTXSU6py7wAR2cW2nxHWZduu)tlOcST531GTnXEn8kaBtvZai79Xsxuc)2o69Gq8UWuF3tRHEb8saKujmzhj60AcmRhoqPg0PeGrUd(xVah4RBGUuQBGFLYlWGJOuWpp1KTt29EGl9P3fnU5N2r(ZWJENfqzVIBkI3sFnWIcaNeG))F)V(hF4N)W)9F606tR)n6f6G3(dHrjSP406Fk)kI4NoToIKPZO3Cc03ol70KW92mUXzNDWtK4XN(LF1laA6bGA)1WayEzn)tvp5Z)pGqjHI)uXJ7eAAOXxgDLPsXtYUKgL)qBPq5fhrjjQ(L6040V0GgU8e(3nD8B6R2XgM5)2F)xLeYEtobQmvIk5V4FLKO47TD8TMlKfQg165EAXDtP)Oi)rVGvGr9CqI9xoT(hZ4WFn1(0AxVp5fZcagEGaUJ05C4RHWGdNYjUpkRUYdnAWPXQI)s)THMVPfJ3ez8M5J)rUX)2lR482EioAyNwjoVPDl3oUDCLw2PVRwYY(tTF8nklXDmsrVJJIhPqMChiuX4FoE84cQL)5HMx94lTMk4IIHzVxLuqa1kdHHDUwxM9EnvKmYRkTk5iUU0uoyuRzPln9ejJCqLwtMoNsj7U)4)a8nBNrCV9ffOsVxLXva9E1wGkVRVurryME4URGsYYx7wQQfUOLdtE2oNWdxyDA)PNizEFFjt9Wd)mlAaLkpwupItRz31EqZ0lKQWTE(LVyIXJlb(F78xxDzED6xWAx114fEVRUaVWBV4fw9o(ljR5gJNEN325vIR8lm7XJvT1WRWQcPGFdQOt(nOhvOb3OMPOA(Fawk66vuyjhoN)YeS8xPAPA3oH8TYpQ7YVj)M)WejniYva4XJAU5bpECOM7Aqb9acPhjWGsxXC3rFxdNxSVN7YUu6MBqzyTfpBqzvDqFnahWv3i8xMWJhV5CMGMLjaCFZDc(xzrUQerZmBMazP31qKfguBXc7EGPMlErlqhHErDXdteia1vU4cvOxJU6QcGo8HSQej96)dwCflp1pmqvlD1BB0a0IonAWW6L4DbhNx7ov42IpaSsTJY)ShMcmb(b4F0OJhRpxZmEOMAO8i7)IPg6NYP(nEWfx58OSYr6slqU5SBxaQEdvIqNeZhf8eyooZRFa5zb8Xp5yqQg8tO1I5gtoEuYXBo6jb7vMY8qHVnhpG0fUtXYDcNMPmNEk2jkRmMPpkpv(dq)9CUE28NCCpEeZWBq9tEZcJXVzqvKE9hdFebO8MqIYUWeFViRHDtfUGElfIqQYdDTyEnvxqGzw9sxeHiKL7mF3ocJqJsqmAXSmq(seygOqQY4iC5bqBcNzJi0zH7scyGoaj1OG4P(gPdvxwainkCWKrAN3G6BHlvd(l1pz3IlbO5YoEuF7ZmmVLsfu4Iy8OaYZEPKMEo6izKpFdyHIJAE3cLBGfvq4seqzmXc2w4kuqBSaDbGWKi(dTkMPh)HxfXMO4U3aPTAN(EC7E6fw35k)8hdvM)c9G5TGEEvVnh0H4nBhkNWDCGvS(6YWXGScJTaxDaI7U)oYu8EWDgllN5aSZvAVJ13R9NwzhYFglfNOUtmXJsjd1jBD9wUdK5Tpmz0SYJHjgwLYJ1lpCQ4efqP0cGTmCk2nyWcZjaYuLXJQ1aK)BOQdU)T1p0(ZmH8l1gals1CJb5mn(EdPOyrMDvrinE)iEfLw8ESM5TL)EgBxCsR9c6pIN4KZbTdB0yazYu01d2Y(9wdEbZiSR2GTGevws11l1ttXAbjff73vH6ltU7Dk0bdBSIlSv8H3GENdLBPYFpdnQPk0GVvYP69LAea3RQ7DOgt3XJ9ehjw6ijgxba7Cd6Zf1eJmAWtWAhdF4WomFx)43kcFFUXNRbmFO(mvg5yGvxnXw4EmLlFOQorZjQyTvBTIg0GR0FuxO4HPwZX)Ya)mZzeb6zMNyhq7paPkBLVtIsaekbzvHs7Eg6BoOAVQYOc7wJ5EJrlYx1RDPZWzQHn0fg0yEWIJkVD2p34LlZi(hna(LkdQ2)b9XWXRuAVWYNfgK7EB5CnuAhAOETNGSe(xG9dWl063lGXuH9curIIhyZ8I3g48hNr2lN8DSB0Hm9iYnzsrYEjRQ6uhytj6lCWFYNg9bEvXe4LcVjmh4JQJCEUt2DHhMZUgoUJAJ6rjGEzjxEBmjXS)SE4hz3rg3vDrD0aQO8(R2Z47m5)cjzTBD9LqGwCvwqrLUY3H87yVS3fpzwwQSHdRE3j5FT(Bc7J4OkynaYHId03GHn4eEt17Gzx4dPHvWiqC9YFNBPOaPoQit3hJcEOAa1o4blMJmtfnosEUk6HkXDWzmt3Ow1RyYgQz2UF6m0tfYXJO)8cnK6hnhXVEOIfUi6HxuzQsXk78OHdRyFeYoQI)LVDogOHM3pDbQema9xNPHs)Oj958QIfWzUmKP8626jggORryhq9CDRL8dpJOtnAm5wCnMoUVxwpYdIvBeDsZcTA3wR9WyFnJDMWz8t7I4T6CzfidNfMCe4lJMK9FOq7rP)i1mudjTgQkQ2WBKzkDRUlMosLOt3NDlnl4LOrcEXAZY1TuMDoGgRmevDq)bXt(PooZmdCU8POR2tN0yWnODCuxaezkciQBarWvQxcarDdyM0WQV6w)8xQo58Lp)M8Cv0dvIRUW1nntTaqKC8hnZwFbpGMKTgWqmw4IOhErLPRacA0uBIaIqZ51larksWCJswaN5USaI606wl5hmaryQXRcGifWo1aictAAjGOM0E6aeHm2(aicZLvfGi5iWxgn5zaiYSFaIKJQPdqu9v3wciQbZcvaIuUT)(KYSZb0eae10ntW1aq0pqptzVG3EanabtvH6wTK(UNqVB3FGD5cS6Fd]] )
\ No newline at end of file
+spec:RegisterPack( "Beast Mastery", 20221029, [[Hekili:LZ1EpUnos(plngmESt3TJTCCptVW2lUDXIdZG5YbCEaU7(hlllr3wxSL8OhjPdm8N9Ri1lsQIKsY2jzVBWGoDlswSQI1JFSKixnE1FSAPNtcz17TgzznEK1ZdHFmAYVSAzYRhjRwE0X9doVa)sGZb4N)nItCY51)BWpjrVsB(19HoEuYehMg5cD5hoVExsYX4)YBF7l(j7s3m0n8WBJ9pKU3jXpmWnYzBc9VDF7QLBs93N8RbR2GZgVB1sN0KDHrRwU0)WFF1YD(EEKSUtIDxTC1Y9(XjXmXGS1jDFc8RVNjwKaNn7jER(Bz9nY)iD2xT8F8zIBAcX78AYhbz486e)de4N7GF44MegDETFm8RF0XFpLcdbEWnBOUHPbGCBhVlmzvcWS05POXKiNG)eeh)V4h8swx44bO3tK4kuQUeyu4p8DwTmknGSnm6fYWyYXDPFj2(yuO7ENdm14WCkDE9PtNxdk)9B8d8gg4)QtSDsy4EO7H(XYDS)51UHbEP(jdJOYFSZE7WT2W8KatxvF7DE9DNx3uwyaDDiGy76TA5KruH9DscBLyLj2WSd8gqgqx5eff(PHFii8tbSj2f4Ep4pgUHeN4dm4NICs2bJ4GJFqSyxQrMYErL27ylPx00bg2jr(UjuRQQLmN97TZ(dBQbyMzODMpc09GpqaJsymtvTMRJaUESX(Kwv4hj2KaYbFciQZoV2Q98zmZg(NB8SS486XTFwC3tC(izfDUwEmIaXc24u5KwqI40dhGrFKi70i4ITjmjbAXE7ENxjEFIUyMe(z)amhTIXSDpjEhlMJuVKTqPmhewZMgoy1YXdNY5A7ezdU3hv4Dc(ESFZMCyd4rj6Wv1VasCmWYFYj61yg5oYSgpE0bS3slhgMzJgEtWOLNbbB)eN9KGKHXUWpPE5B2hg6PXhxHGKT4LVqIeEvyoJC89SHilW8645b04Z0a056cP2k9vxmhSTgL1PAMDZRpqwiZZRFdZUVqt4eFK4YKtiwU9N837vZaIzPY3HMfHEJt0gWStoa9M0TBhUnIe8LxhMEKPp5FuP0ndKGxCZThy9Go32Xh9bsfxmu3DoGQp2EBu206SpZLB47ynxTmbD4LdGQiUqsi79G0hobGVb3I2s3xHLm7ekvHGrWQM2WYmg8XC(BdnnVD2ko3Q051JgAXz7bP0t8lsgkBZI5QCmm1DhLTJC(syKDPKiytMPdPU4rX2hCI(aOHQMZp4dlHfZP6qKnFo5dvqdRusC1rgn7YWeKIWgCwc5gc8zDGznIi3fKypah9lk5OYPk3yYmhki2r0a0V)zExfYNpUpmM6jIaLz8iHG3jeY(8aKIDtigVhbIqzdM5FiY5GCpT((mMcVJkJpBziITPG1ke8M5BBNH0eZiqbshkVBQpa5gBDE99vuvByF84cJvhy4s0)tVq1VyYnkFQokZ3s(ugDjJvvhCkpgl)Yj1VLYczlldPwka2gBp)mdMXt5D3CoCK4XCzhRoifAQiieojB)p5yjkn0HD7iY()IikQQqJsEUcrnQIolbJBKc)Mys0rQzAmv5jeJLa8E8o6aWnzTecUWSXJ3rKtPBjK)3X(qAenzj4v4ccASCVLDV7Q6echer32mLMQDT2g6MMrf3q62QVVC7kLzwhsBrs)cyOp4eKHUrT)aIrMhBlpAmZ4Xv68cdFbG2)dSqFwpjem3pIyZGjiRcLTineHubN8CEWpvGISYJFMTvw2Q)Esc1isFGol15qnNZSRi6rtMB9Cd4KwpdGfkHvaIIPzISNx100)86ClW7Z)nWY(fsa7VNaPohWwkYA5GZN58JICDcORxrGdbdS0e1BkOYkp34M3iEytT8Dd3e5uGnJAb5fRFViMYBUGkJCIuGl0ViOF0njuUZHRbP3c(kmluS9yiSCGV5aXkzi0CvvmuKtrDldyn2hpwWcbChrqu6pqDT8sJyv(HTGv9h5fwkNq7io7H54OBcZ8zY0sjihycD9hIbdQkWF1nHRmsS)xxAWj8ydkyl9BS57w1k1IWEBA0RF7vRpjLiLXwLBQROP9(VSd215)tQhBhusb(VMWDS4yOJHS)L50hJwExH1A9ROcaQf6aVZR1iU1rd4krAo3aPF9wewOLB0pit2hvUYRa7jDJnSzixqvvBZQ1DfCOAmXWm8mRSULHhV6fx5FAQJcgagTrCAcqIBr5buJf8QuEab8Fk3Z)p3eu5QbH1zVTlXvRHKu09GBVtsfj45gUZPrnzNtI1qrFvzuJyPj7EPiOvdE3kCgQ95tbjYEIWMZYcWaQNgNuKRumjSMiznBxl13gR6WoMqXLxyL3GhsPP1BjJZVc1bs1gLugGkRMofnQT6BTAxKDTufcXpmTtCnf2OVsSx64QVhsPRnF(vlvnAXOuhXTFtqenMRcz6FBQnoaYuj0yQ7CfImTMDLWMmcQVrbC()jwl1lXA9c6vuWjPk9OUYcx9Apj(Ieuw7j5eGLXHAqvglWKHTPTILnf1us7E6Zl)XJCf5tOwlVr0NrO4iLRBpwSORTkkc(t4eAbJqfjVgu6ZOjIkRPaI26qvTZxH3O8F6CCVJnjI4Lgydd2oKgZxm1OcZHjkk9JU6PQEF(xuDevKF92v718YRDmDFCwjKBY758RtrlBYlfT1ZqTIwQPkTAlAjnjqZlAzc33QdszfcpsdCWvcYp6aCWg67J4Jo7tj5lZ1sHi43i7sXOsXhGZRbU2PhxHuRrZZT5mXQ5o1vVQzWXvnEbHljkK(DWvjJYrjZLr)T4sjgHk)MSm6QLRNG90htmb13(LuWITuZ2aejZ(RMWSNttK6eCZe7m9)TsOXkWqtfffYGwRSBPSaX(BXcOCW3Y4IzXoglfDIwX2SwgMmE4oNy70yaUcSE1ui0sdVGp5GKwOLhk6LXHy18SCh3ez1j(SofQyvwIUQg5ws43sRk9uvDf0XHCdVK(vaSPV8EmoOQhdq5IkzWGsQ3vJdURjRO64J(MyLhz73Ag)8W5uMXfkAAHjA)wyll1vMg5YRUY87k9G0AgwGa9sJG8IoFdQjYc(zoEVkQwrNMmfYcLsDpLTmZePZ0h52365rLcr12FKx2QNEuIzX6qELeUwwkTLNLzwJln0QwDVUva9I7LBnxNcC1TTbI)ctSyhxkujT6jeDFb03HzlSyU3enxuJMYw84j3UrRls)VM9BQGbg0ibOrim6BmDqFPCFfcIrRRfmtce8qyU7gPMPGGdqvl4I01duu3tliv9sU(7hp01XDhHwEnh3)m1pI4b76M4eNgrIRa(jF6sQ2Zx5O(eTUsflwYJzrXRO(oLdBaSXG9HWwVRasNu)JUwcSTLgW2DdeRYfRBgy7UTPG6uqHD1yZ2vMSBVrOvq4IkzWGsYy2YgZbTdSnEWB9SIPm)nmTSgqv47CrdxE1vMFxPh(6Sxr1qvqaBRbiZLc22aSG7mXJkfIVkGT7SLsB5zLGTvT081bSTHTkzgSTAXVTGTB6sHrW2Oe6cbBJhxYiyB8KB3O1LBbyBebOrimmuCLMc2gZ6Q7GTBOTAdaBBUcHxgOOUNwqfyBRVRbBBH9z4va2MQMbq2hILU6e(JD0BgH4DHP79oVg6fWlbqsLWKDKOZRjWSE8iLAqNsag5b4F9dCH)Cd0LsDd8ukVadoIsH95PMCCZUje8OV9UOHMFBh5Vdp6TyaL9kV7iOFgyrbGtcW))N)l)hV)xF))6F586ZR)d6v8G)HJHrjSP486Fk)sJ4NoVoIKPZO3Lc0VolN0KWdomUXDNtWlK4HN)TF3paAAcqT)EyamVSM)PQ385)fqOKqXhv86oHM6p(ZdUXuP4nzxsJYh0ukuEvsusIQNuNgN)ndA4YZ8F70XVRRAhhyM)h)7)UKq2zYjqLPsuj)d)RKef)DthFJ5czHYOwp3tlUDk9Ne5p6vUcmQxdsC(851)ygh(7PoNx75)r)ywaWWJeWDKoN9FlegS)uoX9jz1vEOXXCASQ4V0N136Dny8wiJ3kF8pXn(F(6ko)ChehnStJeN31SLBxVwUsl703wlzz)PMpEJYsClJu054O4rkKj3rcvm(VhoCyb1Y)9(w384lnMk4IYyRoVkPGaQvgcd7sTUS68AQizKxvAuYrCDPLCWOgZsxB6jsg5GknMmToLs2TbY)hW3SzgXD2xuGkDEvgxb05vBbQ8lDLkkcZ0b3Dfusw(A2svTWfnCyYZ2LeE4kRt7o9ejZZDLm1dp8RSObuQ8ur9ioVMD77bntVIQc36VV8dtmEyjW)7N)2QR3RZ)gw7QUyVW7D1v6fE7fFWQpWFTznF8WPp4VDEL4k)bZE6uvBg(ewvif8BqfDYVd9Oc17o1mfvZ)dWsrBV0cl5W58xVGLpLQLQDFfY3k)OEi)U9B(KrsAqKlfWtN0CxeE6uFn3(Gc6bespqGbLU05EG(TgoVyFppKDn1nFmLH1w8SELv1b9ZaShxDJW)ycpD6Ulzcmlta4EZDc(xzrUQerZSmtGS07AiYIXuBXc7EGPMlELjqhHErDXKrceG6kxC1i0PrxDfaqhEFwvIK(8)RwDQFwG6Hwwj8NoOx)6L2Dbhhx7os4(IFbm6RDe(NnzkWz4hC)bdoDQ(CnB8KAIF5r1)BU4x)Um4Ql(pjl(sxhbYnNDVbq1mOse6Ky9KGnoZLyE9J(oluo(zcdsIGF2RwmF8OtNKCPMJEgVEJLmpu41YXdiDH78P8GW5ukZDMIkIYkdz6JYZBFp0NNZ1ZM)IR3PtyMw9QFMAwmE476vfdx)bShrakV7xOSlmXpkYAy3kHlO3iHiKQ84ulMXs1LbyMvV0Loicz5on3nJWi0OeEIw0i9KVEaMbkKQCjcxla0MWz2icDw4o()90b1Ogfepp3iDO6AaaPrHJCms78guFlCPm4Vu)mBlUeGML60j9TpBS19uQGceeJhfWu2jL00lrhjJP5BaluCiYBxO8XyrfeUEaugtSGTfUCe0glqxaimjI)4OIz6XFSurSjkUvnqAR25Qh3UNE50DPYp)bmL5VqpYDlONe17ZXCiExEHYjCh0xfRVuFj0vySf4QJgC793rMINb3zSSCw9WoXODowFN25zLDi)PNuCIApXepKKmCLS1175oQL3pz0GzLhWsmSkLhy3k7ICtIANAzv2kvKnorbeS(QX2Yfgg7onyH1iarRY4y1AaYB2x1r5)(6hJ)zwqEPAdGfHB(4E5mn(UfPOFrMDvrwh)8aEfLwCISM59b(EgtyCsJ9E6osP4KlbLeB0yaGYu01dsZEEJb9Gze2wBWgqIklP66L6P3yTGKAJ9CvOfZK7oN6TxFJ1GHTI3)o0BHOClv(BEObMQzd(wqNQ3xYiWV3u37qnwWtN6i(tS0ysmUcG55g0xkAlgz0GdH1ogUY(Ty(U9XVve((sJpxdqFF9zQgNJDwD9fBG7XuU8HQ6enNOI1wizMMYizWv6FwxO4rQuZX)6aBnZzebYAMNyl2LqpKQZv(vkkbqqaCwg6UhziX4G49MkJkS7rMhhpqjGootnSHUymnMhS4OYBN9yJx3md4Fzb4xZmOA)j6JHJxd1oThGSWGC3KlxQHsZqd1P9sKLW)kSpcEHw)EigpvypevKO4v4mV47do)fCK95k)a7oEitpIC3MuKSxYQQo1b2uI(chfO8PrFGxvmbEj0nH5aFuTKZZDYEi84C2fZXduBuFkb0ll5YRXKeZ(R6HFKDRz8q1v3Hbur59xTNX3zY)vsYA266xdbAXnzbfv6k)QYFG95Fx8UAzPY63V6RPK)d93e2hXrvWAaKdfhXVE9n4eEx1xLzB4dPHvWiqC9YNZTuuGuhvKP7JrbpunGAhfHfZrMPIghipxf9qL427cMP7uR6vmz91mBpoDg65e50j0hVqdP(rRb8RhQyHRIE4RQmvPyLDE0WHvSpczhuX)Y3xh90qZhNUavc6H(0zAO0pArF)WQybCMldzkVUTEIHE6Ae2buhx3Ai)WZi6uJJhDpUgth33jRh5bXQnIoPzHwTBJ1EySVMXot4u)PDr8EDUScKHZctoc81rtY(puO9O0FGAgYqsR(QIQ1)ozMs3Q7IPduj609z3qZcEjAGGxS2SCTlLzRdOXkdrvh0F08KFBLZSYaNlFU6Q9wnh37o0ooOnaISebe1oGi4k1RbGO2bmtAy1xDRFImvNC(6NFtEUk6HkXvx4AtZudaejh)rZS1vWdOjzRbmeJfUk6HVQY0nabnAQnrarO586eGifjyUtjlGZCxxarTADRH8dgGim14nbqKcyNAaeHjnneqKjTNoariJTlaIWCzvbisoc81rtEbaIS6gGi5OA6aevF1THaImywOcqKYT93LuMToGMaGit3vb3car)a9uM9v8(eWaemvfQB1s63Ec92EFc76gy1)7p]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/HunterMarksmanship.lua b/Interface/AddOns/Hekili/Dragonflight/HunterMarksmanship.lua
index 76c6e9a01..a32c92b4b 100644
--- a/Interface/AddOns/Hekili/Dragonflight/HunterMarksmanship.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/HunterMarksmanship.lua
@@ -370,11 +370,6 @@ spec:RegisterAuras( {
duration = 3600,
max_stack = 1,
},
- master_marksman = {
- id = 269576,
- duration = 12,
- max_stack = 1,
- },
-- Heals $w1% of the pet's health every $t1 sec.$?s343242[ Each time Mend Pet heals your pet, you have a $343242s2% chance to dispel a harmful magic effect from your pet.][]
-- https://wowhead.com/beta/spell=136
mend_pet = {
@@ -517,7 +512,7 @@ spec:RegisterAuras( {
},
trueshot = {
id = 288613,
- duration = function () return ( 15 + ( legendary.eagletalons_true_focus.enabled and 3 or 0 ) + ( 1.5 * talent.eagletalons_true_focus.rank ) or 15 ) * ( 1 + ( conduit.sharpshooters_focus.mod * 0.01 ) ) end,
+ duration = function () return ( 15 + ( legendary.eagletalons_true_focus.enabled and 3 or 0 ) + ( 1.5 * talent.eagletalons_true_focus.rank ) ) * ( 1 + ( conduit.sharpshooters_focus.mod * 0.01 ) ) end,
max_stack = 1,
},
-- Talent: Critical strike chance increased by $s1%. Critical damage dealt increased by $s2%.
@@ -1009,21 +1004,6 @@ spec:RegisterAbilities( {
},
- sentinel_owl = {
- id = 388045,
- cast = 0,
- cooldown = 0,
- gcd = "off",
-
- talent = "sentinel_owl",
- startsCombat = false,
- texture = 4067367,
-
- handler = function ()
- end,
- },
-
-
sniper_shot = {
id = 203155,
cast = 3,
diff --git a/Interface/AddOns/Hekili/Dragonflight/HunterSurvival.lua b/Interface/AddOns/Hekili/Dragonflight/HunterSurvival.lua
index 71bcc1c95..3e22503b4 100644
--- a/Interface/AddOns/Hekili/Dragonflight/HunterSurvival.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/HunterSurvival.lua
@@ -1,5 +1,5 @@
-- HunterSurvival.lua
--- September 2022
+-- October 2022
if UnitClassBase( "player" ) ~= "HUNTER" then return end
@@ -9,264 +9,637 @@ local class, state = Hekili.Class, Hekili.State
local spec = Hekili:NewSpecialization( 255 )
-spec:RegisterResource( Enum.PowerType.Focus )
+spec:RegisterResource( Enum.PowerType.Focus, {
+ terms_of_engagement = {
+ aura = "terms_of_engagement",
+
+ last = function ()
+ local app = state.buff.terms_of_engagement.applied
+ local t = state.query_time
+
+ return app + floor( t - app )
+ end,
+
+ interval = 1,
+ value = 2,
+ },
+
+ death_chakram = {
+ resource = "focus",
+ aura = "death_chakram",
+
+ last = function ()
+ return state.buff.death_chakram.applied + floor( ( state.query_time - state.buff.death_chakram.applied ) / class.auras.death_chakram.tick_time ) * class.auras.death_chakram.tick_time
+ end,
+
+ interval = function () return class.auras.death_chakram.tick_time end,
+ value = function () return state.conduit.necrotic_barrage.enabled and 5 or 3 end,
+ }
+} )
-- Talents
spec:RegisterTalents( {
- agile_movement = { 79918, 378002, 2 }, --
- alpha_predator = { 79904, 269737, 1 }, --
- arctic_bola = { 79815, 390231, 2 }, --
- aspect_of_the_eagle = { 79857, 186289, 1 }, --
- barrage = { 79914, 120360, 1 }, --
- beast_master = { 79926, 378007, 2 }, --
- binding_shackles = { 79920, 321468, 1 }, --
- binding_shot = { 79937, 109248, 1 }, --
- birds_of_prey = { 79864, 260331, 1 }, --
- bloodseeker = { 79859, 260248, 1 }, --
- bloody_claws = { 79828, 385737, 2 }, --
- bombardier = { 79864, 389880, 1 }, --
- born_to_be_wild = { 79933, 266921, 2 }, --
- butchery = { 79848, 212436, 1 }, --
- camouflage = { 79934, 199483, 1 }, --
- carve = { 79848, 187708, 1 }, --
- concussive_shot = { 79906, 5116 , 1 }, --
- coordinated_assault = { 79865, 360952, 1 }, --
- coordinated_kill = { 79824, 385739, 2 }, --
- deadly_duo = { 79869, 378962, 2 }, --
- death_chakram = { 79916, 375891, 1 }, --
- energetic_ally = { 79855, 378961, 1 }, --
- explosive_shot = { 79914, 212431, 1 }, --
- explosives_expert = { 79858, 378937, 2 }, --
- ferocity = { 79845, 378916, 1 }, --
- flanking_strike = { 79841, 269751, 1 }, --
- frenzy_strikes = { 79844, 294029, 1 }, --
- fury_of_the_eagle = { 79852, 203415, 1 }, --
- guerrilla_tactics = { 79867, 264332, 1 }, --
- harpoon = { 79842, 190925, 1 }, --
- hiexplosive_trap = { 79910, 236776, 1 }, --
- hunters_agility = { 79832, 384799, 1 }, --
- hydras_bite = { 79911, 260241, 1 }, --
- improved_kill_command = { 79932, 378010, 2 }, --
- improved_kill_shot = { 79930, 343248, 1 }, --
- improved_mend_pet = { 79936, 343242, 2 }, --
- improved_tranquilizing_shot = { 79919, 343244, 1 }, --
- improved_traps = { 79923, 343247, 2 }, --
- improved_wildfire_bomb = { 79850, 321290, 2 }, --
- intense_focus = { 79827, 385709, 1 }, --
- intimidation = { 79910, 19577 , 1 }, --
- keen_eyesight = { 79922, 378004, 2 }, --
- kill_command = { 79839, 259489, 1 }, --
- kill_shot = { 79833, 320976, 1 }, --
- killer_companion = { 79854, 378955, 2 }, --
- killer_instinct = { 79904, 273887, 1 }, --
- latent_poison_injectors = { 79911, 378014, 1 }, --
- lone_survivor = { 79820, 388039, 1 }, --
- lunge = { 79846, 378934, 1 }, --
- master_marksman = { 79913, 260309, 2 }, --
- misdirection = { 79924, 34477 , 1 }, --
- mongoose_bite = { 79861, 259387, 1 }, --
- muzzle = { 79837, 187707, 1 }, --
- natural_mending = { 79925, 270581, 2 }, --
- natures_endurance = { 79820, 388042, 1 }, --
- nesingwarys_trapping_apparatus = { 79929, 378759, 2 }, --
- posthaste = { 79921, 109215, 2 }, --
- predator = { 79860, 263186, 1 }, --
- quick_shot = { 79868, 378940, 1 }, --
- ranger = { 79825, 385695, 2 }, --
- raptor_strike = { 79847, 186270, 1 }, --
- rejuvenating_wind = { 79909, 385539, 2 }, --
- ruthless_marauder = { 79829, 385718, 3 }, --
- scare_beast = { 79927, 1513 , 1 }, --
- scatter_shot = { 79937, 213691, 1 }, --
- sentinel_nyi = { 79819, 388045, 1 }, --
- sentinels_perception_nyi = { 79818, 388056, 1 }, --
- sentinels_wisdom_nyi = { 79818, 388057, 1 }, --
- serpent_sting = { 79905, 271788, 1 }, --
- serrated_shots = { 79814, 389882, 2 }, --
- sharp_edges = { 79843, 378948, 2 }, --
- spear_focus = { 79853, 378953, 2 }, --
- spearhead = { 79866, 360966, 1 }, --
- stampede = { 79916, 201430, 1 }, --
- steel_trap = { 79908, 162488, 1 }, --
- survival_of_the_fittest = { 79821, 264735, 1 }, --
- sweeping_spear = { 79856, 378950, 2 }, --
- tactical_advantage = { 79851, 378951, 2 }, --
- tar_trap = { 79928, 187698, 1 }, --
- terms_of_engagement = { 79862, 265895, 1 }, --
- tip_of_the_spear = { 79849, 260285, 2 }, --
- trailblazer = { 79931, 199921, 2 }, --
- tranquilizing_shot = { 79907, 19801 , 1 }, --
- vipers_venom = { 79826, 268501, 2 }, --
- wildfire_bomb = { 79863, 259495, 1 }, --
- wildfire_infusion = { 79870, 271014, 1 }, --
+ alpha_predator = { 79904, 269737, 1 }, -- Kill Command now has 2 charges, and deals 15% increased damage.
+ arctic_bola = { 79815, 390231, 2 }, -- Raptor Strike has a chance to fling an Arctic Bola at your target, dealing 760 Frost damage and snaring the target by 20% for 3 sec. The Arctic Bola strikes up to 2 targets.
+ aspect_of_the_eagle = { 79857, 186289, 1 }, -- Increases the range of your Raptor Strike to 43 yds for 15 sec.
+ barrage = { 79914, 120360, 1 }, -- Rapidly fires a spray of shots for 2.6 sec, dealing an average of 4,021 Physical damage to all nearby enemies in front of you. Usable while moving. Deals reduced damage beyond 8 targets.
+ beast_master = { 79926, 378007, 2 }, -- Pet damage increased by 5%.
+ binding_shackles = { 79920, 321468, 1 }, -- Targets rooted by Binding Shot, knocked back by High Explosive Trap, incapacitated by Scatter Shot, or stunned by Intimidation deal 10% less damage to you for 8 sec after the effect ends.
+ binding_shot = { 79937, 109248, 1 }, -- Fires a magical projectile, tethering the enemy and any other enemies within 5 yards for 10 sec, stunning them for 3 sec if they move more than 5 yards from the arrow.
+ birds_of_prey = { 79864, 260331, 1 }, -- Kill Shot strikes up to 3 additional targets while Coordinated Assault is active.
+ bloodseeker = { 79859, 260248, 1 }, -- Kill Command causes the target to bleed for 839 damage over 8 sec. You and your pet gain 10% attack speed for every bleeding enemy within 12 yds.
+ bloody_claws = { 79828, 385737, 2 }, -- Each stack of Mongoose Fury increases the chance for Kill Command to reset by 2%.
+ bombardier = { 79864, 389880, 1 }, -- Wildfire Bomb's cooldown is reset at the start and end of Coordinated Assault.
+ born_to_be_wild = { 79933, 266921, 2 }, -- Reduces the cooldowns of Aspect of the Eagle, Aspect of the Cheetah,, Survival of the Fittest, and Aspect of the Turtle by 7%.
+ butchery = { 79848, 212436, 1 }, -- Attack all nearby enemies in a flurry of strikes, inflicting 2,493 Physical damage to each. Deals reduced damage beyond 5 targets. Reduces the remaining cooldown on Wildfire Bomb by 1 sec for each target hit, up to 5 sec.
+ camouflage = { 79934, 199483, 1 }, -- You and your pet blend into the surroundings and gain stealth for 1 min. While camouflaged, you will heal for 2% of maximum health every 1 secs.
+ carve = { 79848, 187708, 1 }, -- A sweeping attack that strikes all enemies in front of you for 793 Physical damage. Deals reduced damage beyond 5 targets. Reduces the remaining cooldown on Wildfire Bomb by 1 sec for each target hit, up to 5 sec.
+ concussive_shot = { 79906, 5116 , 1 }, -- Dazes the target, slowing movement speed by 50% for 6 sec. Steady Shot will increase the duration of Concussive Shot on the target by 3.0 sec.
+ coordinated_assault = { 79865, 360952, 1 }, -- You and your pet charge your enemy, striking them for a combined 3,800 Physical damage. You and your pet's bond is then strengthened for 20 sec, causing your pet's Basic Attack to empower your next spell cast: Wildfire Bomb: Increaase the initial damage by 20% Kill Shot: Bleed the target for 50% of Kill Shot's damage over 6 sec.
+ coordinated_kill = { 79824, 385739, 2 }, -- While Coordinated Assault is active, the cooldown of Wildfire Bomb is reduced by 25%, Wildifre Bomb generates 5 Focus when thrown, Kill Shot's cooldown is reduced by 25%, and Kill Shot can be used against any target, regardless of their current health.
+ deadly_duo = { 79869, 378962, 2 }, -- While Spearhead is active, the Focus cost of Raptor Strike and Mongoose Bite is reduced by 5, and Kill Command cooldown resets extend the duration of Spearhead by 1.0 sec.
+ death_chakram = { 79916, 375891, 1 }, -- Throw a deadly chakram at your current target that will rapidly deal 600 Physical damage 7 times, bouncing to other targets if they are nearby. Enemies struck by Death Chakram take 10% more damage from you and your pet for 10 sec. Each time the chakram deals damage, its damage is increased by 15% and you generate 3 Focus.
+ energetic_ally = { 79855, 378961, 1 }, -- You and your pets maximum Focus is increased by 10.
+ entrapment = { 79977, 393344, 1 }, -- When Tar Trap is activated, all enemies in its area are rooted for 4 sec. Damage taken may break this root.
+ explosive_shot = { 79914, 212431, 1 }, -- Fires an explosive shot at your target. After 3 sec, the shot will explode, dealing 4,854 Fire damage to all enemies within 8 yards. Deals reduced damage beyond 5 targets.
+ explosives_expert = { 79858, 378937, 2 }, -- Wildfire Bomb cooldown reduced by 1.0 sec.
+ ferocity = { 79845, 378916, 1 }, -- All damage done by your pet is increased by 10%.
+ flankers_advantage = { 79860, 263186, 1 }, -- Kill Command has an additional 15% chance to immediately reset its cooldown.
+ flanking_strike = { 79841, 269751, 1 }, -- You and your pet leap to the target and strike it as one, dealing a total of 7,527 Physical damage. Generates 30 Focus for you and your pet.
+ frenzy_strikes = { 79844, 294029, 1 }, -- Butchery and Carve reduce the remaining cooldown on Wildfire Bomb by 1 sec and the the remaining cooldown of Flanking Strike by 1 sec for each target hit, up to 5.
+ fury_of_the_eagle = { 79852, 203415, 1 }, -- Furiously strikes all enemies in front of you, dealing 6,739 Physical damage over 3.4 sec. Critical strike chance increased by 50% against any target below 20% health. Deals reduced damage beyond 5 targets. Kill Command cooldown resets reduce the cooldown of Fury of the Eagle by 3.0 sec.
+ guerrilla_tactics = { 79867, 264332, 1 }, -- Wildfire Bomb now has 2 charges, and the initial explosion deals 50% increased damage.
+ harpoon = { 79842, 190925, 1 }, -- Hurls a harpoon at an enemy, rooting them in place for 3 sec and pulling you to them.
+ high_explosive_trap = { 79910, 236776, 1 }, -- Hurls a fire trap to the target location that explodes when an enemy approaches, causing 1,089 Fire damage and knocking all enemies away. Trap will exist for 1 min.
+ hunters_avoidance = { 79832, 384799, 1 }, -- Damage taken from area of effect attacks reduced by 6%.
+ hydras_bite = { 79911, 260241, 1 }, -- Serpent Sting fires arrows at 2 additional enemies near your target, and its damage over time is increased by 20%.
+ improved_kill_command = { 79932, 378010, 2 }, -- Kill Command damage increased by 5%.
+ improved_kill_shot = { 79930, 343248, 1 }, -- Kill Shot's critical damage is increased by 25%.
+ improved_tranquilizing_shot = { 79919, 343244, 1 }, -- When Tranquilizing Shot successfully dispels an effect, gain 10 Focus.
+ improved_traps = { 79923, 343247, 2 }, -- The cooldown of Tar Trap, Steel Trap, High Explosive Trap, and Freezing Trap is reduced by 2.5 sec.
+ improved_wildfire_bomb = { 79850, 321290, 2 }, -- Wildfire Bomb deals 8% additional damage.
+ intense_focus = { 79827, 385709, 1 }, -- Kill Command generates 6 additional Focus.
+ intimidation = { 79910, 19577 , 1 }, -- Commands your pet to intimidate the target, stunning it for 5 sec.
+ keen_eyesight = { 79922, 378004, 2 }, -- Critical strike chance increased by 2%.
+ kill_command = { 79839, 259489, 1 }, -- Give the command to kill, causing your pet to savagely deal 2,407 Physical damage to the enemy. Kill Command has a 25% chance to immediately reset its cooldown. Kill Command also increases the damage of your next Raptor Strike by 25%, stacking up to 3 times. Generates 21 Focus.
+ kill_shot = { 79833, 320976, 1 }, -- You attempt to finish off a wounded target, dealing 7,648 Physical damage. Only usable on enemies with less than 20% health.
+ killer_companion = { 79854, 378955, 2 }, -- Kill Command damage increased by 5%.
+ killer_instinct = { 79904, 273887, 1 }, -- Kill Command deals 50% increased damage against enemies below 35% health.
+ lone_survivor = { 79820, 388039, 1 }, -- Reduce the cooldown of Survival of the Fittest by 30 sec, and increase its duration by 2.0 sec.
+ lunge = { 79846, 378934, 1 }, -- Range of your melee attacks and abilities increased by 3 yd.
+ master_marksman = { 79913, 260309, 2 }, -- Your melee and ranged special attack critical strikes cause the target to bleed for an additional 7% of the damage dealt over 6 sec.
+ misdirection = { 79924, 34477 , 1 }, -- Misdirects all threat you cause to the targeted party or raid member, beginning with your next attack within 30 sec and lasting for 8 sec.
+ mongoose_bite = { 79861, 259387, 1 }, -- A brutal attack that deals 4,453 Physical damage and grants you Mongoose Fury. Mongoose Fury Increases the damage of Mongoose Bite by 15% for 14 sec, stacking up to 5 times. Successive attacks do not increase duration.
+ muzzle = { 79837, 187707, 1 }, -- Interrupts spellcasting, preventing any spell in that school from being cast for 3 sec.
+ natural_mending = { 79925, 270581, 2 }, -- Every 30 Focus you spend reduces the remaining cooldown on Exhilaration by 1.0 sec.
+ natures_endurance = { 79820, 388042, 1 }, -- Survival of the Fittest reduces damage taken by an additional 20%.
+ pathfinding = { 79918, 378002, 2 }, -- Movement speed increased by 2%.
+ poison_injection = { 79911, 378014, 1 }, -- Serpent Sting's damage applies Latent Poison to the target, stacking up to 10 times. Raptor Strike consumes all stacks of Latent Poison, dealing 393 Nature damage to the target per stack consumed.
+ posthaste = { 79921, 109215, 2 }, -- Disengage also frees you from all movement impairing effects and increases your movement speed by 25% for 4 sec.
+ quick_shot = { 79868, 378940, 1 }, -- When Kill Command's cooldown is reset, you have a 30% chance to fire an Arcane Shot at your target at 100% of normal value.
+ ranger = { 79825, 385695, 2 }, -- Kill Shot, Serpent Sting, Arcane Shot, Steady Shot, and Explosive Shot deal 20% increased damage.
+ raptor_strike = { 79847, 186270, 1 }, -- A vicious slash dealing 4,928 Physical damage.
+ rejuvenating_wind = { 79909, 385539, 2 }, -- Exhilaration heals you for an additional 10.0% of your maximum health over 8 sec.
+ ruthless_marauder = { 79829, 385718, 3 }, -- Fury of the Eagle now gains bonus critical strike chance against targets below 35% health, and Fury of the Eagle critical strikes reduce the cooldown of Wildfire Bomb and Flanking Strike by 0.5 sec.
+ scare_beast = { 79927, 1513 , 1 }, -- Scares a beast, causing it to run in fear for up to 20 sec. Damage caused may interrupt the effect. Only one beast can be feared at a time.
+ scatter_shot = { 79937, 213691, 1 }, -- A short-range shot that deals 84 damage, removes all harmful damage over time effects, and incapacitates the target for 4 sec. Any damage caused will remove the effect. Turns off your attack when used.
+ sentinel_owl = { 79819, 388045, 1 }, -- Call forth a Sentinel Owl to the target location, granting you unhindered vision. Your attacks ignore line of sight against any target in this area. Every 150 Focus spent grants you 1 sec of the Sentinel Owl when cast, up to a maximum of 12 sec. The Sentinel Owl can only be summoned when it will last at least 5 sec.
+ sentinels_perception = { 79818, 388056, 1 }, -- Sentinel Owl now also grants unhindered vision to party members while active.
+ sentinels_protection = { 79818, 388057, 1 }, -- While the Sentinel Owl is active, your party gains 5% Leech.
+ serpent_sting = { 79905, 271788, 1 }, -- Fire a shot that poisons your target, causing them to take 424 Nature damage instantly and an additional 2,963 Nature damage over 18 sec.
+ serrated_shots = { 79814, 389882, 2 }, -- Serpent Sting and Bleed damage increased by 10%. This value is increased to 20% against targets below 30% health.
+ sharp_edges = { 79843, 378948, 2 }, -- Critical damage dealt increased by 2%.
+ spear_focus = { 79853, 378953, 2 }, -- Mongoose Bite damage increased by 5%.
+ spearhead = { 79866, 360966, 1 }, -- You and your pet charge your enemy, striking them for 665 Physical damage. You then become one with your pet for 12 sec. While active, your pet damage is increased by 25%, Raptor Strike and Mongoose Bite deal an additional 35% damage over 4 sec, and Kill Command has a 20% increased chance to reset.
+ stampede = { 79916, 201430, 1 }, -- Summon a herd of stampeding animals from the wilds around you that deal 2,521 Physical damage to your enemies over 12 sec. Enemies struck by the stampede are snared by 30%, and you have 10% increased critical strike chance against them for 5 sec.
+ steel_trap = { 79908, 162488, 1 }, -- Hurls a Steel Trap to the target location that snaps shut on the first enemy that approaches, immobilizing them for 20 sec and causing them to bleed for 4,419 damage over 20 sec. Damage other than Steel Trap may break the immobilization effect. Trap will exist for 1 min. Limit 1.
+ survival_of_the_fittest = { 79821, 264735, 1 }, -- Reduces all damage you and your pet take by 20% for 8 sec.
+ sweeping_spear = { 79856, 378950, 2 }, -- Raptor Strike, Mongoose Bite, Butchery, and Carve damage increased by 5%.
+ tactical_advantage = { 79851, 378951, 2 }, -- Damage of Flanking Strike increased by 5% and all damage dealt by Wildfire Bomb increased by 5%.
+ tar_trap = { 79928, 187698, 1 }, -- Hurls a tar trap to the target location that creates a 8 yd radius pool of tar around itself for 30 sec when the first enemy approaches. All enemies have 50% reduced movement speed while in the area of effect. Trap will exist for 1 min.
+ terms_of_engagement = { 79862, 265895, 1 }, -- Harpoon has a 10 sec reduced cooldown, and deals 950 Physical damage and generates 20 Focus over 10 sec. Killing an enemy resets the cooldown of Harpoon.
+ tip_of_the_spear = { 79849, 260285, 2 }, -- Kill Command increases the damage of your next Raptor Strike by 8%, stacking up to 3 times.
+ trailblazer = { 79931, 199921, 2 }, -- Your movement speed is increased by 15% anytime you have not attacked for 3 seconds.
+ tranquilizing_shot = { 79907, 19801 , 1 }, -- Removes 1 Enrage and 1 Magic effect from an enemy target. Successfully dispelling an effect generates 10 Focus.
+ vipers_venom = { 79826, 268501, 2 }, -- Raptor Strike and Mongoose Bite have a 15% chance to apply Serpent Sting to your target.
+ wilderness_medicine = { 79936, 343242, 2 }, -- Mend Pet heals for an additional 25% of your pet's health over its duration, and has a 25% chance to dispel a magic effect each time it heals your pet.
+ wildfire_bomb = { 79863, 259495, 1 }, -- Hurl a bomb at the target, exploding for 1,763 Fire damage in a cone and coating enemies in wildfire, scorching them for 2,351 Fire damage over 6 sec.
+ wildfire_infusion = { 79870, 271014, 1 }, -- Lace your Wildfire Bomb with extra reagents, randomly giving it one of the following enhancements each time you throw it: Shrapnel Bomb: Shrapnel pierces the targets, causing Raptor Strike and Butchery to apply a bleed for 9 sec that stacks up to 3 times. Pheromone Bomb: Kill Command has a 100% chance to reset against targets coated with Pheromones. Volatile Bomb: Reacts violently with poison, causing an extra 584 Fire damage against enemies suffering from your Serpent Sting, and applies Serpent Sting to up to 3 targets.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
- chimaeral_sting = 3609, -- 356719
- diamond_ice = 686 , -- 203340
- dragonscale_armor = 3610, -- 202589
- hunting_pack = 661 , -- 203235
- interlope = 5532, -- 248518
- mending_bandage = 662 , -- 212640
- roar_of_sacrifice = 663 , -- 53480
- sticky_tar = 664 , -- 203264
- survival_tactics = 3607, -- 202746
- trackers_net = 665 , -- 212638
- tranquilizing_darts = 5420, -- 356015
- wild_kingdom = 5443, -- 356707
+ chimaeral_sting = 3609, -- (356719) Stings the target, dealing 1,906 Nature damage and initiating a series of venoms. Each lasts 3 sec and applies the next effect after the previous one ends. Scorpid Venom: 90% reduced movement speed. Spider Venom: Silenced. Viper Venom: 20% reduced damage and healing.
+ diamond_ice = 686 , -- (203340) Victims of Freezing Trap can no longer be damaged or healed. Freezing Trap is now undispellable, but has a 5 sec duration.
+ dragonscale_armor = 3610, -- (202589) Magical damage over time effects deal 20% less damage to you.
+ hunting_pack = 661 , -- (203235) Aspect of the Cheetah has 50% reduced cooldown and grants its effects to allies within 15 yds.
+ interlope = 5532, -- (248518) The next hostile spell cast on the target will cause hostile spells for the next 3 sec. to be redirected to your pet. Your pet must be within 10 yards of the target for spells to be redirected.
+ mending_bandage = 662 , -- (212640) Instantly clears all bleeds, poisons, and diseases from the target, and heals for 30% damage over 6 sec. Being attacked will stop you from using Mending Bandage.
+ roar_of_sacrifice = 663 , -- (53480) Instructs your pet to protect a friendly target from critical strikes, making attacks against that target unable to be critical strikes, but 20% of all damage taken by that target is also taken by the pet. Lasts 12 sec.
+ sticky_tar = 664 , -- (203264) Enemies who stand in your Tar Trap for 3 sec have their gear coated with tar, slowing melee attack speed by 80% for 5 sec.
+ survival_tactics = 3607, -- (202746) Feign Death dispels all harmful magical effects, and reduces damage taken by 90% for 1.5 sec.
+ trackers_net = 665 , -- (212638) Hurl a net at your enemy, rooting them for 6 sec. While within the net, the target's chance to hit is reduced by 80%. Any damage will break the net.
+ tranquilizing_darts = 5420, -- (356015) Interrupting or removing effects with Tranquilizing Shot and Counter Shot releases 8 darts at nearby enemies, each reducing the duration of a beneficial Magic effect by 4 sec.
+ wild_kingdom = 5443, -- (356707) Call in help from one of your dismissed Cunning pets for 10 sec. Your current pet is dismissed to rest and heal 30% of maximum health.
} )
-- Auras
spec:RegisterAuras( {
- aspect_of_the_cheetah = {
- id = 186257,
- },
+ -- Talent: Slowed by $s2%.
+ -- https://wowhead.com/beta/spell=390232
+ arctic_bola = {
+ id = 390232,
+ duration = 3,
+ type = "Ranged",
+ max_stack = 1
+ },
+ -- Talent: The range of $?s259387[Mongoose Bite][Raptor Strike] is increased to $265189r yds.
+ -- https://wowhead.com/beta/spell=186289
aspect_of_the_eagle = {
id = 186289,
+ duration = 15,
+ max_stack = 1
},
- aspect_of_the_turtle = {
- id = 186265,
- },
+ -- Talent:
+ -- https://wowhead.com/beta/spell=120360
barrage = {
id = 120360,
+ duration = 3,
+ tick_time = 0.2,
+ max_stack = 1
+ },
+ binding_shot = {
+ id = 117405,
+ duration = 3600,
+ max_stack = 1,
+ },
+ bleeding_gash = {
+ id = 361049,
+ duration = 6,
+ max_stack = 1,
+ },
+ -- Bleeding for $w1 Physical damage every $t1 sec. Taking $s2% increased damage from the Hunter's pet.
+ -- https://wowhead.com/beta/spell=321538
+ bloodshed = {
+ id = 321538,
+ duration = 18,
+ tick_time = 3,
+ max_stack = 1
+ },
+ -- Kill Command causes the target to bleed for 839 damage over 8 sec. You and your pet gain 10% attack speed for every bleeding enemy within 12 yds.
+ bloodseeker = {
+ id = 260248,
+ },
+ camouflage = {
+ id = 199483,
+ duration = 60,
+ max_stack = 1,
},
+ -- Talent: You and your pet's bond is strengthened, empowering your Wildfire Bomb or Kill Shot when your pet uses their basic attack.$?$w2!=0[ Wildfire Bomb cooldown reduced by $w2% and Wildfire Bomb generates $w3 Focus when thrown. Kill Shot cooldown reduced by $w4%.][]$?260331[ Kill Shot strikes up to $260331s1 additional target while Coordinated Assault is active.][]
+ -- https://wowhead.com/beta/spell=360952
coordinated_assault = {
id = 360952,
+ duration = function () return 20 + ( conduit.deadly_tandem.mod * 0.001 ) end,
+ max_stack = 1,
+ copy = 266779
+ },
+ coordinated_assault_empower = {
+ id = 361738,
+ duration = 3,
+ max_stack = 1,
+ },
+ -- While Coordinated Assault is active, the cooldown of Wildfire Bomb is reduced by 25%, Wildfire Bomb generates 5 Focus when thrown, Kill Shot's cooldown is reduced by 25%, and Kill Shot can be used against any target, regardless of their current health.
+ coordinated_kill = {
+ id = 385739,
},
- eagle_eye = {
- id = 6197,
+ -- When Tar Trap is activated, all enemies in its area are rooted for 4 sec. Damage taken may break this root.
+ entrapment = {
+ id = 393344,
},
+ -- Directly controlling pet.
+ -- https://wowhead.com/beta/spell=321297
+ eyes_of_the_beast = {
+ id = 321297,
+ duration = 60,
+ type = "Magic",
+ max_stack = 1
+ },
+ -- Feigning death.
+ -- https://wowhead.com/beta/spell=5384
feign_death = {
id = 5384,
+ duration = 360,
+ max_stack = 1
},
- fury_of_the_eagle = {
- id = 203415,
+ -- Talent: Rooted.
+ -- https://wowhead.com/beta/spell=190925
+ harpoon = {
+ id = 190925,
+ duration = 3,
+ type = "Ranged",
+ max_stack = 1,
+ copy = 190927
},
+ -- The next hostile spell cast on the target will cause hostile spells for the next 3 sec. to be redirected to your pet. Your pet must be within 10 yards of the target for spells to be redirected.
interlope = {
id = 248518,
},
- mastery_spirit_bond = {
- id = 263135,
- },
- sentinel_nyi = {
- id = 388045,
+ -- Suffering $w1 Bleed damage every $t1 sec.
+ -- https://wowhead.com/beta/spell=270343
+ internal_bleeding = {
+ id = 270343,
+ duration = 9,
+ tick_time = 3,
+ mechanic = "bleed",
+ type = "Ranged",
+ max_stack = 3
+ },
+ -- Talent: Bleeding for $w2 damage every $t2 sec.
+ -- https://wowhead.com/beta/spell=259277
+ kill_command = {
+ id = 259277,
+ duration = 8,
+ max_stack = 1
+ },
+ -- Injected with Latent Poison. $?s137015[Barbed Shot]?s137016[Aimed Shot]?s137017&!s259387[Raptor Strike][Mongoose Bite] consumes all stacks of Latent Poison, dealing ${$378016s1/$s1} Nature damage per stack consumed.
+ -- https://wowhead.com/beta/spell=378015
+ latent_poison = {
+ id = 378015,
+ duration = 15,
+ max_stack = 10,
+ copy = 273286
+ },
+ masters_call = {
+ id = 54216,
+ duration = 4,
+ type = "Magic",
+ max_stack = 1,
+ },
+ -- Heals $w1% of the pet's health every $t1 sec.$?s343242[ Each time Mend Pet heals your pet, you have a $343242s2% chance to dispel a harmful magic effect from your pet.][]
+ -- https://wowhead.com/beta/spell=136
+ mend_pet = {
+ id = 136,
+ duration = 10,
+ type = "Magic",
+ max_stack = 1
+ },
+ -- Talent: Threat redirected from Hunter.
+ -- https://wowhead.com/beta/spell=34477
+ misdirection_buff = {
+ id = 34477,
+ duration = 30,
+ max_stack = 1
},
+ misdirection = {
+ id = 35079,
+ duration = 8,
+ max_stack = 1,
+ },
+ -- Mongoose Bite damage increased by $s1%.$?$w2>0[ Kill Command reset chance increased by $w2%.][]
+ -- https://wowhead.com/beta/spell=259388
+ mongoose_fury = {
+ id = 259388,
+ duration = 14,
+ max_stack = 5
+ },
+ pathfinding = {
+ id = 264656,
+ duration = 3600,
+ max_stack = 1,
+ },
+ -- Suffering $w1 Fire damage every $t1 sec.
+ -- https://wowhead.com/beta/spell=270332
+ pheromone_bomb = {
+ id = 270332,
+ duration = 6,
+ tick_time = 1,
+ type = "Ranged",
+ max_stack = 1
+ },
+ -- Talent: Increased movement speed by $s1%.
+ -- https://wowhead.com/beta/spell=118922
+ posthaste = {
+ id = 118922,
+ duration = 4,
+ max_stack = 1
+ },
+ predator = {
+ id = 260249,
+ duratinon = 3600,
+ max_stack = 10,
+ },
+ -- Talent: Suffering $s2 Nature damage every $t2 sec.
+ -- https://wowhead.com/beta/spell=271788
+ serpent_sting = {
+ id = 271788,
+ duration = function () return 12 * haste end,
+ tick_time = function () return 3 * haste end,
+ type = "Ranged",
+ max_stack = 1
+ },
+ -- Suffering $w1 Fire damage every $t1 sec. $?s259387[Mongoose Bite][Raptor Strike] and Butchery apply a stack of Internal Bleeding.
+ -- https://wowhead.com/beta/spell=270339
+ shrapnel_bomb = {
+ id = 270339,
+ duration = 6,
+ tick_time = 1,
+ type = "Ranged",
+ max_stack = 1
+ },
+ -- Talent: Pet damage dealt increased by $s1%. $?s259387[Mongoose Bite][Raptor Strike] deals an additional $s2% of damage dealt as a bleed over $389881d. Kill Command has a $s3% increased chance to reset its cooldown.$?$w4!=0&?s259387[ Mongoose Bite Focus cost reduced by $w4.]?$w4!=0&!s259387[ Raptor Strike Focus cost reduced by $w4.][]
+ -- https://wowhead.com/beta/spell=360966
spearhead = {
id = 360966,
+ duration = 12,
+ max_stack = 1
},
- stampede = {
- id = 201430,
- },
+ -- Talent: Bleeding for $w1 damage every $t1 seconds.
+ -- https://wowhead.com/beta/spell=162487
+ steel_trap = {
+ id = 162487,
+ duration = 20,
+ tick_time = 2,
+ mechanic = "bleed",
+ type = "Ranged",
+ max_stack = 1
+ },
+ steel_trap_immobilize = {
+ id = 162480,
+ duration = 20,
+ max_stack = 1,
+ },
+ terms_of_engagement = {
+ id = 265898,
+ duration = 10,
+ max_stack = 1,
+ },
+ -- Talent: Your next $?s259387[Mongoose Bite][Raptor Strike] deals $s1% increased damage.
+ -- https://wowhead.com/beta/spell=260286
+ tip_of_the_spear = {
+ id = 260286,
+ duration = 10,
+ max_stack = 3
+ },
+ trailblazer = {
+ id = 231390,
+ duration = 3600,
+ max_stack = 1,
+ },
+ -- Suffering $w1 Fire damage every $t1 sec.
+ -- https://wowhead.com/beta/spell=271049
+ volatile_bomb = {
+ id = 271049,
+ duration = 6,
+ tick_time = 1,
+ type = "Magic",
+ max_stack = 1
+ },
+ -- Call in help from one of your dismissed Cunning pets for 10 sec. Your current pet is dismissed to rest and heal 30% of maximum health.
wild_kingdom = {
id = 356707,
},
+ -- Talent: Suffering $w1 Fire damage every $t1 sec.
+ -- https://wowhead.com/beta/spell=269747
+ wildfire_bomb_dot = {
+ id = 269747,
+ duration = 6,
+ tick_time = 1,
+ type = "Magic",
+ max_stack = 1
+ },
+ wildfire_bomb = {
+ alias = { "wildfire_bomb_dot", "shrapnel_bomb", "pheromone_bomb", "volatile_bomb" },
+ aliasType = "debuff",
+ aliasMode = "longest"
+ },
+ -- Movement speed reduced by $s1%.
+ -- https://wowhead.com/beta/spell=195645
+ wing_clip = {
+ id = 195645,
+ duration = 15,
+ max_stack = 1
+ },
+
+
+ -- AZERITE POWERS
+ blur_of_talons = {
+ id = 277969,
+ duration = 6,
+ max_stack = 5,
+ },
+ primeval_intuition = {
+ id = 288573,
+ duration = 12,
+ max_stack = 5,
+ },
+
+ -- Legendaries
+ butchers_bone_fragments = {
+ id = 336908,
+ duration = 12,
+ max_stack = 6,
+ },
+ latent_poison_injection = {
+ id = 336903,
+ duration = 15,
+ max_stack = 10
+ },
+ nessingwarys_trapping_apparatus = {
+ id = 336744,
+ duration = 5,
+ max_stack = 1,
+ copy = { "nesingwarys_trapping_apparatus", "nesingwarys_apparatus", "nessingwarys_apparatus" }
+ },
+
+ -- Conduits
+ flame_infusion = {
+ id = 341401,
+ duration = 8,
+ max_stack = 2,
+ },
+ strength_of_the_pack = {
+ id = 341223,
+ duration = 4,
+ max_stack = 1
+ }
} )
+spec:RegisterHook( "runHandler", function( action, pool )
+ if buff.camouflage.up and action ~= "camouflage" then removeBuff( "camouflage" ) end
+ if buff.feign_death.up and action ~= "feign_death" then removeBuff( "feign_death" ) end
+end )
+
+
+spec:RegisterStateExpr( "current_wildfire_bomb", function () return "wildfire_bomb" end )
+
+spec:RegisterStateExpr( "check_focus_overcap", function ()
+ if settings.allow_focus_overcap then return true end
+ if not this_action then return focus.current + focus.regen * gcd.max <= focus.max end
+ return focus.current + cast_regen <= focus.max
+end )
+
+
+local function IsActiveSpell( id )
+ local slot = FindSpellBookSlotBySpellID( id )
+ if not slot then return false end
+
+ local _, _, spellID = GetSpellBookItemName( slot, "spell" )
+ return id == spellID
+end
+
+state.IsActiveSpell = IsActiveSpell
+
+
+local ExpireNesingwarysTrappingApparatus = setfenv( function()
+ focus.regen = focus.regen * 0.5
+ forecastResources( "focus" )
+end, state )
+
+
+local TriggerBombardier = setfenv( function()
+ setCooldown( "wildfire_bomb", 0 )
+ if talent.wildfire_infusion.enabled then
+ setCooldown( "pheromone_bomb", 0 )
+ setCooldown( "shrapnel_bomb", 0 )
+ setCooldown( "volatile_bomb", 0 )
+ end
+end, state )
+
+
+
+spec:RegisterHook( "reset_precast", function()
+ if talent.wildfire_infusion.enabled then
+ if IsActiveSpell( 270335 ) then current_wildfire_bomb = "shrapnel_bomb"
+ elseif IsActiveSpell( 270323 ) then current_wildfire_bomb = "pheromone_bomb"
+ elseif IsActiveSpell( 271045 ) then current_wildfire_bomb = "volatile_bomb"
+ else current_wildfire_bomb = "wildfire_bomb" end
+ else
+ current_wildfire_bomb = "wildfire_bomb"
+ end
+
+ if talent.bombardier.enabled and buff.coordinated_assault.up then
+ state:QueueAuraExpiration( "coordinated_assault", TriggerBombardier, buff.coordinated_assault.expires )
+ end
+
+ if now - action.harpoon.lastCast < 1.5 then
+ setDistance( 5 )
+ end
+
+ if debuff.tar_trap.up then
+ debuff.tar_trap.expires = debuff.tar_trap.applied + 30
+ end
+
+ if buff.nesingwarys_apparatus.up then
+ state:QueueAuraExpiration( "nesingwarys_apparatus", ExpireNesingwarysTrappingApparatus, buff.nesingwarys_apparatus.expires )
+ end
+
+ if now - action.resonating_arrow.lastCast < 6 then applyBuff( "resonating_arrow", 10 - ( now - action.resonating_arrow.lastCast ) ) end
+end )
+
+spec:RegisterHook( "specializationChanged", function ()
+ current_wildfire_bomb = nil
+end )
+
+spec:RegisterStateTable( "next_wi_bomb", setmetatable( {}, {
+ __index = function( t, k )
+ if k == "shrapnel" then return current_wildfire_bomb == "shrapnel_bomb"
+ elseif k == "pheromone" then return current_wildfire_bomb == "pheromone_bomb"
+ elseif k == "volatile" then return current_wildfire_bomb == "volatile_bomb" end
+ return false
+ end
+} ) )
+
+spec:RegisterStateTable( "bloodseeker", setmetatable( {}, {
+ __index = function( t, k )
+ if k == "count" then
+ return active_dot.kill_command
+ end
+
+ return debuff.kill_command[ k ]
+ end,
+} ) )
+
+
+spec:RegisterStateExpr( "bloodseeker", function () return debuff.bloodseeker end )
+
+
-- Abilities
spec:RegisterAbilities( {
+ -- A quick shot that causes $sw2 Arcane damage.$?s260393[ Arcane Shot has a $260393h% chance to reduce the cooldown of Rapid Fire by ${$260393m1/10}.1 sec.][]
arcane_shot = {
id = 185358,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "arcane",
spend = 40,
spendType = "focus",
startsCombat = true,
- texture = 132218,
-
- handler = function ()
- end,
- },
-
-
- aspect_of_the_cheetah = {
- id = 186257,
- cast = 0,
- cooldown = 180,
- gcd = "off",
-
- startsCombat = false,
- texture = 132242,
-
- toggle = "cooldowns",
handler = function ()
end,
},
-
+ -- Talent: Increases the range of your $?s259387[Mongoose Bite][Raptor Strike] to $265189r yds for $d.
aspect_of_the_eagle = {
id = 186289,
cast = 0,
- cooldown = 90,
+ cooldown = function () return 90 * ( legendary.call_of_the_wild.enabled and 0.75 or 1 ) * ( 1 - 0.075 * talent.born_to_be_wild.rank ) end,
gcd = "off",
+ school = "physical",
talent = "aspect_of_the_eagle",
startsCombat = false,
- texture = 612363,
- toggle = "cooldowns",
+ toggle = "interrupts",
handler = function ()
+ applyBuff( "aspect_of_the_eagle" )
end,
},
-
- aspect_of_the_turtle = {
- id = 186265,
- cast = 0,
- cooldown = 180,
- gcd = "off",
-
- startsCombat = false,
- texture = 132199,
-
- toggle = "cooldowns",
-
- handler = function ()
- end,
- },
-
-
+ -- Talent: Rapidly fires a spray of shots for $120360d, dealing an average of $ Physical damage to all nearby enemies in front of you. Usable while moving. Deals reduced damage beyond $120361s1 targets.
barrage = {
id = 120360,
- cast = 0,
+ cast = 3,
+ channeled = true,
cooldown = 20,
gcd = "spell",
+ school = "physical",
spend = 60,
spendType = "focus",
talent = "barrage",
- startsCombat = false,
- texture = 236201,
+ startsCombat = true,
- handler = function ()
+ start = function ()
+ applyBuff( "barrage" )
end,
},
-
+ -- Talent: Fires a magical projectile, tethering the enemy and any other enemies within $s2 yards for $d, stunning them for $117526d if they move more than $s2 yards from the arrow.$?s321468[ Targets stunned by Binding Shot deal $321469s1% less damage to you for $321469d after the effect ends.][]
binding_shot = {
id = 109248,
cast = 0,
cooldown = 45,
gcd = "spell",
+ school = "nature",
talent = "binding_shot",
startsCombat = false,
- texture = 462650,
handler = function ()
+ applyDebuff( "target", "binding_shot" )
end,
},
-
+ -- Talent: Attack all nearby enemies in a flurry of strikes, inflicting $s1 Physical damage to each. Deals reduced damage beyond $s3 targets.$?s294029[ Reduces the remaining cooldown on Wildfire Bomb by $ sec for each target hit, up to $s3 sec.][]
butchery = {
id = 212436,
cast = 0,
@@ -274,771 +647,626 @@ spec:RegisterAbilities( {
cooldown = 9,
recharge = 9,
gcd = "spell",
+ school = "physical",
spend = 30,
spendType = "focus",
talent = "butchery",
- startsCombat = false,
- texture = 999948,
+ startsCombat = true,
+ aura = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
+ cycle = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
+ usable = function () return charges > 1 or active_enemies > 1 or target.time_to_die < ( 9 * haste ) end,
handler = function ()
- end,
- },
+ removeBuff( "butchers_bone_fragments" )
+ if talent.frenzy_strikes.enabled then
+ gainChargeTime( "wildfire_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "shrapnel_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "volatile_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "pheromone_bomb", min( 5, true_active_enemies ) )
+ reduceCooldown( "flanking_strike", min( 5, true_active_enemies ) )
+ end
- camouflage = {
- id = 199483,
- cast = 0,
- cooldown = 60,
- gcd = "off",
-
- talent = "camouflage",
- startsCombat = false,
- texture = 461113,
+ if debuff.shrapnel_bomb.up then applyDebuff( "target", "internal_bleeding", 9, min( 3, debuff.internal_bleeding.stack + 1 ) ) end
- toggle = "cooldowns",
-
- handler = function ()
+ if conduit.flame_infusion.enabled then
+ addStack( "flame_infusion", nil, 1 )
+ end
end,
},
-
+ -- Talent: A sweeping attack that strikes all enemies in front of you for $s1 Physical damage. Deals reduced damage beyond $s3 targets.$?s294029[ Reduces the remaining cooldown on Wildfire Bomb by $ sec for each target hit, up to $s3 sec.][]
carve = {
id = 187708,
cast = 0,
cooldown = 6,
+ hasteCD = true,
gcd = "spell",
+ school = "physical",
spend = 35,
spendType = "focus",
talent = "carve",
- startsCombat = false,
- texture = 1376039,
+ startsCombat = true,
+ notalent = "butchery",
handler = function ()
- end,
- },
-
-
- chimaeral_sting = {
- id = 356719,
- cast = 0,
- cooldown = 60,
- gcd = "spell",
+ if talent.frenzy_strikes.enabled then
+ gainChargeTime( "wildfire_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "shrapnel_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "volatile_bomb", min( 5, true_active_enemies ) )
+ gainChargeTime( "pheromone_bomb", min( 5, true_active_enemies ) )
+ reduceCooldown( "flanking_strike", min( 5, true_active_enemies ) )
+ end
- pvptalent = "chimaeral_sting",
- startsCombat = false,
- texture = 132211,
+ if debuff.shrapnel_bomb.up then applyDebuff( "target", "internal_bleeding", 9, min( 3, debuff.internal_bleeding.stack + 1 ) ) end
- toggle = "cooldowns",
+ removeBuff( "butchers_bone_fragments" )
- handler = function ()
+ if conduit.flame_infusion.enabled then
+ addStack( "flame_infusion", nil, 1 )
+ end
end,
},
-
+ -- Talent: Dazes the target, slowing movement speed by $s1% for $d. $?s193455[Cobra Shot][Steady Shot] will increase the duration of Concussive Shot on the target by ${$56641m3/10}.1 sec.
concussive_shot = {
id = 5116,
cast = 0,
cooldown = 5,
gcd = "spell",
+ school = "physical",
talent = "concussive_shot",
- startsCombat = false,
- texture = 135860,
+ startsCombat = true,
handler = function ()
+ applyBuff( "concussive_shot" )
end,
},
-
+ -- Talent: You and your pet charge your enemy, striking them for a combined $ Physical damage. You and your pet's bond is then strengthened for $d, causing your pet's Basic Attack to empower your next spell cast: $@spellname259495: Increaase the initial damage by $361738s2% $@spellname320976: Bleed the target for $361738s1% of Kill Shot's damage over $361049d.$?s389880[ Wildfire Bomb's cooldown is reset when Coordinated Assault is applied and when it is removed.][]$?s260331[ Kill Shot strikes up to $260331s1 additional target while Coordinated Assault is active.][]
coordinated_assault = {
id = 360952,
cast = 0,
cooldown = 120,
gcd = "spell",
+ school = "nature",
talent = "coordinated_assault",
startsCombat = false,
- texture = 2032587,
toggle = "cooldowns",
handler = function ()
+ applyBuff( "coordinated_assault" )
+ if talent.bombardier.enabled then
+ setCooldown( "wildfire_bomb", 0 )
+ TriggerBombardier()
+ state:QueueAuraExpiration( "coordinated_assault", TriggerBombardier, buff.coordinated_assault.expires )
+ end
end,
},
-
- death_chakram = {
- id = 375891,
- cast = 0,
- cooldown = 45,
- gcd = "spell",
-
- talent = "death_chakram",
- startsCombat = false,
- texture = 3578207,
-
- handler = function ()
- end,
- },
-
-
- disengage = {
- id = 781,
- cast = 0,
- charges = 1,
- cooldown = 21.99,
- recharge = 21.99,
- gcd = "off",
-
- startsCombat = false,
- texture = 132294,
-
- handler = function ()
- end,
- },
-
-
- eagle_eye = {
- id = 6197,
- cast = 0,
- cooldown = 0,
- gcd = "spell",
-
- startsCombat = true,
- texture = 132172,
-
- handler = function ()
- end,
- },
-
-
- exhilaration = {
- id = 109304,
- cast = 0,
- cooldown = 120,
- gcd = "spell",
-
- startsCombat = false,
- texture = 461117,
-
- toggle = "cooldowns",
-
- handler = function ()
- end,
- },
-
-
- explosive_shot = {
- id = 212431,
- cast = 0,
- cooldown = 30,
- gcd = "spell",
-
- spend = 20,
- spendType = "focus",
-
- talent = "explosive_shot",
- startsCombat = false,
- texture = 236178,
-
- handler = function ()
- end,
- },
-
-
- eyes_of_the_beast = {
- id = 321297,
- cast = 2,
- cooldown = 0,
- gcd = "spell",
-
- startsCombat = false,
- texture = 132150,
-
- handler = function ()
- end,
- },
-
-
- feign_death = {
- id = 5384,
- cast = 0,
- cooldown = 30,
- gcd = "off",
-
- startsCombat = false,
- texture = 132293,
-
- handler = function ()
- end,
- },
-
-
+ -- Talent: You and your pet leap to the target and strike it as one, dealing a total of $ Physical damage. |cFFFFFFFFGenerates $269752s2 Focus for you and your pet.|r
flanking_strike = {
id = 269751,
cast = 0,
cooldown = 30,
gcd = "spell",
+ school = "physical",
- talent = "flanking_strike",
- startsCombat = false,
- texture = 236184,
-
- handler = function ()
- end,
- },
-
-
- flare = {
- id = 1543,
- cast = 0,
- cooldown = 20,
- gcd = "spell",
+ spend = -30,
+ spendType = "focus",
+ talent = "flanking_strike",
startsCombat = true,
- texture = 135815,
- handler = function ()
- end,
+ usable = function () return pet.alive end,
},
-
- freezing_trap = {
- id = 187650,
- cast = 0,
- cooldown = 30,
- gcd = "spell",
-
- startsCombat = true,
- texture = 135834,
-
- handler = function ()
- end,
- },
-
-
+ -- Talent: Furiously strikes all enemies in front of you, dealing ${$203413s1*9} Physical damage over $d. Critical strike chance increased by $s3% against any target below $s4% health. Deals reduced damage beyond $s5 targets. Kill Command cooldown resets reduce the cooldown of Fury of the Eagle by ${$m2/1000}.1 sec$?s385718[ and the cooldown of Wildfire Bomb and Flanking Strike by ${$m1/1000}.1 sec][].
fury_of_the_eagle = {
id = 203415,
- cast = 0,
+ cast = 4,
+ channeled = true,
cooldown = 45,
gcd = "spell",
+ school = "physical",
talent = "fury_of_the_eagle",
- startsCombat = false,
- texture = 1239829,
-
- handler = function ()
- end,
+ startsCombat = true,
},
-
+ -- Talent: Hurls a harpoon at an enemy, rooting them in place for $190927d and pulling you to them.
harpoon = {
id = 190925,
cast = 0,
charges = 1,
- cooldown = 32.99,
- recharge = 32.99,
+ cooldown = function() return talent.terms_of_engagement.enabled and 20 or 30 end,
+ -- recharge = function() return talent.terms_of_engagement.enabled and 20 or 30 end,
gcd = "off",
+ school = "physical",
talent = "harpoon",
- startsCombat = false,
- texture = 1376040,
+ startsCombat = true,
+ usable = function () return settings.use_harpoon and target.distance > 8, "harpoon disabled or target too close" end,
handler = function ()
+ applyDebuff( "target", "harpoon" )
+ if talent.terms_of_engagement.enabled then applyBuff( "terms_of_engagement" ) end
+ setDistance( 5 )
end,
},
-
- hiexplosive_trap = {
+ -- Talent: Hurls a fire trap to the target location that explodes when an enemy approaches, causing $236777s2 Fire damage and knocking all enemies away. Trap will exist for $236775d.$?s321468[ Targets knocked back by High Explosive Trap deal $321469s1% less damage to you for $321469d after being knocked back.][]
+ high_explosive_trap = {
id = 236776,
cast = 0,
cooldown = 40,
gcd = "spell",
+ school = "fire",
- talent = "hiexplosive_trap",
+ talent = "high_explosive_trap",
startsCombat = false,
- texture = 135826,
-
- handler = function ()
- end,
- },
-
-
- hunters_mark = {
- id = 257284,
- cast = 0,
- cooldown = 0,
- gcd = "totem",
-
- startsCombat = true,
- texture = 236188,
handler = function ()
end,
},
-
- interlope = {
- id = 248518,
- cast = 0,
- cooldown = 45,
- gcd = "off",
-
- pvptalent = "interlope",
- startsCombat = false,
- texture = 132180,
-
- handler = function ()
- end,
- },
-
-
- intimidation = {
- id = 19577,
- cast = 0,
- cooldown = 60,
- gcd = "spell",
-
- talent = "intimidation",
- startsCombat = false,
- texture = 132111,
-
- toggle = "cooldowns",
-
- handler = function ()
- end,
- },
-
-
+ -- Talent: Give the command to kill, causing your pet to savagely deal $ Physical damage to the enemy. Kill Command has a $s2% chance to immediately reset its cooldown. $?s260285[ Kill Command also increases the damage of your next ][]$?s260285&s259387[Mongoose Bite]?s260285&!s259387[Raptor Strike][]$?s260285 [ by $260286s1%, stacking up to $260286u times][]. |cFFFFFFFFGenerates $s3 Focus.|r
kill_command = {
id = 259489,
cast = 0,
- charges = 1,
- cooldown = 6,
- recharge = 6,
+ charges = function () return talent.alpha_predator.enabled and 2 or nil end,
+ cooldown = 7.5,
+ recharge = function () return talent.alpha_predator.enabled and 7.5 or nil end,
gcd = "spell",
+ school = "physical",
+
+ spend = function() return talent.intense_focus.enabled and -21 or -15 end,
+ spendType = "focus",
talent = "kill_command",
startsCombat = true,
- texture = 132176,
+ cycle = function () return talent.bloodseeker.enabled and "kill_command" or nil end,
+ usable = function () return pet.alive, "requires a living pet" end,
handler = function ()
+ if debuff.pheromone_bomb.up then gainCharges( "kill_command", 1 ) end
+ if debuff.shrapnel_bomb.up then applyDebuff( "target", "internal_bleeding", 9, min( 3, debuff.internal_bleeding.stack + 1 ) ) end
+
+ if talent.bloodseeker.enabled then
+ applyBuff( "predator", 8 )
+ applyDebuff( "target", "kill_command", 8 )
+ end
+ if talent.tip_of_the_spear.enabled then addStack( "tip_of_the_spear", 20, 1 ) end
end,
},
-
+ -- Talent: You attempt to finish off a wounded target, dealing $s1 Physical damage. Only usable on enemies with less than $s2% health.
kill_shot = {
id = 320976,
cast = 0,
- cooldown = 10,
+ cooldown = function() return 10 - ( 1 - 0.25 * ( buff.coordinated_assault.up and talent.coordinated_kill.rank or 0 ) ) end,
gcd = "spell",
+ school = "physical",
spend = 10,
spendType = "focus",
talent = "kill_shot",
- startsCombat = false,
- texture = 236174,
+ startsCombat = true,
+ usable = function () return buff.flayers_mark.up or talent.coordinated_kill.enabled and buff.coordinated_assault.up or target.health_pct < 20, "requires target health below 20 percent" end,
handler = function ()
+ if buff.flayers_mark.up and legendary.pouch_of_razor_fragments.enabled then
+ applyDebuff( "target", "pouch_of_razor_fragments" )
+ removeBuff( "flayers_mark" )
+ end
+ if buff.coordinated_assault_empower.up then
+ applyDebuff( "target", "bleeding_gash" )
+ removeBuff( "coordinated_assault_empower" )
+ end
end,
},
- mending_bandage = {
- id = 212640,
+ masters_call = {
+ id = 272682,
cast = 0,
- cooldown = 25,
- gcd = "spell",
+ cooldown = 45,
+ gcd = "off",
- pvptalent = "mending_bandage",
startsCombat = false,
- texture = 1014022,
+ texture = 236189,
+ usable = function () return pet.alive, "requires a living pet" end,
handler = function ()
+ applyBuff( "masters_call" )
end,
},
-
+ -- Talent: Misdirects all threat you cause to the targeted party or raid member, beginning with your next attack within $d and lasting for $35079d.
misdirection = {
id = 34477,
cast = 0,
cooldown = 30,
gcd = "off",
+ school = "physical",
talent = "misdirection",
startsCombat = false,
- texture = 132180,
+ usable = function () return pet.alive or group, "requires a living pet or ally" end,
handler = function ()
+ applyBuff( "misdirection" )
end,
},
-
+ -- Talent: A brutal attack that deals $s1 Physical damage and grants you Mongoose Fury. |cFFFFFFFFMongoose Fury|r Increases the damage of Mongoose Bite by $259388s1% $?s385737[and the chance for Kill Command to reset by $259388s2% ][]for $259388d, stacking up to $259388u times. Successive attacks do not increase duration.
mongoose_bite = {
id = 259387,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "physical",
- spend = 30,
+ spend = function() return 30 - 5 * ( buff.spearhead.up and talent.deadly_duo.rank or 0 ) end,
spendType = "focus",
talent = "mongoose_bite",
- startsCombat = false,
- texture = 1376044,
+ startsCombat = true,
+ aura = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
+ cycle = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
handler = function ()
+ removeDebuff( "target", "latent_poison" )
+ removeDebuff( "target", "latent_poison_injection" )
+ removeBuff( "tip_of_the_spear" )
+
+ if talent.spearhead.enabled then applyDebuff( "target", "spearhead" ) end
+
+ if buff.mongoose_fury.down then applyBuff( "mongoose_fury" )
+ else applyBuff( "mongoose_fury", buff.mongoose_fury.remains, min( 5, buff.mongoose_fury.stack + 1 ) ) end
+
+ if debuff.shrapnel_bomb.up then
+ if debuff.internal_bleeding.up then applyDebuff( "target", "internal_bleeding", 9, debuff.internal_bleeding.stack + 1 ) end
+ end
+
+ if azerite.wilderness_survival.enabled then
+ gainChargeTime( "wildfire_bomb", 1 )
+ if talent.wildfire_infusion.enabled then
+ gainChargeTime( "shrapnel_bomb", 1 )
+ gainChargeTime( "pheromone_bomb", 1 )
+ gainChargeTime( "volatile_bomb", 1 )
+ end
+ end
+
+ if azerite.primeval_intuition.enabled then addStack( "primeval_intuition", nil, 1 ) end
+ if azerite.blur_of_talons.enabled and buff.coordinated_assault.up then addStack( "blur_of_talons", nil, 1) end
+
+ if legendary.butchers_bone_fragments.enabled then addStack( "butchers_bone_fragments", nil, 1 ) end
end,
- },
+ copy = { 265888, "mongoose_bite_eagle" }
+ },
+ -- Talent: Interrupts spellcasting, preventing any spell in that school from being cast for $d.
muzzle = {
id = 187707,
cast = 0,
cooldown = 15,
gcd = "off",
+ school = "physical",
talent = "muzzle",
- startsCombat = false,
- texture = 1376045,
+ startsCombat = true,
- handler = function ()
- end,
- },
+ toggle = "interrupts",
-
- ph_pocopoc_zone_ability_skill = {
- id = 363942,
- cast = 0,
- cooldown = 0,
- gcd = "off",
-
- startsCombat = false,
- texture = 4239318,
+ debuff = "casting",
+ readyTime = state.timeToInterrupt,
handler = function ()
+ if conduit.reversal_of_fortune.enabled then gain( conduit.reversal_of_fortune.mod, "focus" ) end
+ interrupt()
end,
},
- primal_rage = {
- id = 272678,
+ pheromone_bomb = {
+ id = 270323,
+ known = 259495,
cast = 0,
- cooldown = 360,
- gcd = "off",
+ charges = function () return talent.guerrilla_tactics.enabled and 2 or nil end,
+ cooldown = function() return ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) end,
+ recharge = function() return talent.guerrilla_tactics.enabled and ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) or nil end,
+ hasteCD = true,
+ gcd = "spell",
+
+ spend = function() return talent.coordinated_kill.enabled and buff.coordinated_assault.up and ( -5 * talent.coordinated_kill.rank ) or nil end,
+ spendType = "focus",
startsCombat = true,
- texture = 136224,
- toggle = "cooldowns",
+ bind = "wildfire_bomb",
+ talent = "wildfire_infusion",
+ velocity = 35,
- handler = function ()
+ usable = function () return current_wildfire_bomb == "pheromone_bomb" end,
+ start = function ()
+ removeBuff( "flame_infusion" )
+ end,
+ impact = function ()
+ applyDebuff( "target", "pheromone_bomb" )
end,
- },
+ copy = 270329,
+ unlisted = true,
+ },
+
+ -- Talent: A vicious slash dealing $s1 Physical damage.
raptor_strike = {
id = 186270,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "physical",
- spend = 30,
+ spend = function() return 30 - 5 * ( buff.spearhead.up and talent.deadly_duo.rank or 0 ) end,
spendType = "focus",
talent = "raptor_strike",
- startsCombat = false,
- texture = 1376046,
-
- handler = function ()
- end,
- },
-
-
- roar_of_sacrifice = {
- id = 53480,
- cast = 0,
- cooldown = 60,
- gcd = "off",
-
- pvptalent = "roar_of_sacrifice",
- startsCombat = false,
- texture = 464604,
+ startsCombat = true,
+ aura = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
+ cycle = function () return debuff.shrapnel_bomb.up and "internal_bleeding" or nil end,
+ indicator = function () return ( ( debuff.latent_poison_injection.down and active_dot.latent_poison_injection > 0 ) or ( debuff.latent_poison.down and active_dot.latent_poison > 0 ) ) and "cycle" or nil end,
- toggle = "cooldowns",
+ notalent = "mongoose_bite",
handler = function ()
+ removeDebuff( "target", "latent_poison" )
+ removeDebuff( "target", "latent_poison_injection" )
+ removeBuff( "tip_of_the_spear" )
+
+ if debuff.shrapnel_bomb.up then
+ applyDebuff( "target", "internal_bleeding", 9, debuff.internal_bleeding.stack + 1 )
+ end
+
+ if talent.spearhead.enabled then applyDebuff( "target", "spearhead" ) end
+
+ if azerite.wilderness_survival.enabled then
+ gainChargeTime( "wildfire_bomb", 1 )
+ if talent.wildfire_infusion.enabled then
+ gainChargeTime( "shrapnel_bomb", 1 )
+ gainChargeTime( "pheromone_bomb", 1 )
+ gainChargeTime( "volatile_bomb", 1 )
+ end
+ end
+
+ if azerite.primeval_intuition.enabled then
+ addStack( "primeval_intuition", nil, 1 )
+ end
+
+ if azerite.blur_of_talons.enabled and buff.coordinated_assault.up then
+ addStack( "blur_of_talons", nil, 1)
+ end
+
+ if legendary.butchers_bone_fragments.enabled then
+ addStack( "butchers_bone_fragments", nil, 1 )
+ end
end,
- },
-
- scare_beast = {
- id = 1513,
- cast = 1.5,
- cooldown = 0,
- gcd = "spell",
-
- spend = 25,
- spendType = "focus",
-
- talent = "scare_beast",
- startsCombat = false,
- texture = 132118,
-
- handler = function ()
- end,
+ copy = { "raptor_strike_eagle", 265189 },
},
-
- scatter_shot = {
- id = 213691,
+ -- Talent: Fire a shot that poisons your target, causing them to take $s1 Nature damage instantly and an additional $o2 Nature damage over $d.$?s260241[ Serpent Sting fires arrows at $260241s1 additional $Lenemy:enemies; near your target.][]$?s378014[ Serpent Sting's damage applies Latent Poison to the target, stacking up to $378015u times. $@spelldesc393949 consumes all stacks of Latent Poison, dealing $378016s1 Nature damage to the target per stack consumed.][]
+ serpent_sting = {
+ id = 259491,
cast = 0,
- cooldown = 30,
+ cooldown = 0,
gcd = "spell",
+ school = "nature",
- talent = "scatter_shot",
- startsCombat = false,
- texture = 132153,
-
- handler = function ()
- end,
- },
-
+ spend = 10,
+ spendType = "focus",
- sentinel_nyi = {
- id = 388045,
- cast = 0,
- cooldown = 0,
- gcd = "off",
+ talent = "serpent_sting",
+ startsCombat = true,
- talent = "sentinel_nyi",
- startsCombat = false,
- texture = 4067367,
+ velocity = 60,
- handler = function ()
+ impact = function ()
+ applyDebuff( "target", "serpent_sting" )
+ if talent.hydras_bite.enabled then
+ active_dot.serpent_sting = min( true_active_enemies, active_dot.serpent_sting + 2 )
+ end
+ if talent.poison_injection.enabled or azerite.latent_poison.enabled then applyDebuff( "target", "latent_poison", nil, debuff.latent_poison.stack + 1 ) end
+ if legendary.latent_poison_injectors.enabled then applyDebuff( "target", "latent_poison_injection", nil, debuff.latent_poison_injection.stack + 1 ) end
end,
},
-
- serpent_sting = {
- id = 271788,
+ -- Hurl a bomb at the target, exploding for $270338s1 Fire damage in a cone and impaling enemies with burning shrapnel, scorching them for $270339o1 Fire damage over $270339d. $?s259387[Mongoose Bite][Raptor Strike] and $?s212436[Butchery][Carve] apply Internal Bleeding, causing $270343o1 damage over $270343d. Internal Bleeding stacks up to $270343u times.
+ shrapnel_bomb = {
+ id = 270335,
+ known = 259495,
cast = 0,
- cooldown = 0,
+ charges = function () return talent.guerrilla_tactics.enabled and 2 or nil end,
+ cooldown = function() return ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) end,
+ recharge = function() return talent.guerrilla_tactics.enabled and ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) or nil end,
+ hasteCD = true,
gcd = "spell",
+ school = "physical",
- spend = 10,
+ spend = function() return talent.coordinated_kill.enabled and buff.coordinated_assault.up and ( -5 * talent.coordinated_kill.rank ) or nil end,
spendType = "focus",
- talent = "serpent_sting",
- startsCombat = false,
- texture = 1033905,
+ startsCombat = true,
+ bind = "wildfire_bomb",
+ talent = "wildfire_infusion",
+ velocity = 35,
- handler = function ()
+ usable = function () return current_wildfire_bomb == "shrapnel_bomb" end,
+ start = function ()
+ removeBuff( "flame_infusion" )
+ end,
+ impact = function ()
+ applyDebuff( "target", "shrapnel_bomb" )
end,
- },
+ copy = 270338,
+ unlisted = true,
+ },
+ -- Talent: You and your pet charge your enemy, striking them for $378957s1 Physical damage. You then become one with your pet for $d. While active, your pet damage is increased by $s1%, Raptor Strike and Mongoose Bite deal an additional $s2% damage over 4 sec, and Kill Command has a $s3% increased chance to reset.$?s378962[ While Spearhead is active, the Focus cost of Raptor Strike and Mongoose Bite is reduced by $s4, and Kill Command cooldown resets extend the duration of Spearhead by ${$m5/1000}.1 sec.][]
spearhead = {
id = 360966,
cast = 0,
cooldown = 90,
gcd = "spell",
+ school = "physical",
talent = "spearhead",
startsCombat = false,
- texture = 4667416,
toggle = "cooldowns",
handler = function ()
+ setDistance( 5 )
+ applyBuff( "spearhead" )
end,
},
- stampede = {
- id = 201430,
+ volatile_bomb = {
+ id = 271045,
+ known = 259495,
cast = 0,
- cooldown = 120,
+ charges = function () return talent.guerrilla_tactics.enabled and 2 or nil end,
+ cooldown = function() return ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) end,
+ recharge = function() return talent.guerrilla_tactics.enabled and ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) or nil end,
+ hasteCD = true,
gcd = "spell",
- talent = "stampede",
- startsCombat = false,
- texture = 461112,
-
- toggle = "cooldowns",
-
- handler = function ()
- end,
- },
-
-
- steady_shot = {
- id = 56641,
- cast = 1.75,
- cooldown = 0,
- gcd = "spell",
+ spend = function() return talent.coordinated_kill.enabled and buff.coordinated_assault.up and ( -5 * talent.coordinated_kill.rank ) or nil end,
+ spendType = "focus",
startsCombat = true,
- texture = 132213,
-
- handler = function ()
- end,
- },
-
-
- steel_trap = {
- id = 162488,
- cast = 0,
- cooldown = 30,
- gcd = "spell",
+ bind = "wildfire_bomb",
+ talent = "wildfire_infusion",
+ velocity = 35,
- talent = "steel_trap",
- startsCombat = false,
- texture = 1467588,
+ usable = function () return current_wildfire_bomb == "volatile_bomb" end,
- handler = function ()
+ start = function ()
+ removeBuff( "flame_infusion" )
end,
- },
-
-
- survival_of_the_fittest = {
- id = 264735,
- cast = 0,
- cooldown = 180,
- gcd = "off",
-
- talent = "survival_of_the_fittest",
- startsCombat = false,
- texture = 136094,
-
- toggle = "cooldowns",
-
- handler = function ()
+ impact = function ()
+ applyDebuff( "target", "volatile_bomb" )
+ if debuff.serpent_sting.up then
+ applyDebuff( "target", "serpent_sting" )
+ active_dot.serpent_sting = min( true_active_enemies, active_dot.serpent_sting + 2 )
+ end
end,
- },
+ copy = 271048,
- tame_beast = {
- id = 1515,
- cast = 0,
- cooldown = 0,
- gcd = "spell",
-
- startsCombat = true,
- texture = 132164,
-
- handler = function ()
- end,
+ unlisted = true,
},
-
- tar_trap = {
- id = 187698,
- cast = 0,
- cooldown = 30,
- gcd = "spell",
-
- talent = "tar_trap",
- startsCombat = false,
- texture = 576309,
-
- handler = function ()
+ -- Talent: Hurl a bomb at the target, exploding for $265157s1 Fire damage in a cone and coating enemies in wildfire, scorching them for $269747o1 Fire damage over $269747d.
+ wildfire_bomb = {
+ id = function ()
+ if current_wildfire_bomb == "wildfire_bomb" then return 259495
+ elseif current_wildfire_bomb == "pheromone_bomb" then return 270323
+ elseif current_wildfire_bomb == "shrapnel_bomb" then return 270335
+ elseif current_wildfire_bomb == "volatile_bomb" then return 271045 end
+ return 259495
end,
- },
-
-
- trackers_net = {
- id = 212638,
+ flash = { 270335, 270323, 271045, 259495 },
+ known = 259495,
cast = 0,
- cooldown = 25,
+ charges = function () return talent.guerrilla_tactics.enabled and 2 or nil end,
+ cooldown = function() return ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) end,
+ recharge = function() return talent.guerrilla_tactics.enabled and ( 18 - talent.explosives_expert.rank ) * ( 1 - 0.25 * talent.coordinated_kill.rank * ( buff.coordinated_assault.up and 1 or 0 ) ) or nil end,
gcd = "spell",
+ school = "physical",
- pvptalent = "trackers_net",
- startsCombat = false,
- texture = 1412207,
+ talent = "wildfire_bomb",
+ startsCombat = true,
+ bind = function () return current_wildfire_bomb end,
+ velocity = 35,
- handler = function ()
+ start = function ()
+ removeBuff( "flame_infusion" )
+ removeBuff( "coordinated_assault_empower" )
end,
- },
-
- tranquilizing_shot = {
- id = 19801,
- cast = 0,
- cooldown = 10,
- gcd = "totem",
-
- talent = "tranquilizing_shot",
- startsCombat = false,
- texture = 136020,
-
- handler = function ()
+ impact = function ()
+ if current_wildfire_bomb == "wildfire_bomb" then
+ applyDebuff( "target", "wildfire_bomb_dot" )
+ else class.abilities[ current_wildfire_bomb ].impact() end
+ current_wildfire_bomb = "wildfire_bomb"
end,
- },
-
- wild_kingdom = {
- id = 356707,
- cast = 0,
- cooldown = 60,
- gcd = "spell",
-
- pvptalent = "wild_kingdom",
- startsCombat = false,
- texture = 236159,
+ impactSpell = function ()
+ if not talent.wildfire_infusion.enabled then return "wildfire_bomb" end
+ if IsActiveSpell( 270335 ) then return "shrapnel_bomb" end
+ if IsActiveSpell( 270323 ) then return "pheromone_bomb" end
+ if IsActiveSpell( 271045 ) then return "volatile_bomb" end
+ return "wildfire_bomb"
+ end,
- toggle = "cooldowns",
+ impactSpells = {
+ wildfire_bomb = true,
+ shrapnel_bomb = true,
+ pheromone_bomb = true,
+ volatile_bomb = true
+ },
- handler = function ()
- end,
+ copy = { 259495, 265157 }
},
+} )
- wildfire_bomb = {
- id = 259495,
- cast = 0,
- charges = 1,
- cooldown = 18,
- recharge = 18,
- gcd = "spell",
+spec:RegisterOptions( {
+ enabled = true,
- talent = "wildfire_bomb",
- startsCombat = false,
- texture = 2065634,
+ aoe = 2,
- handler = function ()
- end,
- },
+ nameplates = true,
+ nameplateRange = 8,
+ damage = true,
+ damageExpiration = 8,
- wing_clip = {
- id = 195645,
- cast = 0,
- cooldown = 0,
- gcd = "spell",
+ potion = "spectral_agility",
- spend = 20,
- spendType = "focus",
+ package = "Survival"
+} )
- startsCombat = true,
- texture = 132309,
- handler = function ()
- end,
- },
+spec:RegisterSetting( "use_harpoon", true, {
+ name = "|T1376040:0|t Use Harpoon",
+ desc = "If checked, the addon will recommend |T1376040:0|t Harpoon when you are out of range and Harpoon is available.",
+ type = "toggle",
+ width = 1.49
} )
-spec:RegisterPriority( "Survival", 20220917,
--- Notes
-[[
+spec:RegisterSetting( "allow_focus_overcap", false, {
+ name = "Allow Focus Overcap",
+ desc = "The default priority tries to avoid overcapping Focus by default. In simulations, this helps to avoid wasting Focus. In actual gameplay, this can " ..
+ "result in trying to use Focus spenders when other important buttons (Wildfire Bomb, Kill Command) are available to push. On average, enabling this feature " ..
+ "appears to be DPS neutral vs. the default setting, but has higher variance. Your mileage may vary.\n\n" ..
+ "The default setting is |cFFFFD100unchecked|r.",
+ type = "toggle",
+ width = 1.49
+})
-]],
--- Priority
-[[
-]] )
\ No newline at end of file
+spec:RegisterPack( "Survival", 20221030, [[Hekili:nVX2UTno2VLGb11Pn1XY5w7G4aS7GflAXI(W6byEZY0s02AIKOgkkNMcd9TVhsDHxePSDJt35L0erYZnEUFyN7n)3NpleXWZ)6KXtM4n(QXJM4n5JxF18zSNZWZNLHcEeTg(Luuc8Zzf0TrBrX8fEoMGc5aiNuqdGf)LYfBySS8F9YlxhX2uSCuaj5Y8OKIyelIKgqrRy8)o4Y5ZwwefZ(C68LwjGj3oFgQGTHqbCgL8BZNTjkmexTDCEW8zZNfhLZYfmaEfQiMb)6xfmeofTmgho)FwTxAugh7ZN9V(goOGHdlxG3IPpxUGfLGHFUb(bkGrOLlIYHFDlkkMdHraneuD0KIV)9y8CgqMCm08zgfL(xaJe99O01(5BimvSd7(k1DhGOBXgB4AdcwU34y)Q)WNZOvSRF1TabizQpSsrUGMU5hbibH58ZERXzbXfdtJqvqzl2hNItIWGC5(YfxDGWg(ta03DWG(HYftoqqheJrBfC9hvLTiAakf7dxIuCQXTaR9uw0qKe1QcaTuCWgeDnajHUbWZRdcLO5PO4WvruS)ssYYoQd8v9ZZIaqMBtrWYv0Qy0Z4WAvNGNb60NXXpaaGuBuqA2nfNtsbBjqzdrPKNmqIPEGK3gwUihZ4hmFeiDjp5VIeuK7tadHauw5ID7kxi(u5I3xUiabYBkEnovicelmkb9TYfNljMqmITXhexpsrjTQsnRMZqjz4qt9970miieAyeWqGeaLNlmI13(hDYrllwTAKq6rZ9tq0hhvuZgIvSaAFCsg5jmf2OKeEmcU0fsFaBFsL4WFllMKZvtTyx7n2jHbyooK8u6inDLr20Ua1(8mm896R8YfxAyiqRu19EzATllybGhJNfGAItqDw5IqcZGUzrbpcQn9yc4zQBlHihC5BOOSuCSg4kxmOCXWk8fLc7ofbBigJH7S1JaDNGhfSXKQR0UWHItqrP5n8QMIPg7Qz)SQG(SpzLp4)0hJwhBQD652cYjRy76YTt1xddrWki9rraign6XkkWTVxGcGl6u83y(pfvXjn8vf2HvzOyWlQutikDvroGRr1qeqV4g8eQRRDPzA23ggMKUMqYb0aCJ2Tdwy1d5za0TFgjc8t2Ogby(J29T69jh4r4vasEjbLg(6C7jeF9z7AJENy61P1zlMMXz8CMqHusWu8kiMXg(beyS(IDZZHuuUqkkVsflZr3ioLaHs9dJW9j(M4TVSBMOfEu6R1yxUDGC6e4QrMWGjmK6wMa5UYa7iKPhLqZvYAM622oRPFL28cqzqMpn2)2oliZZannW6ejtuULvlsaS7NH7CZO58mg4Aro87j3gsgx6XIwjp7wei6wY93c)wDMCjl9Hq3beEcEsPBTgQM0OrhLF64cW1DmK3BnShPX7JQaNyBT7qhwIDyjZBLl4Iu8kci8gbv2el(ni3HLqIgscPHXaHCRQK5nlxGZvi5AgZNbgV2vb5SFy(8EZnTwQa)vsopagoDnuvwc)BQ2VT2kqHb(GxLmcjvSGW7icCahW0I)nI79wsx1hP9Q3DMxwYVspbmaxi6gmkS9ZY4kY1ujE562aEhj)Yycj0Nhr3Mo4F7ixuAag0rH0C4L30Vc4FtizEaDHuUv5UzL4O1By5()zr46KoLB1tjLT5lOgG1v6c6PWIwluCPqsxI6wDNGZ)xLEvGslwaeiYtPWzUFemvK5iZOi26UmOlnnZrr1Pq3ap8CMVP)6G(PihKmvgr8VTfn18DUlkGtsmRuUNADg2gRhyZ7gxrUT6u2OMULj0u5b31(Yiq7lRiNvaHlX0crFI0VjB32wcVjwW(YjXB187EU9qKIYA4W0NhieuUtHmSHB9bN5e1Z7V(StxYqcHqFH5(RIOSmzsHIqvDfMQvaafHqXw3Yqr31m73Jxf5AUYuXkdmmHG9dk1VRBPEQHF7Po0tSKRvIWnzogjPbpDDdpPvlhTQco3HhQT7dJGcCGOkaOaP2TkHA6gNVknJCR9i91qmjjMoDjslNshDjsRTP90vn9I7vBLM220IDTNEOD49dvQQA3pCTG6sHfqtcWJKz9wU4d6YWZLQ4wCp3AAvLNhuPDkiUzry6Kp5FDwGYHAt4LNDuJsQLvmSwDvlsVrB)5jvCvUdRBBcBvVCvdxDRU0wxR3uokQ7oJiGBJY49FeciqsKH(Sv7M7W4VgwD2AjK7wwEwVkBTU4TS8EYxqsq2A1B)b7pG24QOYB0jyjI1AWBpbx1Aiw2gmLagb4MRB3MvhYfZhQIZrmY7v9aVRTxNhsdD3Fpy1yFlDYYnwAtq6uPtATZBUJUDanATJ7PE6B7z29w6sbXvhwC25rRAgoyA3ErLIY9PO8GPMLNAFfAmafO7O7I6lIk6lOLd5XHpVLoD(us0hXT7etVn2dOyV3Bg5T02ahdc1DsO)GJxPQbLTvtmFMNIB((NNbZyuXM99ZvjyMEjB2)FsyfPRXruQFiMhZ858QUzyRe)ElhJhk9g71kF14MhBGt0XQ4nWxeFOeYNoai9q0uUtR5Z(J)X)9RF(R)7FTCr5IFNpH)iiSbLX1BPLlEBBZqFlK(opjDkph9Cc3piQGrsqIhkaVST148rLF5)eXJgCfaVFJKcywS8BT1TsaImIJ1Acmc7zO33oVfUxBax3vu0a993Ksjok)YEKgbH5hNCyID5qRHVHmOtIbM8Vd4zrhYaY90cctC44U7hMMDaVtknBQx8sPzhW7KsZ3DIPzhW7KsZF6etZoG3jLM98mqIZ(k1GJ92ZRdhfMTdRdkC1VSJWRu(r6C(wdI9ndBOQlhUpLQ(27hTFzQw7NXTOTYc7iBhFY052RKS65pDCsZo03BALqDyfhMODE)agSKZ3xWErGnAP8lFwW08nCBtkSLleptqyz(84iRIIBNly(O2KaE)0lLZaT8l2wx2Ax7R30kJl45Umv2pJliztfdd9cXqjNwNzD3zsEHC2MnBQ7OnViGKggXxCQT0lStAnTR8IOvtDN2G9Zkt09c1XzoDYyUa)xkxC0pQYw8aqVAGhQFP7lQuDvXBmq)d6pvWkPVAsV7F3qYp7FtW)csp(NLn76(R2)5QS86E2hMOEw9xVixY2Cxae306PYYbs9LEpZbEGTzapO35)QHnGAKtwLJYEgJ0UDDgH0UDNz6VAWzUJTzIA9PK(th9Tt88NoMnMOANRe1XFYjUdDsQpW7OJjWANa5RoBUBNs5D37DLjPy4aO(RvJmSsF3SnS3p5MAY61IMnPM2QK7OT0gs4IaUIBSp)I5qg0hN1gkAGY93nE3UdPM57HlYZhm0ji3TZzQxNBs4Qbeg2xF(2Tt8NVx26N7BB7Z5doGXEnWC4HC2yG9HgkwAOHBsVD70)YuVbkAdpCZ74YLU3maCFHCNYq(omovHQU(Dwm7S4(vrfVzAEpm9wn))I4ht16ke)uDT0VxhLIZbyvD6zwwwzOzxO12RPEw2T5SZSSfT599YUcSa9M5fAzP(TKB2vB)aBD9zm5a3oxuh8qxaR3(sB0hp3fnx377rZ(qU6dM9ntSa0Mxn7rRsOPmDMZ(sUhu6Sx9dg2Zl7((j7258fDFVH9CRIQzRo7te7(DNB1cqDuzNCvwv51WZS(URLbO6ur05doLQlAflyAVleCoFh1p8rxwt1jFydC)4cYbhS2S2mCTrekVx3b1IzlV)5bDt1WklRxcIfhlw9A1we1lsO8Y5(dIf7vlXwub1Yu7UF5juRlBQL0QuxxjXRQkPCnnanxQ9Ka1d3DJE2OxnwL2YztFvcDLZSg2s8z7XMZz6XLnwXDmyXY6xEDQ7KN(u3CQfe(BgA55y8bj7DopPMoPxxlDhyBmC1B2C6OdC)uu0TXR4xnTRtodzEtTp7PZC(UrSzEDxBHgQTeS7D9RreibSTyqi4ch3IboFRhwkIYavDtTQ)KOQ1om))WxxteTCvS)ongCMDnn3cQpuHgxJ4(Dqok7leKKR7jeODGm4KDb3XE)aY9P711zwFrz9HjlSQ9hjJH9vJYJq2i4Y(ViEqEJ5n(yPOJgbUCVzGyxj73vWEaY19e(0iqstMe7Zo5qYPVY7JzI1x0(wdM6jEsjb8)xlDJyM7Z)Fp]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/MonkWindwalker.lua b/Interface/AddOns/Hekili/Dragonflight/MonkWindwalker.lua
index a4814a782..c4ceeb7a6 100644
--- a/Interface/AddOns/Hekili/Dragonflight/MonkWindwalker.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/MonkWindwalker.lua
@@ -1,5 +1,5 @@
-- MonkWindwalker.lua
--- September 2022
+-- October 2022
if UnitClassBase( "player" ) ~= "MONK" then return end
@@ -7,492 +7,1301 @@ local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
+local GetNamePlates = C_NamePlate.GetNamePlates
+local LRC = LibStub( "LibRangeCheck-2.0" )
+local pow, format = math.pow, string.format
+
+
local spec = Hekili:NewSpecialization( 269 )
-spec:RegisterResource( Enum.PowerType.Mana )
-spec:RegisterResource( Enum.PowerType.Energy )
+spec:RegisterResource( Enum.PowerType.Energy, {
+ crackling_jade_lightning = {
+ aura = "crackling_jade_lightning",
+ debuff = true,
+
+ last = function ()
+ local app = state.debuff.crackling_jade_lightning.applied
+ local t = state.query_time
+
+ return app + floor( ( t - app ) / state.haste ) * state.haste
+ end,
+
+ stop = function( x )
+ return x < class.abilities.crackling_jade_lightning.spendPerSec
+ end,
+
+ interval = function () return state.haste end,
+ value = function () return class.abilities.crackling_jade_lightning.spendPerSec end,
+ }
+} )
spec:RegisterResource( Enum.PowerType.Chi )
+spec:RegisterResource( Enum.PowerType.Mana )
+
-- Talents
spec:RegisterTalents( {
- ascension = { 76460, 115396, 1 }, --
- attenuation = { 76449, 386941, 1 }, --
- bone_marrow_hops = { 76482, 392987, 1 }, --
- bonedust_brew = { 76483, 386276, 1 }, --
- bounce_back = { 76379, 389577, 2 }, --
- calming_presence = { 76411, 388664, 1 }, --
- celerity = { 76407, 115173, 1 }, --
- chi_burst = { 76387, 123986, 1 }, --
- chi_torpedo = { 76407, 115008, 1 }, --
- chi_wave = { 76387, 115098, 1 }, --
- close_to_heart = { 76389, 389574, 2 }, --
- crane_vortex = { 76484, 388848, 2 }, --
- dampen_harm = { 76396, 122278, 1 }, --
- dance_of_chiji = { 76465, 325201, 1 }, --
- detox = { 76410, 218164, 1 }, --
- diffuse_magic = { 76386, 122783, 1 }, --
- disable = { 76375, 116095, 1 }, --
- drinking_horn_cover = { 76481, 391370, 1 }, --
- elusive_mists = { 76384, 388681, 2 }, --
- empowered_tiger_lightning = { 76492, 335913, 1 }, --
- escape_from_reality = { 76392, 343250, 2 }, --
- eye_of_the_tiger = { 76394, 196607, 1 }, --
- faeline_harmony = { 76475, 391412, 1 }, --
- faeline_stomp = { 76476, 388193, 1 }, --
- fast_feet = { 76397, 388809, 2 }, --
- fatal_flying_guillotine = { 76485, 331679, 1 }, --
- fatal_touch = { 76405, 337296, 2 }, --
- feathers_of_a_hundred_flocks = { 76454, 388846, 1 }, --
- ferocity_of_xuen = { 76409, 388674, 2 }, --
- fists_of_fury = { 76458, 113656, 1 }, --
- flashing_fists = { 76468, 388854, 2 }, --
- flying_serpent_kick = { 76467, 101545, 1 }, --
- fortifying_brew = { 76377, 115203, 1 }, --
- fortifying_brew_cooldown = { 76382, 388813, 1 }, --
- fortifying_brew_stagger = { 76382, 322960, 1 }, --
- fury_of_xuen = { 76450, 287055, 1 }, --
- generous_pour = { 76380, 389575, 2 }, --
- glory_of_the_dawn = { 76469, 392958, 1 }, --
- grace_of_the_crane = { 76400, 388811, 2 }, --
- hardened_soles = { 76459, 391383, 2 }, --
- hidden_masters_forbidden_touch = { 76453, 213112, 1 }, --
- hit_combo = { 76452, 196740, 1 }, --
- inner_peace = { 76466, 195243, 1 }, --
- invoke_xuen_the_white_tiger = { 76493, 123904, 1 }, --
- invokers_delight = { 76490, 388661, 1 }, --
- jade_ignition = { 76470, 392979, 1 }, --
- keefers_skyreach = { 76488, 392991, 1 }, --
- last_emperors_capacitor = { 76487, 392989, 1 }, --
- mark_of_the_crane = { 76462, 228287, 1 }, --
- meridian_strikes = { 76480, 391330, 1 }, --
- open_palm_strikes = { 76456, 392970, 1 }, --
- paralysis = { 76374, 115078, 1 }, --
- paralysis_cooldown = { 76376, 344359, 1 }, --
- power_strikes = { 76457, 121817, 1 }, --
- profound_rebuttal = { 76388, 392910, 1 }, --
- provoke = { 76385, 328670, 1 }, --
- resonant_fists = { 76404, 389578, 2 }, --
- ring_of_peace = { 76395, 116844, 1 }, --
- rising_star = { 76477, 388849, 2 }, --
- rising_sun_kick = { 76372, 107428, 1 }, --
- roll = { 76402, 109132, 1 }, --
- rushing_jade_wind = { 76464, 116847, 1 }, --
- save_them_all = { 76391, 389579, 2 }, --
- serenity = { 76451, 152173, 1 }, --
- shadowboxing_treads = { 76463, 392982, 1 }, --
- soothing_mist = { 76412, 115175, 1 }, --
- spear_hand_strike = { 76408, 116705, 1 }, --
- spiritual_focus = { 76479, 280197, 1 }, --
- storm_earth_and_fire = { 76451, 137639, 1 }, --
- strength_of_spirit = { 76381, 387276, 1 }, --
- strike_of_the_windlord = { 76471, 392983, 1 }, --
- summon_black_ox_statue = { 76378, 115315, 1 }, --
- summon_jade_serpent_statue = { 76390, 115313, 1 }, --
- summon_white_tiger_statue = { 76403, 388686, 1 }, --
- teachings_of_the_monastery = { 76478, 116645, 1 }, --
- thunderfist = { 76472, 392985, 1 }, --
- tiger_tail_sweep = { 76383, 264348, 2 }, --
- tigers_lust = { 76373, 116841, 1 }, --
- touch_of_death_2 = { 76406, 322113, 1 }, --
- touch_of_karma = { 76455, 122470, 1 }, --
- touch_of_the_tiger = { 76461, 388856, 2 }, --
- transcendence = { 76398, 101643, 1 }, --
- transfer_the_power = { 76491, 195300, 1 }, --
- vigorous_expulsion = { 76401, 392900, 1 }, --
- vivacious_vivification = { 76399, 388812, 1 }, --
- vivify_2 = { 76371, 231602, 2 }, --
- way_of_the_fae = { 76474, 392994, 1 }, --
- whirling_dragon_punch = { 76473, 152175, 1 }, --
- windwalking = { 76393, 157411, 2 }, --
- xuens_battlegear = { 76489, 392993, 1 }, --
- xuens_bond = { 76486, 392986, 1 }, --
+ ascension = { 80612, 115396, 1 }, -- Increases your maximum Chi by 1, maximum Energy by 20, and your Energy regeneration by 10%.
+ attenuation = { 80668, 386941, 1 }, -- Bonedust Brew's Shadow damage or healing is increased by 20.0%, and when Bonedust Brew deals Shadow damage or healing, its cooldown is reduced by 0.5 sec.
+ bonedust_brew = { 80669, 386276, 1 }, -- Hurl a brew created from the bones of your enemies at the ground, coating all targets struck for 10 sec. Your abilities have a 50% chance to affect the target a second time at 40% effectiveness as Shadow damage or healing. Spinning Crane Kick refunds 1 Chi when striking enemies with your Bonedust Brew active.
+ bounce_back = { 80717, 389577, 2 }, -- When a hit deals more than 20% of your maximum health, reduce all damage you take by 10% for 4 sec. This effect cannot occur more than once every 30 seconds.
+ calming_presence = { 80693, 388664, 1 }, -- Reduces all damage taken by 3%.
+ celerity = { 80685, 115173, 1 }, -- Reduces the cooldown of Roll by 5 sec and increases its maximum number of charges by 1.
+ chi_burst = { 80709, 123986, 1 }, -- Hurls a torrent of Chi energy up to 40 yds forward, dealing 537 Nature damage to all enemies, and 1,141 healing to the Monk and all allies in its path. Healing reduced beyond 6 targets. Chi Burst generates 1 Chi per enemy target damaged, up to a maximum of 2.
+ chi_torpedo = { 80685, 115008, 1 }, -- Torpedoes you forward a long distance and increases your movement speed by 30% for 10 sec, stacking up to 2 times.
+ chi_wave = { 80709, 115098, 1 }, -- A wave of Chi energy flows through friends and foes, dealing 202 Nature damage or 507 healing. Bounces up to 7 times to targets within 25 yards.
+ close_to_heart = { 80707, 389574, 2 }, -- You and your allies within 10 yards have 2% increased healing taken from all sources.
+ crane_vortex = { 80667, 388848, 2 }, -- Spinning Crane Kick damage increased by 10%.
+ dampen_harm = { 80704, 122278, 1 }, -- Reduces all damage you take by 20% to 50% for 10 sec, with larger attacks being reduced by more.
+ dance_of_chiji = { 80626, 325201, 1 }, -- Spending Chi has a chance to make your next Spinning Crane Kick free and deal an additional 200% damage.
+ detox = { 80606, 218164, 1 }, -- Removes all Poison and Disease effects from the target.
+ diffuse_magic = { 80697, 122783, 1 }, -- Reduces magic damage you take by 60% for 6 sec, and transfers all currently active harmful magical effects on you back to their original caster if possible.
+ disable = { 80679, 116095, 1 }, -- Reduces the target's movement speed by 50% for 15 sec, duration refreshed by your melee attacks. Targets already snared will be rooted for 8 sec instead.
+ drinking_horn_cover = { 80619, 391370, 1 }, -- The duration of Storm, Earth, and Fire is extended by 0.4 sec for every Chi you spend.
+ dust_in_the_wind = { 80670, 394093, 1 }, -- Bonedust Brew's radius increased by 50%.
+ elusive_mists = { 80603, 388681, 2 }, -- Reduces all damage taken while channelling Soothing Mists by 0%.
+ empowered_tiger_lightning = { 80659, 323999, 1 }, -- Xuen strikes your enemies with Empowered Tiger Lightning every 4 sec, dealing 10% of the damage you and your summons have dealt to those targets in the last 4 sec.
+ escape_from_reality = { 80715, 394110, 2 }, -- After you use Transcendence: Transfer, you can use Transcendence: Transfer again within 10 sec, ignoring its cooldown. During this time, if you cast Vivify on yourself, its healing is increased by 1% and 50% of its cost is refunded.
+ expeditious_fortification = { 80681, 388813, 1 }, -- Fortifying Brew cooldown reduced by 2 min.
+ eye_of_the_tiger = { 80700, 196607, 1 }, -- Tiger Palm also applies Eye of the Tiger, dealing 401 Nature damage to the enemy and 385 healing to the Monk over 8 sec. Limit 1 target.
+ faeline_harmony = { 80671, 391412, 1 }, -- Your abilities reset Faeline Stomp 100% more often. Enemies and allies hit by Faeline Stomp are affected by Fae Exposure, increasing your damage and healing against them by 8% for 10 sec.
+ faeline_stomp = { 80672, 388193, 1 }, -- Strike the ground fiercely to expose a faeline for 30 sec, dealing 467 Nature damage to up to 5 enemies, and restores 981 health to up to 5 allies within 30 yds caught in the faeline. Up to 5 enemies caught in the faeline suffer an additional 758 damage. Your abilities have a 6% chance of resetting the cooldown of Faeline Stomp while fighting on a faeline.
+ fast_feet = { 80705, 388809, 2 }, -- Rising Sun Kick deals 70% increased damage. Spinning Crane Kick deals 10% additional damage.
+ fatal_flying_guillotine = { 80666, 394923, 1 }, -- Touch of Death strikes up to 4 additional nearby targets.
+ fatal_touch = { 80703, 394123, 2 }, -- Touch of Death cooldown reduced by 120 sec.
+ ferocity_of_xuen = { 80706, 388674, 2 }, -- Increases all damage dealt by 2%.
+ fists_of_fury = { 80613, 113656, 1 }, -- Pummels all targets in front of you, dealing 8,457 Physical damage over 3.5 sec to your primary target and 4,990 damage over 3.5 sec to all other enemies. Deals reduced damage beyond 5 targets. Can be channeled while moving.
+ flashing_fists = { 80615, 388854, 2 }, -- Fists of Fury damage increased by 10%.
+ flying_serpent_kick = { 80621, 101545, 1 }, -- Soar forward through the air at high speed for 1.5 sec. If used again while active, you will land, dealing 103 damage to all enemies within 8 yards and reducing movement speed by 70% for 4 sec.
+ forbidden_technique = { 80608, 393098, 1 }, -- Touch of Death deals 40% increased damage and can be used a second time within 5 sec before its cooldown is triggered.
+ fortifying_brew = { 80680, 115203, 1 }, -- Turns your skin to stone for 15 sec, increasing your current and maximum health by 15%, reducing all damage you take by 20%.
+ fury_of_xuen = { 80656, 396166, 1 }, -- Your Combo Strikes grant a stacking 1.0% chance for your next Fists of Fury to grant 8% Haste and invoke Xuen, The White Tiger for 8 sec.
+ generous_pour = { 80683, 389575, 2 }, -- You and your allies within 10 yards have 10% increased avoidance.
+ glory_of_the_dawn = { 80677, 392958, 1 }, -- Rising Sun Kick has a 25% chance to trigger a second time, dealing 420 Physical damage and restoring 1 Chi.
+ grace_of_the_crane = { 80710, 388811, 2 }, -- Increases all healing taken by 2%.
+ hardened_soles = { 80611, 391383, 2 }, -- Blackout Kick critical strike chance increased by 5% and critical damage increased by 10%.
+ hasty_provocation = { 80696, 328670, 1 }, -- Provoked targets move towards you at 50% increased speed.
+ hit_combo = { 80676, 196740, 1 }, -- Each successive attack that triggers Combo Strikes in a row grants 1% increased damage, stacking up to 6 times.
+ improved_paralysis = { 80687, 344359, 1 }, -- Reduces the cooldown of Paralysis by 15 sec.
+ improved_roll = { 80712, 328669, 1 }, -- Grants an additional charge of Roll and Chi Torpedo.
+ improved_touch_of_death = { 80684, 322113, 1 }, -- Touch of Death can now be used on targets with less than 15% health remaining, dealing 35% of your maximum health in damage.
+ improved_vivify = { 80692, 231602, 2 }, -- Vivify healing is increased by 40%.
+ inner_peace = { 80627, 195243, 1 }, -- Increases maximum Energy by 10.
+ invoke_xuen_the_white_tiger = { 80657, 123904, 1 }, -- Summons an effigy of Xuen, the White Tiger for 24 sec. Xuen attacks your primary target, and strikes 3 enemies within 10 yards every 0.9 sec with Tiger Lightning for 288 Nature damage. Every 4 sec, Xuen strikes your enemies with Empowered Tiger Lightning dealing 10% of the damage you have dealt to those targets in the last 4 sec.
+ invoke_xuen = { 80657, 123904, 1 }, -- Summons an effigy of Xuen, the White Tiger for 24 sec. Xuen attacks your primary target, and strikes 3 enemies within 10 yards every 0.9 sec with Tiger Lightning for 288 Nature damage. Every 4 sec, Xuen strikes your enemies with Empowered Tiger Lightning dealing 10% of the damage you have dealt to those targets in the last 4 sec.
+ invokers_delight = { 80661, 388661, 1 }, -- You gain 33% haste for 20 sec after summoning your Celestial.
+ ironshell_brew = { 80681, 388814, 1 }, -- Increases Armor while Fortifying Brew is active by 25%. Increases Dodge while Fortifying Brew is active by 25%.
+ jade_ignition = { 80607, 392979, 1 }, -- Whenever you deal damage to a target with Fists of Fury, you gain a stack of Chi Energy up to a maximum of 30 stacks. Using Spinning Crane Kick will cause the energy to detonate in a Chi Explosion, dealing 758 Nature damage to all enemies within 8 yards. The damage is increased by 5% for each stack of Chi Energy.
+ last_emperors_capacitor = { 80664, 392989, 1 }, -- Chi spenders increase the damage of your next Crackling Jade Lightning by 100% and reduce its cost by 5%, stacking up to 20 times.
+ mark_of_the_crane = { 80623, 220357, 1 }, -- Spinning Crane Kick's damage is increased by 18% for each unique target you've struck in the last 20 sec with Tiger Palm, Blackout Kick, or Rising Sun Kick. Stacks up to 5 times.
+ meridian_strikes = { 80620, 391330, 1 }, -- When you Combo Strike, the cooldown of Touch of Death is reduced by 0.35 sec. Touch of Death deals an additional 15% damage.
+ open_palm_strikes = { 80678, 392970, 1 }, -- Fists of Fury damage increased by 15%. When Fists of Fury deals damage, it has a 5% chance to refund 1 Chi.
+ paralysis = { 80688, 115078, 1 }, -- Incapacitates the target for 1 min. Limit 1. Damage will cancel the effect.
+ power_strikes = { 80614, 121817, 1 }, -- Every 15 sec, your next Tiger Palm will generate 1 additional Chi and deal 100% additional damage.
+ profound_rebuttal = { 80708, 392910, 1 }, -- Expel Harm's critical healing is increased by 50%.
+ resonant_fists = { 80702, 389578, 2 }, -- Your attacks have a chance to resonate, dealing 350 Nature damage to enemies within 8 yds.
+ ring_of_peace = { 80698, 116844, 1 }, -- Form a Ring of Peace at the target location for 5 sec. Enemies that enter will be ejected from the Ring.
+ rising_star = { 80673, 388849, 2 }, -- Rising Sun Kick damage increased by 10%.
+ rising_sun_kick = { 80690, 107428, 1 }, -- Kick upwards, dealing 4,747 Physical damage, and reducing the effectiveness of healing on the target for 10 sec.
+ rushing_jade_wind = { 80625, 116847, 1 }, -- Summons a whirling tornado around you, causing 1,703 Physical damage over 5.3 sec to all enemies within 8 yards. Deals reduced damage beyond 5 targets.
+ save_them_all = { 80714, 389579, 2 }, -- When your healing spells heal an ally whose health is below 35% maximum health, you gain an additional 10% healing for the next 4 sec.
+ serenity = { 80618, 152173, 1 }, -- Enter an elevated state of mental and physical serenity for 12 sec. While in this state, you deal 20% increased damage and healing, and all Chi consumers are free and cool down 100% more quickly.
+ shadowboxing_treads = { 80624, 392982, 1 }, -- Blackout Kick damage increased by 20% and strikes an additional 2 targets.
+ skyreach = { 80663, 392991, 1 }, -- Tiger Palm now has a 10 yard range and dashes you to the target when used. Tiger Palm also applies an effect which increases your critical strike chance by 50% for 6 sec on the target. This effect cannot be applied more than once every 1 min per target.
+ soothing_mist = { 80691, 115175, 1 }, -- Heals the target for 5,102 over 7.1 sec. While channeling, Enveloping Mist and Vivify may be cast instantly on the target.
+ spear_hand_strike = { 80686, 116705, 1 }, -- Jabs the target in the throat, interrupting spellcasting and preventing any spell from that school of magic from being cast for 4 sec.
+ spiritual_focus = { 80617, 280197, 1 }, -- Every 2 Chi you spend reduces the cooldown of Storm, Earth, and Fire by 1.0 sec.
+ storm_earth_and_fire = { 80618, 137639, 1 }, -- Split into 3 elemental spirits for 15 sec, each spirit dealing 45% of normal damage and healing. You directly control the Storm spirit, while Earth and Fire spirits mimic your attacks on nearby enemies. While active, casting Storm, Earth, and Fire again will cause the spirits to fixate on your target.
+ strength_of_spirit = { 80682, 387276, 1 }, -- Expel Harm's healing is increased by up to 100%, based on your missing health.
+ strike_of_the_windlord = { 80675, 392983, 1 }, -- Strike with both fists at all enemies in front of you, dealing 6,684 damage and reducing movement speed by 50% for 6 sec.
+ summon_black_ox_statue = { 80716, 115315, 1 }, -- Summons a Black Ox Statue at the target location for 15 min, pulsing threat to all enemies within 20 yards. You may cast Provoke on the statue to taunt all enemies near the statue.
+ summon_jade_serpent_statue = { 80713, 115313, 1 }, -- Summons a Jade Serpent Statue at the target location. When you channel Soothing Mist, the statue will also begin to channel Soothing Mist on your target, healing for 2,551 over 7.1 sec.
+ summon_white_tiger_statue = { 80701, 388686, 1 }, -- Summons a White Tiger Statue at the target location for 30 sec, pulsing 313 damage to all enemies every 2 sec for 30 sec.
+ teachings_of_the_monastery = { 80616, 116645, 1 }, -- Tiger Palm causes your next Blackout Kick to strike an additional time, stacking up to 3. Blackout Kick has a 15% chance to reset the remaining cooldown on Rising Sun Kick.
+ thunderfist = { 80674, 392985, 1 }, -- Strike of the Windlord grants you a stack of Thunderfist for each enemy struck. Thunderfist discharges upon melee strikes, dealing 4,393 Nature damage.
+ tiger_tail_sweep = { 80604, 264348, 2 }, -- Increases the range of Leg Sweep by 2 yds and reduces its cooldown by 10 sec.
+ tigers_lust = { 80689, 116841, 1 }, -- Increases a friendly target's movement speed by 70% for 6 sec and removes all roots and snares.
+ touch_of_karma = { 80610, 122470, 1 }, -- Absorbs all damage taken for 10 sec, up to 50% of your maximum health, and redirects 70% of that amount to the enemy target as Nature damage over 6 sec.
+ touch_of_the_tiger = { 80622, 388856, 2 }, -- Tiger Palm damage increased by 25%.
+ transcendence = { 80694, 101643, 1 }, -- Split your body and spirit, leaving your spirit behind for 15 min. Use Transcendence: Transfer to swap locations with your spirit.
+ transfer_the_power = { 80660, 195300, 1 }, -- Blackout Kick and Rising Sun Kick increase damage dealt by your next Fists of Fury by 3%, stacking up to 10 times.
+ vigorous_expulsion = { 80711, 392900, 1 }, -- Expel Harm's healing increased by 5% and critical strike chance increased by 15%.
+ vivacious_vivification = { 80695, 388812, 1 }, -- Every 10 sec, your next Vivify becomes instant.
+ way_of_the_fae = { 80605, 392994, 1 }, -- Increases the initial damage of Faeline Stomp by 10.0% per target hit by that damage, up to a maximum of 50.0% additional damage.
+ whirling_dragon_punch = { 80658, 152175, 1 }, -- Performs a devastating whirling upward strike, dealing 2,904 damage to all nearby enemies. Only usable while both Fists of Fury and Rising Sun Kick are on cooldown.
+ widening_whirl = { 80609, 388846, 1 }, -- Spinning Crane Kick radius increased by 15%.
+ windwalking = { 80699, 157411, 2 }, -- You and your allies within 10 yards have 10% increased movement speed.
+ xuens_battlegear = { 80662, 392993, 1 }, -- Rising Sun Kick critical strikes reduce the cooldown of Fists of Fury by 5.0 sec. When Fists of Fury ends, the critical strike chance of Rising Sun Kick is increased by 50% for 5 sec.
+ xuens_bond = { 80665, 392986, 1 }, -- Abilities that activate Combo Strikes reduce the cooldown of Invoke Xuen, the White Tiger by 0.1 sec, and Xuen's damage is increased by 10.0%.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
- alpha_tiger = 3734, -- 287503
- disabling_reach = 3050, -- 201769
- grapple_weapon = 3052, -- 233759
- mighty_ox_kick = 5540, -- 202370
- perpetual_paralysis = 5448, -- 357495
- pressure_points = 3744, -- 345829
- reverse_harm = 852 , -- 342928
- ride_the_wind = 77 , -- 201372
- tigereye_brew = 675 , -- 247483
- turbo_fists = 3745, -- 287681
- wind_waker = 3737, -- 357633
+ alpha_tiger = 3734, -- (287503) Attacking new challengers with Tiger Palm fills you with the spirit of Xuen, granting you 20% haste for 8 sec. This effect cannot occur more than once every 30 sec per target.
+ disabling_reach = 3050, -- (201769) Disable now has a 10 yard range.
+ grapple_weapon = 3052, -- (233759) You fire off a rope spear, grappling the target's weapons and shield, returning them to you for 6 sec.
+ mighty_ox_kick = 5540, -- (202370) You perform a Mighty Ox Kick, hurling your enemy a distance behind you.
+ perpetual_paralysis = 5448, -- (357495) Paralysis range reduced by 10 yards, but spreads to 2 new enemies when removed.
+ pressure_points = 3744, -- (345829) Killing a player with Touch of Death reduces the remaining cooldown of Touch of Karma by 60 sec.
+ reverse_harm = 852 , -- (342928) Increases the healing done by Expel Harm by 60%, and your Expel Harm now generates 1 additional Chi.
+ ride_the_wind = 77 , -- (201372) Flying Serpent Kick clears all snares from you when used and forms a path of wind in its wake, causing all allies who stand in it to have 30% increased movement speed and to be immune to movement slowing effects.
+ tigereye_brew = 675 , -- (247483) Consumes up to 10 stacks of Tigereye Brew to empower your Physical abilities with wind for 2 sec per stack consumed. Damage of your strikes are reduced, but bypass armor. For each 3 Chi you consume, you gain a stack of Tigereye Brew.
+ turbo_fists = 3745, -- (287681) Fists of Fury now deals full damage to all targets hit, reduces all targets movement speed by 90%, and you Parry all attacks while channelling Fists of Fury.
+ wind_waker = 3737, -- (357633) Your movement enhancing abilities increases Windwalking on allies by 10%, stacking 2 additional times. Movement impairing effects are removed at 3 stacks.
} )
-- Auras
spec:RegisterAuras( {
+ bok_proc = {
+ id = 116768,
+ type = "Magic",
+ max_stack = 1,
+ },
+ -- Talent: The Monk's abilities have a $h% chance to affect the target a second time at $s1% effectiveness as Shadow damage or healing.
+ -- https://wowhead.com/beta/spell=325216
bonedust_brew = {
- id = 386276,
+ id = 325216,
duration = 10,
- max_stack = 1
+ max_stack = 1,
+ copy = 386276
},
bounce_back = {
id = 390239,
duration = 4,
max_stack = 1
},
- chi_burst = { -- TODO: Hidden aura that procs Chi per enemy targeted.
- id = 123986,
- duration = 1,
- max_stack = 1
- },
+ -- Increases the damage done by your next Chi Explosion by $s1%. Chi Explosion is triggered whenever you use Spinning Crane Kick.
+ -- https://wowhead.com/beta/spell=393057
chi_energy = {
id = 393057,
duration = 45,
- max_stack = 30
+ max_stack = 30,
+ copy = 337571
},
- chi_torpedo = { -- Movement buff.
+ -- Talent: Movement speed increased by $w1%.
+ -- https://wowhead.com/beta/spell=119085
+ chi_torpedo = {
id = 119085,
duration = 10,
max_stack = 2
},
- --[[ chi_torpedo_115008 = { -- TODO: Actual duration of a Chi Torpedo roll?
- id = 115008,
- duration = 1.1,
- max_stack = 1
- }, ]]
+ -- Taking $w1 damage every $t1 sec.
+ -- https://wowhead.com/beta/spell=117952
crackling_jade_lightning = {
id = 117952,
duration = 4,
tick_time = 1,
+ type = "Magic",
max_stack = 1
},
+ -- Talent: Damage taken reduced by $m2% to $m3% for $d, with larger attacks being reduced by more.
+ -- https://wowhead.com/beta/spell=122278
dampen_harm = {
id = 122278,
duration = 10,
+ type = "Magic",
max_stack = 1
},
+ -- Talent: Your next Spinning Crane Kick is free and deals an additional $325201s1% damage.
+ -- https://wowhead.com/beta/spell=325202
dance_of_chiji = {
id = 325202,
duration = 15,
- max_stack = 1
+ max_stack = 1,
+ copy = { 286587, "dance_of_chiji_azerite" }
},
+ -- Talent: Spell damage taken reduced by $m1%.
+ -- https://wowhead.com/beta/spell=122783
diffuse_magic = {
id = 122783,
duration = 6,
+ type = "Magic",
max_stack = 1
},
+ -- Talent: Movement slowed by $w1%. When struck again by Disable, you will be rooted for $116706d.
+ -- https://wowhead.com/beta/spell=116095
disable = {
id = 116095,
duration = 15,
- tick_time = 1,
+ mechanic = "snare",
max_stack = 1
},
- eye_of_the_tiger = {
- id = 196608,
+ disable_root = {
+ id = 116706,
duration = 8,
- tick_time = 2,
- max_stack = 1
- },
- fae_exposure_buff = {
- id = 356774,
- duration = 10,
max_stack = 1,
- friendly = true
},
- fae_exposure_debuff = {
- id = 356773,
+ escape_from_reality = {
+ id = 343249,
duration = 10,
max_stack = 1
},
+ exit_strategy = {
+ id = 289324,
+ duration = 2,
+ max_stack = 1
+ },
+ -- Talent: $?$w1>0[Healing $w1 every $t1 sec.][Suffering $w2 Nature damage every $t2 sec.]
+ -- https://wowhead.com/beta/spell=196608
+ eye_of_the_tiger = {
+ id = 196608,
+ duration = 8,
+ max_stack = 1
+ },
+ -- Talent: Fighting on a faeline has a $s2% chance of resetting the cooldown of Faeline Stomp.
+ -- https://wowhead.com/beta/spell=388193
faeline_stomp = {
id = 388193,
duration = 30,
- max_stack = 1
+ max_stack = 1,
+ copy = 327104
},
- fatal_flying_guillotine = {
- id = 331679,
- duration = 3600,
- max_stack = 1
+ -- Damage version.
+ fae_exposure = {
+ id = 395414,
+ duration = 10,
+ max_stack = 1,
+ copy = 356773
},
- fatal_touch = {
- id = 337296,
- duration = 3600,
- max_stack = 1
+ fae_exposure_heal = {
+ id = 395413,
+ duration = 10,
+ max_stack = 1,
+ copy = 356774
},
+ -- Talent: $w3 damage every $t3 sec. $?s125671[Parrying all attacks.][]
+ -- https://wowhead.com/beta/spell=113656
fists_of_fury = {
id = 113656,
- duration = 4,
- tick_time = 0.166,
- max_stack = 1
+ duration = function () return 4 * haste end,
+ max_stack = 1,
},
+ -- Talent: Stunned.
+ -- https://wowhead.com/beta/spell=120086
fists_of_fury_stun = {
id = 120086,
duration = 4,
+ mechanic = "stun",
max_stack = 1
},
- flying_serpent_kick = { -- TODO: May want to generate this from cast time, to enable stopping again.
- id = 101545,
- duration = 1.5,
- max_stack = 1
+ flying_serpent_kick = {
+ name = "Flying Serpent Kick",
+ duration = 2,
+ generate = function ()
+ local cast = rawget( class.abilities.flying_serpent_kick, "lastCast" ) or 0
+ local expires = cast + 2
+
+ local fsk = buff.flying_serpent_kick
+ fsk.name = "Flying Serpent Kick"
+
+ if expires > query_time then
+ fsk.count = 1
+ fsk.expires = expires
+ fsk.applied = cast
+ fsk.caster = "player"
+ return
+ end
+ fsk.count = 0
+ fsk.expires = 0
+ fsk.applied = 0
+ fsk.caster = "nobody"
+ end,
},
- grapple_weapon = {
- id = 233759,
- duration = 6,
+ -- Talent: Movement speed reduced by $m2%.
+ -- https://wowhead.com/beta/spell=123586
+ flying_serpent_kick_snare = {
+ id = 123586,
+ duration = 4,
max_stack = 1
},
- invoke_xuen_the_white_tiger = { -- TODO: Is a totem.
+ fury_of_xuen = {
+ id = 396167,
+ duration = 20,
+ max_stack = 67,
+ copy = { 396168, 396167, 287062 }
+ },
+ fury_of_xuen_haste = {
+ id = 287063,
+ duration = 8,
+ max_stack = 1,
+ copy = 396168
+ },
+ hit_combo = {
+ id = 196741,
+ duration = 10,
+ max_stack = 6,
+ },
+ invoke_xuen = {
id = 123904,
duration = 24,
- tick_time = 4,
max_stack = 1,
- copy = "invoke_xuen"
+ hidden = true,
+ copy = "invoke_xuen_the_white_tiger"
},
+ -- Talent: Haste increased by $w1%.
+ -- https://wowhead.com/beta/spell=388663
invokers_delight = {
id = 388663,
duration = 20,
- max_stack = 1
+ max_stack = 1,
+ copy = 338321
},
+ -- Stunned.
+ -- https://wowhead.com/beta/spell=119381
leg_sweep = {
id = 119381,
duration = 3,
+ mechanic = "stun",
max_stack = 1
},
mark_of_the_crane = {
id = 228287,
- duration = 20,
- max_stack = 1
+ duration = 15,
+ max_stack = 1,
+ },
+ mortal_wounds = {
+ id = 115804,
+ duration = 10,
+ max_stack = 1,
+ },
+ mystic_touch = {
+ id = 113746,
+ duration = 3600,
+ max_stack = 1,
},
+ -- Talent: Incapacitated.
+ -- https://wowhead.com/beta/spell=115078
paralysis = {
id = 115078,
duration = 60,
+ mechanic = "incapacitate",
max_stack = 1
},
power_strikes = {
id = 129914,
- duration = 3600,
+ duration = 1,
+ max_stack = 1
+ },
+ pressure_point = {
+ id = 393050,
+ duration = 5,
+ max_stack = 1,
+ copy = 337482,
+ generate = function( t, auraType )
+ local lastCast, castTime = action.fists_of_fury.lastCast, action.fists_of_fury.cast
+
+ if query_time - lastCast < castTime + 5 then
+ t.count = 1
+ t.expires = lastCast + castTime + 5
+ t.applied = lastCast + castTime
+ t.caster = "player"
+
+ return
+ end
+
+ t.count = 0
+ t.expires = 0
+ t.applied = 0
+ t.caster = "nobody"
+ end,
+ },
+ -- Taunted. Movement speed increased by $s3%.
+ -- https://wowhead.com/beta/spell=116189
+ provoke = {
+ id = 116189,
+ duration = 3,
+ mechanic = "taunt",
max_stack = 1
},
+ recently_touched = { -- Fake aura for Forbidden Technique.
+ duration = 5,
+ max_stack = 1,
+ },
+ -- Talent: Nearby enemies will be knocked out of the Ring of Peace.
+ -- https://wowhead.com/beta/spell=116844
ring_of_peace = {
id = 116844,
duration = 5,
+ type = "Magic",
max_stack = 1
},
+ rising_sun_kick = {
+ id = 107428,
+ duration = 10,
+ max_stack = 1,
+ },
+ -- Talent: Dealing physical damage to nearby enemies every $116847t1 sec.
+ -- https://wowhead.com/beta/spell=116847
rushing_jade_wind = {
id = 116847,
- duration = 6,
+ duration = function () return 6 * haste end,
tick_time = 0.75,
+ dot = "buff",
+ max_stack = 1
+ },
+ save_them_all = {
+ id = 390105,
+ duration = 4,
max_stack = 1
},
+ -- Talent: Damage and healing increased by $w2%. All Chi consumers are free and cool down $w4% more quickly.
+ -- https://wowhead.com/beta/spell=152173
serenity = {
id = 152173,
duration = 12,
max_stack = 1
},
+ skyreach = {
+ id = 393047,
+ duration = 6,
+ max_stack = 1,
+ copy = { 344021, "keefers_skyreach" }
+ },
+ skyreach_exhaustion = {
+ id = 393050,
+ duration = 60,
+ max_stack = 1,
+ copy = { 337341, "recently_rushing_tiger_palm" }
+ },
+ -- Talent: Healing for $w1 every $t1 sec.
+ -- https://wowhead.com/beta/spell=115175
soothing_mist = {
id = 115175,
duration = 8,
- tick_time = 1,
+ type = "Magic",
max_stack = 1
},
+ -- $?$w2!=0[Movement speed reduced by $w2%. ][]Drenched in brew, vulnerable to Breath of Fire.
+ -- https://wowhead.com/beta/spell=196733
+ special_delivery = {
+ id = 196733,
+ duration = 15,
+ max_stack = 1
+ },
+ -- Attacking nearby enemies for Physical damage every $101546t1 sec.
+ -- https://wowhead.com/beta/spell=101546
spinning_crane_kick = {
id = 101546,
- duration = 1.5,
- tick_time = 0.5,
+ duration = function () return 1.5 * haste end,
+ tick_time = function () return 0.5 * haste end,
max_stack = 1
},
+ -- Talent: Elemental spirits summoned, mirroring all of the Monk's attacks. The Monk and spirits each do ${100+$m1}% of normal damage and healing.
+ -- https://wowhead.com/beta/spell=137639
storm_earth_and_fire = {
id = 137639,
duration = 15,
- max_stack = 2
+ max_stack = 1
},
+ -- Talent: Movement speed reduced by $s2%.
+ -- https://wowhead.com/beta/spell=392983
strike_of_the_windlord = {
id = 392983,
duration = 6,
max_stack = 1
},
- summon_black_ox_statue = { -- TODO: Is a totem.
- id = 115315,
- duration = 900,
- max_stack = 1
- },
- summon_jade_serpent_statue = { -- TODO: Is a totem.
- id = 115313,
- duration = 900,
+ -- Movement slowed by $s1%.
+ -- https://wowhead.com/beta/spell=280184
+ sweep_the_leg = {
+ id = 280184,
+ duration = 6,
max_stack = 1
},
- summon_white_tiger_statue = { -- TODO: Is a totem.
- id = 388686,
- duration = 30,
- max_stack = 1
+ teachings_of_the_monastery = {
+ id = 202090,
+ duration = 20,
+ max_stack = 3,
},
- the_emperors_capacitor = { -- TODO: There are at least 4 versions of this to double-check.
+ -- Damage of next Crackling Jade Lightning increased by $s1%. Energy cost of next Crackling Jade Lightning reduced by $s2%.
+ -- https://wowhead.com/beta/spell=393039
+ the_emperors_capacitor = {
id = 393039,
duration = 3600,
- max_stack = 20
- },
- tigereye_brew = {
- id = 247483,
- duration = function () return max( 2, min( 10, buff.tigereye_brew_stack.stack * 2 ) ) end,
- max_stack = 1
- },
- tigereye_brew_stack = {
- id = 248646,
- duration = 120,
max_stack = 20,
+ copy = 337291
},
+ thunderfist = {
+ id = 393565,
+ duration = 30,
+ max_stack = 30
+ },
+ -- Talent: Moving $s1% faster.
+ -- https://wowhead.com/beta/spell=116841
tigers_lust = {
id = 116841,
duration = 6,
+ type = "Magic",
+ max_stack = 1
+ },
+ touch_of_death = {
+ id = 115080,
+ duration = 8,
max_stack = 1
},
touch_of_karma = {
+ id = 125174,
+ duration = 10,
+ max_stack = 1
+ },
+ -- Talent: Damage dealt to the Monk is redirected to you as Nature damage over $124280d.
+ -- https://wowhead.com/beta/spell=122470
+ touch_of_karma_debuff = {
id = 122470,
duration = 10,
max_stack = 1
},
+ -- Talent: You left your spirit behind, allowing you to use Transcendence: Transfer to swap with its location.
+ -- https://wowhead.com/beta/spell=101643
transcendence = {
id = 101643,
duration = 900,
max_stack = 1
},
+ transcendence_transfer = {
+ id = 119996,
+ },
transfer_the_power = {
id = 195321,
duration = 30,
max_stack = 10
},
+ -- Talent: Your next Vivify is instant.
+ -- https://wowhead.com/beta/spell=392883
vivacious_vivification = {
id = 392883,
duration = 3600,
max_stack = 1
},
- whirling_dragon_punch = { -- TODO: This is animation time, really.
- id = 152175,
- duration = 1,
- tick_time = 0.25,
- max_stack = 1
+ -- Talent:
+ -- https://wowhead.com/beta/spell=196742
+ whirling_dragon_punch = {
+ id = 196742,
+ duration = function () return action.rising_sun_kick.cooldown end,
+ max_stack = 1,
+ },
+ windwalking = {
+ id = 166646,
+ duration = 3600,
+ max_stack = 1,
},
+ -- Flying.
+ -- https://wowhead.com/beta/spell=125883
zen_flight = {
id = 125883,
duration = 3600,
+ type = "Magic",
+ max_stack = 1
+ },
+ zen_pilgrimage = {
+ id = 126892,
+ },
+
+ -- PvP Talents
+ alpha_tiger = {
+ id = 287504,
+ duration = 8,
+ max_stack = 1,
+ },
+ fortifying_brew = {
+ id = 201318,
+ duration = 15,
+ max_stack = 1,
+ },
+ grapple_weapon = {
+ id = 233759,
+ duration = 6,
+ max_stack = 1,
+ },
+ heavyhanded_strikes = {
+ id = 201787,
+ duration = 2,
+ max_stack = 1,
+ },
+ ride_the_wind = {
+ id = 201447,
+ duration = 3600,
+ max_stack = 1,
+ },
+ tigereye_brew = {
+ id = 247483,
+ duration = 20,
+ max_stack = 1
+ },
+ tigereye_brew_stack = {
+ id = 248646,
+ duration = 120,
+ max_stack = 20,
+ },
+ wind_waker = {
+ id = 290500,
+ duration = 4,
+ max_stack = 1,
+ },
+
+ -- Conduit
+ coordinated_offensive = {
+ id = 336602,
+ duration = 15,
+ max_stack = 1
+ },
+
+ -- Azerite Powers
+ recently_challenged = {
+ id = 290512,
+ duration = 30,
+ max_stack = 1
+ },
+ sunrise_technique = {
+ id = 273298,
+ duration = 15,
max_stack = 1
},
} )
+spec:RegisterGear( "tier29", 200360, 200362, 200363, 200364, 200365 )
+spec:RegisterAuras( {
+ kicks_of_flowing_momentum = {
+ id = 394944,
+ duration = 30,
+ max_stack = 2,
+ },
+ fists_of_flowing_momentum = {
+ id = 394949,
+ duration = 30,
+ max_stack = 1,
+ }
+} )
+
+spec:RegisterGear( "tier19", 138325, 138328, 138331, 138334, 138337, 138367 )
+spec:RegisterGear( "tier20", 147154, 147156, 147152, 147151, 147153, 147155 )
+spec:RegisterGear( "tier21", 152145, 152147, 152143, 152142, 152144, 152146 )
+spec:RegisterGear( "class", 139731, 139732, 139733, 139734, 139735, 139736, 139737, 139738 )
+
+spec:RegisterGear( "cenedril_reflector_of_hatred", 137019 )
+spec:RegisterGear( "cinidaria_the_symbiote", 133976 )
+spec:RegisterGear( "drinking_horn_cover", 137097 )
+spec:RegisterGear( "firestone_walkers", 137027 )
+spec:RegisterGear( "fundamental_observation", 137063 )
+spec:RegisterGear( "gai_plins_soothing_sash", 137079 )
+spec:RegisterGear( "hidden_masters_forbidden_touch", 137057 )
+spec:RegisterGear( "jewel_of_the_lost_abbey", 137044 )
+spec:RegisterGear( "katsuos_eclipse", 137029 )
+spec:RegisterGear( "march_of_the_legion", 137220 )
+spec:RegisterGear( "prydaz_xavarics_magnum_opus", 132444 )
+spec:RegisterGear( "salsalabims_lost_tunic", 137016 )
+spec:RegisterGear( "sephuzs_secret", 132452 )
+spec:RegisterGear( "the_emperors_capacitor", 144239 )
+
+spec:RegisterGear( "soul_of_the_grandmaster", 151643 )
+spec:RegisterGear( "stormstouts_last_gasp", 151788 )
+spec:RegisterGear( "the_wind_blows", 151811 )
+
+
+spec:RegisterStateTable( "combos", {
+ blackout_kick = true,
+ bonedust_brew = true,
+ chi_burst = true,
+ chi_wave = true,
+ crackling_jade_lightning = true,
+ expel_harm = true,
+ faeline_stomp = true,
+ fists_of_fury = true,
+ flying_serpent_kick = true,
+ rising_sun_kick = true,
+ rushing_jade_wind = true,
+ spinning_crane_kick = true,
+ strike_of_the_windlord = true,
+ tiger_palm = true,
+ touch_of_death = true,
+ weapons_of_order = true,
+ whirling_dragon_punch = true
+} )
+
+local prev_combo, actual_combo, virtual_combo
+
+spec:RegisterStateExpr( "last_combo", function () return virtual_combo or actual_combo end )
+
+spec:RegisterStateExpr( "combo_break", function ()
+ return this_action == virtual_combo and combos[ virtual_combo ]
+end )
+
+spec:RegisterStateExpr( "combo_strike", function ()
+ return not combos[ this_action ] or this_action ~= virtual_combo
+end )
+
+
+local application_events = {
+ SPELL_AURA_APPLIED = true,
+ SPELL_AURA_APPLIED_DOSE = true,
+ SPELL_AURA_REFRESH = true,
+}
+
+local removal_events = {
+ SPELL_AURA_REMOVED = true,
+ SPELL_AURA_BROKEN = true,
+ SPELL_AURA_BROKEN_SPELL = true,
+}
+
+local death_events = {
+ UNIT_DIED = true,
+ UNIT_DESTROYED = true,
+ UNIT_DISSIPATES = true,
+ PARTY_KILL = true,
+ SPELL_INSTAKILL = true,
+}
+
+local bonedust_brew_applied = {}
+local bonedust_brew_expires = {}
+
+-- If a Tiger Palm missed, pretend we never cast it.
+-- Use RegisterEvent since we're looking outside the state table.
+spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
+ if sourceGUID == state.GUID then
+ local ability = class.abilities[ spellID ] and class.abilities[ spellID ].key
+ if not ability then return end
+
+ if ability == "tiger_palm" and subtype == "SPELL_MISSED" and not state.talent.hit_combo.enabled then
+ if ns.castsAll[1] == "tiger_palm" then ns.castsAll[1] = "none" end
+ if ns.castsAll[2] == "tiger_palm" then ns.castsAll[2] = "none" end
+ if ns.castsOn[1] == "tiger_palm" then ns.castsOn[1] = "none" end
+ actual_combo = "none"
+
+ Hekili:ForceUpdate( "WW_MISSED" )
+
+ elseif subtype == "SPELL_CAST_SUCCESS" and state.combos[ ability ] then
+ prev_combo = actual_combo
+ actual_combo = ability
+
+ elseif subtype == "SPELL_DAMAGE" and spellID == 148187 then
+ -- track the last tick.
+ state.buff.rushing_jade_wind.last_tick = GetTime()
+
+ -- Track Bonedust Brew applications.
+ elseif spellID == 325216 then
+ if application_events[ subtype ] then
+ bonedust_brew_applied[ destGUID ] = GetTime()
+ bonedust_brew_expires[ destGUID ] = nil
+ elseif removal_events[ subtype ] then
+ bonedust_brew_expires[ destGUID ] = nil
+ bonedust_brew_expires[ destGUID ] = nil
+ end
+ end
+ elseif death_events[ subtype ] then
+ bonedust_brew_applied[ destGUID ] = nil
+ bonedust_brew_expires[ destGUID ] = nil
+ end
+end )
+
+
+local chiSpent = 0
+
+spec:RegisterHook( "spend", function( amt, resource )
+ if resource == "chi" and amt > 0 then
+ if talent.spiritual_focus.enabled then
+ chiSpent = chiSpent + amt
+ cooldown.storm_earth_and_fire.expires = max( 0, cooldown.storm_earth_and_fire.expires - floor( chiSpent / 2 ) )
+ chiSpent = chiSpent % 2
+ end
+
+ if talent.drinking_horn_cover.enabled then
+ if buff.storm_earth_and_fire.up then buff.storm_earth_and_fire.expires = buff.storm_earth_and_fire.expires + 0.4
+ elseif buff.serenity.up then buff.serenity.expires = buff.serenity.expires + 0.3 end
+ end
+
+ if talent.last_emperors_capacitor.enabled or legendary.last_emperors_capacitor.enabled then
+ addStack( "the_emperors_capacitor", nil, 1 )
+ end
+ end
+end )
+
+
+local noop = function () end
+
+-- local reverse_harm_target
+
+
+-- New Bonedust Brew Stuff
+local checker = LRC:GetHarmMaxChecker( 8 )
+
+local valid_brews = {}
+
+local function ValidateBonedustBrews()
+ local now = state.now
+ checker = checker or LRC:GetHarmMaxChecker( 8 )
+ table.wipe( valid_brews )
+
+ for _, plate in ipairs( GetNamePlates() ) do
+ local unit = plate.namePlateUnitToken
+
+ if unit and UnitCanAttack( "player", unit ) and ( UnitIsPVP( "player" ) or not UnitIsPlayer( unit ) ) and checker( unit ) then
+ local guid = UnitGUID( unit )
+
+ valid_brews[ guid ] = 0
+
+ if bonedust_brew_applied[ guid ] then
+ if not bonedust_brew_expires[ guid ] then
+ -- We haven't scraped the aura for the duration yet.
+ local found, _, _, _, _, expires = AuraUtil.FindAuraByName( class.auras.bonedust_brew_debuff.name, unit, "HARMFUL|PLAYER" )
+
+ if found then
+ bonedust_brew_expires[ guid ] = expires
+ valid_brews[ guid ] = expires
+ end
+ else
+ if bonedust_brew_expires[ guid ] > now then
+ valid_brews[ guid ] = bonedust_brew_expires[ guid ]
+ end
+ end
+ end
+ end
+ end
+end
+
+local GatherBonedustInfo = setfenv( function()
+ local targets, bonedusts, aggregate, longest = 0, 0, 0, 0
+
+ for _, expires in pairs( valid_brews ) do
+ targets = targets + 1
+ local remains = max( 0, expires - query_time )
+
+ if remains > 0 then
+ bonedusts = bonedusts + 1
+ aggregate = aggregate + remains
+ longest = max( longest, remains )
+ end
+ end
+
+ return targets, bonedusts, aggregate, longest
+end, state )
+
+local bdbActions = {}
+
+local SetAction = setfenv( function( name, damage, execution_time, net_chi, net_energy, mastery, p, capped )
+ local a = bdbActions[ name ] or {}
+
+ capped = capped or false
+
+ a.damage = damage
+ a.execution_time = execution_time
+ a.net_chi = net_chi
+ a.net_energy = ( capped and net_energy ) or ( net_energy + energy.regen * execution_time )
+ a.idps = damage / execution_time
+ a.cps = net_chi / execution_time
+ a.eps = a.net_energy / execution_time
+ a.rdps = a.idps + 0.5 * mastery * a.cps + 0.02 * mastery * ( 1 + p ) * a.eps
+
+ bdbActions[ name ] = a
+
+ return a
+end, state )
+
+
+local lastBonedustZoneTime = 0
+local lastBonedustZoneValue = 0
+
+-- Returns cap_energy, tp_fill, bok, break_mastery.
+local GetBonedustZoneInfo = setfenv( function()
+ if query_time == lastBonedustZoneTime then
+ return lastBonedustZoneValue
+ end
+
+ local targets, bonedusts, aggregate = GatherBonedustInfo()
+ lastBonedustZoneTime = query_time
+
+ if targets < 2 or bonedusts < 1 then
+ -- Orange
+ lastBonedustZoneValue = 0
+ return 0
+ end
+
+ if aggregate > 0 then
+ local length = 60
+ local blp = 0.2
+ local bb_rate = 1.5 + blp
+
+ -- Bone Marrow Hops
+ if conduit.bone_marrow_hops.rank > 0 then
+ length = length - 2.5 - ( 2.5 * bb_rate )
+ end
+
+ -- Brewmaster Keg Smash
+ if spec.brewmaster then
+ length = length - ( 60 / length * 8 ) -- 2 Keg Smashes for a hard Cast
+ length = length - bb_rate * 4 -- 1 Keg Smash per bountiful minimum (safe)
+ end
+ end
+
+ -- Math below is credit to Tostad0ra, ported to Lua/WoW by Jeremals (https://wago.io/2rN0fBudK).
+ -- https://colab.research.google.com/drive/1IlNnwzigBG_xa0VdXhiofvuy-mgJAhGa?usp=sharing
+
+ local mastery = 1 + stat.mastery_value
+ local haste = 1 + stat.haste
+
+ -- Locally defined variables that may change.
+
+ local eps = 0.2 -- Delay when chaining SCKs
+ local tiger_palm_AP = 0.41804714952
+ local sck_AP = 0.8481600000000001
+
+ local coordinated_offensive_bonus = 1
+
+ if conduit.coordinated_offensive.rank > 0 then
+ coordinated_offensive_bonus = 1 + 0.085 + ( 0.009 * ( conduit.coordinated_offensive.rank - 1 ) )
+ end
+
+ local calculated_strikes_bonus = 0.16
+ if conduit.calculated_strikes.rank > 0 then
+ calculated_strikes_bonus = 0.16 + 0.1 + ( 0.01 * ( conduit.calculated_strikes.rank - 1 ) )
+ end
+
+ local bone_marrow_hops_bonus = 0
+ if conduit.bone_marrow_hops.rank > 0 then
+ bone_marrow_hops_bonus = 0.4 + ( 0.04 * ( conduit.bone_marrow_hops.rank - 1 ) )
+ end
+
+ -- sqrt scaling
+ local N_effective_targets_above = 5 * pow( ( targets / 5 ), 0.5 )
+ local N_effective_targets_below = targets
+ local N_effective_targets = min( N_effective_targets_below, N_effective_targets_above )
+
+
+ local mark_stacks = spinning_crane_kick.count
+ local mark_bonus_per_target = 0.18 + calculated_strikes_bonus
+ local mark_bonus = mark_bonus_per_target * mark_stacks
+ local mark_multiplier = 1 + mark_bonus
+
+ local p = tiger_palm_AP / ( ( N_effective_targets * sck_AP * mark_multiplier ) - ( 1.1 / 1.676 * 0.81 / 2.5 * 1.5 ) )
+
+ local amp = 1 + stat.versatility_atk_mod
+
+ if buff.invoke_xuen.up then
+ amp = amp * 1.1
+ end
+
+ if buff.storm_earth_and_fire.up then
+ amp = amp * 1.35 * ( 2 * coordinated_offensive_bonus + 1 ) / 3
+ end
+
+ amp = amp * ( 1 + ( 0.5 * 0.4 * ( bonedusts / targets ) * ( 1 + bone_marrow_hops_bonus ) ) )
+
+ local TP_SCK = SetAction( "TP_SCK", amp * mastery * ( 1 + p ), 2, 1, -50, mastery, p )
+ local rSCK_cap = SetAction( "rSCK_cap", amp, 1.5 / haste + eps, -1, 0, mastery, p, true )
+ local rSCK_unc = SetAction( "rSCK_unc", amp, 1.5 / haste + eps, -1, 0, mastery, p )
+
+ if rSCK_unc.rdps > TP_SCK.rdps then
+ local regen = 2 * energy.regen
+ local N_oc_expr = ( 1 - 2 * regen ) / ( 1.5 + haste * eps ) / ( regen / haste )
+ local w_oc_expr = 1 / ( 1 + N_oc_expr )
+ local rdps_nocap = w_oc_expr * TP_SCK.rdps + ( 1 - w_oc_expr ) * rSCK_unc.rdps
+
+ -- Purple
+ if rSCK_cap.rdps > rdps_nocap then
+ lastBonedustZoneValue = 4
+ return 4
+ end
+
+ -- Red
+ lastBonedustZoneValue = 3
+ return 3
+ end
+
+ -- Blue
+ if rSCK_unc.idps < TP_SCK.idps then
+ lastBonedustZoneValue = 1
+ return 1
+ end
+
+ -- Green
+ lastBonedustZoneValue = 2
+ return 2
+end, state )
+
+
+
+spec:RegisterHook( "runHandler", function( key, noStart )
+ if combos[ key ] then
+ if last_combo == key then removeBuff( "hit_combo" )
+ else
+ if talent.hit_combo.enabled then addStack( "hit_combo", 10, 1 ) end
+ if azerite.fury_of_xuen.enabled or talent.fury_of_xuen.enabled then addStack( "fury_of_xuen", nil, 1 ) end
+ if ( talent.xuens_bond.enabled or conduit.xuens_bond.enabled ) and cooldown.invoke_xuen.remains > 0 then reduceCooldown( "invoke_xuen", 0.1 ) end
+ if talent.meridian_strikes.enabled and cooldown.touch_of_death.remains > 0 then reduceCooldown( "touch_of_death", 0.35 ) end
+ end
+ virtual_combo = key
+ end
+
+ lastBonedustZoneTime = 0
+end )
+
+spec:RegisterStateExpr( "cap_energy", function()
+ return GetBonedustZoneInfo() == 4
+end )
+
+spec:RegisterStateExpr( "tp_fill", function()
+ return GetBonedustZoneInfo() < 3
+end )
+
+spec:RegisterStateExpr( "no_bok", function()
+ return GetBonedustZoneInfo() > 0
+end )
+
+spec:RegisterStateExpr( "break_mastery", function()
+ return GetBonedustZoneInfo() > 1
+end )
+
+
+spec:RegisterStateTable( "healing_sphere", setmetatable( {}, {
+ __index = function( t, k)
+ if k == "count" then
+ t[ k ] = GetSpellCount( action.expel_harm.id )
+ return t[ k ]
+ end
+ end
+} ) )
+
+spec:RegisterHook( "reset_precast", function ()
+ rawset( healing_sphere, "count", nil )
+ if healing_sphere.count > 0 then
+ applyBuff( "gift_of_the_ox", nil, healing_sphere.count )
+ end
+
+ chiSpent = 0
+
+ if actual_combo == "tiger_palm" and chi.current < 2 and now - action.tiger_palm.lastCast > 0.2 then
+ actual_combo = "none"
+ end
+
+ if buff.rushing_jade_wind.up then setCooldown( "rushing_jade_wind", 0 ) end
+
+ if buff.casting.up and buff.casting.v1 == action.spinning_crane_kick.id then
+ removeBuff( "casting" )
+ -- Spinning Crane Kick buff should be up.
+ end
+
+ spinning_crane_kick.count = nil
+
+ virtual_combo = actual_combo or "no_action"
+ -- reverse_harm_target = nil
+
+ if not IsUsableSpell( 322109 ) then setCooldown( "touch_of_death", action.touch_of_death.cooldown ) end
+
+ if buff.weapons_of_order_ww.up then
+ state:QueueAuraExpiration( "weapons_of_order_ww", noop, buff.weapons_of_order_ww.expires )
+ end
+
+ -- BDB Logic.
+ if talent.bonedust_brew.enabled or state:IsKnown( "bonedust_brew" ) then
+ ValidateBonedustBrews()
+ lastBonedustZoneTime = 0
+ end
+
+ if talent.forbidden_technique.enabled and cooldown.touch_of_death.remains == 0 and query_time - action.touch_of_death.lastCast < 5 then
+ applyBuff( "recently_touched", query_time - action.touch_of_death.lastCast )
+ end
+end )
+
+spec:RegisterHook( "advance", function()
+ lastBonedustZoneTime = 0
+end )
+
+
+spec:RegisterHook( "IsUsable", function( spell )
+ -- Allow repeats to happen if your chi has decayed to 0.
+ if talent.hit_combo.enabled and buff.hit_combo.up and ( spell ~= "tiger_palm" or chi.current > 0 ) and last_combo == spell then
+ return false, "would break hit_combo"
+ end
+end )
+
+
+spec:RegisterStateTable( "spinning_crane_kick", setmetatable( { onReset = function( self ) self.count = nil end },
+ { __index = function( t, k )
+ if k == "count" then
+ t[ k ] = max( GetSpellCount( action.spinning_crane_kick.id ), active_dot.mark_of_the_crane )
+ return t[ k ]
+ elseif k == "max" then
+ return spinning_crane_kick.count >= min( active_enemies, 5 )
+ end
+ end } ) )
+
+spec:RegisterStateExpr( "alpha_tiger_ready", function ()
+ if not pvptalent.alpha_tiger.enabled then
+ return false
+ elseif debuff.recently_challenged.down then
+ return true
+ elseif cycle then return
+ active_dot.recently_challenged < active_enemies
+ end
+ return false
+end )
+
+spec:RegisterStateExpr( "alpha_tiger_ready_in", function ()
+ if not pvptalent.alpha_tiger.enabled then return 3600 end
+ if active_dot.recently_challenged < active_enemies then return 0 end
+ return debuff.recently_challenged.remains
+end )
+
+spec:RegisterStateFunction( "weapons_of_order", function( c )
+ if c and c > 0 then
+ return buff.weapons_of_order_ww.up and ( c - 1 ) or c
+ end
+ return c
+end )
+
+
+spec:RegisterPet( "xuen_the_white_tiger", 63508, "invoke_xuen", 24 )
+
+spec:RegisterTotem( "jade_serpent_statue", 620831 )
+spec:RegisterTotem( "white_tiger_statue", 125826 )
+spec:RegisterTotem( "black_ox_statue", 627607 )
+
+
-- Abilities
spec:RegisterAbilities( {
+ -- Kick with a blast of Chi energy, dealing $?s137025[${$s1*$/$AP}][$s1] Physical damage.$?s261917[ Reduces the cooldown of Rising Sun Kick and Fists of Fury by ${$m3/1000}.1 sec when used.][]$?s387638[ Strikes up to $387638s1 additional$ltarget;targets.][]$?s387625[ $@spelldesc387624][]$?s387046[ Critical hits grant an additional $387046m2 $Lstack:stacks; of Elusive Brawler.][]
blackout_kick = {
id = 100784,
cast = 0,
cooldown = 3,
gcd = "spell",
+ school = "physical",
- spend = 1,
+ spend = function ()
+ if buff.serenity.up or buff.bok_proc.up then return 0 end
+ return weapons_of_order( 1 )
+ end,
spendType = "chi",
startsCombat = true,
texture = 574575,
+ cycle = "mark_of_the_crane",
+
handler = function ()
+ if buff.bok_proc.up and buff.serenity.down then
+ removeBuff( "bok_proc" )
+ if set_bonus.tier21_4pc > 0 then gain( 1, "chi" ) end
+ end
+ cooldown.rising_sun_kick.expires = max( 0, cooldown.rising_sun_kick.expires - ( buff.weapons_of_order.up and 2 or 1 ) )
+ cooldown.fists_of_fury.expires = max( 0, cooldown.fists_of_fury.expires - ( buff.weapons_of_order.up and 2 or 1 ) )
+
+ removeBuff( "teachings_of_the_monastery" )
+ applyDebuff( "target", "mark_of_the_crane", 15 )
+ if talent.eye_of_the_tiger.enabled then applyDebuff( "target", "eye_of_the_tiger" ) end
+ if talent.transfer_the_power.enabled then addStack( "transfer_the_power", nil, 1 ) end
end,
},
-
+ -- Talent / Covenant (Necrolord): Hurl a brew created from the bones of your enemies at the ground, coating all targets struck for $d. Your abilities have a $h% chance to affect the target a second time at $s1% effectiveness as Shadow damage or healing. $?s137024[Gust of Mists heals targets with your Bonedust Brew active for an additional $328748s1.]?s137023[Tiger Palm and Keg Smash reduces the cooldown of your brews by an additional $s3 sec when striking enemies with your Bonedust Brew active.]?s137025[Spinning Crane Kick refunds 1 Chi when striking enemies with your Bonedust Brew active.][]
bonedust_brew = {
- id = 386276,
+ id = function() return talent.bonedust_brew.enabled and 386276 or 325216 end,
cast = 0,
cooldown = 60,
gcd = "totem",
+ school = "shadow",
- talent = "bonedust_brew",
+ talent = function()
+ if covenant.necrolord then return end
+ return "bonedust_brew"
+ end,
startsCombat = false,
- texture = 3578227,
-
- toggle = "cooldowns",
handler = function ()
+ applyDebuff( "target", "bonedust_brew" )
+ if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
end,
- },
+ copy = { 386276, 352216 }
+ },
+ -- Talent: Hurls a torrent of Chi energy up to 40 yds forward, dealing $148135s1 Nature damage to all enemies, and $130654s1 healing to the Monk and all allies in its path. Healing reduced beyond $s1 targets. $?c1[ Casting Chi Burst does not prevent avoiding attacks.][]$?c3[ Chi Burst generates 1 Chi per enemy target damaged, up to a maximum of $s3.][]
chi_burst = {
id = 123986,
- cast = 1,
+ cast = function () return 1 * haste end,
cooldown = 30,
gcd = "spell",
+ school = "nature",
+
+ spend = function() return max( -2, true_active_enemies ) end,
+ spendType = "chi",
talent = "chi_burst",
startsCombat = false,
- texture = 135734,
-
- handler = function ()
- end,
},
-
+ -- Talent: Torpedoes you forward a long distance and increases your movement speed by $119085m1% for $119085d, stacking up to 2 times.
chi_torpedo = {
id = 115008,
cast = 0,
- charges = 1,
+ charges = function () return legendary.roll_out.enabled and 3 or 2 end,
cooldown = 20,
recharge = 20,
gcd = "off",
+ school = "physical",
talent = "chi_torpedo",
startsCombat = false,
- texture = 607849,
handler = function ()
+ -- trigger chi_torpedo [119085]
+ applyBuff( "chi_torpedo" )
end,
},
-
+ -- Talent: A wave of Chi energy flows through friends and foes, dealing $132467s1 Nature damage or $132463s1 healing. Bounces up to $s1 times to targets within $132466a2 yards.
chi_wave = {
id = 115098,
cast = 0,
cooldown = 15,
gcd = "spell",
+ school = "nature",
talent = "chi_wave",
startsCombat = false,
- texture = 606541,
handler = function ()
end,
},
-
+ -- Channel Jade lightning, causing $o1 Nature damage over $117952d to the target$?a154436[, generating 1 Chi each time it deals damage,][] and sometimes knocking back melee attackers.
crackling_jade_lightning = {
id = 117952,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "nature",
- spend = 0,
- spendType = "energy",
+ spend = function () return 20 * ( 1 - ( buff.the_emperors_capacitor.stack * 0.05 ) ) end,
+ spendPerSec = function () return 20 * ( 1 - ( buff.the_emperors_capacitor.stack * 0.05 ) ) end,
- startsCombat = true,
- texture = 606542,
+ startsCombat = false,
handler = function ()
+ applyBuff( "crackling_jade_lightning" )
+ removeBuff( "the_emperors_capacitor" )
end,
},
-
+ -- Talent: Reduces all damage you take by $m2% to $m3% for $d, with larger attacks being reduced by more.
dampen_harm = {
id = 122278,
cast = 0,
cooldown = 120,
gcd = "off",
+ school = "physical",
talent = "dampen_harm",
startsCombat = false,
- texture = 620827,
- toggle = "cooldowns",
+ toggle = "defensives",
handler = function ()
+ applyBuff( "dampen_harm" )
end,
},
-
+ -- Talent: Removes all Poison and Disease effects from the target.
detox = {
id = 218164,
cast = 0,
@@ -500,197 +1309,209 @@ spec:RegisterAbilities( {
cooldown = 8,
recharge = 8,
gcd = "spell",
+ school = "nature",
spend = 20,
spendType = "energy",
talent = "detox",
startsCombat = false,
- texture = 460692,
+
+ toggle = "interrupts",
+ usable = function () return debuff.dispellable_poison.up or debuff.dispellable_disease.up, "requires dispellable_poison/disease" end,
handler = function ()
- end,
+ removeDebuff( "player", "dispellable_poison" )
+ removeDebuff( "player", "dispellable_disease" )
+ end,nm
},
-
+ -- Talent: Reduces magic damage you take by $m1% for $d, and transfers all currently active harmful magical effects on you back to their original caster if possible.
diffuse_magic = {
id = 122783,
cast = 0,
cooldown = 90,
- gcd = "off",
-
- talent = "diffuse_magic",
- startsCombat = false,
- texture = 775460,
-
- toggle = "cooldowns",
-
- handler = function ()
- end,
- },
-
-
- disable = {
- id = 116095,
- cast = 0,
- cooldown = 0,
- gcd = "spell",
-
- spend = 0.01,
- spendType = "mana",
+ gcd = "off",
+ school = "nature",
- talent = "disable",
+ talent = "diffuse_magic",
startsCombat = false,
- texture = 132316,
+
+ toggle = "interrupts",
+ buff = "dispellable_magic",
handler = function ()
+ removeBuff( "dispellable_magic" )
end,
},
-
- empowered_tiger_lightning = {
- id = 335913,
+ -- Talent: Reduces the target's movement speed by $s1% for $d, duration refreshed by your melee attacks.$?s343731[ Targets already snared will be rooted for $116706d instead.][]
+ disable = {
+ id = 116095,
cast = 0,
cooldown = 0,
- gcd = "off",
+ gcd = "spell",
+ school = "physical",
- talent = "empowered_tiger_lightning",
- startsCombat = false,
- texture = 620832,
+ spend = 15,
+ spendType = "energy",
+
+ talent = "disable",
+ startsCombat = true,
handler = function ()
+ if not debuff.disable.up then applyDebuff( "target", "disable" )
+ else applyDebuff( "target", "disable_root" ) end
end,
},
-
+ -- Expel negative chi from your body, healing for $s1 and dealing $s2% of the amount healed as Nature damage to an enemy within $115129A1 yards.$?s322102[ Draws in the positive chi of all your Healing Spheres to increase the healing of Expel Harm.][]$?s325214[ May be cast during Soothing Mist, and will additionally heal the Soothing Mist target.][]$?s322106[ |cFFFFFFFFGenerates $s3 Chi.]?s342928[ |cFFFFFFFFGenerates ${$s3+$342928s2} Chi.][]
expel_harm = {
id = 322101,
cast = 0,
cooldown = 15,
gcd = "totem",
+ school = "nature",
- spend = 0.03,
- spendType = "mana",
+ spend = 15,
+ spendType = "energy",
- startsCombat = false,
- texture = 627486,
+ startsCombat = true,
handler = function ()
- end,
- },
-
-
- faeline_harmony = {
- id = 391412,
- cast = 0,
- cooldown = 0,
- gcd = "off",
-
- talent = "faeline_harmony",
- startsCombat = false,
- texture = 3636842,
+ gain( ( healing_sphere.count * stat.attack_power ) + stat.spell_power * ( 1 + stat.versatility_atk_mod ), "health" )
+ removeBuff( "gift_of_the_ox" )
+ healing_sphere.count = 0
- handler = function ()
+ gain( pvptalent.reverse_harm.enabled and 2 or 1, "chi" )
end,
},
-
+ -- Talent: Strike the ground fiercely to expose a faeline for $d, dealing $388207s1 Nature damage to up to 5 enemies, and restores $388207s2 health to up to 5 allies within $388207a1 yds caught in the faeline. $?a137024[Up to 5 allies]?a137025[Up to 5 enemies][Stagger is $s3% more effective for $347480d against enemies] caught in the faeline$?a137023[]?a137024[ are healed with an Essence Font bolt][ suffer an additional $388201s1 damage]. Your abilities have a $s2% chance of resetting the cooldown of Faeline Stomp while fighting on a faeline.
faeline_stomp = {
- id = 388193,
+ id = function() return talent.faeline_stomp.enabled and 388193 or 327104 end,
cast = 0,
- charges = 1,
+ -- charges = 1,
cooldown = 30,
- recharge = 30,
+ -- recharge = 30,
gcd = "totem",
+ school = "nature",
spend = 0.04,
spendType = "mana",
talent = "faeline_stomp",
- startsCombat = false,
- texture = 3636842,
+ startsCombat = true,
handler = function ()
- end,
- },
+ applyBuff( "faeline_stomp" )
+ if spec.brewmaster then
+ applyDebuff( "target", "breath_of_fire" )
+ active_dot.breath_of_fire = active_enemies
+ end
- fatal_flying_guillotine = {
- id = 331679,
- cast = 0,
- cooldown = 0,
- gcd = "off",
+ if legendary.fae_exposure.enabled then applyDebuff( "target", "fae_exposure" ) end
+ end,
+ },
- talent = "fatal_flying_guillotine",
- startsCombat = false,
- texture = 606552,
+ -- Talent: Pummels all targets in front of you, dealing ${5*$s5} Physical damage over $113656d to your primary target and ${5*$s5*$s6/100} damage over $113656d to all other enemies. Deals reduced damage beyond $s1 targets. Can be channeled while moving.
+ fists_of_fury = {
+ id = 113656,
+ cast = 4,
+ channeled = true,
+ cooldown = function ()
+ local x = 24 * haste
+ if buff.serenity.up then x = max( 0, x - ( buff.serenity.remains / 2 ) ) end
+ return x
+ end,
+ gcd = "totem",
+ school = "physical",
- handler = function ()
+ spend = function ()
+ if buff.serenity.up then return 0 end
+ return weapons_of_order( 3 )
end,
- },
+ spendType = "chi",
+ cycle = "mark_of_the_crane",
+ aura = "mark_of_the_crane",
- fatal_touch = {
- id = 337296,
- cast = 0,
- cooldown = 0,
- gcd = "off",
+ tick_time = function () return haste end,
- talent = "fatal_touch",
- startsCombat = false,
- texture = 606552,
+ start = function ()
+ removeBuff( "fists_of_flowing_momentum" )
+ removeBuff( "transfer_the_power" )
- handler = function ()
- end,
- },
+ if buff.fury_of_xuen.stack >= 50 then
+ applyBuff( "fury_of_xuen_haste" )
+ summonPet( "xuen", 8 )
+ removeBuff( "fury_of_xuen" )
+ end
+ if talent.whirling_dragon_punch.enabled and cooldown.rising_sun_kick.remains > 0 then
+ applyBuff( "whirling_dragon_punch", min( cooldown.fists_of_fury.remains, cooldown.rising_sun_kick.remains ) )
+ end
- fists_of_fury = {
- id = 113656,
- cast = 0,
- cooldown = 24,
- gcd = "totem",
+ if pvptalent.turbo_fists.enabled then
+ applyDebuff( "target", "heavyhanded_strikes", action.fists_of_fury.cast_time + 2 )
+ end
- spend = 3,
- spendType = "chi",
+ if legendary.pressure_release.enabled then
+ -- TODO: How much to generate? Do we need to queue it? Special buff generator?
+ end
- talent = "fists_of_fury",
- startsCombat = false,
- texture = 627606,
+ if set_bonus.tier29_2pc > 0 then applyBuff( "kicks_of_flowing_momentum", nil, set_bonus.tier29_4pc > 0 and 3 or 2 ) end
+ end,
- handler = function ()
+ tick = function ()
+ if legendary.jade_ignition.enabled then
+ addStack( "chi_energy", nil, active_enemies )
+ end
end,
- },
+ finish = function ()
+ if talent.xuens_battlegear.enabled or legendary.xuens_battlegear.enabled then applyBuff( "pressure_point" ) end
+ end,
+ },
+ -- Talent: Soar forward through the air at high speed for $d. If used again while active, you will land, dealing $123586s1 damage to all enemies within $123586A1 yards and reducing movement speed by $123586s2% for $123586d.
flying_serpent_kick = {
id = 101545,
cast = 0,
cooldown = 25,
gcd = "totem",
+ school = "physical",
talent = "flying_serpent_kick",
startsCombat = false,
- texture = 606545,
handler = function ()
+ if buff.flying_serpent_kick.up then
+ removeBuff( "flying_serpent_kick" )
+ else
+ applyBuff( "flying_serpent_kick" )
+ setCooldown( "global_cooldown", 2 )
+ end
end,
},
-
+ -- Talent: Turns your skin to stone for $120954d$?a388917[, increasing your current and maximum health by $%][]$?s322960[, increasing the effectiveness of Stagger by $322960s1%][]$?a388917[, reducing all damage you take by $%][]$?a388814[, increasing your armor by $388814s2% and dodge chance by $388814s1%][].
fortifying_brew = {
id = 115203,
cast = 0,
- cooldown = 360,
+ cooldown = function() return talent.expeditious_fortification.enabled and 240 or 360 end,
gcd = "off",
+ school = "physical",
talent = "fortifying_brew",
startsCombat = false,
- texture = 615341,
- toggle = "cooldowns",
+ toggle = "defensives",
handler = function ()
+ applyBuff( "fortifying_brew" )
+ if conduit.fortifying_ingredients.enabled then applyBuff( "fortifying_ingredients" ) end
end,
},
@@ -699,361 +1520,541 @@ spec:RegisterAbilities( {
id = 233759,
cast = 0,
cooldown = 45,
- gcd = "totem",
+ gcd = "spell",
pvptalent = "grapple_weapon",
- startsCombat = false,
+
+ startsCombat = true,
texture = 132343,
handler = function ()
+ applyDebuff( "target", "grapple_weapon" )
end,
},
-
- invoke_xuen_the_white_tiger = {
+ -- Talent: Summons an effigy of Xuen, the White Tiger for $d. Xuen attacks your primary target, and strikes 3 enemies within $123996A1 yards every $123999t1 sec with Tiger Lightning for $123996s1 Nature damage.$?s323999[ Every $323999s1 sec, Xuen strikes your enemies with Empowered Tiger Lightning dealing $323999s2% of the damage you have dealt to those targets in the last $323999s1 sec.][]
+ invoke_xuen = {
id = 123904,
cast = 0,
cooldown = 120,
gcd = "totem",
+ school = "nature",
- talent = "invoke_xuen_the_white_tiger",
+ talent = "invoke_xuen",
startsCombat = false,
- texture = 620832,
toggle = "cooldowns",
handler = function ()
+ summonPet( "xuen_the_white_tiger", 24 )
+ applyBuff( "invoke_xuen" )
+
+ if talent.invokers_delight.enabled or legendary.invokers_delight.enabled then
+ if buff.invokers_delight.down then stat.haste = stat.haste + 0.33 end
+ applyBuff( "invokers_delight" )
+ end
end,
- },
+ copy = "invoke_xuen_the_white_tiger"
+ },
+ -- Knocks down all enemies within $A1 yards, stunning them for $d.
leg_sweep = {
id = 119381,
cast = 0,
- cooldown = 60,
+ cooldown = function() return 60 - 10 * talent.tiger_tail_sweep.rank end,
gcd = "spell",
+ school = "physical",
startsCombat = true,
- texture = 642414,
-
- toggle = "cooldowns",
handler = function ()
+ applyDebuff( "target", "leg_sweep" )
+ active_dot.leg_sweep = active_enemies
+ if conduit.dizzying_tumble.enabled then applyDebuff( "target", "dizzying_tumble" ) end
end,
},
-
- mark_of_the_crane = {
- id = 228287,
+ -- Talent: Incapacitates the target for $d. Limit 1. Damage will cancel the effect.
+ paralysis = {
+ id = 115078,
cast = 0,
- cooldown = 0,
- gcd = "off",
+ cooldown = function() return talent.improved_paralysis.enabled and 30 or 45 end,
+ gcd = "spell",
+ school = "physical",
+
+ spend = 20,
+ spendType = "energy",
- talent = "mark_of_the_crane",
+ talent = "paralysis",
startsCombat = false,
- texture = 606543,
handler = function ()
+ applyDebuff( "target", "paralysis" )
end,
},
-
- mighty_ox_kick = {
- id = 202370,
+ -- Taunts the target to attack you$?s328670[ and causes them to move toward you at $116189m3% increased speed.][.]$?s115315[ This ability can be targeted on your Statue of the Black Ox, causing the same effect on all enemies within $118635A1 yards of the statue.][]
+ provoke = {
+ id = 115546,
cast = 0,
- cooldown = 30,
- gcd = "totem",
+ cooldown = 8,
+ gcd = "off",
+ school = "physical",
- pvptalent = "mighty_ox_kick",
startsCombat = false,
- texture = 1381297,
handler = function ()
+ applyDebuff( "target", "provoke" )
end,
},
-
- paralysis = {
- id = 115078,
+ --[[ Deprecated.
+ reverse_harm = {
+ id = 287771,
cast = 0,
- cooldown = 45,
+ cooldown = 10,
gcd = "spell",
- spend = 20,
+ spend = 40,
spendType = "energy",
- talent = "paralysis",
- startsCombat = false,
- texture = 629534,
+ pvptalent = function ()
+ if essence.conflict_and_strife.major then return end
+ return "reverse_harm"
+ end,
- handler = function ()
+ startsCombat = true,
+ texture = 627486,
+
+ indicator = function ()
+ local caption = class.abilities.reverse_harm.caption
+ if caption and caption ~= UnitName( "player" ) then return "cycle" end
end,
- },
+ caption = function ()
+ if not group or not settings.optimize_reverse_harm then return end
+ if reverse_harm_target then return reverse_harm_target end
- provoke = {
- id = 115546,
- cast = 0,
- cooldown = 8,
- gcd = "off",
+ local targetName, dmg = UnitName( "player "), -1
- startsCombat = true,
- texture = 620830,
+ if raid then
+ for i = 1, 5 do
+ local unit = "raid" .. i
- handler = function ()
- end,
- },
+ if UnitExists( unit ) and UnitIsFriend( "player", unit ) then
+ local h, m = UnitHealth( unit ), UnitHealthMax( unit )
+ local deficit = min( m - h, m * 0.08 )
+ if deficit > dmg then
+ targetName = i < 5 and UnitName( "target" ) or nil
+ dmg = deficit
+ end
+ end
+ end
- resuscitate = {
- id = 115178,
- cast = 10,
- cooldown = 0,
- gcd = "spell",
+ elseif group then
+ for i = 1, 5 do
+ local unit = i < 5 and ( "party" .. i ) or "player"
- spend = 0.01,
- spendType = "mana",
+ if UnitExists( unit ) and UnitIsFriend( "player", unit ) then
+ local h, m = UnitHealth( unit ), UnitHealthMax( unit )
+ local deficit = min( m - h, m * 0.08 )
- startsCombat = true,
- texture = 132132,
+ if deficit > dmg then
+ targetName = not UnitIsUnit( "player", unit ) and UnitName( unit ) or nil
+ dmg = deficit
+ end
+ end
+ end
- handler = function ()
+ end
+
+ -- Consider using LibGetFrame to highlight a raid frame.
+ reverse_harm_target = targetName
+ return reverse_harm_target
end,
- },
+ usable = function ()
+ if not group and health.deficit / health.max < 0.02 then return false, "solo and health deficit is too low" end
+ return true
+ end,
+
+ handler = function ()
+ health.actual = min( health.max, health.current + 0.08 * health.max )
+ gain( 1, "chi" )
+ end,
+ }, ]]
+ -- Talent: Form a Ring of Peace at the target location for $d. Enemies that enter will be ejected from the Ring.
ring_of_peace = {
id = 116844,
cast = 0,
cooldown = 45,
gcd = "spell",
+ school = "nature",
talent = "ring_of_peace",
startsCombat = false,
- texture = 839107,
handler = function ()
end,
},
-
+ -- Talent: Kick upwards, dealing $?s137025[${$185099s1*$/$AP}][$185099s1] Physical damage$?s128595[, and reducing the effectiveness of healing on the target for $115804d][].$?a388847[ Applies Renewing Mist for $388847s1 seconds to an ally within $388847r yds][]
rising_sun_kick = {
id = 107428,
cast = 0,
- cooldown = 10,
+ cooldown = function ()
+ local x = 10 * haste
+ if buff.serenity.up then x = max( 0, x - ( buff.serenity.remains / 2 ) ) end
+ return x
+ end,
gcd = "spell",
+ school = "physical",
- spend = 0.02,
- spendType = "mana",
+ spend = function ()
+ if buff.serenity.up then return 0 end
+ return weapons_of_order( 2 )
+ end,
+ spendType = "chi",
talent = "rising_sun_kick",
startsCombat = true,
- texture = 642415,
+ cycle = "mark_of_the_crane",
handler = function ()
+ applyDebuff( "target", "mark_of_the_crane" )
+ applyDebuff( "target", "rising_sun_kick" )
+
+ if buff.kicks_of_flowing_momentum.up then
+ removeStack( "kicks_of_flowing_momentum" )
+ if set_bonus.tier29_4pc > 0 then addStack( "fists_of_flowing_momentum" ) end
+ end
+
+ if talent.transfer_the_power.enabled then addStack( "transfer_the_power", nil, 1 ) end
+
+ if talent.whirling_dragon_punch.enabled and cooldown.fists_of_fury.remains > 0 then
+ applyBuff( "whirling_dragon_punch", min( cooldown.fists_of_fury.remains, cooldown.rising_sun_kick.remains ) )
+ end
+
+ if azerite.sunrise_technique.enabled then applyDebuff( "target", "sunrise_technique" ) end
+
+ if buff.weapons_of_order.up then
+ applyBuff( "weapons_of_order_ww" )
+ state:QueueAuraExpiration( "weapons_of_order_ww", noop, buff.weapons_of_order_ww.expires )
+ end
end,
},
-
+ -- Roll a short distance.
roll = {
id = 109132,
cast = 0,
- charges = 1,
- cooldown = 20,
- recharge = 20,
+ charges = function ()
+ local n = 1 + ( talent.celerity.enabled and 1 or 0 ) + ( legendary.roll_out.enabled and 1 or 0 )
+ if n > 1 then return n end
+ return nil
+ end,
+ cooldown = function () return talent.celerity.enabled and 15 or 20 end,
+ recharge = function () return talent.celerity.enabled and 15 or 20 end,
gcd = "off",
+ school = "physical",
- talent = "roll",
startsCombat = false,
- texture = 574574,
+ notalent = "chi_torpedo",
handler = function ()
+ if azerite.exit_strategy.enabled then applyBuff( "exit_strategy" ) end
end,
},
-
+ -- Talent: Summons a whirling tornado around you, causing ${(1+$d/$t1)*$148187s1} Physical damage over $d to all enemies within $107270A1 yards. Deals reduced damage beyond $s1 targets.
rushing_jade_wind = {
id = 116847,
cast = 0,
- cooldown = 6,
+ cooldown = function ()
+ local x = 6 * haste
+ if buff.serenity.up then x = max( 0, x - ( buff.serenity.remains / 2 ) ) end
+ return x
+ end,
gcd = "spell",
+ school = "nature",
- spend = 1,
+ spend = function() return weapons_of_order( 1 ) end,
spendType = "chi",
talent = "rushing_jade_wind",
startsCombat = false,
- texture = 606549,
handler = function ()
+ applyBuff( "rushing_jade_wind" )
+ if talent.transfer_the_power.enabled then addStack( "transfer_the_power", nil, 1 ) end
end,
},
-
+ -- Talent: Enter an elevated state of mental and physical serenity for $?s115069[$s1 sec][$d]. While in this state, you deal $s2% increased damage and healing, and all Chi consumers are free and cool down $s4% more quickly.
serenity = {
id = 152173,
cast = 0,
- cooldown = 90,
+ cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * 90 end,
gcd = "off",
+ school = "physical",
talent = "serenity",
startsCombat = false,
- texture = 988197,
toggle = "cooldowns",
handler = function ()
+ applyBuff( "serenity" )
+ setCooldown( "fists_of_fury", cooldown.fists_of_fury.remains - ( cooldown.fists_of_fury.remains / 2 ) )
+ setCooldown( "rising_sun_kick", cooldown.rising_sun_kick.remains - ( cooldown.rising_sun_kick.remains / 2 ) )
+ setCooldown( "rushing_jade_wind", cooldown.rushing_jade_wind.remains - ( cooldown.rushing_jade_wind.remains / 2 ) )
+ if conduit.coordinated_offensive.enabled then applyBuff( "coordinated_offensive" ) end
end,
},
-
+ -- Talent: Heals the target for $o1 over $d. While channeling, Enveloping Mist$?s227344[, Surging Mist,][]$?s124081[, Zen Pulse,][] and Vivify may be cast instantly on the target.$?s117907[ Each heal has a chance to cause a Gust of Mists on the target.][]$?s388477[ Soothing Mist heals a second injured ally within $388478A2 yds for $388477s1% of the amount healed.][]
soothing_mist = {
id = 115175,
- cast = 0,
+ cast = 8,
+ channeled = true,
+ hasteCD = true,
cooldown = 0,
gcd = "totem",
-
- spend = 0,
- spendType = "mana",
+ school = "nature",
talent = "soothing_mist",
startsCombat = false,
- texture = 606550,
handler = function ()
+ applyBuff( "soothing_mist" )
end,
},
-
+ -- Talent: Jabs the target in the throat, interrupting spellcasting and preventing any spell from that school of magic from being cast for $d.
spear_hand_strike = {
id = 116705,
cast = 0,
cooldown = 15,
gcd = "off",
+ school = "physical",
talent = "spear_hand_strike",
- startsCombat = false,
- texture = 608940,
+ startsCombat = true,
+
+ toggle = "interrupts",
+
+ debuff = "casting",
+ readyTime = state.timeToInterrupt,
handler = function ()
+ interrupt()
end,
},
-
+ -- Spin while kicking in the air, dealing $?s137025[${4*$107270s1*$/$AP}][${4*$107270s1}] Physical damage over $d to all enemies within $107270A1 yds. Deals reduced damage beyond $s1 targets.$?a220357[ Spinning Crane Kick's damage is increased by $220358s1% for each unique target you've struck in the last $220358d with Tiger Palm, Blackout Kick, or Rising Sun Kick. Stacks up to $228287i times.][]
spinning_crane_kick = {
id = 101546,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "physical",
- spend = 2,
+ spend = function () return buff.dance_of_chiji.up and 0 or weapons_of_order( 2 ) end,
spendType = "chi",
- startsCombat = false,
- texture = 606543,
+ startsCombat = true,
+
+ usable = function ()
+ if settings.check_sck_range and target.outside8 then return false, "target is outside of melee range" end
+ return true
+ end,
handler = function ()
+ removeBuff( "chi_energy" )
+ removeBuff( "dance_of_chiji" )
+
+ if buff.kicks_of_flowing_momentum.up then
+ removeStack( "kicks_of_flowing_momentum" )
+ if set_bonus.tier29_4pc > 0 then addStack( "fists_of_flowing_momentum" ) end
+ end
+
+ applyBuff( "spinning_crane_kick" )
+
+ if debuff.bonedust_brew.up or active_dot.bonedust_brew > 0 and active_enemies > 1 then
+ gain( 1, "chi" )
+ end
end,
},
-
+ -- Talent: Split into 3 elemental spirits for $d, each spirit dealing ${100+$m1}% of normal damage and healing. You directly control the Storm spirit, while Earth and Fire spirits mimic your attacks on nearby enemies. While active, casting Storm, Earth, and Fire again will cause the spirits to fixate on your target.
storm_earth_and_fire = {
id = 137639,
cast = 0,
charges = 2,
- cooldown = 90,
- recharge = 90,
+ cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * 90 end,
+ recharge = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * 90 end,
+ icd = 1,
gcd = "off",
+ school = "nature",
talent = "storm_earth_and_fire",
+ notalent = "serenity",
startsCombat = false,
- texture = 136038,
- toggle = "cooldowns",
+ toggle = function ()
+ if settings.sef_one_charge then
+ if cooldown.storm_earth_and_fire.true_time_to_max_charges > gcd.max then return "cooldowns" end
+ return
+ end
+ return "cooldowns"
+ end,
handler = function ()
+ -- trigger storm_earth_and_fire_fixate [221771]
+ applyBuff( "storm_earth_and_fire" )
end,
+
+ bind = "storm_earth_and_fire_fixate"
},
+ storm_earth_and_fire_fixate = {
+ id = 221771,
+ known = 137639,
+ cast = 0,
+ cooldown = 0,
+ icd = 1,
+ gcd = "spell",
+
+ startsCombat = true,
+ texture = 236188,
+
+ notalent = "serenity",
+ buff = "storm_earth_and_fire",
+
+ usable = function ()
+ if buff.storm_earth_and_fire.down then return false, "spirits are not active" end
+ return action.storm_earth_and_fire_fixate.lastCast < action.storm_earth_and_fire.lastCast, "spirits are already fixated"
+ end,
+
+ bind = "storm_earth_and_fire",
+ },
+
+ -- Talent: Strike with both fists at all enemies in front of you, dealing ${$395519s1+$395521s1} damage and reducing movement speed by $s2% for $d.
strike_of_the_windlord = {
id = 392983,
cast = 0,
cooldown = 40,
gcd = "totem",
+ school = "physical",
spend = 2,
spendType = "chi",
talent = "strike_of_the_windlord",
- startsCombat = false,
- texture = 1282595,
+ startsCombat = true,
handler = function ()
+ applyDebuff( "target", "strike_of_the_windlord" )
+ if talent.thunderfist.enabled then addStack( "thunderfist", nil, true_active_enemies ) end
end,
},
-
+ -- Talent: Summons a Black Ox Statue at the target location for $d, pulsing threat to all enemies within $163178A1 yards. You may cast Provoke on the statue to taunt all enemies near the statue.
summon_black_ox_statue = {
id = 115315,
cast = 0,
cooldown = 10,
gcd = "totem",
+ school = "physical",
talent = "summon_black_ox_statue",
startsCombat = false,
- texture = 627607,
handler = function ()
+ summonTotem( "black_ox_statue" )
end,
},
-
+ -- Talent: Summons a Jade Serpent Statue at the target location. When you channel Soothing Mist, the statue will also begin to channel Soothing Mist on your target, healing for $198533o1 over $198533d.
summon_jade_serpent_statue = {
id = 115313,
cast = 0,
cooldown = 10,
gcd = "spell",
+ school = "nature",
talent = "summon_jade_serpent_statue",
startsCombat = false,
- texture = 620831,
handler = function ()
+ summonTotem( "jade_serpent_statue" )
end,
},
-
+ -- Talent: Summons a White Tiger Statue at the target location for $d, pulsing $389541s1 damage to all enemies every 2 sec for $d.
summon_white_tiger_statue = {
id = 388686,
cast = 0,
cooldown = 120,
gcd = "totem",
+ school = "physical",
talent = "summon_white_tiger_statue",
startsCombat = false,
- texture = 4667418,
toggle = "cooldowns",
handler = function ()
+ summonTotem( "white_tiger_statue" )
end,
},
-
+ -- Strike with the palm of your hand, dealing $s1 Physical damage.$?a137384[ Tiger Palm has an $137384m1% chance to make your next Blackout Kick cost no Chi.][]$?a137023[ Reduces the remaining cooldown on your Brews by $s3 sec.][]$?a129914[ |cFFFFFFFFGenerates 3 Chi.]?a137025[ |cFFFFFFFFGenerates $s2 Chi.][]
tiger_palm = {
id = 100780,
cast = 0,
cooldown = 0,
gcd = "spell",
+ school = "physical",
spend = 50,
spendType = "energy",
startsCombat = true,
- texture = 606551,
+ cycle = function ()
+ if legendary.keefers_skyreach.enabled and debuff.skyreach_exhaustion.up and active_dot.skyreach_exhaustion < cycle_enemies then return "skyreach_exhaustion" end
+ return "mark_of_the_crane"
+ end,
+
+ buff = function () return prev_gcd[1].tiger_palm and buff.hit_combo.up and "hit_combo" or nil end,
handler = function ()
+ gain( 2, "chi" )
+ applyDebuff( "target", "mark_of_the_crane" )
+
+ if talent.eye_of_the_tiger.enabled then
+ applyDebuff( "target", "eye_of_the_tiger" )
+ applyBuff( "eye_of_the_tiger" )
+ end
+ if ( legendary.keefers_skyreach.enabled or talent.skyreach.enabled ) and debuff.skyreach_exhaustion.down then
+ if target.distance > 10 then setDistance( 5 ) end
+ applyDebuff( "target", "skyreach" )
+ applyDebuff( "player", "skyreach_exhaustion" )
+ end
+ if talent.teachings_of_the_monastery.enabled then addStack( "teachings_of_the_monastery" ) end
+
+
+ if pvptalent.alpha_tiger.enabled and debuff.recently_challenged.down then
+ if buff.alpha_tiger.down then
+ stat.haste = stat.haste + 0.10
+ applyBuff( "alpha_tiger" )
+ applyDebuff( "target", "recently_challenged" )
+ end
+ end
end,
},
@@ -1064,146 +2065,262 @@ spec:RegisterAbilities( {
cooldown = 1,
gcd = "spell",
- pvptalent = "tigereye_brew",
startsCombat = false,
texture = 613399,
+ buff = "tigereye_brew_stack",
+ pvptalent = "tigereye_brew",
+
handler = function ()
+ applyBuff( "tigereye_brew", 2 * min( 10, buff.tigereye_brew_stack.stack ) )
+ removeStack( "tigereye_brew_stack", min( 10, buff.tigereye_brew_stack.stack ) )
end,
},
-
+ -- Talent: Increases a friendly target's movement speed by $s1% for $d and removes all roots and snares.
tigers_lust = {
id = 116841,
cast = 0,
cooldown = 30,
gcd = "spell",
+ school = "physical",
talent = "tigers_lust",
startsCombat = false,
- texture = 651727,
handler = function ()
+ applyBuff( "tigers_lust" )
end,
},
-
+ -- You exploit the enemy target's weakest point, instantly killing $?s322113[creatures if they have less health than you.][them. Only usable on creatures that have less health than you]$?s322113[ Deals damage equal to $s3% of your maximum health against players and stronger creatures under $s2% health.][.]$?s325095[ Reduces delayed Stagger damage by $325095s1% of damage dealt.]?s325215[ Spawns $325215s1 Chi Spheres, granting 1 Chi when you walk through them.]?s344360[ Increases the Monk's Physical damage by $344361s1% for $344361d.][]
touch_of_death = {
id = 322109,
cast = 0,
- cooldown = 180,
+ cooldown = function () return ( talent.fatal_touch.enabled or legendary.fatal_touch.enabled ) and 60 or 180
+ end,
gcd = "spell",
+ school = "physical",
startsCombat = true,
- texture = 606552,
toggle = "cooldowns",
+ cycle = "touch_of_death",
+
+ -- Non-players can be executed as soon as their current health is below player's max health.
+ -- All targets can be executed under 15%, however only at 35% damage.
+ usable = function ()
+ return ( talent.improved_touch_of_death.enabled and target.health.pct < 15 ) or ( target.class == "npc" and target.health_current < health.max ), "requires low health target"
+ end,
handler = function ()
+ applyDebuff( "target", "touch_of_death" )
+ if talent.forbidden_technique.enabled and buff.recently_touched.down then
+ setCooldown( "touch_of_death", 0 )
+ applyBuff( "recently_touched" )
+ end
end,
},
-
+ -- Talent: Absorbs all damage taken for $d, up to $s3% of your maximum health, and redirects $s4% of that amount to the enemy target as Nature damage over $124280d.
touch_of_karma = {
id = 122470,
cast = 0,
cooldown = 90,
gcd = "off",
+ school = "physical",
talent = "touch_of_karma",
- startsCombat = false,
- texture = 651728,
+ startsCombat = true,
- toggle = "cooldowns",
+ toggle = "defensives",
+
+ usable = function ()
+ return incoming_damage_3s >= health.max * ( settings.tok_damage or 20 ) / 100, "incoming damage not sufficient (" .. ( settings.tok_damage or 20 ) .. "% / 3 sec) to use"
+ end,
handler = function ()
+ applyBuff( "touch_of_karma" )
+ applyDebuff( "target", "touch_of_karma_debuff" )
end,
},
-
+ -- Talent: Split your body and spirit, leaving your spirit behind for $d. Use Transcendence: Transfer to swap locations with your spirit.
transcendence = {
id = 101643,
cast = 0,
cooldown = 10,
gcd = "spell",
+ school = "nature",
talent = "transcendence",
startsCombat = false,
- texture = 627608,
handler = function ()
+ applyBuff( "transcendence" )
end,
},
+ transcendence_transfer = {
+ id = 119996,
+ cast = 0,
+ cooldown = function () return buff.escape_from_reality.up and 0 or 45 end,
+ gcd = "spell",
+
+ startsCombat = false,
+ texture = 237585,
+
+ buff = "transcendence",
+
+ handler = function ()
+ if buff.escape_from_reality.up then removeBuff( "escape_from_reality" )
+ elseif legendary.escape_from_reality.enabled then
+ applyBuff( "escape_from_reality" )
+ end
+ end,
+ },
+
+ -- Causes a surge of invigorating mists, healing the target for $s1$?s274586[ and all allies with your Renewing Mist active for $s2][].
vivify = {
id = 116670,
- cast = 1.5,
+ cast = function() return buff.vivacious_vivification.up and 0 or 1.5 end,
cooldown = 0,
gcd = "spell",
+ school = "nature",
- spend = 30,
- spendType = "energy",
+ spend = 0.038,
+ spendType = "mana",
startsCombat = false,
- texture = 1360980,
handler = function ()
+ removeBuff( "vivacious_vivification" )
end,
},
-
+ -- Talent: Performs a devastating whirling upward strike, dealing ${3*$158221s1} damage to all nearby enemies. Only usable while both Fists of Fury and Rising Sun Kick are on cooldown.
whirling_dragon_punch = {
id = 152175,
cast = 0,
cooldown = 24,
gcd = "totem",
+ school = "physical",
talent = "whirling_dragon_punch",
startsCombat = false,
- texture = 988194,
+
+ usable = function ()
+ if settings.check_wdp_range and target.outside8 then return false, "target is outside of melee range" end
+ return cooldown.fists_of_fury.remains > 0 and cooldown.rising_sun_kick.remains > 0, "requires fists_of_fury and rising_sun_kick on cooldown"
+ end,
handler = function ()
end,
},
-
+ -- You fly through the air at a quick speed on a meditative cloud.
zen_flight = {
id = 125883,
cast = 0,
cooldown = 0,
gcd = "totem",
+ school = "nature",
startsCombat = false,
- texture = 660248,
handler = function ()
+ applyBuff( "zen_flight" )
end,
},
+} )
+spec:RegisterOptions( {
+ enabled = true,
- zen_pilgrimage = {
- id = 126892,
- cast = 10,
- cooldown = 60,
- gcd = "totem",
+ aoe = 2,
+ cycle = true,
- startsCombat = false,
- texture = 775462,
+ nameplates = true,
+ nameplateRange = 8,
- toggle = "cooldowns",
+ damage = true,
+ damageExpiration = 8,
- handler = function ()
- end,
- },
+ potion = "potion_of_spectral_agility",
+
+ package = "Windwalker",
+
+ strict = false
+} )
+
+spec:RegisterSetting( "allow_fsk", false, {
+ name = "Use |T606545:0|t Flying Serpent Kick",
+ desc = "If unchecked, |T606545:0|t Flying Serpent Kick will not be recommended (this is the same as disabling the ability via Windwalker > Abilities > Flying Serpent Kick > Disable).",
+ type = "toggle",
+ width = "full",
+ get = function () return not Hekili.DB.profile.specs[ 269 ].abilities.flying_serpent_kick.disabled end,
+ set = function ( _, val )
+ Hekili.DB.profile.specs[ 269 ].abilities.flying_serpent_kick.disabled = not val
+ end,
+} )
+
+--[[ Deprecated.
+spec:RegisterSetting( "optimize_reverse_harm", false, {
+ name = "Optimize |T627486:0|t Reverse Harm",
+ desc = "If checked, |T627486:0|t Reverse Harm's caption will show the recommended target's name.",
+ type = "toggle",
+ width = "full",
+} ) ]]
+
+spec:RegisterSetting( "sef_one_charge", false, {
+ name = "Reserve One |T136038:0|t Storm, Earth, and Fire Charge as CD",
+ desc = "If checked, |T136038:0|t when Storm, Earth, and Fire's toggle is set to Default, only one charge will be reserved for use with the Cooldowns toggle.",
+ type = "toggle",
+ width = "full",
+} )
+
+spec:RegisterSetting( "tok_damage", 1, {
+ name = "Required Damage for |T651728:0|t Touch of Karma",
+ desc = "If set above zero, |T651728:0|t Touch of Karma will only be recommended while you have taken this percentage of your maximum health in damage in the past 3 seconds.",
+ type = "range",
+ min = 0,
+ max = 99,
+ step = 0.1,
+ width = "full",
} )
-spec:RegisterPriority( "Windwalker", 20220918,
--- Notes
-[[
+spec:RegisterSetting( "check_wdp_range", false, {
+ name = "Check |T988194:0|t Whirling Dragon Punch Range",
+ desc = "If checked, when your target is outside of |T988194:0|t Whirling Dragon Punch's range, it will not be recommended.",
+ type = "toggle",
+ width = "full"
+} )
+
+spec:RegisterSetting( "check_sck_range", false, {
+ name = "Check |T606543:0|t Spinning Crane Kick Range",
+ desc = "If checked, when your target is outside of |T606543:0|t Spinning Crane Kick's range, it will not be recommended.",
+ type = "toggle",
+ width = "full"
+} )
+
+spec:RegisterSetting( "use_diffuse", false, {
+ name = "Use |T775460:0|t Diffuse Magic to Self-Dispel",
+ desc = function()
+ local t = class.abilities.diffuse_magic.toggle
+
+ if t then
+ local active = Hekili.DB.profile.toggles[ t ].value
+
+ return "If checked, when you have a dispellable magic debuff, |T775460:0|t Diffuse Magic can be recommended in the default Windwalker priority.\n\n" ..
+ "Requires " .. ( active and "|cFF00FF00" or "|cFFFF0000" ) .. t:gsub("^%l", string.upper) .. "|r Toggle"
+ end
+
+ return "If checked, when you have a dispellable magic debuff, |T775460:0|t Diffuse Magic can be recommended in the default Windwalker priority."
+ end,
+ type = "toggle",
+ width = "full"
+} )
-]],
--- Priority
-[[
-]] )
\ No newline at end of file
+spec:RegisterPack( "Windwalker", 20221029, [[Hekili:T3ZAVnUrs(BX4ayKMhAfPS8yVqsaBYLCxgSyYIZ5WEFYu0IusmwIulf14Xhe0V9RFXMD3SQUjLL3DdU9ljZiswD9(vxDpp4)WV(W9XrLjp8LGHbb(ddUBG)n(3n(tpCF5l7sE4(DrlEkAf5pKfTL8F)RPzXphT5PKc6JEztEumfe7ZpuSG84hU)XdPBk)5ShEegUJjV7UKfKF(M7E4(1PXXj83nz)c6NVjDF5EkeZ3LKrwKF9HVWWXKSOh3Ke)W3)W9rlktZZi)032LSjCDuXw(NxKUJ)GFH)P3t(LYKI0icPeTjjRCWI1PHpEOyF5ab4on370CYVoyB03on)JS)8P5ZMEA(Ohkj4iYkxMUkPiCx0MTQlYI8TpMhUVSi9PeCa3708GtZF)P5pEy5Yb7YFMaj(3SFWHDNM3NaOxwSjjSmQyvcHxqOFcQmYavuwwZvHSib14kLMFo6RjuGCnfiqSVAatERXDJQVCezjr3iPijlT8fi5UMm(EXlEA(FPinVG(jseLVsH5ldlxNe(mrJDtErSnb6JBiA55hkdFkDXtQuhd)ltIiuw2Q9vGCBEw0EYB8YG9LKpKXYh1z5MP6spb7kokBbd7jl6VLY4xKNsr1VMes0S3MMSNWMzS4JhpnF)U0Smc6fUOiklHrcd2MhNUmnPG)Ed(egigXKfsgxtijvBaPbg(wjZguKSnknJa4jAAGlPM0u6z5HIxGuWQHxdmKZyRG0ZRtl2qXV4IOv5zH7oKTynfI3Gixls3tF99hYAizBW(nx7jmUJNqOq)CorSj)zkm3MVL4s5WwI8bwY)jdCI7)uNzuBLsL5Bcf)vYxF7fGI6bsuJ5AncxIGS0A3JiEJUR9A1WQ0o158h2vt1gRSGc3gv8uLHlBn0C(FfI9d1JgIvhmlX30Dvhu1iq1N9Gwyk77M1z6LRgtOuBsz4J5zh2pOKa0G7cd2TGRratRsfVd7P(ad)TOyUpv2sz6ERtsjegPP7g7XFeszl(Ovf3T0F(em)5KqulIdTfLskCoSLa2qI9vjbgmuNa8YdjObY(H88nX5pNTxL82Luo4BhsY4HYQb2aU0ckOMM4(RrK)e5jdwtaEifssnW8SbefHK4d7jAefjpp4PmYQZZCrGkgVqTd(Ps)iltxTUmuZ1)4AUqA2xZjHIPRR9OH4O6voX2EkiSH)r9ysCmUgGpNeTlpJPgqsqGWufWS)zqA4bjjOxruACyYxPkQrXX7hKMXmVUwWdnFmlfjDbHn6k5BjloWum2MO)vk4ydfijeMXZxBilHn6)7DSFO4qwYYCIUVakf7dJt2qzj1wukbsWFP(vetpgVVgUu0AFyzrs0(dfnCllGl)LEmQSCtYQKOc9fxsPAXvRPnuj5ifjPPAG9CuUs4frxBuKLMQQOmVi6Z0q2MzmrJaGAqnAid2gpG(jdTqH(8VIuz2MhjURhSjjko8Xxct(w02DBKSBfF2QeeuwvT2RKb52wTqkglmq1uQG)sn9aaYxral9xdKwM98NAYZVrGKi6a4YcL8SlZpSynvDlojQCnu6E1yvtm4UHOlZnaRXtKk8IKjTjtkpAdHdl031R)RrQxy57JtVbdvtfippwM7VL0KolGt84Ku8eX1yDMpvpJ5gAF4VDiEfnvDtQepw05GiltlsyukykmVoyttEMOwgTjCbrQXwaC3tNZc8y0kwQqf0ICyWh30x6pzhrV)aj)OKIdSuzm9F70hrv6ysKnUkGoGTf9zkC7nj7xtY6DzjdBnTPRdrts06qj93d)BhIOLRrm5(AkTtvNhhJxeNf4srhSA3irVkxtOMiwCY0T7ipalhigNJK)4H9ju5s2tjLNPx1aH7IMPxvroG4fLqWlZRl8SkYNskKVF7EL8OxErsHUmVy7hon)hP0bj5UmIo4prSh)9yk1OLTpQQLIIUIGuZ20gVzW5Lp7VFsvxJT8VYp))VNFUBnq0mSDAJsuj013U2AYGCgLUXcXNNu3UtDEQ2Y2fwYn6B6dGt9oJlFwrzQRTH6moKfsjK4joKMy0GLh2SHWWxSM2lfHDGAFNb(g7fGWvvXz784tqOIZxqlHAlTLJkNeQVUWMowsNTv0q57nS6p8cLSsRxGWGbigQIQVmcJake5AA8VzOz13wL61Lv)wAU4JMuMQs1B3YpsHcFl5KJu8pIAoYdaP4pGwMJyVqcPBimFBHd5zR(y8JeNOLh21P6MNuNiC3YsXotzQmvfgj2ilLQmJDKfJQHrJ3515M9S0p6(YyKoes4EQ19DncnPr9G7hLga8dCh5OdBqL7U8aYeIvuwCOrzjdbR(VT2XilDPbjB2rdXYMfPTqqTRPBLw)2496g0GN3I2ASwx8o2ic8pUI39SefaY)2zuOVTPuOJy8ilr2WfnYSq0BwiErB)DaVu7GSrFgh3H(mINe7FpOb0wuARp4V5OLJUBIhv3U)yBD0epIWBqhnTgWOBD3SK2SRLrh2ukBvMm43oYseUMUcvBOUMQhExSi5pvs3a8bupuXPlxs()1Wv8dHBJwLUaQxq57yGO(lQK80)0gA)5oJTWPZQDgQvaAAFSRqLAXeilXONKiKD6uvJOz8N60MASbFEwFQ(E55m9tOeWM0aH8ohWi2iY2IjQjcpSflPkN2aD5Laq0Ke55xh9cO7DU1ark0uuLAlPQjADszISTRaMWQu2TnOdANUb6ALT0yj)NVrhGw9ED)tSF8080LNMFG2YrwtUlItZi)mrV8xwUmjBpZB0I8S4dPL6U2z)0Gf1FcXnP4l0uUrAaHZUYaVXaoR)dOjjtPj6zq9)LCrmdbFBh)Vd0TcTp77pKUHqw)avigrsfJy)tOWscMCAE(skNA7JrL2Q)K6FDbnmIk5kn8UwthzCv8ceNhAvZkgZzGszRtjpHuqucXfF(2DM8d(SVM()sWJFI)ENMFp9f5Ai72e9cth55u6oJiFL)ZOIT5zVqO(ItZ)s6lrKVsef0ATsnD5jjwRZerDpLROM1CmaSv1wFhz06vf5FnjK4wpDvErKE86QsUXNNtlHO7dvaP(goreAX0(6tYCHazQeC1l2uFAzVZQEibzipHZ3nFMITLMI0EkofkqfO6dLyx1qWBqu)37teMiFp9PeProrWLSNw7IUUfq321usH6QH(lOgJQ3j4bLN36vtPi)bS8fG(OaWpsRf4imzWQD1yqkBMyhDu0sFblKXjSmcNOaszLXrpZvREUyAudiYuk(hon)FNNpk0O33sgIDnzvScByqTsA0UyuUU4ap95DKuC4o4ntG(XC6Uwrm(jUjtIzJ1Dz(3sZCKhT7Kps(Bhs3TljEaEZg4kXYxC1MO40iItj6EPfVY8Xpt8WTMy7Kz(aIpWcE6kXe)yPBJyBfxsXlgV3(1reD3vfr73rOXYKTgpNMsSWIiDv6gJNUiAXA28BhTG8tfK1QAxb3RMQdqFpKLpauCJox2sT(IaRclELEYuFewasUsZ(d3pfKNXQSCuFc7q0OHYLkAAwgJbWwAAyFjnP(tSpAVPl2gZLT1Y7GDAcx6P2S4JEWzWBqu3wR6Ny)avuHrMh3b76jxOZEaww6gNDdd3zM9Tp8zoZfAg3VeNxfSnCaEfXgrkuAc6CcadASexFThQQz8dYw3o)jMQJtAXOYGRPscD81WvlIh4pasxPfgo80WC4kqZpiAl3B1zQax1GRpcMF0e8ZVMLmrqpaBWtfRvKQpCEBx2ZfJJj(eudOfR8DveFDAET50Oq5jkjgYIp)in7JvSGRX7TxoZm(wP5(07HMc1frFcrRbZfAxCW1RDJzKxlNAjTEmInosiKdElpySMgNnQ6M9cj2(Kc)a8uvH3BEa3BvJsqLQ36dzePdLaBoKhw8t9w5fxMpGK3JoQCE6nCergPB3aVFXsHoMa1maIZWH4djic(gFG3uc246nCWTiwXmUJCum4LVpG2yjsw6HSYBNzoaHFeVe4j1LhJ3Ld1ovQd53xHnW7Ad0ltFZ4KM(pdf)iMhIGx)57ekk2EsbbBQwkJoqaPoHGCooKcW27oSQd6wKu0yHVYyg30MWA0mVgCDBIUe0Hd4owVVum)061jf8oojfuxojB3LuqlCEr0UOfPevEzgKeEgp6ChmSALRQgFR0KZngDDdpDGNGEENvr3akTWz4ZmKeqCwm6eibBXpwFSSki0WgPInBFVPQembvhV1iatXaERAUCxWeFjWYMXd2dYA6qVxdbw2(8U2mtp0qlvt0rxB1PEJlKT0i4w3904lbyHgBPG88ex16aw2CFW7xd8XGcwhJs2cVb12K0jy4Jm1931KL6eZAypBZTrqlIkv9IA242oHbJAlqvpBiYkJDVeZA7smXCjU2EMkiUMNOESvWfB(Gdc2eTmSrIBncRk73u1CeDylzg4WRuuXckvr0mlOJEefywp4oIOaaJPOsq4nVW0csk2rGPipS0mcqOZfZd3xDv9OUHtNZ100pk2(SFuS9zUOABjjpPoNyRbvfgviG462QJ7pyCxIaRE8lW3aqPUoBiT2qEM(p34e8WvPa6eSDD5ww4MIBLlIU)VVfFGwULQtJUfta9ZwHXSjiE2P5Fp5HNMFpdyQnITvhfeBQbDPPlsiogXxvNu1ANQdstEX6BvNihhkd4zqbkUjc8VsSaPOb7ETB4TKsfV)5OcQaIum5F9p9F9LF(l)h)XtZpn)xPdzs62D50PmzjDql(UkD6VJUX68nsJoqd06hIoqk5HpcplwhLTIy1C6Z)z2EUF7FKoJpzKfM94VtusW)Z3X3IE5FVQ2aYV3Z)B9LFV)WxlaU(SbWPp7GLOSl0DJRCo4uGcrz(91nquccLFcdkJnGIC6uKaP(xuGbDiK(XF5pBWNV5mijn5KjaAj20jz1YFpkMotgdSyY)UZdATLnlg33UXNh9k5ZFQ7Fpm3516TY87BVa3gu6MisiN97oPGOXe86HKt1MQrrOB6n(VwfhFtxGTba(2aW5jX9VyAW(Vwv4GZqCRdGZXRzLAYpZ0kOF2Dv17DAo7A1L8y60qLVmDJCA)3pqoEuVF6FaBGOo9zO3UASN(aD6FMcm8pFiF3usYXFGnvutBXqrD8i6arP8O6HHs5hrhekL3PXqqP8mJbGs5jwg(jy(s9iob)86kI)q6YPK0GNuLwm4Rl7Hh9TVsubp0axI(1028rvnepFAJdoI8rKpq70FqxsOdlI6hORgihBFDH)vcvwlhdJJh7YH1yMwxFoEu7V(XUaPj(bd961tGGvzJ6PbWzO1L6H(Kz(d7F8yVUEgmMOTWED9ZN5p29QkoGdth6a8vCinuQFFhsFssI6cF5Iy20dhlVanNe4rnsgD8iqNtQqXBp95)n61(txpEeQ0ILJHbZsTnNEcpS61POh)8lOUK8tWaf694nzUEOyfKlYXMOVUc6KP3mKTeT7SoOIcMJslxsYpycFGp(Ut9Pyit78AMSyS3vg2lC67YFEeuXunNECjsD9(ggSemeSpBE9qpmchpkOPg)ULdDWXJ6nqyYip77wqFgNc8ie4wQO20vw4ayAK)Zgt4U4xvpCoumP9Z9Vg6PgucpMuTbo4baWRNiY3hj))zt9905Lt9jXeuFHaJxG8l9HjwgPjNyF3mwETTAQ7n1WBfq4VSUHdGPI9jQ39AbUqnfWUatvvd00dOEpG6gzDIfYUDovtLJLLaSBppMC7AaqqqjJo59bTEUXPinlCgSgddR6gq2gWOOsDHqnRnASPARGF3IRUUA8JRJof9AXJIuUoJYgaJqPwYqIzf08uD7jS3b2fjpKq9YOuJ961WFjtomY0rk5N4pjOVr2DtcgFzOJRSqi9CTROtcoEScaWtvrFbLbGSMFalbGMtbWSRhF8yZ7RJ(Eoro1PtXRlzdpRxWW3hm8D9WVF5KXjnFq)(E9UcBsmLzmyokNk59dA80q8pcs8dfVvj2eOi2aSdDP9ETWBgyIO0aSnUQ3iQiyogb02Dy7euzp41ZHzEhlLQR1y0hG)3iGqpKCtSLuRLhklwZhldBAzpiRzdbTEUI(dXGPqG3qfK(fixTAa8g4qVYWnwsK7v4PnWq)E2nd9AxzHZgQO)ytyqRW9sRl6tw8MUQPY2l9cnQ)LNFmYrrB9HmDWCDze0ByD8g7bSSwYFGadbo5q8iWOHZ8CUB5D2rshfzDf89DKw2KP3jCPQqB2UaYMm1paqaQF7C1i3Wg2H2usIzYslcAKGpaUOG01uVGVOikqohJgcLZbaSQUqN5UZsr7QBlYlTJkc30Wd(TdBKK4qNOmJ1)O(9HLEUIan1UJOAWqpx3ExmtBGlpPpZMDyi0F))eXsRVYU4k(Dynhbs3TBvLxixVrRQpusMgx1xq2xPIlzR3k0cIzOFfA9gTYWIb17zR6oqGoPSamm5MLW6Ia2DXL3vou3D01npaNMCmYOBmy1DZF(LS4BoepVkxFf5fo2z10VgeRDzOC(Lu3EK)FvI9LSeBjBTrDEyTzVozn1T0O5VkJ30qXeOoTxrHyskq25u3wSDmgkT2LwTrNoc1ir1ZmXstHH7udBUIS)zdQrviZURrsb(3Gbl1CnrvN0YEO5wG5igunC0Yh48HJ9i81KMAy(ZF1Ag4(8HfsO4Zbux4yYvOG94WWOsxQX48j4)ruwawk)2WVwlxzj1yEPYud9QD9zky1UvTnvP7Kbn)wwJlGoo5n)8P(qID1AkvaQ5oV0AOX)v63WJV18ELbMiA25VgoAzqU5)UmdboT4RqBBey3xe3dgTHF4ANOW6UZ5HTG)ZfleK0o32O0TRJDI2(XDgAAta3gjy1f7xUlGObO5Y5XoClZ46eg7tWe1TtQJAX9qsoWYQ33CBkq6(U4OJplyGFxqpybJJv4osgWIKSWvNQted4uY3uh5U(VTsXlILDpS079qRiWzI)WiM59xGuwbFZh0yVS(0RZiMMhDLeU(6m58KqTYTdjKIRY9ukObKtwRWb6KaMr709lubRi4r1foY7go42gk4(KYgBEQ5MPwc7h1h2Mj0HVbVNkqfb)E)gLNP)4JhTFvHCEsynBetVLAxiio2oGlITqxC)PBD3WtBN8GDJD3MtdgCnIoO1HQdU6EqaHD9quBfUg)QXyM)DEovqDAKQ9(c1x7R61qnQOs7DSNXKBP4ofBpWiFeN3G0bltlKXWsfERfB14mbhevBiN6f8E2BzESCHx7gZNUYe6bl5vhgqht0NhGhnAXqUMZp0fMpC7Vowy7ywoAX8zB5Za7cJl4GzJg(XXVtNn4Qh3oBW6SahUaNfOOIJ14ZrUacFWTg5guZCbkX0HDTzOjaFftOZjgmR03OrItGZp5IRWaUk6xzdT0cd4oz4dYRKbX4QkC7a05Dr)a(f2iDxdF(iEpv3Cx4XtAslNRDnSCKjuEBzFY1OYG3GTP6Eq(U10v3r2wIFg7DuJP3vg4ykCUVnFX2KWt7sPDeiWBJ)OEWT7W0NmXvHJk1(K5NmQpisPNgCQzlUKn2c8JBBlSqyiDTimDOwnT)TRRtkl7ck3TAOWeJITkx4IGRMJA7yzzvUQrPJAmWkmNN2TgGfO72OINQ0ZzOHxBhRsyDM2qtgaQln(qvK1XYhyEYHA6wJm(HPSoXEbHGDpJoB8IxR8onzKW5P(LaKccPCqxMAlHuO6AN4BzJgPBYmWNCTRmr8hmUnP)tNox4IMQ2CoLB3hXpbCZ(0hMv4u(0sUV3zeo(F(40pCF0HY15fpC)9PB)b29ZYd)F]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/PaladinRetribution.lua b/Interface/AddOns/Hekili/Dragonflight/PaladinRetribution.lua
index 2f7bef1ea..bc4662619 100644
--- a/Interface/AddOns/Hekili/Dragonflight/PaladinRetribution.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/PaladinRetribution.lua
@@ -407,7 +407,8 @@ spec:RegisterAuras( {
duration = 6,
tick_time = 2,
type = "Magic",
- max_stack = 1
+ max_stack = 1,
+ copy = 344067
},
-- Talent: Counterattacking all melee attacks.
-- https://wowhead.com/beta/spell=205191
@@ -703,11 +704,6 @@ spec:RegisterAuras( {
max_stack = 1,
copy = 287731
},
- expurgation = {
- id = 344067,
- duration = 6,
- max_stack = 1
- },
-- Power: 335069
negative_energy_token_proc = {
id = 345693,
@@ -926,7 +922,7 @@ spec:RegisterAbilities( {
handler = function ()
applyBuff( "blessing_of_protection" )
applyDebuff( "player", "forbearance" )
- setCooldown( "blessing_of_spellwarding", action.blessing_of_spellwarding.cooldown )
+ if talent.blessing_of_spellwarding.enabled then setCooldown( "blessing_of_spellwarding", action.blessing_of_spellwarding.cooldown ) end
end,
},
@@ -1207,10 +1203,6 @@ spec:RegisterAbilities( {
spend = 0.15,
spendType = "mana",
- talent = function ()
- if covenant.kyrian then return end
- return "divine_toll"
- end,
startsCombat = false,
handler = function ()
@@ -1379,7 +1371,7 @@ spec:RegisterAbilities( {
cast = 0,
charges = function() return talent.vanguards_momentum.enabled and 2 or nil end,
cooldown = function() return 7.5 * ( talent.seal_of_order.enabled and buff.blessing_of_dusk.up and 0.9 or 1 ) end,
- charges = function() return talent.vanguards_momentum.enabled and ( 7.5 * ( talent.seal_of_order.enabled and buff.blessing_of_dusk.up and 0.9 or 1 ) ) or nil end,
+ recharge = function() return talent.vanguards_momentum.enabled and ( 7.5 * ( talent.seal_of_order.enabled and buff.blessing_of_dusk.up and 0.9 or 1 ) ) or nil end,
hasteCD = true,
gcd = "spell",
school = "holy",
@@ -1742,7 +1734,7 @@ spec:RegisterAbilities( {
if buff.avenging_wrath_crit.up then removeBuff( "avenging_wrath_crit" ) end
if buff.empyrean_legacy.up then
class.abilities.divine_storm.handler() -- TODO: Check for resource gain?
- removeBufF( "empyrean_legacy" )
+ removeBuff( "empyrean_legacy" )
end
if talent.executioners_will.enabled and debuff.execution_sentence.up and debuff.execution_sentence.expires - debuff.execution_sentence.applied < 16 then
debuff.execution_sentence.expires = debuff.execution_sentence.expires + 1
@@ -1859,4 +1851,4 @@ spec:RegisterSetting( "check_wake_range", false, {
} )
-spec:RegisterPack( "Retribution", 20220911, [[Hekili:T3ZAVnUo29BjOa6gFVdC9Zjt6ghG2lUO4oyXSaB2IwGIAzgjABTrwYREKmPiW)23dPErsXdfLSZmTyNVmWrI8WdpVFqXz901)L1p4tYOR)YSjZMnDYSBgpB(IBwmB9dzVEKU(HJeVNi7GFeroa)7FMMLe8yEwqCe7DVggt8zWinopXdE)6hEmpim73Jw)OoaVCXcyShPER)Yntw)W(aFFAXqPPESzFmjEBqiaiIhBnshFmH6fF4rs2VS6FEBinDVxczB2hc2UcwYWhdI8hFmpnlpK6stYpYM0BVv)QNJdjza8CtJdFMgLD6Z6GljXJerDZItsGXWGDgje(14TbrKqxyKpfhfeTZP8XP0eYX9bh0dThbSmfgTB8w308dhOjDposEw(HOUh3lbrz2aV0JjWV0pU09b0qF2OakYokjYJE6ZN(8)0Pn)2xPE5zu)tBOpttE90MSGdu4F3d)daP4KtBcsHF(mjiKal346faaBc9X8NOIpXJeg6w8NUHbPzFGjcTYloo0p(LO0Uhkn1DBI7rycWMHXwU(QesGVlLXkht89tht)km603Et955hB)SGO7Uv3tVF(KroxxYBPCAadpsH)KcehNkmwZ7gNqpqcIsV7whqQg2dzKKD0S0X(bphaIuPar7WDlF7nebQAqR8Ig4oYPaKJz8cqe11pGE)NSL2XE8ZugPZhypB3QBlWivLVvflYp29cTJgbQdW(mLjfvjWvZLxDmM9egkWxcctOJjL(cmP98fN)CVK8uIpdBCK(70mWa0QPtE7TTb72N5wryMTuZIbiziBuPU)1C)DhkvML5mkd4(vZE7nRfRaHLBwQtAtpYSna0kcJJ95cVN1(FKZvOsOil(zBT8dCRnSX5ga2X8da75RMk80DHXpscLEK4sHB9vep1ypQqxhD)(2B2OsUC2ihjzM7NIiZyYIn24uTyJnovl2ORRIfBXXLNsDdYOhkv4arOq2ua7YUGewAMlj5Xa0vrE2jLRNxCyi5iF13cBLeAkJOFfx2dg8XmcdsC5tzfpmIO8YqII9d(FP(U(uqo0RW8q3tRzlLgSli8YB1yInybnABmentsky)opYDhevaa0Vtidmsaqzm)TU)TCsei2be1Nd8U8i0CRqOyi2Gx2tdpWwXJXVqtC9sEfG5LNDzNSMpj5PdXGjaFWXL7ZXjeVGSxV4iJDSRdepYJjGjV9uAM7H80aVVtyYwsEy2RGIEoZc0bkjf0Y5k5LgwlxMwiXWel8tOeFMdpWmEAkn0M5K(uE4tm9SxS12xsWbyh5t)QnJ(a9qCYRmRDhjCtkrwzek9ib2fablZDFC8twnfs4Zqws(GT0uMZiYHJHbBdSZK8UaqR2noH9hraVX9iLKyf9diB(PEKexqFmdI1mcjua5zXJibKTGau9D3tI8bwGh4eE7h8E1dSYugPeZToe3ymxqb84SJKKeNrHar9EYs2vwm19PikelkKx3HGuRqpqSdwg3D5b(Sybkn2zZmzKIug7ElOFrtyXYMcPRUL24AdDiUl0j5BL9hV9SbZaQpSjJ4ooTzEaxoBpyRGWvbcoaPAJeIK882ZMyvaaPVqso0S)AzIX5kfTBBwHDHewWEGtB3hj(7otpn3ZnHvhYMcmQcoBXsHXun)MxAgTr0RLxkEuL7JdFTWR19Rw4WsQILEM4tNd5ccp(EwC(5ruiuGDGqpqQpq2bzfWKBAsFyK8CN50mLNjr7Yjj(PUhIzdn)GJ(SaRZoKdjoottAsnu8PveKvSmwVsPCeqEmylqnWQgBnLDYi9KUsoaJMjUbxIqYkOyiCbWxyeyOjmm(f9JqClYl)szUU7pUB1eNMv6oGaJMgLSxnNRXeMwnPLq7O2EyrilkuwmrQpPxKAf8C86eWeFkwZQhNbbPp(PiyThnsydHObTZZhxfcexA5MxVQkBPeya3prCVSAPwbVcBRvYwab15ClvZ9l4I4ymBrmsytVNWYEJN3LiPzWuDXsAiwrLv1z2R)9)cw1sa5NaqDijvwXITjkRbtLLfZ1LX5AKxvjbdcdJpq(Ax7C8KShvV6ARzKd(lvqbukKa5wMAaQ5OtcSQ(3YliHUfCB0H(c4yLNQom60wRakfSzVzG2(ZaPRXuF5obsIooIWlqX5t6mZ5w6GV6o48uuA1JGhFoX6VMNMvMBPxCKFEadohZt2XdRHPwJVUI035I6Oa5gFPflv3vTvcCKSVo1PBFYkUKXx5ourhOGvVOXsKSHsIqNNI5qCcrHpGeESWcfXxDCYnkbDy0VgN4fKEaF9GNr9skJuwDyLf8FvL)evtLnoGWJZbt1Dft3DUGpSHwDXcaHvyF2cuSPA7ura(IVRPI)i0JUfyr9P02eNnXTF30j4OsB7W1jjieha(8venzt2uOZ4aQdR8L8h(B5Tpb09WJnSZ0umWC6T6DZu7P(nkv0GKJSgEH5DzAq17gd5ZcmbgakGgjeS7o(MLIwIVJ12ePDxtclQecXau)zPPbHlB5SAgxnDr69g4lIMrqmCyvl(k04)UOyBnFfFGT7XTi3Bb(eXmMRNa)pUMMrCPvZdx9mjjGvf)YYLM66rs5L1)dptcZPRmgOEP9A6HJVMqjrf8nE5D0eXurwtLqaID7yCQCLFQrkvUxxPyo1urAMUSPjLQkygzQgd0TpPsYtBuBJ)5bu3oZZZsyOD3ku634YE7LvKX0MsXzrsqGHDo4me1kDuMJ)8oDZD)uXcm1BDz(01DUfCU2QJjr9wN3BagInspnkHvNYOmwNFsO9M(OYFSN8S8SOolr2nIud2EPYIXybJfLk3Td)INQ01T6Td6M)czTLdNpA)qx4ivUmglxvm5UoQs2YMcDwz8Ygh4LbkComo19QPX1AJIJZMaZSrdO8W3v6bKlQinaRJ8hreLD0aczTq5zAIFGxMKp)))Uq3pKQEVLQeJmQ5GJTQ351ETUILkMxXihXyGQlrvdMQG)6ql0SCfRbwE2RpgNh57YpwoOTGXqHwvdJ4ti4IXmMlQfMV7rsczh7qDvgvJyVxkcRPHhl9UkPJzIHJiT(NxI26DKIBQyecwyQOXAdg(c3Tc(XfvFOKdk2xfEF3bd3vOjDeIERveJq)nSSSMfZewOvtuQQSTLpONC4ziCynYs1iqRoRUSwjSDFLoFpGtxoOqNolhv6KE6uGS)Q49YBaR5Qw66r7I1U8gsV22(IGuOV(OrzNz)EGN2GtwqRVUumBpLecS1JEzGIxvMLDFGqWQCbk3xOqkCkL4dyCxJ1jbdO)Jt5p7d7DGSa7iYiJcRhsOyW6hGCnyNQUIpLOj3oD66hEHKWmnLU(H)Z)1)8x(9V8V)VCAZPn)f2xQsWHJXjzN2SL99Q8tnG9NoTjHcrZLW(axsJzFzlK8S4de(x8cW1HqbthF6Z)rqE60Mzaa)14iyP5V(NknA(Fbqjlw4VhtJyPL7dp)6zFDe68B8pwdcHhjcLPcqz(fbklgWErC(lhW8Nlm)pEr2f3myS40N7qiXNYpSS9tcrL3yd(mZo8P(Z1QFy0ufmQ(dXOgNAEcgvEGWGa4(V9N(JkaBikrN58vrKoP1vww7P9HbW91tJuvoTKGFjGHEeAiA7ssqmU2)ruA(rgzMbIQtPj)RiemKFAZ)n8Z2FHi)p)HtBaqZ(Yd9ds5aVbQ3EMO1SBTcTADKLnHuZhInPfI23vbG9MgfD2SyYaWdjbiv1E7bqNky1rB0pfSbO7lrtgGcQmnDaZ)CvJ(ObNM2p)o5iINgN3FMY5sumn)HPU8(epsFHILSPYwm3p(0quNNBq436927KlLZ1(20HGbvbp(7hQ8yCtJRcw2um696h4)IDhi0KQb8xFHF1kucT1)BvxObRFqnLm4jjSpEZaY6hAsn80Mvaz70M3EdqeWZt7QfWFLYewCAZOtBCoTbR43fZsxbWl2hUS8dx)qTj71zqsxkBKg09kqMeRs4veYIvegzjfwT2s1dZrCuAk8Le8KQc1Pn3DAZNAOWTlApBBmhDBGwfD51eTI6CC3yv1pT5EW250jn4OsvDyi4cueuKlFhWMNXxXssLub3LiNxlIvARnxXgdR(CGWudclvwwg6USNO7v6LIlWZgoFDzuLO9QvSVsoVyQ6RSBXmBxDxoZy(e9VUb02jYE9zk1w8c8sAbiBHHGrwZsVNzURloRWG0IvcCEHQxZ47F0K5aCoSOqbBlnL)IU7AGmfufkZKW0Q5WqZBqrZRBz2CsBG3i32zf64eZDEag(Zfi05jzoRtjtl0xq7kbFjwkzqRv3j0UoDjBBrplKK6A37IHQqyHIQecI0Ddl0jSwfC4wv)0zg1aJ4mVjeGMYW3(z8gJW3BmhtyE)VLHqvyrvZserrymW8Xu200ReoMOQRnVzru1Z4RGA0uDy1rVnHPZe3mQUGv2t4Xl0xCx1XUn80RR1qAA7sPvPjcUeB1(fH3jY7RFyR2WWfhXy(tXDYFftcxURam(AxkUZe2(I14NTy4Ew6rVAk9Um(ML688uAwxN1(5dZAV(OWhcKeNJAxEA5JrGmkts4usvNF4sCOCEvdrM48g4PsMpurvznUztehRCBIuh6ujWk1SiXbMXUy54L2xxgzS7CUKGJftR339znRFXnFMUuLSIUxxaADzPyPTIEgQrLjbDHGa(dUTZqNRDfAr0bowgCqXc3HnK7QJEPlF(o24YVynhvMpv7isUNNyPaZsQMm6YAZggMPpo0Inh63TLgKHTipt1LsMvIFcvTGRWu37jDQmn7b07tm5OUqVlWQgwdw2CFLzUQdwW4rIng16sLIxJBC1lemfdqlWgDX1cMYOxIn6IlhmLr)rumHFfHPm6BehTMRsTwgeBm3yK)2RWlqcTK5iEcwa1Zw2G3f3rGMz7gVf)QZgKTw90yyPzTBwIzRSbpvwvDgSLmlFbjIQfLa3IRGgv1LuGodvVhQYIxdGcWvDcsdS6IfC9dt1Al4b1RBq2anw)PlFERmVo1z2RikZZA0SkOrLADMxUPxMx(uVmVCBVmV0k1UsNgeS7GWgyBym6YORaW4xpHcXBzymsHPYvNKUmdXmgbCW68dBHtA6u9ADziwmALRWWg0U1l(wASDYADzIwggH2R7Wgeh79F7XFvD(c8pa9gsSzpyAmFd3hZl2hQz6wSpWVyfB2hMgZ3W9rP(IAEMf7d93hJn7bS3)ne)lLNutYTa)1Cfo2G8AF53Em)wTyU2R8rbVQ6FTKnZs3MvOKKVsTLvctiFMEphQxtKcIfQVPor)war6EJuW3R0JztxVb9MBrsbVvnpJnr9221CHskizO5LmqP3ORYLmPWMq5fmqO3Uh6LoPaWqhcdS6ndP)6OuGsP)9maQ3Eq7BPYgGP5DmaPxXe9IReKHfV5kz51iMUn2vyPyCqyqMHn6v2ADsX4PdOxQpr7DAPqin6FpdGiAay3JLc8E8H0okjZ3lMOA6C3aZ1RLP7AXSb70(wgW0R5P7UYuicfDVLbm96ETVanBaLU31MCPXcFr2zkMi5iHETx17ytbfSwV5Y6F5EbhmD2kli9Mf20n5ffIcs55uF7CQKuXCRBo791LtVOCSnL)tFtVUUAGnD5SpTyEKEyxuCEtxpr6Q(KXUrwogPdHJimQP1sJOMGx00ARBhCFBrQ2UgprQTdYYlCUkEldujOl7blTHFky8OqaKVQs5ZkE4Bue6wG3KsHB7YksRMwuoRIABshel8jh5gh3sdQ5ui0slEeEOGsCerjf(ggV4EDRL9j70YwzDh7lOEf4kYroW((Rx1mmZwLQ1n0g3QjlJIiJKWX9ApSiRWoqcV3hMjt9XHztwXgHjbx9h9WgZq6VyvVq8EHuuKTpTMxY6MotQPK1XhHqDOcbduDRPW(vyovTYXArVA2IM(J7y6SRvrvBDzlXXJYwSiC9TWJN0KEPnY(wF8UE3ojBDrsxoCzAbzxSxFNG6FxhtkCPojkOMB4jHUdQ3(70c3yTRh8Y(fpw5jWPoU9sldCVBMevKGLFS6brvRqHoNmcg)MRqwmjeQpae7cWW4zWAsxDKTAv7vJIBFNsje3NqQeTK85(sVW8bDsidJn8EDs4wkrvKVNTyue82VO7wRsYwP27UQQ9G02qBvOmsyRoJmZFxpeJvRYhh20w0k(YYiWkexpZdgjByMcbXP)i8S3jHmm6OnZXir029Vnl0SAxaNzsB3jjEwR)R8HymaFhN0CCT5Yemfv8tv3pu1mQQzRmKLyYp0H()06qnkqQxXDf5GiDwRQsdPjRLQdAHCnhS)8aQVwjng0X(aWW)pUZsrnZ)xzqfbL))tdw5GzMskfM0ZhjHJih3nhtdqdAIFMvT)eBpRL5YQVUfPd2LMpKmz(BF)gOW5hYuIo4wcNy4RK(e8u)G)KSMC5yd2jPuKDKnyNJDstcDns9ZMW0rhx)hGW1wt7C0EwXzuanm5rI9uI06BbaVW34LyqtX6EV)4PS)RqX4NnIDAggyRg(WsAXsmt4)E9bKOuXAKJ((ujZogp67tLomPyFqosTHX45Jx(anB8iH22Z0foAggF8BquLklJqujO4)fUIs6l2ZfpAbDozgqGr93FRAfUn6s1y5vSPPB4AKdWfDPKGDFv1TslsscaRQndZrwpn41tpng8dyN5oCd(QuRF8XBH7wWSpplm0ABIPk2aF)nU1YbC)JPq27BhEuTpzGfOEEB5zgZDRLNf9F4E8SKGSoOgwZaZZ2hdPR9qWHFL)K1)9)]] )
+spec:RegisterPack( "Retribution", 20221030.1, [[Hekili:T3ZAVnUo29BjOa6gF3bU(5KzAJnq7Iff3blMcSzlAbkQLzKOT1gzjV6rYKIa)BFpK6fjfpuuYoZ0ID(YahjYdp88(bfNnt38N38GpjJU5RZMmB20jZNmE6SLtMpFZdzVEIU5HteVNi7HFeroc)7FIMLe8yEwqCe7DVggt8zWinopXdE)MhEmpim73I28Owap7oySNOEB(6Dt28WHaFFAXqPPESzFkjExqiaiIhBnshFkH6fF8rs2VB1)4UqA6bVeYUSpeSBfSKHpge5p(uEAwEi1LMKFInP3ER(vphhsYa45Mgh(mnk78x0bxsIhjI6MfNKaJHb7msi8RX7cIiHUWiFkokiAVt5JtPjKthcoQhApcyzkmA34DUP5hpst6ECK8S8JrDpUxcIYSbEPNsGFPFCPhcOH(SrbuK9usKh98xo)L)HZB)dFJ6LNr9pVL(mn51ZBZcosH)9a8paKItoVnif(5ZKGqcSCJRxaaSj0hZFIk(epsyOBXF6ggKM9bMi0kV44q)4xIs7EO0u3DjUNGjaBggB52Bsib(UugRCmX3pDm9BWOtF7n1NNFQ9ZcIU)Z6E665tg5CBjVLYPbm8if(tkqCCQWynVBCc9ijik9(p7as1WEiJKSNMLo2p45aqKkfiAhVF5BVHiqvdALx0a3rofGCmJxaIOU(b01FYwAh7XptzKoFG9SBNUTaJuv(wvSi)u3l0EAeOoa7ZuMuuLaxnxE1Py2tyOaFjimHoMu6lWKoWxC(Z9sYtj(mSXr6VtZadqRMo5T32fS)qMBfHz2snlgGKHSrL6(xY93FSuzwMZOmG1RM92Bwlwbcl3TuN0MEKzxaOvegh7ZfEVO9)iNBqLqrw8l2A5h4wByJZnaSJ5ha2Zxnv4P7dJFKek9iXLc36RiEQXEuHUo6(9T3SrLC5SrosYmRNIiZyYIn24uTyJnovl2ORRIfBXXLNsDdYOhlv4arOq2ua7YUGewAMlj5Xa0vrE2jLRNxCyi5eF13bBLeAkJOFdx2dg8PmcdsC5tzfpmIO8YqII9d(FP(U(uqo0RW8q3tRzlLgSpi86B1yInybnAxmentsky)opYDpevaa0Fqidmsaqzm)TU)1Csei2be1Nd8U(i0CRqOyi2GxoqdpYwXtXVqtC9sEfG51NDzNSMpj5PJXGjaFWXL7ZXjeVGSxV6iJDSRJepYJjGjVduAM7X80aVFqyYosEy2RGIEoZc0rkjf0Y5k5LgwlxMwiXWel8tOeFMdpWmEAkn0M5K(uE4tm9SxS12xsWryh5t)MnJ(i9yCYRmRDNiCtkrwzek9eb2fablZ9qC8twnfs4Zqws(GT0uMZiYXtHb7cSZK8(aqR2noH9hraVX9eLKyf9diB(PEKexqFmdI1mcjua5zXJibKTGau9DpqI8bwGh4eE3h8E1dSYugPeZToe3ymxqb84SNKKeNrHar9EYs2vwm19PikelkKx3XGuRqpqSdwg395b(Sybkn2zZmzKIug7EhOFrtyXYMcPRUJ24AdDiUl0j5BL9hVdSbZaQpSjJ4ooTzEaxo7ayRGWvbcocPAJeIK88oWMyvaaPVqso2S)AzIX5gfTBBwH9HewWEGtB3hj(7VqpnR5MWQdztbgvbNTyPWyQMFZlnJ2i61YlfpQYdXHVw41A9QfoSKQyPNj(05qUGWJxZIZppIcHcShe6bs9rYEiRaMCtt6dJKN7mNMP8mjAFojXp19ymBO5hD0NfyD2HCiXXzAstQHIpTIGSILX6nkLJaYJbBbQbw1yRPStgPN0vYby0mXn4seswbfdHla(cJadnHHXVOFeIBrE5xkZ19WP9RM40Ss3dey00OK9Q5ClMW0QjTeAh12dlczrHYIjs9j9IuRGNJxNaM4tXAw94mii9XpfbR9OrcBienO9E(4QqG4sl386vvzlLady9eX9YQLAf8kSTwjBbeuNlTunRxWfXXy2IyKWM(aHL9gpVlrsZGP6IL0qSIkRQZSx)7)DyvlbKFca1HKuzfl2MOSgmvwwmxxgNBrEvLemimm(i5BDTZXtYEu9QRTMro4VubfqPqcKBzQbOMJojWQ6FnVGe6wWTrh6lGJvEQ6WOtBTcOuWM9MbA7VcKUgt9L7eij64icVafxoPZmNBPd(Q7GZtrPvpcE85eR)sEAwzULEXr(5bm4CkpzppSgMAn(6ksFNlQJcKB8LwSuD30wjWrY(6uNU9jR4sgFL7qfDGcw9IglrYgkjcDEkMdXjef(as4XclueF1Xj3Oe0Hr)wCIxq6r81dEg1lPmsz1HvwW)vv(tunv24acpohmv3vmD35c(WgA1flaewH9zlqXMQTtfb4l(UMk(Jqp6wGf1NsBtC2e3(9tNGJkTTdxNKGqCa4Zxr0KnztHoJdOoSYxYF4VL3(eq3dp2WottXaZP3Q3ntTN63OurdsoYA4fM3LPbvVBmKplWeyaOaAKqWU747wkAj(EwBtK2DnjSOsiedq9xLMgeUSLZQzC10fP3BGViAgbXWHvT4RqJ)hIIT18v8b2Uh3ICVf4teZyUEc8F)AAgXLwnpC1ZKKawv8llxAQRhjLxw)p8mjmNUYyG6L2RPhp9AcLevW34L3rtetfznvcbi2TtXPYv(PgPu5EDLI5utfPz6YMMuQQGzKPAmq3(KkjpTrTn(NhqD7mpViHH2DRqPFJl7TxwrgtBkfNfjbbg25GZquR0rzo(Z70n36PIfyQ36Y8PR7Cl4CRvhtI6ToV3ameBKEAucRoLrzSo)Kq7n9rL)yp5z5frDwISBePgS9sLfJXcglkvUBh(fpvPBB1Bh0n)vYAlhoF0(HUWrQCzmwUQyY9DuLSLnf6SY4LnoWldu4syCQ7vtJR1gfhNnbMzJgq5HVV0dixurAawh5pIik7ObeYAHYZ0e)aVmjF())DHUFkv9ElvjgzuZbhBvVZR9wDflvmVIroIXavxIQgmvb)1HwOz5kwdS8SxFmopY3LFSCqBbJHcTQggXNqWfJzmxulmF3tKeYE2H6QmQgXEVuewtdpw6DvshZedhrA9VSeT17if3uXieSWurJ1gm8vUBf8JlQ(qjhuSVk8(UdgURqt6ie9wRigH(7yzznlMjSqRMOuvzBlFqp5WZq4WAKLQrGwDwDzTsy7(kD5EaNUCqHoDroQ0j90Paz)vX7L3awZvT01J2fRD5nKETT9fbPqF9rJYoZ(9apTbNSGwFBPy2bkjeyRN8YafVQml7(aHGv5cuUVqHu4ukXhW4UgRtcgq)7NYF2h27azb2rKrgfwpKqXGnpa5AWovDnFkrBE4fscZ0u6Mh(p)x(tF93(6)2)05TN3(NzFPkbhpfNKDE7o23RYV0a2F582ekenxc7dCjnM9LTqYZIps4FXlaxhcfmD85V8hb5PZBNba83hhbln)1)sPrZ)lakzXc)9yAelTCF453o7BJqNFJ)XAqi8irOmvakZVkqzXa2lIZF5aM)CH5)XRYU4UlelMorbav2XRHq9dAJcN)shYz(u(5TTFczQSxB2sZSdFQ)IV6hgnvbJQ)woQXPMNGXOgimiaU)h(3)JkaBi6Hx48vrKoP1vgN7PjMbW91tJu1VTKGFnGHEeAigmKKGyCT)JO08tmYmdevh0t(hIi4l482)B4NT)it(F(NpVfan7Jx0piLd8gO(5leTM9zRqRwN6zti18HywBHOlcvayV1vr)vluToAdEijaPQ2Bpa6ubRoGL(PGnaDFjAYauqLPPdy(xQA0hn431(53jhr8a98(ZuUuIIP5pm1LRtinQqPprKOpOO(IhwYOl7ZD)40dXGWCdQpwV3ENCkDPwiNoemyEjB63ow5Z5UgNnSu6y07npW)f7IyOjFh4V(k)(DOeAB(x38Gxc77enGS5HMSqpVDfqCoV9T3GLd8q1UWe8xPmHfN3o68wNZBXQZEXS0vR9Ql3baDuspTyF4YssDZd1g93Kbz(HUrUbKjXkhFfHSaxGrwsHvlWv9WCehLMQVjbpPsHDE79N3(PMTw7ohW2gZr3gOLYxEnrlRph3nwA)ZBxdwFNoPbhvkTedbxyLaZ9GaWm(kwsQKQ6Ve58wrSsBbcl2yyfjeeZAqyPAdZq3L9eDVrV8DbE2W5RRLReTxTTbvAaftvF5LlMz7smZzgZNO)1nG2or2BVqP2IxGxxnazlmrmYAw6AM5UU4ScdslwjW5fkHoJV)rtMdW5WIcfST0u(l6U1fYuqvOmtctRMddnVdfnVTLb1jTbEJCBNLjKtm37by4VwGqxMK5SoLmTqFbT1i8LyPKbTwTir760LSTfnorsQRDdugQcHfkQsiislwSqNWAvWHBv9twzvLrcM3ecqtf)B)mEpy47ar3p279)ZmeQAAvDSrefHXaqgdR10Wgj7NQ6CZBwmv9n(kHhvLwRp6TnmDM4Ms1vSYEdpUH(I74o4VTwFOPtpL2GMi4aSvhFeENOmq9dB15hjHp7fcMI7S)gMKUClky81UuGNjGgInCGTy4Ey6rJJk9Ym(UL68avAExNv)5dZQV(40hcKeNJAlNA5RrGmkts4usvNGdGZJBqQnN3apvYmIkQkRXnBI4yL7zL6qNkbwPoxjoWm2TChVjb6YmJDb4LeCQyA9(IyRz9lUg20LYKv096szBoBL(hyrLjbDbCa(f(CNbkx74ZIybCSmuGIfUdlf3xhRsxE4DSXbFXAoQm7P2XFSwknsJmlPAZyo7ntFpQfBo0pvSEHmS3(mvxQzwbeHQxWvyQ7IL5IzGE5Mjh9f6ftw1WAWYMlpnZvFWcrcKyKrTUuP414gx92jtXa0cSrxChLPm6LyJU4Mktz0Feft43xzkJ(oXrR5EDRLbXgZng5V9kWdKGpzoINGfy9SLn4DXfwOz2UXRuW6SczRvpntwAW7ULywrBWtLvTtd2xrIOAXjWTflOrvDJjy2q11tvw8ojuaUQtqAGv3YHBEyQwBbpOE3hYgOX6qD9ZFL5pQodFfrzE2JMvbnQuRZ8YD9Y8YN6L5Lp3lZlTsXR0Pbb7crSb2ggJUm6QJMQeDAFBjQeekxzr6EteZudJ)uG3gaED(HT2SA659gDziwTduUrf)(AvDsfwRIf6YeTcJ1F7l(dcXrqgDPJwH)bOxyJFx3dZR3dgqiDz6wTpWVNh)UUpA0xmGqMYZu)1d5319qJ8ecYOlj3k8xZnk5piKxhMuNxTgmx7nqPIHZspJviKK7qT1uYKKU(fSoD(wgtvVZkfeAuFtDI(TaI0LyPGVxPhZMUEd6nxPLcERAEgBIQ22l5gTVDlfeA08sgOun6wUfKVXlf2ekVGbcv7ELGa7gWuayOdHbwvZqLuhT3nMcuk9VNbqv7bfaS9vMzdW08ogGuvmlae6TOjiGlEnAYYRrieh8j1KRo2vUjhBuv2kDWQEMZ4PdOxQpr7fSPqqp6FpdGyXjHETAQlmjZ3bNOA51(bWxmgkQxlt3D0zd6R9TmGPxZt3f3Pq8l6Eldyyb80((8uhvtJj(ICWuSswHKAGkdjWIAr9k)8A7IzTGpMoBDfKgZcB6E8IAzIwOpBVkLNt9vfQssfZTUjTRRlNEr5yBkmO(2IDB1aB62zFA18i9WUO48MURK0v9jJDLSCmshthryuZdKgrnJOO51w3w4(2QuTDpEIuBhKLJ4Cv77H5YEWsB4Ncgpkem5RQu(SIhchfHUf4nRu4Q3SI0QPfLZQO2M0nXITYrUbYT0SAoncT0UhHhLOehrusHVHXlUx3AzFYoTSvw35(cQxbUIC0dSVp7vndZS1QADdTb1AYIPiYijCSw7Hgzf2bt49(qnzQdpmB1k2imj4Q)Wj2ygs)T86vI3lK)IS9Pn8sw30zsnLSogC)MsfcgO6kCH9RWCQALJ1IE1SfnDo3X0zyRIQ26MFIJhLTyr4UKHhpPj9sBK9T(yE9UDI26IKUC4Y0cYUyV(Eb1)UoUu4sDsuqnx3uc9nuV93PfUXAxp4L9lonLZOtLLbU3ntIksWYpw9aPQvOqNtgbJFZvilMec1haIDbyy8SynPRE1wTQ9QfYTVGReI7tivIws(CFPxz(GojKHXgEVorClLOkYx6xmkcE7x0DfAjzRu7fPv1EqABOTevgjSvNrM5VRhMXQv5JdBAlAfFzzeyfIRx4bKKnmtHG40FeE27KqggD0M5yKiA7(3MfAwTlGlmPT7LepR1)v(ungGVJZAo22CzcMIk(PQ7NQAgv1SvgYsm5N6q)FADOgfi17BVICqKoRvvPH0K1s1bTqUMd4r6RpDlSpem8)VcTuGY8)7jur24)xdHvUrMPK4GjT5rs4iYXDZX0a0GMc16X6ZSQ9Ny7zTmxw9vUiDWU08bLjZF773cfoNsMg1bFu4edFJ0NIN6NeOK1KRhdYozOISJSb7CStotORrQF(eMo64M)qeU1AAOJ2ZmoJsOHzpsSbuKwFta4fahVudAkA379htfw)XTxNuT1zwPt2I9A4dnPflXmH)h1hsIsLRroc8tLm)y8iWpv6qLI9b6i1ogJNtE5d2Cp)oMVYr1W4JFhIUuzzeIobf)VYvwsFrFgyud6CPCbHbzVooUFx1kDB01QXYSytZ3W1ihGR6sjb7(kRBLEKKeaw1BgMdTEAWRNEAm4hWoZD4g8vPw)8J4c3TGzFEwyO12euvSb((BCd9C)AV9gzVVD4r1(KcwG65TLNzm3TwEM0)P7XlscY6GAynfmp7qmK22dbh)98NS5Vb]] )
diff --git a/Interface/AddOns/Hekili/Dragonflight/ShamanElemental.lua b/Interface/AddOns/Hekili/Dragonflight/ShamanElemental.lua
index 263e5791c..1e1399f0b 100644
--- a/Interface/AddOns/Hekili/Dragonflight/ShamanElemental.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/ShamanElemental.lua
@@ -22,28 +22,28 @@ spec:RegisterTalents( {
ancestral_wolf_affinity = { 80982, 382197, 1 }, -- Cleanse Spirit, Wind Shear, Purge, and totem casts no longer cancel Ghost Wolf.
ascendance = { 81003, 114050, 1 }, -- Transform into a Flame Ascendant for 15 sec, replacing Chain Lightning with Lava Beam, removing the cooldown on Lava Burst, and increasing the damage of Lava Burst by an amount equal to your critical strike chance. When you transform into the Flame Ascendant, instantly cast a Lava Burst at all enemies affected by your Flame Shock, and refresh your Flame Shock durations to 18 sec.
astral_bulwark = { 81056, 377933, 1 }, -- Astral Shift reduces damage taken by an additional 15%.
- astral_shift = { 81057, 108271, 1 }, -- Shift partially into the elemental planes, taking 40% less damage for 8 sec.
+ astral_shift = { 81057, 108271, 1 }, -- Shift partially into the elemental planes, taking 40% less damage for 12 sec.
brimming_with_life = { 81085, 381689, 1 }, -- While Reincarnation is off cooldown, your maximum health is increased by 8%. While you are at full health, Reincarnation cools down 75% faster.
call_of_fire = { 81011, 378255, 1 }, -- Increases the damage of your Flame Shock, Lava Burst, Lava Beam, and Fire Elemental by 10%.
call_of_the_elements = { 81090, 383011, 1 }, -- Reduces the cooldown of Call of the Elements by 60 sec.
call_of_thunder = { 80987, 378241, 1 }, -- Increases the damage of your Lightning Bolt, Chain Lightning, and Storm Elemental by 15%.
- capacitor_totem = { 81071, 192058, 1 }, -- Summons a totem at the target location that gathers electrical energy from the surrounding air and explodes after 2 sec, stunning all enemies within 8 yards for 3 sec.
- chain_heal = { 81063, 1064 , 1 }, -- Heals the friendly target for 943, then jumps to heal the 3 most injured nearby allies. Healing is reduced by 30% with each jump.
- chain_lightning = { 81061, 188443, 1 }, -- Hurls a lightning bolt at the enemy, dealing 359 Nature damage and then jumping to additional nearby enemies. Affects 5 total targets. Generates 4 Maelstrom per target hit.
+ capacitor_totem = { 81071, 192058, 1 }, -- Summons a totem at the target location that gathers electrical energy from the surrounding air and explodes after 2 sec, stunning all enemies within 9 yards for 3 sec.
+ chain_heal = { 81063, 1064 , 1 }, -- Heals the friendly target for 3,305, then jumps to heal the 3 most injured nearby allies. Healing is reduced by 30% with each jump.
+ chain_lightning = { 81061, 188443, 1 }, -- Hurls a lightning bolt at the enemy, dealing 1,448 Nature damage and then jumping to additional nearby enemies. Affects 5 total targets. Generates 4 Maelstrom per target hit.
cleanse_spirit = { 81075, 51886 , 1 }, -- Removes all Curse effects from a friendly target.
creation_core = { 81090, 383012, 1 }, -- Call of the Elements affects an additional totem.
deeply_rooted_elements = { 81003, 378270, 1 }, -- Casting Lava Burst has a 7% chance to activate Ascendance for 6.0 sec. Ascendance Transform into a Flame Ascendant for 15 sec, replacing Chain Lightning with Lava Beam, removing the cooldown on Lava Burst, and increasing the damage of Lava Burst by an amount equal to your critical strike chance. When you transform into the Flame Ascendant, instantly cast a Lava Burst at all enemies affected by your Flame Shock, and refresh your Flame Shock durations to 18 sec.
earth_elemental = { 81064, 198103, 1 }, -- Calls forth a Greater Earth Elemental to protect you and your allies for 1 min. While this elemental is active, your maximum health is increased by 15%.
- earth_shield = { 81106, 974 , 1 }, -- Protects the target with an earthen shield, increasing your healing on them by 20% and healing them for 330 when they take damage. This heal can only occur once every few seconds. Maximum 9 charges. Earth Shield can only be placed on one target at a time. Only one Elemental Shield can be active on the Shaman.
- earth_shock = { 80984, 8042 , 1 }, -- Instantly shocks the target with concussive force, causing 1,081 Nature damage.
- earthgrab_totem = { 81082, 51485 , 1 }, -- Summons a totem at the target location for 20 sec. The totem pulses every 2 sec, rooting all enemies within 8 yards for 8 sec. Enemies previously rooted by the totem instead suffer 50% movement speed reduction.
- earthquake = { 80985, 61882 , 1 }, -- Causes the earth within 8 yards of the target location to tremble and break, dealing 498 Physical damage over 6 sec and has a 5% chance to knock the enemy down.
+ earth_shield = { 81106, 974 , 1 }, -- Protects the target with an earthen shield, increasing your healing on them by 20% and healing them for 1,158 when they take damage. This heal can only occur once every few seconds. Maximum 9 charges. Earth Shield can only be placed on one target at a time. Only one Elemental Shield can be active on the Shaman.
+ earth_shock = { 80984, 8042 , 1 }, -- Instantly shocks the target with concussive force, causing 3,791 Nature damage.
+ earthgrab_totem = { 81082, 51485 , 1 }, -- Summons a totem at the target location for 30 sec. The totem pulses every 2 sec, rooting all enemies within 9 yards for 8 sec. Enemies previously rooted by the totem instead suffer 50% movement speed reduction.
+ earthquake = { 80985, 61882 , 1 }, -- Causes the earth within 8 yards of the target location to tremble and break, dealing 2,036 Physical damage over 7 sec and has a 8.0% chance to knock the enemy down.
echo_chamber = { 81013, 382032, 2 }, -- Increases the damage dealt by your Elemental Overloads by 15%.
echo_of_the_elements = { 80999, 333919, 1 }, -- Lava Burst has an additional charge.
echoes_of_great_sundering = { 80991, 384087, 2 }, -- After casting Earth Shock, your next Earthquake deals 60% additional damage. After casting Elemental Blast, your next Earthquake deals 70% additional damage.
electrified_shocks = { 80996, 382086, 1 }, -- Icefury causes your Frost Shocks to damage up to 3 additional enemies and targets hit take 15% increased Nature damage from your spells for 6 sec. Chain Lightning prefers targets with this effect.
- elemental_blast = { 80994, 117014, 1 }, -- Harnesses the raw power of the elements, dealing 1,980 Elemental damage and increasing your Critical Strike or Haste by 6% or Mastery by 11% for 10 sec.
- elemental_equilibrium = { 80993, 378271, 2 }, -- TODO: Dealing direct Fire, Frost, and Nature damage within 10 sec will increase all damage dealt by 7% for 10 sec. This can only occur once every 30 sec.
+ elemental_blast = { 80994, 117014, 1 }, -- Harnesses the raw power of the elements, dealing 7,151 Elemental damage and increasing your Critical Strike or Haste by 6% or Mastery by 11% for 10 sec.
+ elemental_equilibrium = { 80993, 378271, 2 }, -- Dealing direct Fire, Frost, and Nature damage within 10 sec will increase all damage dealt by 7% for 10 sec. This can only occur once every 30 sec.
elemental_fury = { 80983, 60188 , 1 }, -- Your damaging critical strikes deal 250% damage instead of the usual 200%.
elemental_orbit = { 81105, 383010, 1 }, -- Increases the number of Elemental Shields you can have active on yourself by 1. You can have Earth Shield on yourself and one ally at the same time.
elemental_warding = { 81084, 381650, 2 }, -- Reduces all magic damage taken by 2%.
@@ -57,41 +57,41 @@ spec:RegisterTalents( {
flurry = { 81059, 382888, 1 }, -- Increases your attack speed by 15% for your next 3 melee swings after dealing a critical strike with a spell or ability.
flux_melting = { 80996, 381776, 1 }, -- Casting Frost Shock increases the damage of your next Lava Burst by 20%.
focused_insight = { 81058, 381666, 2 }, -- Casting Flame Shock reduces the mana cost of your next heal by 10% and increases its healing effectiveness by 15%.
- frost_shock = { 81074, 196840, 1 }, -- Chills the target with frost, causing 297 Frost damage and reducing the target's movement speed by 50% for 6 sec.
+ frost_shock = { 81074, 196840, 1 }, -- Chills the target with frost, causing 1,072 Frost damage and reducing the target's movement speed by 50% for 6 sec.
further_beyond = { 81001, 381787, 1 }, -- Casting Earth Shock or Earthquake while Ascendance is active extends the duration of Ascendance by 2.5 sec. Casting Elemental Blast while Ascendance is active extends the duration of Ascendance by 3.5 sec.
go_with_the_flow = { 81089, 381678, 2 }, -- Reduces the cooldown of Spirit Walk by 7.5 sec. Reduces the cooldown of Gust of Wind by 5.0 sec.
graceful_spirit = { 81065, 192088, 1 }, -- Reduces the cooldown of Spiritwalker's Grace by 30 sec and increases your movement speed by 20% while it is active.
greater_purge = { 81076, 378773, 1 }, -- Purges the enemy target, removing 2 beneficial Magic effects.
guardians_cudgel = { 81070, 381819, 1 }, -- When Capacitor Totem fades or is destroyed, another Capacitor Totem is automatically dropped in the same place.
gust_of_wind = { 81088, 192063, 1 }, -- A gust of wind hurls you forward.
- healing_stream_totem = { 81100, 5394 , 1 }, -- Summons a totem at your feet for 15 sec that heals an injured party or raid member within 40 yards for 211 every 2 sec. If you already know Healing Stream Totem, instead gain 1 additional charge of Healing Stream Totem.
+ healing_stream_totem = { 81100, 5394 , 1 }, -- Summons a totem at your feet for 18 sec that heals an injured party or raid member within 46 yards for 740 every 1.6 sec. If you already know Healing Stream Totem, instead gain 1 additional charge of Healing Stream Totem.
+ heat_wave = { 80978, 386474, 1 }, -- Casting Primordial Wave triggers Lava Surge immediately and every 3 sec for 12 sec.
hex = { 81079, 51514 , 1 }, -- Transforms the enemy into a frog for 1 min. While hexed, the victim is incapacitated, and cannot attack or cast spells. Damage may cancel the effect. Limit 1. Only works on Humanoids and Beasts.
- icefury = { 80997, 210714, 1 }, -- Hurls frigid ice at the target, dealing 389 Frost damage and causing your next 4 Frost Shocks to deal 225% increased damage and generate 8 Maelstrom. Generates 25 Maelstrom.
+ icefury = { 80997, 210714, 1 }, -- Hurls frigid ice at the target, dealing 1,404 Frost damage and causing your next 4 Frost Shocks to deal 225% increased damage and generate 8 Maelstrom. Generates 25 Maelstrom.
improved_flametongue_weapon = { 81009, 382027, 1 }, -- Imbuing your weapon with Flametongue increases your Fire spell damage by 5% for 1 hour.
improved_lightning_bolt = { 81098, 381674, 2 }, -- Increases the damage of your Lightning Bolt by 10%.
inundate = { 80986, 378776, 1 }, -- Your successful Purge, Cleanse Spirit, Healing Stream Totem, Hex, and Wind Shear casts generate 8 Maelstrom during combat.
- lava_burst = { 81062, 51505 , 1 }, -- Hurls molten lava at the target, dealing 366 Fire damage. Lava Burst will always critically strike if the target is affected by Flame Shock. Generates 10 Maelstrom.
+ lava_burst = { 81062, 51505 , 1 }, -- Hurls molten lava at the target, dealing 1,456 Fire damage. Lava Burst will always critically strike if the target is affected by Flame Shock. Generates 12 Maelstrom.
lava_surge = { 80979, 77756 , 1 }, -- Your Flame Shock damage over time has a 10% chance to reset the remaining cooldown on Lava Burst and cause your next Lava Burst to be instant.
- lightning_lasso = { 81096, 305483, 1 }, -- Grips the target in lightning, stunning and dealing 3,143 Nature damage over 5 sec while the target is lassoed. Can move while channeling.
+ lightning_lasso = { 81096, 305483, 1 }, -- Grips the target in lightning, stunning and dealing 11,020 Nature damage over 5 sec while the target is lassoed. Can move while channeling.
lightning_rod = { 80992, 210689, 1 }, -- Earth Shock, Elemental Blast, and Earthquake make your target a Lightning Rod for 8 sec. Lightning Rods take 20% of all damage you deal with Lightning Bolt and Chain Lightning.
- liquid_magma_totem = { 81008, 192222, 1 }, -- Summons a totem at the target location that erupts dealing 424 Fire damage and applying Flame Shock to 3 enemies within 8 yards. Continues hurling liquid magma at a random nearby target every 1 sec for 6 sec, dealing 245 Fire damage to all enemies within 8 yards.
+ liquid_magma_totem = { 81008, 192222, 1 }, -- Summons a totem at the target location that erupts dealing 1,532 Fire damage and applying Flame Shock to 3 enemies within 9 yards. Continues hurling liquid magma at a random nearby target every 0.8 sec for 6 sec, dealing 885 Fire damage to all enemies within 9 yards.
maelstrom_weapon = { 81060, 187880, 1 }, -- TODO: When you deal damage with a melee weapon, you have a chance to gain Maelstrom Weapon, stacking up to 5 times. Each stack of Maelstrom Weapon reduces the cast time of your next damage or healing spell by 20%. A maximum of 5 stacks of Maelstrom Weapon can be consumed at a time.
magma_chamber = { 81007, 381932, 2 }, -- Flame Shock damage increases the damage of your next Earth Shock, Elemental Blast, or Earthquake by 0.8%, stacking up to 20 times.
- mana_spring_totem = { 81103, 381930, 1 }, -- Summons a totem at your feet for 2 min that restores 26 mana to you and 4 allies nearest to the totem within 30 yards when you cast Lava Burst. Allies can only benefit from one Mana Spring Totem at a time, prioritizing healers.
+ mana_spring_totem = { 81103, 381930, 1 }, -- Summons a totem at your feet for 2 min that restores 33 mana to you and 4 allies nearest to the totem within 35 yards when you cast Lava Burst. Allies can only benefit from one Mana Spring Totem at a time, prioritizing healers.
master_of_the_elements = { 81004, 16166 , 2 }, -- Casting Lava Burst increases the damage or healing of your next Nature, Physical, or Frost spell by 10%.
mountains_will_fall = { 81012, 381726, 1 }, -- Earth Shock, Elemental Blast, and Earthquake can trigger your Mastery: Elemental Overload at 50% effectiveness. Overloaded Earthquakes do not knock enemies down.
natures_fury = { 81086, 381655, 2 }, -- Increases the critical strike chance of your Nature spells by 2%.
natures_guardian = { 81081, 30884 , 2 }, -- When your health is brought below 35%, you instantly heal for 20% of your maximum health. Cannot occur more than once every 45 sec.
natures_swiftness = { 81099, 378081, 1 }, -- Your next healing or damaging Nature spell is instant cast and costs no mana.
- oath_of_the_far_seer = { 81002, 381785, 2 }, -- Reduces the cooldown of Ascendance by 30 sec, and you gain 8% additional Haste while Ascendance is active.
+ oath_of_the_far_seer = { 81002, 381785, 2 }, -- Reduces the cooldown of Ascendance by 45 sec, and you gain 8% additional Haste while Ascendance is active.
planes_traveler = { 81056, 381647, 1 }, -- Reduces the cooldown of Astral Shift by 30 sec and increases its duration by 4 sec.
- poison_cleansing_totem = { 81093, 383013, 1 }, -- Summons a totem at your feet that removes 1 poison effect from a nearby party or raid member within 30 yards every 1.5 sec for 6 sec.
+ poison_cleansing_totem = { 81093, 383013, 1 }, -- Summons a totem at your feet that removes 1 poison effect from a nearby party or raid member within 34 yards every 1.5 sec for 9 sec.
power_of_the_maelstrom = { 81015, 191861, 2 }, -- Casting Lava Burst has a 5% chance to cause your next 2 Lightning Bolt or Chain Lightning casts to trigger Elemental Overload an additional time.
primal_elementalist = { 81008, 117013, 1 }, -- Your Earth, Fire, and Storm Elementals are drawn from primal elementals 80% more powerful than regular elementals, with additional abilities, and you gain direct control over them.
primordial_bond = { 80980, 381764, 1 }, -- While you have an elemental active, your damage taken is reduced by 5%.
primordial_fury = { 80982, 378193, 1 }, -- Your healing critical strikes heal for 250% healing instead of the usual 200%.
- primordial_surge = { 80978, 386474, 1 }, -- Casting Primordial Wave triggers Lava Surge immediately and every 3 sec for 12 sec. Lava Surges triggered by Primordial Wave increase the damage of your next Lava Burst by 20%.
- primordial_wave = { 81014, 375982, 1 }, -- Blast your target with a Primordial Wave, dealing 292 Shadow damage and apply Flame Shock to an enemy, or heal an ally for 292. Your next Lava Burst will also hit all targets affected by your Flame Shock for 80% of normal damage.
+ primordial_wave = { 81014, 375982, 1 }, -- Blast your target with a Primordial Wave, dealing 1,023 Shadow damage and apply Flame Shock to an enemy, or heal an ally for 1,023. Your next Lava Burst will also hit all targets affected by your Flame Shock for 80% of normal damage.
purge = { 81076, 370 , 1 }, -- Purges the enemy target, removing 1 beneficial Magic effect.
refreshing_waters = { 80980, 378211, 1 }, -- Your Healing Surge is 30% more effective on yourself.
rolling_magma = { 80977, 386443, 2 }, -- Lava Burst and Lava Burst Overload damage reduces the cooldown of Primordial Wave by 0.5 sec.
@@ -103,30 +103,30 @@ spec:RegisterTalents( {
spiritwalkers_grace = { 81066, 79206 , 1 }, -- Calls upon the guidance of the spirits for 15 sec, permitting movement while casting Shaman spells. Castable while casting.
splintered_elements = { 80978, 382042, 1 }, -- Each additional Lava Burst generated by Primordial Wave increases your Haste by 10% for 12 sec.
static_charge = { 81070, 265046, 1 }, -- Reduces the cooldown of Capacitor Totem by 5 sec for each enemy it stuns, up to a maximum reduction of 20 sec.
- stoneskin_totem = { 81095, 383017, 1 }, -- Summons a totem at your feet for 15 sec that grants 10% physical damage reduction to you and the 4 allies nearest to the totem within 30 yards.
+ stoneskin_totem = { 81095, 383017, 1 }, -- Summons a totem at your feet for 15 sec that grants 10% physical damage reduction to you and the 4 allies nearest to the totem within 35 yards.
storm_elemental = { 80981, 192249, 1 }, -- Calls forth a Greater Storm Elemental to hurl gusts of wind that damage the Shaman's enemies for 30 sec. While the Storm Elemental is active, each time you cast Lightning Bolt or Chain Lightning, the cast time of Lightning Bolt and Chain Lightning is reduced by 3%, stacking up to 10 times.
stormkeeper_2 = { 80992, 191634, 1 }, -- Charge yourself with lightning, causing your next 2 Lightning Bolts to deal 150% more damage, and also causes your next 2 Lightning Bolts or Chain Lightnings to be instant cast and trigger an Elemental Overload on every target. If you already know Stormkeeper, instead gain 1 additional charge of Stormkeeper.
stormkeeper = { 80989, 191634, 1 }, -- Charge yourself with lightning, causing your next 2 Lightning Bolts to deal 150% more damage, and also causes your next 2 Lightning Bolts or Chain Lightnings to be instant cast and trigger an Elemental Overload on every target. If you already know Stormkeeper, instead gain 1 additional charge of Stormkeeper.
- surge_of_power = { 81000, 262303, 1 }, -- TODO: Recheck effects -- Earth Shock, Elemental Blast, and Earthquake enhance your next spell cast within 15 sec: Flame Shock: The next cast also applies Flame Shock to 1 additional target within 8 yards of the target. Lightning Bolt: Your next cast will cause an additional 2 Elemental Overloads. Chain Lightning: Your next cast will chain to 1 additional target. Lava Burst: Reduces the cooldown of your Fire and Storm Elemental by 6.0 sec. Frost Shock: Freezes the target in place for 6 sec.
+ surge_of_power = { 81000, 262303, 1 }, -- TODO: Earth Shock, Elemental Blast, and Earthquake enhance your next spell cast within 15 sec: Flame Shock: The next cast also applies Flame Shock to 1 additional target within 8 yards of the target. Lightning Bolt: Your next cast will cause an additional 2 Elemental Overloads. Chain Lightning: Your next cast will chain to 1 additional target. Lava Burst: Reduces the cooldown of your Fire and Storm Elemental by 6.0 sec. Frost Shock: Freezes the target in place for 6 sec.
surging_shields = { 81092, 382033, 2 }, -- Increases the damage dealt by Lightning Shield by 50% and causes it to generate an additional 2 Maelstrom when triggered. Increases the healing done by Earth Shield by 12%.
swelling_maelstrom = { 81016, 381707, 1 }, -- Increases your maximum Maelstrom by 50.
swirling_currents = { 81101, 378094, 2 }, -- Using Healing Stream Totem increases the healing of your next 3 Healing Surges by 25%.
thunderous_paws = { 81072, 378075, 1 }, -- Ghost Wolf removes snares and increases your movement speed by an additional 25% for the first 3 sec. May only occur once every 60 sec.
thundershock = { 81096, 378779, 1 }, -- Thunderstorm knocks enemies up instead of away and its cooldown is reduced by 5 sec.
- thunderstorm = { 81097, 51490 , 1 }, -- Calls down a bolt of lightning, dealing 49 Nature damage to all enemies within 10 yards, reducing their movement speed by 40% for 5 sec, and knocking them away from the Shaman. Usable while stunned.
+ thunderstorm = { 81097, 51490 , 1 }, -- Calls down a bolt of lightning, dealing 173 Nature damage to all enemies within 10 yards, reducing their movement speed by 40% for 5 sec, and knocking them away from the Shaman. Usable while stunned.
totemic_focus = { 81094, 382201, 2 }, -- Increases the radius of your totem effects by 15%. Increases the duration of your Earthbind and Earthgrab Totems by 5 sec. Increases the duration of your Healing Stream, Tremor, Poison Cleansing, and Wind Rush Totems by 1.5 sec.
totemic_projection = { 81080, 108287, 1 }, -- Relocates your active totems to the specified location.
totemic_recall = { 81091, 108285, 1 }, -- Resets the cooldown of your most recently used totem with a base cooldown shorter than 3 minutes.
totemic_surge = { 81104, 381867, 2 }, -- TODO: Reduces the cooldown of your totems by 2 sec.
- tranquil_air_totem = { 81095, 383019, 1 }, -- Summons a totem at your feet for 20 sec that prevents cast pushback and reduces the duration of all incoming interrupt effects by 50% for you and the 4 allies nearest to the totem within 30 yards.
- tremor_totem = { 81069, 8143 , 1 }, -- Summons a totem at your feet that shakes the ground around it for 10 sec, removing Fear, Charm and Sleep effects from party and raid members within 30 yards.
+ tranquil_air_totem = { 81095, 383019, 1 }, -- Summons a totem at your feet for 20 sec that prevents cast pushback and reduces the duration of all incoming interrupt effects by 50% for you and the 4 allies nearest to the totem within 35 yards.
+ tremor_totem = { 81069, 8143 , 1 }, -- Summons a totem at your feet that shakes the ground around it for 13 sec, removing Fear, Charm and Sleep effects from party and raid members within 34 yards.
tumultuous_fissures = { 80986, 381743, 1 }, -- Increases the chance for Earthquake to knock enemies down by 3.0%.
unrelenting_calamity = { 80988, 382685, 1 }, -- Reduces the cast time of Lightning Bolt and Chain Lightning by 0.25 sec. Increases the duration of Earthquake by 1 sec.
voodoo_mastery = { 81078, 204268, 1 }, -- Reduces the cooldown of your Hex spell by 15 sec.
- wind_rush_totem = { 81082, 192077, 1 }, -- Summons a totem at the target location for 15 sec, continually granting all allies who pass within 10 yards 40% increased movement speed for 5 sec.
+ wind_rush_totem = { 81082, 192077, 1 }, -- Summons a totem at the target location for 18 sec, continually granting all allies who pass within 10 yards 40% increased movement speed for 5 sec.
wind_shear = { 81068, 57994 , 1 }, -- Disrupts the target's concentration with a burst of wind, interrupting spellcasting and preventing any spell in that school from being cast for 3 sec.
winds_of_alakir = { 81087, 382215, 2 }, -- Increases the movement speed bonus of Ghost Wolf by 5%. When you have 3 or more totems active, your movement speed is increased by 7%.
- windspeakers_lava_resurgence = { 81006, 378268, 1 }, -- When you cast Earth Shock, Elemental Blast, or Earthquake, gain Lava Surge and increase the damage of your next Lava Burst by 10%.
+ windspeakers_lava_resurgence = { 81006, 378268, 1 }, -- When you cast Earth Shock or Elemental Blast, gain Lava Surge and increase the damage of your next Lava Burst by 10%.
} )
@@ -169,21 +169,8 @@ spec:RegisterAuras( {
ascendance = {
id = 114050,
duration = 15,
- max_stack = 1
- },
- -- Talent: Transformed into a powerful Air ascendant. Auto attacks have a $114089r yard range. Stormstrike is empowered and has a $114089r yard range.$?s384411[ Generating $384411s1 $lstack:stacks; of Maelstrom Weapon every $384437t1 sec.][]
- -- https://wowhead.com/beta/spell=114051
- ascendance = {
- id = 114051,
- duration = 15,
- max_stack = 1
- },
- -- Talent: Transformed into a powerful Water Ascendant. Healing you deal is duplicated and distributed evenly among nearby allies.
- -- https://wowhead.com/beta/spell=114052
- ascendance = {
- id = 114052,
- duration = 15,
- max_stack = 1
+ max_stack = 1,
+ copy = { 114051, 114052 }
},
-- Talent: Damage taken reduced by $w1%.
-- https://wowhead.com/beta/spell=108271
@@ -267,11 +254,11 @@ spec:RegisterAuras( {
aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal.
aliasType = "buff",
},
- -- buff id is different if not talented.
- echoes_of_great_sundering = {
- id = function () return talent.echoes_of_great_sundering.enabled and 384088 or 336217 end,
- duration = 25,
- max_stack = 1,
+ electrified_shocks = {
+ id = 382089,
+ duration = 6,
+ type = "Magic",
+ max_stack = 1
},
elemental_blast_critical_strike = {
id = 118522,
@@ -446,6 +433,11 @@ spec:RegisterAuras( {
type = "Magic",
max_stack = 1
},
+ lightning_rod = {
+ id = 197209,
+ duration = 8,
+ max_stack = 1
+ },
-- Chance to deal $192109s1 Nature damage when you take melee damage$?a137041[ and have a $s3% chance to generate a stack of Maelstrom Weapon]?a137040[ and have a $s4% chance to generate $s5 Maelstrom][].
-- https://wowhead.com/beta/spell=192106
lightning_shield = {
@@ -590,15 +582,8 @@ spec:RegisterAuras( {
id = 320137,
duration = 15,
type = "Magic",
- max_stack = 2
- },
- -- Talent: Your next Lightning Bolt or Chain Lightning will deal $s2% increased damage and be instant cast.
- -- https://wowhead.com/beta/spell=383009
- stormkeeper = {
- id = 383009,
- duration = 15,
- type = "Magic",
- max_stack = 2
+ max_stack = 2,
+ copy = 383009
},
-- Incapacitated.
-- https://wowhead.com/beta/spell=197214
@@ -625,7 +610,8 @@ spec:RegisterAuras( {
id = 378102,
duration = 15,
type = "Magic",
- max_stack = 3
+ max_stack = 3,
+ copy = 338340
},
-- Talent: Movement speed increased by $378075s1%.
-- https://wowhead.com/beta/spell=378076
@@ -652,22 +638,11 @@ spec:RegisterAuras( {
duration = 5,
max_stack = 1,
},
- --buff id is different if not talented.
- windspeakers_lava_resurgence = {
- id = function () return talent.windspeakers_lava_resurgence.enabled and 378269 or 336065 end,
- duration = 15,
- max_stack = 1,
- },
wind_gust = {
id = 263806,
duration = 30,
max_stack = 20
},
- wind_rush = {
- id = 192082,
- duration = 5,
- max_stack = 1,
- },
-- Talent: Lava Burst damage increased by $s1%.
-- https://wowhead.com/beta/spell=378269
windspeakers_lava_resurgence = {
@@ -699,24 +674,8 @@ spec:RegisterAuras( {
t.caster = "nobody"
end,
},
- -- TODO: Implement like Bloodtalons, but APL doesn't really require it mechanically.
- elemental_equilibrium = {
- id = 347348,
- duration = 10,
- max_stack = 1
- },
- elemental_equilibrium_debuff = {
- id = 347349,
- duration = 30,
- max_stack = 1
- },
-- Conduit
- swirling_currents = {
- id = 338340,
- duration = 15,
- max_stack = 1
- },
vital_accretion = {
id = 337984,
duration = 60,
@@ -756,6 +715,20 @@ spec:RegisterHook( "runHandler", function( action )
recall_totem_2 = recall_totem_1
recall_totem_1 = action
end
+
+ if talent.elemental_equilibrium.enabled and debuff.elemental_equilibrium_debuff.down then
+ local ability = class.abilities[ action ]
+ if ability and ability.startsCombat and ability.school then
+ if ability.school == "fire" then last_ee_fire = query_time
+ elseif ability.school == "frost" then last_ee_frost = query_time
+ elseif ability.school == "nature" then last_ee_nature = query_time end
+
+ if max( last_ee_fire, last_ee_frost, last_ee_nature ) - min( last_ee_fire, last_ee_frost, last_ee_nature ) < 10 then
+ applyBuff( "elemental_equilibrium" )
+ applyDebuff( "player", "elemental_equilibrium_debuff" )
+ end
+ end
+ end
end )
@@ -813,7 +786,9 @@ local recall_totems = {
local recallTotem1
local recallTotem2
-spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
+local fireDamage, frostDamage, natureDamage = 0, 0, 0
+
+spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName, school )
-- Deaths/despawns.
if death_events[ subtype ] then
if destGUID == summon.guid then
@@ -887,6 +862,12 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _
recallTotem1 = key
end
end
+
+ if ( subtype == "SPELL_DAMAGE" or subtype == "SPELL_PERIODIC_DAMAGE" ) and state.talent.elemental_equilibrium.enabled then
+ if bit.band( school, 4 ) == 1 then fireDamage = GetTime() end
+ if bit.band( school, 16 ) == 1 then frostDamage = GetTime() end
+ if bit.band( school, 8 ) == 1 then natureDamage = GetTime() end
+ end
end
end )
@@ -916,6 +897,19 @@ spec:RegisterStateFunction( "trigger_vesper_damage", function ()
end
end )
+spec:RegisterStateFunction( "last_ee_fire", function ()
+ return fireDamage
+end )
+
+spec:RegisterStateFunction( "last_ee_frost", function ()
+ return frostDamage
+end )
+
+spec:RegisterStateFunction( "last_ee_nature", function ()
+ return natureDamage
+end )
+
+
spec:RegisterTotem( "liquid_magma_totem", 971079 )
spec:RegisterTotem( "tremor_totem", 136108 )
spec:RegisterTotem( "wind_rush_totem", 538576 )
@@ -1015,23 +1009,7 @@ spec:RegisterAuras( {
} )
--- Tier 28
-spec:RegisterGear( "tier28", 188925, 188924, 188923, 188922, 188920 )
-spec:RegisterSetBonuses( "tier28_2pc", 364472, "tier28_4pc", 363671 )
--- 2-Set - Fireheart - While your Storm Elemental / Fire Elemental is active, your Lava Burst deals 20% additional damage and you gain Lava Surge every 8 sec.
--- 4-Set - Fireheart - Casting Lava Burst extends the duration of your Storm Elemental / Fire Elemental by 1.5 sec. If your Storm Elemental / Fire Elemental is not active. Lava Burst has a 20% chance to reduce its remaining cooldown by 10 sec instead.
-spec:RegisterAura( "fireheart", {
- id = 364523,
- duration = 30,
- tick_time = 8,
- max_stack = 1
-} )
-
-local TriggerFireheart = setfenv( function()
- applyBuff( "lava_surge" )
-end, state )
-
-local TriggerPrimordialSurge = setfenv( function()
+local TriggerHeatWave = setfenv( function()
applyBuff( "lava_surge" )
end, state )
@@ -1086,22 +1064,10 @@ spec:RegisterHook( "reset_precast", function ()
end
end
- if buff.fireheart.up then
- if pet.fire_elemental.up then buff.fireheart.expires = pet.fire_elemental.expires
- elseif pet.storm_elemental.up then buff.fireheart.expires = pet.storm_elemental.expires end
-
- -- Proc the next Lava Surge from Fireheart.
- local next_ls = 8 - ( ( query_time - buff.fireheart.applied ) % 8 )
-
- if next_ls < buff.fireheart.remains then
- state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + next_ls, "AURA_PERIODIC" )
- end
- end
-
- if talent.primordial_surge.enabled and query_time - action.primordial_wave.lastCast < 12 then
+ if talent.heat_wave.enabled and query_time - action.primordial_wave.lastCast < 12 then
local expires = action.primordial_wave.lastCast + 12
while expires > query_time do
- state:QueueAuraEvent( "primordial_surge", TriggerPrimordialSurge, expires )
+ state:QueueAuraEvent( "heat_wave", TriggerHeatWave, expires, "AURA_PERIODIC" )
expires = expires - 3
end
end
@@ -1167,7 +1133,10 @@ spec:RegisterAbilities( {
return "nature"
end,
talent = "ascendance",
- startsCombat = false,
+ startsCombat = function()
+ if state.spec.elemental and active_dot.flame_shock > 0 then return true end
+ return false
+ end,
toggle = "cooldowns",
@@ -1176,7 +1145,7 @@ spec:RegisterAbilities( {
if state.spec.elemental and dot.flame_shock.up then dot.flame_shock.expires = query_time + class.auras.flame_shock.duration
elseif state.spec.enhancement and talent.static_accumulation.enabled then
for i = 1, class.auras.ascendance.duration do
- state:QueueAuraEvent( "ascendance", TriggerStaticAccumulation, query_time + i )
+ state:QueueAuraEvent( "ascendance", TriggerStaticAccumulation, query_time + i, "AURA_PERIODIC" )
end
end
end,
@@ -1458,6 +1427,7 @@ spec:RegisterAbilities( {
talent = "earth_shock",
notalent = "elemental_blast",
startsCombat = true,
+ cycle = function() return talent.lightning_rod.enabled and "lightning_rod" or nil end,
handler = function ()
removeBuff( "master_of_the_elements" )
@@ -1477,7 +1447,7 @@ spec:RegisterAbilities( {
applyBuff( "windspeakers_lava_resurgence" )
end
- if talent.lightning_rod.enabled then applyDebuff( "lightning_rod" ) end
+ if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end
if talent.further_beyond.enabled and buff.ascendance.up then buff.ascendance.expires = buff.ascendance.expires + 2.5 end
if set_bonus.tier29_2pc > 0 then
@@ -1545,14 +1515,14 @@ spec:RegisterAbilities( {
spendType = "maelstrom",
talent = "earthquake",
- startsCombat = false,
+ startsCombat = true,
handler = function ()
removeBuff( "echoes_of_great_sundering" )
removeBuff( "master_of_the_elements" )
removeBuff( "magma_chamber" )
- if talent.lightning_rod.enabled then applyDebuff( "lightning_rod" ) end
+ if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end
if talent.further_beyond.enabled and buff.ascendance.up then buff.ascendance.expires = buff.ascendance.expires + 2.5 end
if talent.windspeakers_lava_resurgence.enabled then
@@ -1592,6 +1562,7 @@ spec:RegisterAbilities( {
talent = "elemental_blast",
startsCombat = true,
+ cycle = function() return talent.lightning_rod.enabled and "lightning_rod" or nil end,
handler = function ()
removeBuff( "master_of_the_elements" )
@@ -1612,10 +1583,6 @@ spec:RegisterAbilities( {
applyBuff( "windspeakers_lava_resurgence" )
end
- if talent.lightning_rod.enabled then
- applyDebuff( "target","lightning_rod" )
- end
-
if talent.further_beyond.enabled and buff.ascendance.up then
--TODO: increase ascendance duration by 3.5 seconds
end
@@ -1628,7 +1595,7 @@ spec:RegisterAbilities( {
applyBuff( "elemental_mastery" )
end
- if talent.lightning_rod.enabled then applyDebuff( "lightning_rod" ) end
+ if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end
if talent.further_beyond.enabled and buff.ascendance.up then buff.ascendance.expires = buff.ascendance.expires + 3.5 end
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
end,
@@ -1673,11 +1640,6 @@ spec:RegisterAbilities( {
handler = function ()
summonPet( talent.primal_elementalist.enabled and "primal_fire_elemental" or "greater_fire_elemental" )
-
- if set_bonus.tier28_2pc > 0 then
- applyBuff( "fireheart", pet.fire_elemental.remains )
- state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + 8, "AURA_PERIODIC" )
- end
end,
},
@@ -1759,8 +1721,9 @@ spec:RegisterAbilities( {
if buff.icefury.up then
gain( 8, "maelstrom" )
removeStack( "icefury", 1 )
+
if talent.electrified_shocks.enabled then
- applyDebuff( "electrified_shocks" )
+ applyDebuff( "target", "electrified_shocks" )
active_dot.electrified_shocks = min( true_active_enemies, active_dot.electrified_shocks + 2 )
end
end
@@ -1774,12 +1737,6 @@ spec:RegisterAbilities( {
applyBuff( "flux_melting" )
end
- if talent.electrified_shocks.enabled then
- --TODO: Apply debuff to 3 additional targets if hit
- applyDebuff( "target", "electrified_shocks" )
- active_dot.electrified_shocks = min( active_enemies, active_dot.electrified_shocks + 3 )
- end
-
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
end,
},
@@ -1812,14 +1769,16 @@ spec:RegisterAbilities( {
spendType = "mana",
talent = "greater_purge",
- startsCombat = true,
+ startsCombat = function()
+ if talent.elemental_equilibrium.enabled then return false end
+ return true
+ end,
toggle = "interrupts",
debuff = "dispellable_magic",
handler = function ()
removeDebuff( "target", "dispellable_magic" )
- removeDebuff( "target", "dispellable_magic" )
end,
},
@@ -1984,7 +1943,7 @@ spec:RegisterAbilities( {
spendType = "mana",
talent = "lava_burst",
- startsCombat = false,
+ startsCombat = true,
velocity = 30,
@@ -2019,16 +1978,6 @@ spec:RegisterAbilities( {
reduceCooldown( "primordial_wave", 0.2 * talent.rolling_magma.rank )
end
- if set_bonus.tier28_4pc > 0 then
- if pet.fire_elemental.up then
- pet.fire_elemental.expires = pet.fire_elemental.expires + 1.5
- buff.fireheart.expires = pet.fire_elemental.expires
- elseif pet.storm_elemental.up then
- pet.storm_elemental.expires = pet.storm_elemental.expires + 1.5
- buff.fireheart.expires = pet.storm_elemental.expires
- end
- end
-
if set_bonus.tier29_2pc > 0 then
addStack( "seismic_accumulation" )
end
@@ -2144,14 +2093,8 @@ spec:RegisterAbilities( {
handler = function ()
summonTotem( "liquid_magma_totem" )
- --TODO: Apply FS to 3 targets
- if active_enemies >= 4 then
- active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + 3 )
- else
- applyDebuff( "flame_shock" )
- active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + 2 )
- end
-
+ applyDebuff( "target", "flame_shock" )
+ active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + 2 )
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
end,
},
@@ -2254,12 +2197,12 @@ spec:RegisterAbilities( {
applyDebuff( "target", "flame_shock" )
applyBuff( "primordial_wave" )
- if talent.primordial_surge.enabled then
+ if talent.heat_wave.enabled then
applyBuff( "lava_surge" )
- state:QueueAuraEvent( "primordial_surge", TriggerPrimordialSurge, query_time + 3, "AURA_PERIODIC" )
- state:QueueAuraEvent( "primordial_surge", TriggerPrimordialSurge, query_time + 6, "AURA_PERIODIC" )
- state:QueueAuraEvent( "primordial_surge", TriggerPrimordialSurge, query_time + 9, "AURA_PERIODIC" )
- state:QueueAuraEvent( "primordial_surge", TriggerPrimordialSurge, query_time + 12, "AURA_PERIODIC" )
+ state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 3, "AURA_PERIODIC" )
+ state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 6, "AURA_PERIODIC" )
+ state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 9, "AURA_PERIODIC" )
+ state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 12, "AURA_PERIODIC" )
end
end,
@@ -2272,7 +2215,6 @@ spec:RegisterAbilities( {
cast = 0,
cooldown = 0,
gcd = "spell",
- school = "nature",
spend = 0.1,
spendType = "mana",
@@ -2388,11 +2330,6 @@ spec:RegisterAbilities( {
handler = function ()
summonPet( talent.primal_elementalist.enabled and "primal_storm_elemental" or "greater_storm_elemental" )
-
- if set_bonus.tier28_2pc > 0 then
- applyBuff( "fireheart", pet.storm_elemental.remains )
- state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + 8, "AURA_PERIODIC" )
- end
end,
},
@@ -2409,7 +2346,7 @@ spec:RegisterAbilities( {
school = "nature",
talent = function () return talent.stormkeeper.enabled and "stormkeeper" or talent.stormkeeper_2.enabled and "stormkeeper_2" end,
- startsCombat = true,
+ startsCombat = false,
texture = 839977,
toggle = "cooldowns",
@@ -2569,7 +2506,7 @@ spec:RegisterAbilities( {
handler = function () end,
},
- eye_of_the_storm = {
+ tempest = {
id = 157375,
known = function () return talent.primal_elementalist.enabled and talent.storm_elemental.enabled and storm_elemental.up end,
cast = 0,
@@ -2577,7 +2514,6 @@ spec:RegisterAbilities( {
gcd = "off",
startsCombat = true,
- -- texture = ,
talent = "primal_elementalist",
@@ -2623,4 +2559,4 @@ spec:RegisterOptions( {
} )
-spec:RegisterPack( "Elemental", 20220801, [[Hekili:T3Z(VTnoA(3IXcOXUtxx)kPTdIdWm9gCOfZnhW65WD)KLvKzIfQSKxj5Kjag(V99JuViP4hF4hT7I9WUOtIef537NKmlhV8pwUyDqbz5Vpz0KjJ(WOXdhd)ZSjlxu86oYYf7cc)AWtWpKeSf(3FnMSLKueetFZRXPbRPZqE6(Sq4TBkk2L)tV7DpfvSz)dddt3(U8OT7JdkIstcZcESG(7HVB5Ih2hfx85KLpOC5NEdmN7iHWJVfGKnrRxtkhljpKdioUAXMGTbjh)YpV)P95fhxn(ThxrNQJF54x(0MGKNi5)0XV8xpU6ZjHPz7sZGf74QCsrruYt5dZla0Z)H9p(ij74QhtH)5ZHKh3N9kmplksZ2(vczhjBiBo(51RpU6)IuqOJlib(LF9vy2sF84QInKQpaEZtbrjdbcuw6JrXaz5V8xGr2fMPpwfCtFElSt)Tlb8xnpoHdmObgXFsc3xqGXsEMK9kmYOTKQXhewqNPOC4hFoiko4Hyc8DWJbwE(WDzeqk4HGI5KGSIn(KAYWBJECEp4)c)cmOOTbXTVlkVyijHotRzR))toraBoUQzApUAFsmjhw98ukmfSEn8ZVefd058DbVKqFrAIki6hN)UhHpDdtUKcoGuC8drjRhUdyj7Jj(KS97OF0HdnV65uQWm8U804NbGv98M3cR0jUcn5EAn651pliATpHovdPWoOZSpP4UPhoi)IOK7Vz0ae8ikJ0s(upMMx7)qCqEbhCj9Mgyd0aJJ9lcYEIuaa2gqIWpo6PnfjGS3DtzSMFHegSNYE(TN)LJR2eqfdajJSGNjXLYjVTwqz96uGBSloiKaJ6nfBOYmW6M96Ba5p4vF6)OseEkvcpmnHYklsPcwPrGW3609aC9xzReBQ2hhJWyJbzrqTidWZ4OeIF465t5L4oru(WbQQMaJC)o1qG03E2l(9ZN61Z6vFxk9zvQVFoPGKrfLlvZdH1mVLUbJ(fqY2pFdOHY)08DrzrfVee)vswU)tzaF7TBtFgGL5J5hx9A1(eqGWpQGSnN)HpgdoqGvjn8RuIrFduJbE9kIc)kSAE92rQuEALXhsN4NjE9nYXQwMTWCtY8tF0hKgRNN86vdu32NqaHVNidZ)6RpKrcyy9JrG9o)1KTr5KHK)((OD7aqta7bBxPzRJa4)fqO)THVgcwhQGN5Jz8DgBtAGaRZRVgmdS5OhZ8yZkJ1rDHu6k4UjJ4mwftcw7)WR(K)my7oWSSkKDhOFaegYAoAsnEAI6EZ1G6EjH)kfgfJHtXPRSzJK3vHbzKSE9fAr8xaVzBzKbCp5H4001(Sqk4SHfKhsswhKeYXvy4l3l2V7WHW0041PVKW)8mYwaHZb3zcRda6KSVkzR0U1rg3yWS7tJlGl9v5GFUy)WG44R7A9mbeyY8lsbBQcOAayPjlij)X95WJOarykeXqaafjuXjFyeE94KsiK15uXPmqHcgfyvp9LInncjEnwLnj5XqiKbTF3atosDhl(2JeguWbhYGMCdtuuLQHrsTh3mgzdjTdsq7eqv)YFZNgk8BPzEnpiL8wqElkSO0PsPriFscOMtGPWGrL7NiJoLHirc2E)eZREomfnU1eGJE8b3YHB1b1icN3nFI51cSeJUCUVATbibKW5sFiddWTXl8T0yOFLulOW(a6NZeIO2aAj2nm25Jh1zkOPb933dwQB(ys4Mu4Rk9)iesx5NuYk3eKb2bkKFP1PAi)H8(8ue0sg5Xmi5i6N61VFfDDDAXqUV7UjDi4t9AK2Ld4PIOC34B9A1VjHzPXWO0fK3Hdil)yPL)(5Z0gSOvMfgC4qFh8RQBbLMknHQ4HrHNYB(MkOqyM(EcGPc)89jRjzubU2GNqMNz82QW5mv2e7gR6Gbd0jarvJuVY6JE3koIBX5ypnVjmpmCUJUlVIkFc0ckW12I2gqIbtxPBVF(TJ867cB0RXUG6XrDo5KCrhuPnMdo8OBKlAJaEqRN2OYIo1YXkJ8U(XqUo9AK(AFyhOkocG31(BdEABqz4oCqx3xIzAtrU36JhzMN(qbA5L3DJAl6TYeUWwQsqrhJUdjQTYgWIjPSvRjBi8RzMyRmOITs57PycL)zGczLMCxnkbVHgI3AIB2cT06cVE6nJmHNDfzB5hk8IQWrNtOqoPW)H0K95dlaJDt(G)SDHEOCNUMWCdAvmXOLUq5lQDKm9npfI6lspBg9RUqEcNpthl8muPCWhLkoODYQM0cfKLpn8SVHQt4gMAfAr9zB1aDtxfSY5MeJrJXdesM2eY3nKj74aAP)ZDJ()9rsZnZ6w4(USoECj1iyP5nDEnRwBUz87kAQ9Qp7kMitkX6Jaqw0Sks5o856p8c1tPB0dwQjcKGTAJH1G4LgkBD3oqiX1r06dQGHDsmNp9OMjsFI2DMIS08cPPGVGgYvk5KRUH8eXcfVI(aITXTczmKNApyx6ls9FsXKyrZruvkaSGoSQC(QGJZQUnkMpEgtRONusqEYPaj871gWu2k)wJA1dN9w1Duy8h0dRwxNNVvO84HJrqq9mrxn2OD2oH6MPcMCQIanPa3AJPHOmhOigSoo5WbXAkyYX6viai92meCk1hrATsnM1JMy6lGPTAPfSV6WsPLQ3GurC1y1ePwpxxi8Ml9IlerKdwMr2wagHFJmDZZvR8VbYQCrXukIq7zs74(4iXs6zwo2IQQmGVMI01hG7YWOzcwGfrQqiliIQj1mrOHGAOtmJP1nRBS)nMHnOJ1H7RP(QDu0CqNI9TQ7YQ5pgl0ih)qpG2bdl)EoDmSmwU8EV0oJinLrPdyLBYm5DswLuR8J93SFBqsA0AaGEBu9o5XpA7wceBubH6fV5PpfN(qqSWJ0TKgCqcJn0FDuEjtqWlP4RSIfCA7)VMTcHMXyBsdOCrHunl)SMwkn2uJvhJ3y1XUOkRDOpe8etUpdYdl36W9CoTdBNp47HFMrOhcsbfude3FR1AGkZLHF8Z7ALRFhNCwgbDNYcmazrpvZeNFC9Aai9bV3VUfwhoGumjwCLnkrkAWd231xZ2t5hL9nSEFgBlEpWtZxX6bz3W8Q7vKq8GNmfHnvksDuT4U0CBDtXO7RvAamvHTka6C9zTBy(3p6s20mlCGlwXI(og0tniD5A7ZzNuNx)2EX9(r1BXpS4u64tZYK(CEFzZdwZMPdHVOzmARSG75OOzMp3M0EMPJyNmNHo6Qd9Si9k77x8TJUCiULnjPVEGJBdPPYafFkAFSZUgRBgDQOoMeBH0VSDp61mvY2dAMpCpTt0Ph6qlkg7PlFn36l5LB3j6ax0eDO1AKJoi8CX6R2m96BYtJKVrRDdE6zu6j7p22L0(52cliCD60YI0ONd7uPumQ(pWwJsMXaZ2T(3dlt2LeIvaP6uvofNI2xAixugTJuJp5vyMgYuV24YUF6n6z)JoBMIm5UVWdQxiQaWmfPbQ80LzR8Ov2dXhdwbgKjdNsZK0tk5mh1Ohrn)eh9qw0(TDQQRQb5VMWEjnLjdPp0txOW6q8)fOiEsWmwjkVeI26YX6CQBOsFxUx0qwbbLosg014znYLkQfOHWcTnjc70NCVAD2mzrMkvNgPHoN2ZlJSZ5xWSLlEgIkfGOQ7nG3pE6YfVeKrP45lx8)(Z)TF)Z)()5pDC1Xv)b9ShhTDxAwr1Pl(heqIF44QmQLKm6XBV6mKVViDBa78UhwEm8hE8l)wuc8QPJGj9tPjWYZE)p0Ow()9dLNvzUNuJ)WB6p(phWon9gaTMZWRBG1KZcQoR5GEe8)1)7FZEuuU2WoIPZonWSb6(mdyOF6nSlVGi6jjNA8GUglxal9M0SLlw0CTv8jQr)LlydHDxxWd8Wd(D2DOr1kT8xwUimlcSBhfSCr)JR64rVsC)4Q7qVghEZXv0s7q)VD(8Y6fVAaaPmyNcy8MAwwaQeOaKA9ZJR8Qwjo77DE2ja4s6S1qmNrdk4ovcCBgwR5mjIAp6nlq5gsB1Hd0lgaL1Wga15vqeDufy1ZLHR4Zbi8aYH411(4QFScFvurCGvXMETFpSeZQhyTmJ4wHGHa9QELqdDPIccomOcKavDMBuv2eRyBhsbjoNpQxRBmjWHqZ7xFtICpWNUDujwQcfRhTMW3Hj54QrCJTxdhVJ4opXusKVh3IW)kofUwKHI73II7QyJLGMJfzreGXZEJo7wLRGO9JgsjfDEVjwjsC11Owt2wmP633Wq61vfz)UwGqAwPqYhmbjQ2Rw1eyvfVNbrtljMDlIpt(5gEbiruz2mbQg3Itb2pAcyvNUHGLbvY0vgW4iu8ZdDLhp60x6YeQKk8pMKXyC)CfMQ9pV3k5XWMBCxwnWiAHVCqS3ZKoehHUP(Wmau2jLeakT5RmVqSHikHD7iDo1hlBq3vsuFxOs9nd)u1ilShlIMud9FCs5hRn5kgfzslHubb2gfhM6CL1tlXEb8cP0ELZV5OGMiyZqsKc3RPbkdqyhxBuvtFjQhIl17TRZtBixxvrfCciURxNDW6zW9uBj0zRmUxsPn(wl50ensoCBPGoKSfJ7Cubau1YdgzUWCRje8x3coOWIv((SAXS2Ajv24MrcFRo7FyG(eCFN9DvVXAlAdC3ASn4OlMT))niRuTEIXiCuL4SLyHk9BJrjGMZ8edbmHyhts8hpOgfwrSLHHUA4bWOH62touCWg20BStCBKaZUA2zGIXewTTcj91uKKAzUzifeHZ3PSYKBkidWftyUivWp4qE6WEp)WeAfK8iLD8yOScglDWeCVh22yirtK6BpKKKSUKz7j4SStcu4LZc3PcApCuATxxtKaXzUMdPzMfgyD7MwUympNRUZw8JTSju0bsrPX8YhcTvss(y6LO2J4KwCdwf67WeFI7IJGnV4MMALc0Dj1wRWI21jzFonVNT8NvMaYmMMxZMArdaIzvkX6ygbkB5dv5S6T(vpbvxxwPgt7xCXKTJ0zXANLoTVIH33IapTiaDz(O14eNKMiOoZybwSqKU7ZUwLtVGEjz)yW(yL9MGE)zNfTR8dvEVW2oVT3kSmd12sjvCTXkZ85LjlV9yLP58JO52KvAq4An9TYgFtHjB6LGxJsmYbMUYLV5aLNk0YbtoWzvK0(l1brp(Cc)fDlhDdzwS0(sM4yIxiv)VVrIID5omTvhq6a)vMArv5)nD5V2HAP5g(IlzlZW3nxxw21c3Q5EQpv8Qd6cV8fsAdFd59oWP(UPC9bEZsI(5LSn9r(rwEN6kncn1TVN2Ev2K0G4gWtmnzvDzK1FdUW8BUxFzGdEUVNc4WTmnxRVSLbp(WtzzChRBUDGzqdE8KFBGg6lBVeHzGKGRp(l(xz5hC3FDV9CRTuWPhy4s0Lt93b9mtfFQuj3cnCogM4Tdmd1Xl8lcQ)9gVTWkjTqCtv1QB1xSWmrPAFMnJv2kT8GhONUI7xO0CF9HITC(S0GD5q7sbkRgbjyB9qgqtoJEt)YIVSgoZeVIGl3io(L)XOjiTSra4vdVLnktAiCbRlJD0IhnXzOrCJbvytLX)gaus72QYmeA2MzQYrOEALZuvm5bN)BcJZzv3K1HcyJVOfcG1f4pvmkRyJ8Fsye1)nwyNM0EmknCf2qd8f)qyxlmZ64zmwWuDvsZj79stKUCA4RNz1FLxwUyQA5SZe(qRvRK4339)C4yo8(ZMEu5PIp3djssndsrbP(GPC)lknRRDFvQnNejPDXsTzOTjQVoWkr5XCXTjFFIPx9UP3Drk3MnID1wqNuxPwnQsQWCcQLamvmZL1V2cv)gpwsBjbUghQYLwPKutemi3OSSjz8TvJv(gJZMk3q1F1aGJvcGu((mBMDpRdxSQ9N9DmPuZGGYjwBbe8mX1M2nVbBBfUMzDMQOCnX3Bm)QQkvdk))NqXoWatZKBpx6HV71G4uyMsfVbNCPVahADZJUxcL2tb3oQj0fNKD8SARoqPnolwY34F5DrPXi1X3bZMvlLZO8QUFKnVFqpJTPjUlzZXqnRL5A9(85oXYLOiEcnfuYnPdp72MnYPh1UNWW9)JE0cmhRvdDZbbngo0DFN3ZkIVLg0W3zA4Ts1IWkNCAoCCYwCxBvs7KmD1VclQTovJtvokQktLqimoJ1QUvPBvZWLb66vqTVZovAtpAHSQg6UKYxZ7)FABRq1fAXCJAtg(6Rq4oLXpIezIM6TDjmz4uah4Ym2RwzHcKkLputj4rJOJ803MIsEYejlPgTXVz5hCowLACp4UCRr)DCTz0js1aD(iWJ26mK7NFQS0)ztUxZUs2gxOyUO0S7w7ueheRVOhivTHO1zVQQ3jY12NMMD96LCPr4TgofpDxdBnKzBaIi)LDafGnwMPZOsIL76c7aETviEcEhbrZFtgJjbSCCe3lSYIZILGRZUHT8hvUl2qyVIB0A16gcBPTj2VL2UaBtVrwVyy7FUcf9G67tXD78NUc(0Df2yKkQMB9i1SpQWRlPUaGBQHUd7FhdgroNQyBuD)7YMDSDgvT9HGafvkhEw11wnL34XJ(SjpJho(e35Nwu9o1MQ1AA1yLXCPndMlo15DoPT0Pt1(rqDjlTjgRREm3lXlvPMIW1xRsIG5MoxWcnqMGpk0q4nUp)D8uNBdP)oHOBLaiJDx)kaqAJ320b2gRPPD9fPzREzuwcf6WJyYcUGQeAAR4pQmy9(vs84C9XrQ73Hn6tE2v12MfWXdgSe1Jtje3rG5IpuE(T5BmG2tXnErhXn4BOZvDmbOv8d3faBES7SgIB53IqG1N(65FKNrxuJM5SWFpQ)6jt7MQH6E9RjTrJB9ibLK)55mLzoXYt7SCPjvWE2SRZkTtyZ4CoV1UN8RjoTJlhxVMwzFX0oUCSaWPQUnc7vhj7csYNc73DDhGuhYO8cK(QSnJolw7SCoNYmRpBuAYsU8)T8F8]] )
\ No newline at end of file
+spec:RegisterPack( "Elemental", 20221030, [[Hekili:DZvEZTTnw8plE6ux7UjYskXUn7u7DAoAhNTxtvY2)tKqKGsyfpu5Hv9oE4N999a4fajaPSKTt60zCTjbX7aVJFVhFHZNm)dZN5ssPZ)LPJNoDY4xmE00x8YXJFX8zP3UHoF2gIZAYs4xcjbWpFNpnGgMs8X7CRFeXf3HKOSyh4URst3K8pp7SLS0vzlg5efCwcliZNKYIcDIjEP4F7C28zlYy(PxhoFrhK)fV6Lxa75gQdC5lMcBlZ1LkwlnXz(mG2XrEmFGIFrU97ctYIP52BPKnrH520qNvKW0CBwsUnzZgFg1Du(7joitKmAtmf4RfK0)XLN55dcvAu4YmQL4XFgZ7sq6arCelaOYnuxR2RAenKSWN629UUjcVw(7ZFpYD)f1jlfwQn9gA8T52PSaGztxb)aE4O4c(8gcZh3Zr8N66WuACC2gqkI8YTDijPj1YaqJTSqxRKvusSGkC(j3oikM)ZB4Ns1pXLjByXS0Te)104eRLXeh6ZGLXcxE5euMREexwskj0HE1fnj3c)OiqrKfFlU4Jk0qKehAOlU6sfYD3TiZZR5nY2C3Dorr(UrBdBE9yAaHfMC15JLOdWD041aBT70P5(4XIPCEE33MDHDXBLKgt8TCi((pS0AbzPvKNvAmZzDsFK6iZQNSeQflLgK08IGnofmhBCfyfBa5djgF)qH0YNTCvAiCcncmuCwF1LtKyZ4SqlXFbReEwmSXLKi6ZsqopvyTHl4gQfnKgWOjxn94taVDyVtjXlPGLo4aZcRP0vtV7o5f4d(lwlOKGRMEAVupb2cFAXZw4w(VP0n523cXTaVRIZaWnmoY3hfTAhBG1VeTMSOLr(25Nh4ReWrp4aSfRHNHkC5HyGucew5hWOtWFUkYzDUDgkSWFLbYQi2XVfTLgpk3(TrHFfeozlekbUdEEceBbeqkMMaQ0C7tk)fcgdzzui9z46GN56VY3p3EnNFtxrGR4hTK5KBVIgtpTfNUjMbXHCzGBXwYn0N5CRtL6pryaiSpvwiyKEm)6ji3Jg7B48oCzX6tGy5yGriMCHQmHBy)3wTrHhUlql)BTIJIsBk6fE7hxgiqrTvD7dSUtr(4zhHurWd1LSft9an5kKv0C4AGhsJavpjGNAdtT)wUIi3(35AciTNqsYTHm1oj7dRDi00Cb59FC2hag9xb7KpCeytuGiInA9Tbp3XnKdkc2JyiW3zmhGzpliAbGL5SXJhF24jF7ztE53Cga5Hy9tKxtJY8SSEFwsQ1BJSUo1Y6NbWf3WXtb2jZ2qPoRSo5xJzlz4f(pmxAK1IBRF2F)lFZl(YxFr461IFXYY6dzXH04tTg)8xAL4etPHGkkD0)DZsvfyDcK7telF2FMXCTcildiwPGgnGVlFmPe)JqBMW3YC7eqD7KIy1SFlZT4ISWBGmq4PpEUpboPJyCSDG1al9FHiLWndHqbGKOIFN7GUabybB1Vnl32LcIjC7wSiGFkD1FMrwtBMrf0Pr0e88Dj8yPwjzHU0yueLZLRFDfw1pPIALp1pvMhfDCCfEveyxciHiEuHlH4sBIssycuOkkQYuxwl8HyMD5onuL3tVMPhz7Zkz5WEkJUd6dy(5JwXGCTRYXSg4U4LQbazJqTmje4EypZ8DfSbGQ2TDqWsKQvOOBaKRk73(rdf4YMOephUiDo)S5NjuFKybhs6YZkYlwzffc)xqHsw47xIv3ahUx0WSeRdwu8QkGJ28baBJLUcS4bvBU9RbDlKdIa0kMdilS6ozXjPMpquke5YlmHr5GX4Vb1BsESdN97qNVtcXpwaNISLaEAEi7RbvvsbSkGRxb79ni)j4ScjnasBMiXTLQcQNhZHj1bcjTpU2kRf(L4m7GH8YLK3qqckrDmMhUNLGuybbuaqDk1NlR((rBFoOhSFxvA)YJKFgleOPJrPsOhjOegKfebXj9y9cuaNaLofTqwEsLBcC(n(5N)1LXOULw(mCV5rXKW1pFA5T9ajQfo0tp(KdjsMtRdNFTdf7beOy9kcC7G2Ryz1cTMxMiMCi1JbxZJhy5Dya)yMhdnU4i7bTQ91ELwl15MW)Adw4fp2)Yq(TzTTIyc(OzS8AAiIZxRALDp(UZLQ3icROtyS8dXrOnurPh8wUjSOObBe(Z1Ptv9G7lXQhU31jG468cHOHnIbH4ixQ4GQ9sGNVTiQjMxprtmvavv3cnxjLjjVCl21EWi1aN9QBms7KM(YWT0)TQIXZT)dOA8Id)mNvYN0I4hCRiSxc8G58UjyGO7thbmxmVokUdfcFKHCh3B1CxvcA8iraAPwt0DNmB9S1lR(rvbbP7zDWhdkbaEgrBdRdJRbqL20SAvdTt(nWDCFWi2(WOWB3ArK)NbCYaA6sBOxpeS1WpO3L8tg8A33KgNymRrrQ)YDS4To8DxU0X90hqMQbqNZhFSEgSKFM(1adDSU6z(dwOBYgkGKl(RQWI(7u(zf22Qggc1D9nHLk6NOe0Ib4TUTMAjw87hxrQsoscIms9qaqfq7pMY8z)pv8mMjAVOlF6R02(7DDzOSq8XnS69ddyY95a0RpaQlW5Dr)4SrTjLR44jd)9Mq0XJkHIQeSObnOCl96fDBdSYYTbsh(XP3DNsbxtAGqUjBtkRxmDlIIuSAq8c9PjLNrR4yl49QXhsOhs4VocQdHReWaAVJZ8IF)hr2hnUk5)HQgu54(EHBt0)c3MCAvezJUdQ9mV3srmilYNm9i0IaiIJKsFUQIk6dBwho9E(z)Lva1pLv3y3okFOQ2OSec31VDjsIYDeNS4dIhPehNOGnKqEXr9XDdl4Redl)wG(8rwoP)mj3NSBxCQSHbpSPHMIHBsL8hl1ZMxdGdeH3kkqKl1Gs7JHXuK35R6nea7nl92DhVH2UOvEoNvthC(deKPxNPcnsXrp27S2YKxbipP458XuHhhze2WfyDRIcX(hrWSdGr0nSOmEtJyrXqkbQr)SwY8giQUs5yJeKBiER1rGvSG5MHnSGDzU8Kmft3JuIZ7V16rdWA1G3zv)SeMmTApiPmjsr4yXHraQ8RA1wvZdLpnnit93kX9lpbxQ(bMVpVxO4Yq4c(Bj3MinWtvxJFuSiknf98GskPd2aAyL(UZTWyqBgtZ0t9fQTucpZ4gNLlp32JRDgODxjfNp7giHlS8YPMB6RMpBljM3iQ5ZUgIgfZBK7lfoSi8jCAyq)X5ZizPRIINpBw1G59gCW8MpJVeCA(iru4)9l8zdSWaD(RfZExmBd(eZN1tRaGnXrSq5U1mpf45dY(QeQa34xC42yrrg4M(sLnTCzk9Mz(mjBku7ndioaPJrMp7irCOoAOtU9Xf3RD5L4TkFYU74JImUJdYXd4qWGAUZFe0Cd7TfuOin3hHpZ12xOrB3iKLznDZaG6nk3lDaYNFZHMppCMads22Xrscf5V1uCPpRNxO6JV6oVIs8RoirIB31yCVNmwJfuDfVke8PS)ikXYgCTW23DxHlOPMxW1hQ5PR0hYvnB2RAOm2NqQ29B0x4QovOiAvDFYi03RZmuuvbhj51mK4UdMAF6OSoawi6G)jP2(KrGVxNxOyQdRwv5CQ5g3Txbut(QJo5ZzbDayuk58HNr0HqXmJSxdwvl2sBVF4COkGI(oToydU0WM4QMsJCdfYTV6soxOhFjkFQWhg2jWbtk3LXZAFL1P6qZu3AlfX8rEaUAzAk)(NgmcCUWQdQIwH9rAgVAkKYVZT6JpTYT5j7IVYtqDDv8aUDX4C7NNBFEU9xxJkSRz9IVSPnxwNZ8vU9PLu6WdZe2C(XNo4sfncTReHpvtmwxzc1)k4rnNQ373bNoCPwhYPgTMttLJpqdxwlxY6gr30USh59ie3G(3FIzDchwuhPDQvt4QoV5QAf8wET80)IoCYbEkURvXv2ZgfOsSVzWeR5zCZ9acuj1Q2)w0W0hIo0TtTu7an6DM6BRS5J2UkDK(gG1sz0rVoVFhrD3WdvGXTv9sth3CDDYwfxB79rbmSMM7OI(0iIAJTsSk0q9O3j2elXhBG6uUD1uP9NUnGDyQXsYVQPh0cq6dzSwaupYSyVTs1u3vmZS3Jr5Rnh3PYtnC3oGqOnwNUAoWHiT8jdiZCfOnLPBasqdqlx6GOb7ohwx16Fi4Af0TNpMF1EhUpoIcb4woxFCpbIuffD9mqB9e794c2sD1ZibASJcAzZHmdH7CnlgBDWNKnp)PA4cBDiBU4OwLD19GeQdr9uHdDRUhWvGNASHiMp1EKNfrJTcHlmcfLXjkPCPOgrZKLuPAuYenKPru5r6Ta56w0uPYvF1aYvwmrATnBsS860MBuxibDJYylBvLr87Wvc7HBOahyoNoNuQMGZ7su1I7)ttr9KHMHDFafWBd5P1LKVRyYEcMwYw6n9)BkUHfJPjISUldQq56Q5a7Qk6HEskBQp0pPKC()BB3Bgr8ezXuxof9ok794v2NZWr7GZGHye8wBORyoZVdHhOzW8rp1ixfySFu73CzQ1RaPlp32G6U2(3kVxOMARfXQ3LwtPjxDDHg(PwaqYOMwPfzKvUdCUp1411K08anEKm)(BXyNF0aRjr9NmqU)FFc0oO364JlOcRP57tOQw2uhQkC4B)1URrQp5)zIYVUHpWECX48X1Yr9x5qKB0xD)9HBAqLQVXHiv0xn(9Hk7Umx9LsezgJTA8rGzK)EkICKXMw2dh1t7rL(GkI0skXz1NirLaoVQ5IeFYevwrR(iQK0RRVIII2MmPHQO4BViFdv96nMmz6WtMmT)Kjt5Tss8TBKhuUK)u(slkgF8I(2IdqEQHgaA6zLFRk84FvFBv7kcOuSBPpsRTcbL0)Nj2oAk4a(mWwfpTKzeFbyLTlk)V5))d]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/ShamanEnhancement.lua b/Interface/AddOns/Hekili/Dragonflight/ShamanEnhancement.lua
index 4abbf9ddb..6669be87a 100644
--- a/Interface/AddOns/Hekili/Dragonflight/ShamanEnhancement.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/ShamanEnhancement.lua
@@ -397,10 +397,10 @@ spec:RegisterAuras( {
},
-- Talent: Movement speed reduced by $s2%.
-- https://wowhead.com/beta/spell=342240
- ice_strike = {
+ ice_strike_snare = {
id = 342240,
duration = 6,
- max_stack = 1
+ max_stack = 1,
},
-- Talent: Damage of your next Frost Shock increased by $s1%.
-- https://wowhead.com/beta/spell=384357
@@ -537,13 +537,6 @@ spec:RegisterAuras( {
duration = 8,
max_stack = 1
},
- -- Talent:
- -- https://wowhead.com/beta/spell=58876
- spirit_walk = {
- id = 58876,
- duration = 0.1,
- max_stack = 1
- },
-- Talent: Able to move while casting all Shaman spells.
-- https://wowhead.com/beta/spell=79206
spiritwalkers_grace = {
@@ -568,21 +561,14 @@ spec:RegisterAuras( {
duration = 12,
max_stack = 1
},
- -- Your next Chain Lightning will deal $s2% increased damage and be instant cast.
- -- https://wowhead.com/beta/spell=320137
- stormkeeper = {
- id = 320137,
- duration = 15,
- type = "Magic",
- max_stack = 2
- },
-- Your next Lightning Bolt or Chain Lightning will deal $s2% increased damage and be instant cast.
-- https://wowhead.com/beta/spell=383009
stormkeeper = {
id = 383009,
duration = 15,
type = "Magic",
- max_stack = 2
+ max_stack = 2,
+ copy = 320137
},
-- Talent: Incapacitated.
-- https://wowhead.com/beta/spell=197214
@@ -692,6 +678,25 @@ local vesper_last_proc = 0
local last_totem_actual = 0
+local recall_totems = {
+ capacitor_totem = 1,
+ earthbind_totem = 1,
+ earthgrab_totem = 1,
+ grounding_totem = 1,
+ healing_stream_totem = 1,
+ liquid_magma_totem = 1,
+ mana_spring_totem = 1,
+ poison_cleansing_totem = 1,
+ skyfury_totem = 1,
+ stoneskin_totem = 1,
+ tranquil_air_totem = 1,
+ tremor_totem = 1,
+ wind_rush_totem = 1,
+}
+
+local recallTotem1
+local recallTotem2
+
spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
-- Deaths/despawns.
if death_events[ subtype ] and destGUID == vesper_guid then
@@ -702,12 +707,12 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _
if sourceGUID == state.GUID then
-- Summons.
if subtype == "SPELL_SUMMON" and spellID == 324386 then
- vesper_guid = destGUID
- vesper_expires = GetTime() + 30
+ vesper_guid = destGUID
+ vesper_expires = GetTime() + 30
- vesper_heal = 3
- vesper_damage = 3
- vesper_used = 0
+ vesper_heal = 3
+ vesper_damage = 3
+ vesper_used = 0
-- Vesper Totem heal
elseif spellID == 324522 then
@@ -734,6 +739,14 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _
if subtype == "SPELL_CAST_SUCCESS" then
-- Reset in case we need to deal with an instant after a hardcast.
vesper_last_proc = 0
+
+ local ability = class.abilities[ spellID ]
+ local key = ability and ability.key
+
+ if key and recall_totems[ key ] then
+ recallTotem2 = recallTotem1
+ recallTotem1 = key
+ end
end
end
end )
@@ -784,6 +797,7 @@ spec:RegisterStateExpr( "ti_chain_lightning", function ()
return tiSpell == "chain_lightning"
end)
+
spec:RegisterHook( "reset_precast", function ()
local mh, _, _, mh_enchant, oh, _, _, oh_enchant = GetWeaponEnchantInfo()
@@ -831,7 +845,7 @@ spec:RegisterHook( "reset_precast", function ()
end
if talent.alpha_wolf.enabled then
- local last_trigger = max( action.chain_lighting.lastCast, action.crash_lightning.lastCast )
+ local last_trigger = max( action.chain_lightning.lastCast, action.crash_lightning.lastCast )
if last_trigger > buff.feral_spirit.applied then
applyBuff( "alpha_wolf", last_trigger + 8 - now )
@@ -849,6 +863,12 @@ spec:RegisterHook( "reset_precast", function ()
end
tiSpell = action.chain_lightning.lastCast > action.lightning_bolt.lastCast and "chain_lightning" or "lightning_bolt"
+
+ -- Make buff/debuffs for Doom Winds work in either slot.
+ if buff.doom_winds_debuff ~= debuff.doom_winds_debuff or buff.doom_winds_cd ~= debuff.doom_winds_cd then
+ rawset( buff, "doom_winds_debuff", debuff.doom_winds_debuff )
+ rawset( buff, "doom_winds_cd", debuff.doom_winds_cd )
+ end
end )
@@ -859,6 +879,14 @@ local ancestral_wolf_affinity_spells = {
-- TODO: List totems?
}
+spec:RegisterStateExpr( "recall_totem_1", function()
+ return recallTotem1
+end )
+
+spec:RegisterStateExpr( "recall_totem_2", function()
+ return recallTotem2
+end )
+
spec:RegisterHook( "runHandler", function( action )
if buff.ghost_wolf.up then
if talent.ancestral_wolf_affinity.enabled then
@@ -872,18 +900,17 @@ spec:RegisterHook( "runHandler", function( action )
removeBuff( "spirit_wolf" )
end
end
+
+ if talent.totemic_recall.enabled and recall_totems[ action ] then
+ recall_totem_2 = recall_totem_1
+ recall_totem_1 = action
+ end
end )
spec:RegisterGear( "waycrest_legacy", 158362, 159631 )
spec:RegisterGear( "electric_mail", 161031, 161034, 161032, 161033, 161035 )
--- Tier 28
-spec:RegisterSetBonuses( "tier28_2pc", 364473, "tier28_4pc", 363668 )
--- 2-Set - Stormspirit - Spending Maelstrom Weapon has a 3% chance per stack to summon a Feral Spirit for 9 sec.
--- 4-Set - Stormspirit - Your Feral Spirits' attacks have a 20% chance to trigger Stormbringer, resetting the cooldown of your Stormstrike.
--- 2/15/22: No mechanics require actual modeling; nothing can be predicted.
-
spec:RegisterStateFunction( "consume_maelstrom", function( cap )
local stacks = min( buff.maelstrom_weapon.stack, cap or ( talent.overflowing_maelstrom.enabled and 10 or 5 ) )
@@ -2262,10 +2289,7 @@ spec:RegisterAbilities( {
if legendary.doom_winds.enabled and debuff.doom_winds_cd.down then
applyBuff( "doom_winds_buff" )
- applyDebuff( "player", "doom_winds_cd" )
applyDebuff( "player", "doom_winds_debuff" )
- applyBuff( "doom_winds_cd" ) -- SimC weirdness.
- applyBuff( "doom_winds_debuff" ) -- SimC weirdness.
end
end,
},
diff --git a/Interface/AddOns/Hekili/Dragonflight/WarriorArms.lua b/Interface/AddOns/Hekili/Dragonflight/WarriorArms.lua
index 257b7b5fc..5be5b7638 100644
--- a/Interface/AddOns/Hekili/Dragonflight/WarriorArms.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/WarriorArms.lua
@@ -68,108 +68,108 @@ spec:RegisterResource( Enum.PowerType.Rage, {
-- Talents
spec:RegisterTalents( {
- anger_management = { 90289, 152278, 1 }, --
- armored_to_the_teeth = { 90366, 384124, 2 }, --
- avatar = { 90365, 107574, 1 }, --
- barbaric_training = { 92221, 383082, 1 }, --
- battle_stance = { 90327, 386164, 1 }, --
- battlelord = { 90436, 386630, 1 }, --
- berserker_rage = { 90372, 18499 , 1 }, --
- berserker_shout = { 90348, 384100, 1 }, --
- bitter_immunity = { 90356, 383762, 1 }, --
- blademasters_torment = { 90363, 390138, 1 }, --
- bladestorm = { 90441, 227847, 1 }, --
- blood_and_thunder = { 90342, 384277, 1 }, --
- bloodborne = { 90283, 383287, 2 }, --
- bloodletting = { 90438, 383154, 1 }, --
- bloodsurge = { 90277, 384361, 1 }, --
- blunt_instruments = { 90287, 383442, 1 }, --
- bounding_stride = { 90355, 202163, 1 }, --
- cacophonous_roar = { 90383, 382954, 1 }, --
- cleave = { 90293, 845 , 1 }, --
- collateral_damage = { 90267, 334779, 1 }, --
- colossus_smash = { 90290, 167105, 1 }, --
- concussive_blows = { 90333, 383115, 1 }, --
- crackling_thunder = { 90342, 203201, 1 }, --
- critical_thinking = { 90444, 389306, 2 }, --
- cruel_strikes = { 90381, 392777, 2 }, --
- crushing_force = { 90347, 382764, 2 }, --
- dance_of_death = { 90263, 390713, 1 }, --
- defensive_stance = { 90330, 386208, 1 }, --
- deft_experience = { 90437, 389308, 2 }, --
- die_by_the_sword = { 90276, 118038, 1 }, --
- double_time = { 90382, 103827, 1 }, --
- dreadnaught = { 90285, 262150, 1 }, --
- elysian_might = { 90323, 386285, 1 }, --
- endurance_training = { 90338, 382940, 1 }, --
- executioners_precision = { 90445, 386634, 1 }, --
- exhilarating_blows = { 90286, 383219, 1 }, --
- fast_footwork = { 90371, 382260, 1 }, --
- fatality = { 90439, 383703, 1 }, --
- fervor_of_battle = { 90272, 202316, 1 }, --
- frothing_berserker = { 90352, 392792, 1 }, --
- fueled_by_violence = { 90275, 383103, 1 }, --
- furious_blows = { 90336, 390354, 1 }, --
- heroic_leap = { 90346, 6544 , 1 }, --
- honed_reflexes = { 90354, 382461, 1 }, --
- hurricane = { 90440, 390563, 1 }, --
- impale = { 90292, 383430, 1 }, --
- impending_victory = { 90326, 202168, 1 }, --
- improved_execute = { 90273, 316405, 1 }, --
- improved_mortal_strike = { 90443, 385573, 1 }, --
- improved_overpower = { 90279, 385571, 1 }, --
- in_for_the_kill = { 90288, 248621, 1 }, --
- inspiring_presence = { 90332, 382310, 1 }, --
- intervene = { 90329, 3411 , 1 }, --
- intimidating_shout = { 90384, 5246 , 1 }, --
- juggernaut = { 90446, 383292, 1 }, --
- leeching_strikes = { 90344, 382258, 1 }, --
- martial_prowess = { 90278, 316440, 1 }, --
- massacre = { 90291, 281001, 1 }, --
- menace = { 90383, 275338, 1 }, --
- merciless_bonegrinder = { 90266, 383317, 1 }, --
- mortal_strike = { 90270, 12294 , 1 }, --
- overpower = { 90271, 7384 , 1 }, --
- overwhelming_rage = { 90378, 382767, 2 }, --
- pain_and_gain = { 90353, 382549, 1 }, --
- piercing_howl = { 90348, 12323 , 1 }, --
- piercing_verdict = { 90379, 382948, 1 }, --
- rallying_cry = { 90331, 97462 , 1 }, --
- reaping_swings = { 90294, 383293, 1 }, --
- reinforced_plates = { 90368, 382939, 1 }, --
- rend = { 90284, 772 , 1 }, --
- rumbling_earth = { 90374, 275339, 1 }, --
- second_wind = { 90332, 29838 , 1 }, --
- seismic_reverberation = { 90340, 382956, 1 }, --
- sharpened_blades = { 90447, 383341, 1 }, --
- shattering_throw = { 90351, 64382 , 1 }, --
- shockwave = { 90375, 46968 , 1 }, --
- sidearm = { 90333, 384404, 1 }, --
- skullsplitter = { 90281, 260643, 1 }, --
- sonic_boom = { 90321, 390725, 1 }, --
- spear_of_bastion = { 90380, 376079, 1 }, --
- spell_reflection = { 90385, 23920 , 1 }, --
- storm_bolt = { 90337, 107570, 1 }, --
- storm_of_swords = { 90267, 385512, 1 }, --
- storm_wall = { 90269, 388807, 1 }, --
- sudden_death = { 90274, 29725 , 1 }, --
- sweeping_strikes = { 90268, 260708, 1 }, --
- tactician = { 90282, 184783, 1 }, --
- test_of_might = { 90288, 385008, 1 }, --
- thunder_clap = { 92224, 6343, 1 }, -- TODO: is 396719 in BETA Build for Arms/Fury
- thunderous_roar = { 90359, 384318, 1 }, --
- thunderous_words = { 90358, 384969, 1 }, --
- tide_of_blood = { 90280, 386357, 1 }, --
- titanic_throw = { 90341, 384090, 1 }, --
- twohanded_weapon_specialization = { 90322, 382896, 1 }, --
- unhinged = { 90440, 386628, 1 }, --
- uproar = { 90357, 391572, 1 }, --
- valor_in_victory = { 90442, 383338, 2 }, --
- war_machine = { 90328, 262231, 1 }, --
- warbreaker = { 90287, 262161, 1 }, --
- warlords_torment = { 90363, 390140, 1 }, --
- wild_strikes = { 90360, 382946, 2 }, --
- wrecking_throw = { 90351, 384110, 1 }, --
+ anger_management = { 90289, 152278, 1 }, -- Every 20 Rage you spend reduces the remaining cooldown on Warbreaker and Bladestorm by 1 sec.
+ armored_to_the_teeth = { 90366, 384124, 2 }, -- Gain Strength equal to 5% of your Armor.
+ avatar = { 90365, 107574, 1 }, -- Transform into a colossus for 20 sec, causing you to deal 20% increased damage and removing all roots and snares. Generates 10 Rage.
+ barbaric_training = { 90333, 383082, 1 }, -- Slam and Whirlwind deal 30% more damage but now cost 10 more rage.
+ battle_stance = { 90327, 386164, 1 }, -- A balanced combat state that increases the critical strike chance of your abilities by 3% and reduces the duration of movement impairing effects by 10%. Lasts until canceled.
+ battlelord = { 90436, 386630, 1 }, -- Your Overpower has a 25% chance to reset the cooldown of Mortal Strike and Cleave and reduces their Rage costs by 10.
+ berserker_rage = { 90372, 18499 , 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec.
+ berserker_shout = { 90348, 384100, 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec. Also remove fear effects from group members within 12 yards.
+ bitter_immunity = { 90356, 383762, 1 }, -- Restores 20% health instantly and removes all diseases, poisons and curses affecting you.
+ blademasters_torment = { 90363, 390138, 1 }, -- Activating Avatar or Bladestorm casts the other at reduced effectiveness.
+ bladestorm = { 90441, 227847, 1 }, -- Become an unstoppable storm of destructive force, striking all nearby enemies for 4,197 Physical damage over 5.3 sec. Deals reduced damage beyond 8 targets. You are immune to movement impairing and loss of control effects, but can use defensive abilities and can avoid attacks.
+ blood_and_thunder = { 90342, 384277, 1 }, -- Thunderclap deals 10% increased damage, costs 10 more Rage and if you have Rend, Thunder Clap affects 5 nearby targets with Rend.
+ bloodborne = { 90283, 383287, 2 }, -- Deep Wounds, Rend and Thunderous Roar's Bleed effects deal 7.50% increased damage.
+ bloodletting = { 90438, 383154, 1 }, -- Deep Wounds, Rend and Thunderous Roar's Bleed effects last 6.0 sec longer and have a 5% increased critical strike chance.
+ bloodsurge = { 90277, 384361, 1 }, -- Your Bleed effects have a chance to grant you 5 Rage.
+ blunt_instruments = { 90287, 383442, 1 }, -- Colossus Smash damage increased by 30% and its effect duration is increased by 3.0 sec.
+ bounding_stride = { 90355, 202163, 1 }, -- Reduces the cooldown of Heroic Leap by 15 sec, and Heroic Leap now also increases your run speed by 70% for 3 sec.
+ cacophonous_roar = { 90383, 382954, 1 }, -- Intimidating Shout can withstand 200% more damage before breaking.
+ cleave = { 90293, 845 , 1 }, -- Strikes all enemies in front of you for 937 Physical damage, inflicting Deep Wounds. Cleave will consume your Overpower effect to deal increased damage. Deals reduced damage beyond 5 targets.
+ collateral_damage = { 90267, 334779, 1 }, -- When Sweeping Strikes ends, your next Whirlwind deals 25% increased damage for each ability used during Sweeping Strikes that damaged a second target.
+ colossus_smash = { 90290, 167105, 1 }, -- Smashes the enemy's armor, dealing 2,428 Physical damage, and increasing damage you deal to them by 30% for 10 sec.
+ concussive_blows = { 90333, 383115, 1 }, -- Cooldown of Pummel reduced by 1.0 sec. Successfully interrupting an enemy increases the damage you deal to them by 5% for 10 sec.
+ crackling_thunder = { 90342, 203201, 1 }, -- Thunder Clap's radius is increased by 50%, and it reduces movement speed by an additional 20%.
+ critical_thinking = { 90444, 389306, 2 }, -- Critical Strike chance increased by 1% and Execute immediately refunds 5% of the Rage spent.
+ cruel_strikes = { 90381, 392777, 2 }, -- Critical strike chance increased by 1% and critical strike damage of Execute increased by 5%.
+ crushing_force = { 90347, 382764, 2 }, -- Slam deals and additional 30% damage and has a 7.50% increased critical strike chance.
+ dance_of_death = { 90263, 390713, 1 }, -- If your Bladestorm helps kill an enemy your next Bladestorm lasts 3.0 sec longer.
+ defensive_stance = { 90330, 386208, 1 }, -- A defensive combat state that reduces all damage you take by 20%, and all damage you deal by 10%. Lasts until canceled.
+ deft_experience = { 90437, 389308, 2 }, -- Mastery increased by 1.1% and Tactician's chance to trigger is increased by an additional 0.4%.
+ die_by_the_sword = { 90276, 118038, 1 }, -- Increases your parry chance by 100% and reduces all damage you take by 30% for 8 sec.
+ double_time = { 90382, 103827, 1 }, -- Increases the maximum number of charges on Charge by 1, and reduces its cooldown by 3 sec.
+ dreadnaught = { 90285, 262150, 1 }, -- Overpower has 2 charges and causes a seismic wave, dealing 415 damage to all enemies in a 10 yd line. Deals reduced damage beyond 5 targets.
+ elysian_might = { 90323, 386285, 1 }, -- Spear of Bastion's duration is increased by 2 sec. While you remain within Spear of Bastion's area your critical strike damage is increased by 25%.
+ endurance_training = { 90338, 382940, 1 }, -- Stamina increased by 5% and the duration of Fear, Sap and Incapacitate effects on you is reduced by 10.0%.
+ executioners_precision = { 90445, 386634, 1 }, -- Condemn causes the target to take 25% more damage from your next Mortal Strike, stacking up to 2 times.
+ exhilarating_blows = { 90286, 383219, 1 }, -- Mortal Strike and Cleave have a 15% chance to instantly reset their own cooldowns.
+ fast_footwork = { 90371, 382260, 1 }, -- Movement speed increased by 5%.
+ fatality = { 90439, 383703, 1 }, -- Your Mortal Strikes and Cleaves against enemies above 30% health have a high chance to apply Fatal Mark. When an enemy falls below 30% health, Your next execute inflicts an additional 2,676 Physical damage per stack.
+ fervor_of_battle = { 90272, 202316, 1 }, -- Whirlwind also Slams your primary target.
+ frothing_berserker = { 90352, 392792, 1 }, -- Mortal Strike and Cleave have a 20% chance to immediately refund 20% of the Rage spent.
+ fueled_by_violence = { 90275, 383103, 1 }, -- You are healed for 50% of the damage dealt by Deep Wounds.
+ furious_blows = { 90336, 390354, 1 }, -- Auto-attack speed increased by 5%.
+ heroic_leap = { 90346, 6544 , 1 }, -- Leap through the air toward a target location, slamming down with destructive force to deal 314 Physical damage to all enemies within 8 yards.
+ honed_reflexes = { 90354, 382461, 1 }, -- Cooldown of Overpower and Pummel reduced by 1.0 sec.
+ hurricane = { 90440, 390563, 1 }, -- While Bladestorming, every 0.9 sec you gain 5% movement speed and 5% Strength, stacking up to 6 times. Lasts 6 sec.
+ impale = { 90292, 383430, 1 }, -- The damaging critical strikes of your abilities deal an additional 10.00% damage.
+ impending_victory = { 90326, 202168, 1 }, -- Instantly attack the target, causing 669 damage and healing you for 30% of your maximum health. Killing an enemy that yields experience or honor resets the cooldown of Impending Victory and makes it cost no Rage.
+ improved_execute = { 90273, 316405, 1 }, -- Execute no longer has a cooldown and if your foe survives, 20% of the Rage spent is refunded.
+ improved_mortal_strike = { 90443, 385573, 1 }, -- Damage of Mortal Strike increased by 5%.
+ improved_overpower = { 90279, 385571, 1 }, -- Damage of Overpower increased by 10%.
+ in_for_the_kill = { 90288, 248621, 1 }, -- Warbreaker increases your Haste by 10%, or by 20% if any target is below 35% health. Lasts 10 sec.
+ inspiring_presence = { 90332, 382310, 1 }, -- Rallying Cry's duration is increased by 3 sec and it grants a further 5% maximum health.
+ intervene = { 90329, 3411 , 1 }, -- Run at high speed toward an ally, intercepting all melee and ranged attacks against them for 6 sec while they remain within 10 yds.
+ intimidating_shout = { 90384, 5246 , 1 }, -- Causes the targeted enemy to cower in fear, and up to 5 additional enemies within 8 yards to flee. Targets are disoriented for 8 sec.
+ juggernaut = { 90446, 383292, 1 }, -- Execute increases Execute's damage dealt by 3% for 12 sec, stacking up to 12 times.
+ leeching_strikes = { 90344, 382258, 1 }, -- Leech increased by 5%.
+ martial_prowess = { 90278, 316440, 1 }, -- Overpower increases the damage of your next Mortal Strike or Cleave by 20%. Stacking up to 2 times.
+ massacre = { 90291, 281001, 1 }, -- Condemn is now usable on targets below 35% health.
+ menace = { 90383, 275338, 1 }, -- Intimidating Shout will knock back all nearby enemies except your primary target, and cause them all to cower in fear for 15 sec instead of fleeing.
+ merciless_bonegrinder = { 90266, 383317, 1 }, -- When Bladestorm ends, Whirlwind and Cleave deal 50% increased damage for 9 sec.
+ mortal_strike = { 90270, 12294 , 1 }, -- A vicious strike that deals 2,378 Physical damage and reduces the effectiveness of healing on the target by 50% for 10 sec.
+ overpower = { 90271, 7384 , 1 }, -- Overpower the enemy, dealing 1,324 Physical damage. Cannot be blocked, dodged, or parried. Increases the damage of your next Mortal Strike by 20%. Stacking up to 2 times.
+ overwhelming_rage = { 90378, 382767, 2 }, -- Maximum Rage increased by 15.
+ pain_and_gain = { 90353, 382549, 1 }, -- When you take any damage, heal for 4.50% of your maximum health. This can only occur once every 10 sec.
+ piercing_howl = { 90348, 12323 , 1 }, -- Snares all enemies within 12 yards, reducing their movement speed by 70% for 8 sec.
+ piercing_verdict = { 90379, 382948, 1 }, -- Spear of Bastion's instant damage increased by 50% and its Rage generation is increased by 100%.
+ rallying_cry = { 90331, 97462 , 1 }, -- Lets loose a rallying cry, granting all party or raid members within 40 yards 19% temporary and maximum health for 13.2 sec.
+ reaping_swings = { 90294, 383293, 1 }, -- Cooldown of Cleave reduced by 3 sec.
+ reinforced_plates = { 90368, 382939, 1 }, -- Armor increased by 20%.
+ rend = { 90284, 772 , 1 }, -- Wounds the target, causing 859 Physical damage instantly and an additional 1,881 Bleed damage over 15 sec.
+ rumbling_earth = { 90374, 275339, 1 }, -- Shockwave's range increased by 6 yards and when Shockwave strikes at least 3 targets, its cooldown is reduced by 15 sec.
+ second_wind = { 90332, 29838 , 1 }, -- Restores 6% health every 1 sec when you have not taken damage for 5 sec.
+ seismic_reverberation = { 90340, 382956, 1 }, -- If Whirlwind hits 3 or more enemies, it hits them 1 additional time for 70% damage.
+ sharpened_blades = { 90447, 383341, 1 }, -- Your Mortal Strike, Cleave and Execute critical strike damage is increased by 10% and your Execute has a 5% increased critical hit chance.
+ shattering_throw = { 90351, 64382 , 1 }, -- Hurl your weapon at the enemy, causing 1,338 Physical damage, ignoring armor, and removing any magical immunities. Deals up to 500% increased damage to absorb shields.
+ shockwave = { 90375, 46968 , 1 }, -- Sends a wave of force in a frontal cone, causing 267 damage and stunning all enemies within 10 yards for 2 sec. Generates 10 Rage.
+ sidearm = { 90377, 384404, 1 }, -- Your auto-attacks have a 20% chance to hurl weapons at your target and 3 other enemies in front of you, dealing an additional 267 Physical damage.
+ skullsplitter = { 90281, 260643, 1 }, -- Bash an enemy's skull, dealing 1,605 Physical damage. Generates 20 Rage.
+ sonic_boom = { 90321, 390725, 1 }, -- Shockwave deals 350% increased damage and will always critical strike.
+ spear_of_bastion = { 90380, 376079, 1 }, -- Throw a spear at the target location, dealing 2,207 Physical damage instantly and an additional 2,283 damage over 4 sec. Deals reduced damage beyond 5 targets. Enemies hit are chained to the spear's location for the duration. Generates 20 Rage.
+ spell_reflection = { 90385, 23920 , 1 }, -- Raise your weapon, reflecting the first spell cast on you, and reduce magic damage you take by 20% for 5 sec.
+ storm_bolt = { 90337, 107570, 1 }, -- Hurls your weapon at an enemy, causing 381 Physical damage and stunning for 4 sec.
+ storm_of_swords = { 90267, 385512, 1 }, -- Whirlwind costs 30 more Rage and has a 14.0 sec cooldown. It now deals 175% more damage.
+ storm_wall = { 90269, 388807, 1 }, -- Whenever you Parry, you heal for 10.00% of your maximum health. Can only occur once per second.
+ sudden_death = { 90274, 29725 , 1 }, -- Your attacks have a chance to make your next Condemn cost no Rage, be usable on any target regardless of their health, and deal damage as if you spent 40 Rage.
+ sweeping_strikes = { 90268, 260708, 1 }, -- For 15 sec your single-target damaging abilities hit 1 additional target within 8 yds for 75% damage.
+ tactician = { 90282, 184783, 1 }, -- You have a 1.40% chance per Rage spent on abilities to reset the remaining cooldown on Overpower.
+ test_of_might = { 90288, 385008, 1 }, -- When Warbreaker expires, your Strength is increased by 1% for every 10 Rage you spent during Warbreaker. Lasts 12 sec.
+ thunder_clap = { 90343, 6343 , 1 }, -- Blasts all enemies within 8 yards for 618 Physical damage. and reduces their movement speed by 20% for 10 sec. Deals reduced damage beyond 5 targets.
+ thunderous_roar = { 90359, 384318, 1 }, -- Roar explosively, dealing 2,141 Physical damage to enemies within 12 yds and cause them to bleed for 2,461 physical damage over 8 sec. Generates 10 Rage.
+ thunderous_words = { 90358, 384969, 1 }, -- Increases the duration of Thunderous Roar's Bleed effect by 2.0 sec and increases the damage of your bleed effects by 15% at all times.
+ tide_of_blood = { 90280, 386357, 1 }, -- When Skullsplitter damages an enemy it causes your Deep Wounds and Rend to expire instantly.
+ titanic_throw = { 90341, 384090, 1 }, -- Throws your weapon at the enemy, causing 468 Physical damage to it and 5 nearby enemies. Generates high threat.
+ twohanded_weapon_specialization = { 90322, 382896, 1 }, -- Increases your damage while using two-handed weapons by 5%.
+ unhinged = { 90440, 386628, 1 }, -- While Bladestorm is active, you automatically cast a total of 2 Mortal Strikes at random nearby enemies.
+ uproar = { 90357, 391572, 1 }, -- Thunderous Roar's cooldown reduced by 30 sec.
+ valor_in_victory = { 90442, 383338, 2 }, -- Increases versatility by 1% and reduces the cooldown of Die by the Sword by 15.0 sec.
+ war_machine = { 90328, 262231, 1 }, -- Your auto attacks generate 10% more Rage. Killing an enemy instantly generates 10 Rage, and increases your movement speed by 30% for 8 sec.
+ warbreaker = { 90287, 262161, 1 }, -- Smash the ground and shatter the armor of all enemies within 8 yds, dealing 2,428 Physical damage and increasing damage you deal to them by 30% for 10 sec.
+ warlords_torment = { 90363, 390140, 1 }, -- Activating Avatar or Colossus Smash casts Recklessness at reduced effectiveness.
+ wild_strikes = { 90360, 382946, 2 }, -- Haste increased by 1% and your auto-attack critical strikes increase your auto-attack speed by 10% for 10 sec sec.
+ wrecking_throw = { 90351, 384110, 1 }, -- Hurl your weapon at the enemy, causing 1,338 Physical damage, ignoring armor. Deals up to 500% increased damage to absorb shields.
} )
@@ -355,7 +355,8 @@ spec:RegisterAuras( {
overpower = {
id = 7384,
duration = 15,
- max_stack = function() return 1 + ( talent.martial_prowess.enabled and 1 or 0 ) end,
+ max_stack = function() return talent.martial_prowess.enabled and 2 or 1 end,
+ copy = "martial_prowess"
},
piercing_howl = {
id = 12323,
@@ -400,6 +401,11 @@ spec:RegisterAuras( {
duration = 5,
max_stack = 1
},
+ storm_bolt = {
+ id = 107570,
+ duration = 4,
+ max_stack = 1
+ },
sweeping_strikes = {
id = 260708,
duration = 15,
@@ -506,17 +512,6 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _
if ( spellName == class.abilities.colossus_smash.name or spellName == class.abilities.warbreaker.name ) then
last_cs_target = destGUID
end
-
- if state.talent.collateral_damage.enabled and state.buff.sweeping_strikes.up then
- collateralDmgStacks = collateralDmgStacks + 1
- end
- elseif state.set_bonus.tier28_2pc > 0 and subtype == "SPELL_DAMAGE" and UnitGUID( "target" ) == destGUID and critical_spell then
- if spellName == class.abilities.cleave.name or spellName == class.abilities.mortal_strike.name or spellName == class.abilities.execute.name then
- -- Critical boolean is the 21st parameter in SPELL_DAMAGE within CLEU (Ref: https://wowpedia.fandom.com/wiki/COMBAT_LOG_EVENT#Payload)
- TriggerTier29Crit()
- end
- elseif subtype == "SPELL_AURA_REMOVED" and state.talent.collateral_damage.enabled and spellName == class.abilities.sweeping_strikes.name then
- TriggerCollateralDamage()
end
end
end )
@@ -612,8 +607,8 @@ spec:RegisterStateExpr( "cycle_for_execute", function ()
end )
-- Tier 28
-spec:RegisterGear( 'tier28', 188942, 188941, 188940, 188938, 188937 )
-spec:RegisterSetBonuses( "tier28_2pc", 364553, "tier28_4pc", 363913 )
+-- spec:RegisterGear( 'tier28', 188942, 188941, 188940, 188938, 188937 )
+-- spec:RegisterSetBonuses( "tier28_2pc", 364553, "tier28_4pc", 363913 )
-- 2-Set - Pile On - Colossus Smash / Warbreaker lasts 3 sec longer and increases your damage dealt to affected enemies by an additional 5%.
-- 4-Set - Pile On - Tactician has a 50% increased chance to proc against enemies with Colossus Smash and causes your next Overpower to grant 2% Strength, up to 20% for 15 sec.
spec:RegisterAuras( {
@@ -821,9 +816,9 @@ spec:RegisterAbilities( {
texture = 132338,
handler = function ()
- applyDebuff ( "target" , "deep_wounds" )
+ applyDebuff( "target" , "deep_wounds" )
active_dot.deep_wounds = max( active_dot.deep_wounds, active_enemies )
- if buff.overpower.up then removeBuff ( "overpower" ) end
+ removeBuff( "overpower" )
end,
},
@@ -873,14 +868,7 @@ spec:RegisterAbilities( {
die_by_the_sword = {
id = 118038,
cast = 0,
- cooldown = function ()
- if valor_in_victory.enabled then
- return 120 - (talent.valor_in_victory.rank * 15)
- - ( conduit.stalwart_guardian.enabled and 20 or 0 )
- else
- return 120 - ( conduit.stalwart_guardian.enabled and 20 or 0 )
- end
- end,
+ cooldown = function () return 120 - ( talent.valor_in_victory.rank * 15 ) - ( conduit.stalwart_guardian.enabled and 20 or 0 ) end,
gcd = "off",
talent = "die_by_the_sword",
@@ -1127,9 +1115,9 @@ spec:RegisterAbilities( {
texture = 132355,
handler = function ()
- if buff.overpower.up then removeBuff ( "overpower" ) end
- if buff.executioners_precision.up then removeBuff( "executioners_precision" ) end
- if buff.battlelord.up then removeBuff ( "battlelord" ) end
+ removeBuff( "overpower" )
+ removeBuff( "executioners_precision" )
+ removeBuff( "battlelord" )
end,
},
@@ -1147,13 +1135,7 @@ spec:RegisterAbilities( {
texture = 132223,
handler = function ()
- if talent.martial_prowess.enabled then applyBuff ( "overpower" ) end
-
- --Tier28
- if buff.pile_on_ready.up then
- addStack( "pile_on_str", nil, 1 )
- removeBuff( "pile_on_ready" )
- end
+ if talent.martial_prowess.enabled then applyBuff( "overpower" ) end
end,
},
@@ -1307,10 +1289,9 @@ spec:RegisterAbilities( {
texture = 2065621,
handler = function ()
- gain(30,"rage")
if talent.tide_of_blood.enabled then
- removeDebuff("target","rend")
- removeDebuff("target","deep_wounds")
+ removeDebuff( "target", "rend" )
+ removeDebuff( "target", "deep_wounds" )
end
end,
},
@@ -1620,4 +1601,4 @@ spec:RegisterOptions( {
} )
-spec:RegisterPack( "Arms", 20221026, [[Hekili:fRvBVnoUr4FlbhG3n3TvXYXoj72ydC9AXHeuSfOElUcC4SfTeTTUql5srTzdGH(T3HK6fskskNBx0(HDJJeNHdhoZZmZJZQWvFA1YeedV6Jtgpzs44j3eeE34RhpB1s2lhXRwEef)eAh8Hm0b4))r6Hc(dFHKJs4cxKxsJHxSNXow8HRUAxkBF5MG48dxvKEOKGyP5zXu0wg)3JVA1YnLPe2dzR2yBNdND9QLOs2(C6QLlBvWpXvaSjPjjyPK4IyP1uf9liknnNw94KBQI(hXS8nyAvexRvrVnCBYM7M8(lRES6XhYszPisv0FLI2LNTLKUBpRkk9WXCkly1ssAbRqCOsZ2rWRzi6omdEWhf(jCgAdbNS6VSAzmnLHPPOvlP4dO0mWkUFEv0U4eW6J5wm)nzjRyWXZPSWYdALheFCNWOpJGDNl(1CXB1j88DyQQ(GLmvDjpJOBOy0t9w1m1vfNtYlkklwxCavS3yL340IJ3ZDjsRDsN2Y)mMEm)zSWGV1TVQmdVnhuqa4AkPGtE9gs(Zb1lUk60PQOUfTbXyemjNMOVInLB3g0ULbfmieTkAHUjDaUsrK1fmA6tyUzDNtZsOVIsEO16emIThUua1O6SYsWhY4A59)X1c(l44sMWwch72hb3Vbj4TPXPqO5IQOPZ6urXtLesXrskJj91HEcmbfbrLvrxRewTHGGmhwo9Gq6jQHeDxI6rdHArG6(vJvo9mstQIGRErsDv03dX8bx3pLjCMtfvCeti1zMfbpVpLsEonlr4QcvUYiy0NL(A3rZWbbNXc2IPFoNUoF7AzeNE0MVnC6WlbWGgvhYw8mgFKh0lDEfbj5pNPK42iNWQDNfDrv0GgoSLVfsLeHaGrmBS0qtWcdrp5pO8O8TxOM85id9sLGrcIhfX4GXBrLeRaLCCAA6rPe)nzgaOgmeR9cCospagiBp8FGwbi8OuiebW4sjCneOCFkaEAHtBE8XYdhWeJWWRpFaxHNYUxPDDG)7oPdAlVEXA1q5jkjNhZf)Sbp2Qb46cqndnppz92s6lTy2VcnPA03OOumTatFcUohaEppNWdkd0YY10AyWmHtRfEzMAvlAmkdQBMtHmzM)Ib2pa8DxOF)Ms3wkQHxS(3lt2DOEpDJ0pS7FBkflUc8d2pSIqzXaqlfS8yeHmaO)3iFXg0ooya824NkgO8GxC0gaK2nURUHEWWmzIrnEuD3j2rlma)6Q)4dAg8dfOyQoYM0Od2JreOk7XyMSmxRTy7TtQraJHQCziqZWpy7FH6sH8K(grEbkMSgqfxxxb38XnThSKF0I5NlfCl4YFT8xwZBVu2K5AzZ0QDe4g0IIstwJ52BakjPOfUEGkHVwJzpk2An82AZLzoLvVFzrnHJummdauxQTQqBkgbxSpw2qVkUnRZH0icpROElu6C5vgqpVjG2o6VADYBRJH0kC2u(goqpbMErg8pXLWLQEwiDNSMVUvVUw(DwzX9WaUB)eqnGUp)9YDqwygmfLWmBS)EVuD7a7QgQbQ7NYSSyu2t9AYQRVy3L8()HHPKyPn1J9XNCxp0C4UMaMUwW6M2sdIQf40v957BBE8mvKY7nuYLQyy8oQG6VRtsLbWHt63D9TQUeNJlEN6Q8oUO7YKDTtwKUldZevNGuy4aJtwZ7hPWwpRDZ)iAXAOExhPKWoDSYmI9NgtpPTl81tT5ZzK3VQ6Sj5m4aJpU(58YmaF3i636mnUbyCRTMqy9HS9mjU95SN3mtt9fc(lhj58DxFbTkqzkE1(J6nFU3kG9IjSFl6z(ZM2v9poT7(TBvqtNeAtlbfa3wcNMsPlTlI2ABYgtHFJAMMZPWVvpFSULd91OLZ2acAwKLxO3pLwn28nJ94RChcEoGFHoRUniW00ZgyYZ0tdKLylPt7AYE7iMGR2R34E(enZWKMepejOMy1GY)En3K8uyeU4g0Z12udf7hXsyODLiL7DtwHpea3HK1QkbcisGQ(qZs91NoIS7Wt)NTbPXtfVzG2X8EpP28)aDpDUSkQ1RJxI6(da50rpLbGcymGck4lQLkFr6BgV((QL)Yp(p)4dF8N)qvuv0N4u9i5BhA6Lt4ZB0MD4naIj()ucdHdrrf5C2HGE8YpGeSgbLIZGsXbvp(3tZGxDlOZFkpd2DXRFthE8)guelx)rnrmVH)Tc8Ll)gRLWVw1u94aoQ6B6xNl69FLwv9HBY3g1m7Runvp(P9CgcpsZ3MsWs6cpKwWJHaNr5rf)1oCgKcfdQfAV5jEZxC)6dmPqIPtH(qt42bBpI1Yj5r(3Lukd(uAwmPmH36hoLTht)ayar)PQOF9FvG5AcFO43ExveKyeVxD1OSx621QOSCUYHUK4TVq60Bc)t1SF2SP)5Qi(xKLCB(KufGF734knr9rtu25NtjeLtuTkznlv4nepkR8WgSmUHaq4vp(GiaJ)GzcgyfvBeFlyWlf9Ugdv0c5tZlC4Rw(DFxvKX36g)rd9nVXxJ)V9n(QKwqrql3b)W8R6ylqONQOxnjYT6DUSv(2Fh0UK)yTNiyX9DPBNRmQ(8XJ8Y36I7oDsBe(7HPwuuAhPUCf7CsgvjAzS1TenB(nQcQtblxy)ShUimy2iEhF3pBSQEm4v1TvWv9ObiowrVTeSEUEcDIupxP0Oc9BMXBwqNRyhd4TiC0B9qF6IWzNozN20lv3rtk7EhNnS51LcENKJV5HC7WbJPJ6rU59xl2AZNoz8PtMSJ2x4f3XxMjJOQpQU)OHpeWCiAhG(8CE6KtNRQ6nyMuQDT2kubxQnzHz1sANuMURjpxSZdhPJm8wE2ZIBbNQ4dZgpYgDHxAZcKJ(0dSPhyYyRMV0rZL2fhBJ8YV29WMoYlVAk(zLnUj67)5BCDII1xbf(ebr17a3Ho6Tx4KCTrdmK69tBtp9jCFw5UF6LJ6Zf3IWj2S6oXTFbRAzdecCguTjJuBisbkrD6KlOurfHftHirhdGynCUDqcrzhjVzZTEWLZe6h(0XuM8GhBQud8wG47qEEObKRANbS6dSbRxZNmYoBxZNulGglxdDvPFlyB1AST0iZ9tTUwDulXc5y5xyNDQE16TD)55a4bqqfLfa3NB)qCZyTvPHcouszOPO2sGKVXvYt9BBJ)8fLykvNN28n9qMQFSjQudNoF)4GRh5KicRgR5t7fV7sDqwU7mPrxyLLgZntlZ2nzm9Ve0lrz16CrvVHUmR6CgoUEIm4MO5uD6e6ff2YQVsgGwdiZTvFYXA)bN9f4wGEXFMlWwII5ACLYyUUHG5nxFVivNyV2(B)ZoI8cFByVWop37MY(AIzmL1kGxds)cv0BtjTGHFTNRBlrIED6EcCmIlvbO84GhU8TNqXMfPGL46VKn3tam19RM4azv83tJ7lpcs48VyatQUF)zJD39KwXxTq8lf8LU6)c]] )
\ No newline at end of file
+spec:RegisterPack( "Arms", 20221030, [[Hekili:DRvwVnoYr4Fl(fnJNmGwK20hlSeWM9HGzrW8q0cK8KOAr2sIR5HsZMw7aqOF7P6Mx9nLDCqcYldg1DxvxDD8vhMR9x)BRxLGO41FpyEqG)8BN7n)P7UD9k6poIxV6ik(f0E4)uGYH)9Nj5vSf)rwjkHrAvznjg24aLES6NU5M9P0d1B9IlZVPknVodrtllIjODu2VJVz9QT1Pz0VvSERP7ni8X1Rq10dLK1RwnWGFHXa4sstsWTuIRIxVA9QS0kAfxosl2NHJOiYEmfw478hgUaTndNS(pVEvmjLIjPO1Ri4CuAr15npV48M9XjN300CEdfLHlOE00eCu5UOTzLLjED0FEZSZBIllZskpv4v9sDww1XSukWqpDUbN9ZchpUmRSQQUkQkhvDWW5z3EcEB9UDQNT(45nxZzysjfOSirGCyXAcx7CEZxoVzU3JHGQlMTa7nwKSMc6wRAb4QhzgikZhjg9kc0JmYVLrE)YNqKTem6fmrKLWPUt8uYpbLtgAvCSRayQh(EuCfLzAYt3FGcBnENvhXic3QHQ4Rax192VknD5sbfSIs9PWEdQDje2NaXiCBY9ZDiXG1uqOfDJys8d29yRlW7kbpBWHeKpWvN5FEA09KDJJhAlIsZWzLKe5tWEJjy8XOtL1fjvAUIJYwEjbIhIQOK0xWmz7rRYg)HwvZcmJsWikZdhyJOdrrcoNBtE69Zf8FGJRPCzXF()z8IaGlqsjLaDKYw)FF7OioDh6atQloa2kSIzWIRXizhQjK0yubUNUrzCBgcG(OLKCU4fig5vDOm(LtOxXkbD(srXYMwLtE3faAQH7CRoSJFOeKqg2GuzpaDiy6bbqPYxXKJLNAdv8ThR0Pd3HjVw2HjWIgKnbaGrwwxYIkVthsjzNsls4ib3n9rc4wRwF2tqaflGSvHw5XW8fWm7PJl12JIUAW4BtWfSZzOwR)tIk508JGYNjjVMgdoi)qrFhmxclNGJFHDy6bs5j5Jszo37q1ztKhLMMJBXoM7f2Q0YbRuo7vKa5LrfXyU6siVu8bMcDiZu)YhRZZXzks8TxEUR2CKgJifb5FSvk3XI5Ie9OdeeXJL9PqShnyl4xmqfQFiAxnyhEh59ef67fykMuHjm7M7mCd1EifSlXvFVq5exHIfaqyOprGxeeqtDNBY8dGD7YvnzuugVYmMnPk63Rt2N3DN2JwMw9VlLG5Ma3PDMMrmNyqMbjpgLL9Us)8M1fBr7zX)WUXVuzmnuBX47bu1m(jpGJGxmKrbkrJjmJ8YXz0sGuxHJGDyv4BibIXxSlus)(kNgb3gtFjJhpOzeoGK3AOCPtkGUtK7Q7YbJrfkMGLQQVv09oGrzqrhhJP8GHBd7BkW0UbD141koEDf449srVH2azm0NoYI)bKqmckvlQROg1L7RyAf75fZEBcaOGxyu7pIyn)02cuuRdHyrs2HCiO0Ki8RmvckbkdSV8iN2Y3UWCafBmp)qTc1fwPvUBoEkPJqgRYCiN4qsPHy9mC1H42oevYJ1RqCMhZq2elzjm2JK9wS4Gbacaut7VxVFpMuaD22xRN5nfVUHMd5h1chSt7AtvGBps()vewbFyP(kjGgFVwRNo8YT0x(iy0y)SM7Z3AJ7d1iEHmsyFfMCTiCbREkiNBusABzta4SwH12Z5BPRcMyo(KL3xuyNotOH2JEqQKsBJh4rXt5C8aV9e1xuJDMgpGJS4tNtZEJ0QrETD(ykfU88iC1wUWBmhrOPqLdhHI2XvvEqr2XVWbTceTITXqGea1lgXaotRyjQeo9OiQ1QVVDaTHIfVvOEzT5y4OCHbge4EmjVNEHFF9U6W5xUtolT22NQwUGP7fptpIMYzKcES27UuWZypWQj6yjBDp0ZXbu5W0z30FjOI(Msp()TJq8YMK2icWBTfQluWnall5ZieLyaS1D2v)5xKp6foQDJHEMhII4dCiWtQxfZZuAIYBmCptnz0XAhgZI2E36as6qPt2tscenKafejKo2u4o1zb9UFBT7EzdO1Xq5M2qj29HDN9jfhr2i5j7CYLpDb4KQZaBy2CkOPGWamGLYS)povWtCSRc4Pdnh)3)5)23)23)l)05nN38Bhay108JGSbTmusoV5tsnV8PZBi4)zDkHvNvvjBIzq5VL5ikBH4dOI9GA88V(xtlGTEa45Vuwa3oF7pnot))bWiAP8s9EmWwF2)pU(dJlN)1jEHDMO32BlurQ6IageP(FlkpbcVQ7Fh03)E(gx8zKf232(5n8)2HW2CW)yaG2N1Lz5U0mCVtsL3qBN)Pf3m2OjJNDNawVDOMFnD3cwj8pVyUxytJ2Oqxgkst7epLwHp3rgxeAiDX8zoNq4YhBAKAu95aPRzCmKmgBnrJifdZy0of9x(9Iekp0qgXUN31sFVWzSYsEoCUiFuMeODPGX6ztmQtb(omsWlvtip6VlLkPH39Hj89JM7RS5JSW(q9mrJeJurWzsOLgEw6p7ZxzDWDnnogA3s)WRLIquguu7ZOdg5RTtwAHppcY8S6MPnsTNVfcY0xnyEtt7fjpxoDgS8r4OAZItCPogm9dbQ(w6rOpHTMgRkzr2RmtSwUlLpra5PRnpmZvLxUTg2Hg2WCte39mzuBBiqZCoaONHlTPrFWpZSm0h25nji9(d)xxq6Qg24wq1OCtChhyk8XWKX(BMnrdtpFhZ71kr6Jm657UEM(GIw6hyskvAkyqJQ2grtZvMMmKLCocaDc31OOA25sKfMoHANxUaA7mUAdmW0fZls3n8MLY(T5wiHsZftl0Vy0p04eBwem7cMuZcJMwPE2BbBGuO3gA6SJaZdhKHpAuhoZ2axUKOG(w7(c0wNfNh(Ffm7OpoWdmQf67f10MdL)lcwcy0lmR7UFU0PKGtNkk2xLutrdT7ylsOD3p0OGUlCicWLFQkvgGo(3uog9cv3rdNTtxOBC7oVk4RKFN12GnQxuxvl42g7AACaBm7kJZiq9Yg8qfk5XWOa0DHKZuBu6S0GTkVut2EbkonsM8sKuQwvcAXqdJCxi(vQkit(cCmxQJVIZzU)co7sLpveF79ylK46zQFDHIyJpgA)9yPeo7eycPr9m2WCup3hk6JgZvrDvvrl1(4l)c7dVC2NTjcZ6WTTikxBxw0IYT8Pv20y6ZP0EOVmsQUzqjU1rGJkTVLGovA)iXYv5TCTfwTuuZFjKV)Iq08U0tw40OF5ikIjxCyBvYMOUVeup3V9bxb19qFcjgS9fbAVNY7SVvGL0KYLNPPKZqCZ8vtis25G2NNOdDG83MiBESR)x]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/WarriorFury.lua b/Interface/AddOns/Hekili/Dragonflight/WarriorFury.lua
index 21837a21c..709dc7fa3 100644
--- a/Interface/AddOns/Hekili/Dragonflight/WarriorFury.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/WarriorFury.lua
@@ -126,109 +126,109 @@ spec:RegisterResource( Enum.PowerType.Rage, {
-- Talents
spec:RegisterTalents( {
- anger_management = { 90415, 152278, 1 }, --
- annihilator = { 90419, 383916, 1 }, --
- armored_to_the_teeth = { 90258, 384124, 2 }, --
- ashen_juggernaut = { 90409, 392536, 1 }, --
- avatar = { 90365, 107574, 1 }, --
- barbaric_training = { 92222, 390674, 1 }, --
- berserker_rage = { 90372, 18499 , 1 }, --
- berserker_shout = { 90348, 384100, 1 }, --
- berserker_stance = { 90325, 386196, 1 }, --
- berserkers_torment = { 90362, 390123, 1 }, --
- bitter_immunity = { 90356, 383762, 1 }, --
- blood_and_thunder = { 90342, 384277, 1 }, --
- bloodborne = { 90401, 385703, 1 }, --
- bloodcraze = { 90405, 393950, 1 }, --
- bloodthirst = { 90392, 23881 , 1 }, --
- bounding_stride = { 90355, 202163, 1 }, --
- cacophonous_roar = { 90383, 382954, 1 }, --
- cold_steel_hot_blood = { 90402, 383959, 1 }, --
- concussive_blows = { 90335, 383115, 1 }, --
- crackling_thunder = { 90342, 203201, 1 }, --
- critical_thinking = { 90425, 383297, 2 }, --
- cruel_strikes = { 90381, 392777, 2 }, --
- cruelty = { 90428, 392931, 1 }, --
- crushing_force = { 90349, 382764, 2 }, --
- dancing_blades = { 90417, 391683, 1 }, --
- defensive_stance = { 90330, 386208, 1 }, --
- deft_experience = { 90421, 383295, 2 }, --
- depths_of_insanity = { 90413, 383922, 1 }, --
- double_time = { 90382, 103827, 1 }, --
- dual_wield_specialization = { 90373, 382900, 1 }, --
- elysian_might = { 90323, 386285, 1 }, --
- endurance_training = { 90376, 391997, 1 }, --
- enraged_regeneration = { 90395, 184364, 1 }, --
- fast_footwork = { 90371, 382260, 1 }, --
- focus_in_chaos = { 90403, 383486, 1 }, --
- frenzied_flurry = { 90422, 383605, 1 }, --
- frenzy = { 90406, 335077, 1 }, --
- fresh_meat = { 90399, 215568, 1 }, --
- frothing_berserker = { 90350, 215571, 1 }, --
- furious_blows = { 90336, 390354, 1 }, --
- hack_and_slash = { 90407, 383877, 1 }, --
- heroic_leap = { 90346, 6544 , 1 }, --
- honed_reflexes = { 90367, 391270, 1 }, --
- hurricane = { 90389, 390563, 1 }, --
- impending_victory = { 90326, 202168, 1 }, --
- improved_bloodthirst = { 90397, 383852, 1 }, --
- improved_enrage = { 90398, 383848, 1 }, --
- improved_execute = { 90430, 316402, 1 }, --
- improved_raging_blow = { 90390, 383854, 1 }, --
- improved_whirlwind = { 90427, 12950 , 1 }, --
- inspiring_presence = { 90332, 382310, 1 }, --
- intervene = { 90329, 3411 , 1 }, --
- intimidating_shout = { 90384, 5246 , 1 }, --
- invigorating_fury = { 90393, 383468, 1 }, --
- leeching_strikes = { 90344, 382258, 1 }, --
- massacre = { 90410, 206315, 1 }, --
- meat_cleaver = { 90391, 280392, 1 }, --
- menace = { 90383, 275338, 1 }, --
- odyns_fury = { 90418, 385059, 1 }, --
- onslaught = { 90424, 315720, 1 }, --
- overwhelming_rage = { 90378, 382767, 2 }, --
- pain_and_gain = { 90353, 382549, 1 }, --
- piercing_howl = { 90348, 12323 , 1 }, --
- piercing_verdict = { 90379, 382948, 1 }, --
- raging_armaments = { 90426, 388049, 1 }, --
- raging_blow = { 90396, 85288 , 1 }, --
- rallying_cry = { 90331, 97462 , 1 }, --
- rampage = { 90408, 184367, 1 }, --
- ravager = { 90388, 228920, 1 }, --
- reckless_abandon = { 90415, 202751, 1 }, --
- recklessness = { 90412, 1719 , 1 }, --
- reinforced_plates = { 90368, 382939, 1 }, --
- rumbling_earth = { 90374, 275339, 1 }, --
- second_wind = { 90332, 29838 , 1 }, --
- seismic_reverberation = { 90340, 382956, 1 }, --
- shattering_throw = { 90351, 64382 , 1 }, --
- shockwave = { 90375, 46968 , 1 }, --
- sidearm = { 90335, 384404, 1 }, --
- singleminded_fury = { 90400, 81099 , 1 }, --
- slaughtering_strikes = { 90411, 388004, 1 }, --
- sonic_boom = { 90321, 390725, 1 }, --
- spear_of_bastion = { 90380, 376079, 1 }, --
- spell_reflection = { 90385, 23920 , 1 }, --
- storm_bolt = { 90337, 107570, 1 }, --
- storm_of_steel = { 90389, 382953, 1 }, --
- storm_of_swords = { 90420, 388903, 1 }, --
- sudden_death = { 90429, 280721, 1 }, --
- swift_strikes = { 90416, 383459, 2 }, --
- tenderize = { 90423, 388933, 1 }, --
- thunder_clap = { 92223, 6343, 1 }, -- TODO: is 396719 in BETA Build for Arms/Fury
- thunderous_roar = { 90359, 384318, 1 }, --
- thunderous_words = { 90358, 384969, 1 }, --
- titanic_rage = { 90417, 394329, 1 }, --
- titanic_throw = { 90341, 384090, 1 }, --
- titans_torment = { 90362, 390135, 1 }, --
- unbridled_ferocity = { 90414, 389603, 1 }, --
- uproar = { 90357, 391572, 1 }, --
- vicious_contempt = { 90404, 383885, 2 }, --
- war_machine = { 90386, 346002, 1 }, --
- warpaint = { 90394, 208154, 1 }, --
- wild_strikes = { 90360, 382946, 2 }, --
- wrath_and_fury = { 90387, 392936, 1 }, --
- wrecking_throw = { 90351, 384110, 1 }, --
+ anger_management = { 90415, 152278, 1 }, -- Every 20 Rage you spend reduces the remaining cooldown on Recklessness by 1 sec.
+ annihilator = { 90419, 383916, 1 }, -- Your auto-attacks deal an additional 269 Physical damage and generate 4 Rage.
+ armored_to_the_teeth = { 90258, 384124, 2 }, -- Gain Strength equal to 5% of your Armor.
+ ashen_juggernaut = { 90409, 392536, 1 }, -- Condemn increases the critical strike chance of Condemn by 10% for 12 sec, stacking up to 5 times.
+ avatar = { 90365, 107574, 1 }, -- Transform into a colossus for 20 sec, causing you to deal 20% increased damage and removing all roots and snares. Generates 10 Rage.
+ barbaric_training = { 90335, 390674, 1 }, -- Slam and Whirlwind deal 20% increased damage and 10% increased critical strike damage.
+ berserker_rage = { 90372, 18499 , 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec.
+ berserker_shout = { 90348, 384100, 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec. Also remove fear effects from group members within 12 yards.
+ berserker_stance = { 90325, 386196, 1 }, -- An aggressive combat state that increases the damage of your auto- attacks by 15% and reduces the duration of Fear, Sap and Incapacitate effects on you by 10%. Lasts until canceled.
+ berserkers_torment = { 90362, 390123, 1 }, -- Activating Avatar or Recklessness casts the other at reduced effectiveness.
+ bitter_immunity = { 90356, 383762, 1 }, -- Restores 20% health instantly and removes all diseases, poisons and curses affecting you.
+ blood_and_thunder = { 90342, 384277, 1 }, -- Thunderclap deals 10% increased damage, costs 10 more Rage and if you have Rend, Thunder Clap affects 5 nearby targets with Rend.
+ bloodborne = { 90401, 385703, 1 }, -- Bleed damage of Odyn's Fury, Thunderous Roar and Gushing Wound increased by 20%.
+ bloodcraze = { 90405, 393950, 1 }, -- Bloodthirst increases the critical strike chance of your next Bloodthirst by 15%. Stacking up to 5 times.
+ bloodthirst = { 90392, 23881 , 1 }, -- Assault the target in a bloodthirsty craze, dealing 1,686 Physical damage and restoring 3% of your health. Generates 8 Rage.
+ bounding_stride = { 90355, 202163, 1 }, -- Reduces the cooldown of Heroic Leap by 15 sec, and Heroic Leap now also increases your run speed by 70% for 3 sec.
+ cacophonous_roar = { 90383, 382954, 1 }, -- Intimidating Shout can withstand 200% more damage before breaking.
+ cold_steel_hot_blood = { 90402, 383959, 1 }, -- Bloodthirst critical strikes generate 4 additional Rage, and inflict a Gushing Wound that leeches 2,108 health over 6 sec.
+ concussive_blows = { 90335, 383115, 1 }, -- Cooldown of Pummel reduced by 1.0 sec. Successfully interrupting an enemy increases the damage you deal to them by 5% for 10 sec.
+ crackling_thunder = { 90342, 203201, 1 }, -- Thunder Clap's radius is increased by 50%, and it reduces movement speed by an additional 20%.
+ critical_thinking = { 90425, 383297, 2 }, -- Critical Strike chance increased by 1.0% and Raging Blow and Annihilator's damaging critical strikes deal 5.0% increased damage.
+ cruel_strikes = { 90381, 392777, 2 }, -- Critical strike chance increased by 1% and critical strike damage of Execute increased by 5%.
+ cruelty = { 90428, 392931, 1 }, -- While Enraged, Raging Blow deals 15% increased damage and Annihilator deals 10% increased damage.
+ crushing_force = { 90349, 382764, 2 }, -- Slam deals and additional 30% damage and has a 7.50% increased critical strike chance.
+ dancing_blades = { 90417, 391683, 1 }, -- Odyn's Fury increases your auto-attack speed by 30% for 10 sec.
+ defensive_stance = { 90330, 386208, 1 }, -- A defensive combat state that reduces all damage you take by 20%, and all damage you deal by 10%. Lasts until canceled.
+ deft_experience = { 90421, 383295, 2 }, -- Mastery increased by 1% and Bloodthirst cooldown reduced by 0.75 sec.
+ depths_of_insanity = { 90413, 383922, 1 }, -- Recklessness lasts 4.0 sec longer.
+ double_time = { 90382, 103827, 1 }, -- Increases the maximum number of charges on Charge by 1, and reduces its cooldown by 3 sec.
+ dual_wield_specialization = { 90373, 382900, 1 }, -- Increases your damage while dual wielding by 5%.
+ elysian_might = { 90323, 386285, 1 }, -- Spear of Bastion's duration is increased by 2 sec. While you remain within Spear of Bastion's area your critical strike damage is increased by 25%.
+ endurance_training = { 90376, 391997, 1 }, -- Increases Stamina by 5% and reduces the duration of movement impairing effects on you by 10.0%.
+ enraged_regeneration = { 90395, 184364, 1 }, -- Reduces damage taken by 30%, and Bloodthirst restores an additional 20% health. Usable while stunned. Lasts 8 sec.
+ fast_footwork = { 90371, 382260, 1 }, -- Movement speed increased by 5%.
+ focus_in_chaos = { 90403, 383486, 1 }, -- While Enraged, your auto-attacks can no longer miss.
+ frenzied_flurry = { 90422, 383605, 1 }, -- Increases auto-attack damage with one-handed weapons by 5% and your auto-attack critical strikes have a 50% chance to Enrage you.
+ frenzy = { 90406, 335077, 1 }, -- Rampage increases your Haste by 2% for 12 sec, stacking up to 4 times. This effect is reset if you Rampage a different primary target.
+ fresh_meat = { 90399, 215568, 1 }, -- Bloodthirst always Enrages you the first time you strike a target, and it has a 15% increased chance to trigger Enrage.
+ frothing_berserker = { 90350, 215571, 1 }, -- Rampage has a 20% chance to immediately refund 20% of the Rage spent.
+ furious_blows = { 90336, 390354, 1 }, -- Auto-attack speed increased by 5%.
+ hack_and_slash = { 90407, 383877, 1 }, -- Each Rampage strike has a 20% chance to refund a charge of Raging Blow.
+ heroic_leap = { 90346, 6544 , 1 }, -- Leap through the air toward a target location, slamming down with destructive force to deal 550 Physical damage to all enemies within 8 yards.
+ honed_reflexes = { 90367, 391270, 1 }, -- Cooldown of Raging Blow and Pummel reduced by 1.0 sec.
+ hurricane = { 90389, 390563, 1 }, -- While Ravager is active, every 0.8 sec you gain 5% movement speed and 5% Strength, stacking up to 6 times. Lasts 6 sec.
+ impending_victory = { 90326, 202168, 1 }, -- Instantly attack the target, causing 1,171 damage and healing you for 30% of your maximum health. Killing an enemy that yields experience or honor resets the cooldown of Impending Victory and makes it cost no Rage.
+ improved_bloodthirst = { 90397, 383852, 1 }, -- Bloodthirst damage increased by 10%.
+ improved_enrage = { 90398, 383848, 1 }, -- Enrage increases your Haste by 15% and increases your movement speed by 10%.
+ improved_execute = { 90430, 316402, 1 }, -- Execute no longer costs Rage and now generates 20 Rage.
+ improved_raging_blow = { 90390, 383854, 1 }, -- Raging Blow has 2 charges and has a 20% chance to instantly reset its own cooldown.
+ improved_whirlwind = { 90427, 12950 , 1 }, -- Whirlwind causes your next 4 single-target attacks to strike up to 4 additional targets for 45% damage. Whirlwind generates 3 Rage, plus an additional 1 per target hit. Maximum 8 Rage.
+ inspiring_presence = { 90332, 382310, 1 }, -- Rallying Cry's duration is increased by 3 sec and it grants a further 5% maximum health.
+ intervene = { 90329, 3411 , 1 }, -- Run at high speed toward an ally, intercepting all melee and ranged attacks against them for 6 sec while they remain within 10 yds.
+ intimidating_shout = { 90384, 5246 , 1 }, -- Causes the targeted enemy to cower in fear, and up to 5 additional enemies within 8 yards to flee. Targets are disoriented for 8 sec.
+ invigorating_fury = { 90393, 383468, 1 }, -- Enraged Regeneration lasts 3 sec longer and instantly heals for 20% of your maximum health.
+ leeching_strikes = { 90344, 382258, 1 }, -- Leech increased by 5%.
+ massacre = { 90410, 206315, 1 }, -- Condemn is now usable on targets below 35% health, and its cooldown is reduced by 1.5 sec.
+ meat_cleaver = { 90391, 280392, 1 }, -- Whirlwind deals 20% more damage and now affects your next 4 single-target melee attacks, instead of the next 2 attacks.
+ menace = { 90383, 275338, 1 }, -- Intimidating Shout will knock back all nearby enemies except your primary target, and cause them all to cower in fear for 15 sec instead of fleeing.
+ odyns_fury = { 90418, 385059, 1 }, -- Unleashes your power, dealing 4,763 Physical damage and an additional 1,967 Physical damage over 4 sec to all enemies within 12 yards. Generates 15 Rage.
+ onslaught = { 90424, 315720, 1 }, -- Brutally attack an enemy for 3,551 Physical damage. Generates 20 Rage.
+ overwhelming_rage = { 90378, 382767, 2 }, -- Maximum Rage increased by 15.
+ pain_and_gain = { 90353, 382549, 1 }, -- When you take any damage, heal for 4.50% of your maximum health. This can only occur once every 10 sec.
+ piercing_howl = { 90348, 12323 , 1 }, -- Snares all enemies within 12 yards, reducing their movement speed by 70% for 8 sec.
+ piercing_verdict = { 90379, 382948, 1 }, -- Spear of Bastion's instant damage increased by 50% and its Rage generation is increased by 100%.
+ raging_armaments = { 90426, 388049, 1 }, -- Raging Blow gains an extra charge.
+ raging_blow = { 90396, 85288 , 1 }, -- A mighty blow with both weapons that deals a total of 2,629 Physical damage. Generates 14 Rage.
+ rallying_cry = { 90331, 97462 , 1 }, -- Lets loose a rallying cry, granting all party or raid members within 40 yards 19% temporary and maximum health for 13.2 sec.
+ rampage = { 90408, 184367, 1 }, -- Enrages you and unleashes a series of 4 brutal strikes for a total of 3,561 Physical damage.
+ ravager = { 90388, 228920, 1 }, -- Throws a whirling weapon at the target location that chases nearby enemies, inflicting 11,919 Physical damage to all enemies over 9.6 sec. Deals reduced damage beyond 8 targets. Generates 10 Rage each time it deals damage.
+ reckless_abandon = { 90415, 202751, 1 }, -- Recklessness generates 50 Rage and greatly empowers Bloodthirst and Raging Blow.
+ recklessness = { 90412, 1719 , 1 }, -- Go berserk, increasing all Rage generation by 100% and granting your abilities 20% increased critical strike chance for 12 sec.
+ reinforced_plates = { 90368, 382939, 1 }, -- Armor increased by 20%.
+ rumbling_earth = { 90374, 275339, 1 }, -- Shockwave's range increased by 6 yards and when Shockwave strikes at least 3 targets, its cooldown is reduced by 15 sec.
+ second_wind = { 90332, 29838 , 1 }, -- Restores 6% health every 1 sec when you have not taken damage for 5 sec.
+ seismic_reverberation = { 90340, 382956, 1 }, -- If Whirlwind hits 3 or more enemies, it hits them 1 additional time for 70% damage.
+ shattering_throw = { 90351, 64382 , 1 }, -- Hurl your weapon at the enemy, causing 2,231 Physical damage, ignoring armor, and removing any magical immunities. Deals up to 500% increased damage to absorb shields.
+ shockwave = { 90375, 46968 , 1 }, -- Sends a wave of force in a frontal cone, causing 468 damage and stunning all enemies within 10 yards for 2 sec. Generates 10 Rage.
+ sidearm = { 90377, 384404, 1 }, -- Your auto-attacks have a 20% chance to hurl weapons at your target and 3 other enemies in front of you, dealing an additional 468 Physical damage.
+ singleminded_fury = { 90400, 81099 , 1 }, -- While dual-wielding a pair of one-handed weapons, your damage done is increased by 5% and your movement speed is increased by 5%.
+ slaughtering_strikes = { 90411, 388004, 1 }, -- Raging Blow causes every strike of your next Rampage to deal an additional 20% damage, stacking up to 5 times. Annihilator causes every strike of your next Rampage to deal an additional 2% damage, stacking up to 5 times.
+ sonic_boom = { 90321, 390725, 1 }, -- Shockwave deals 350% increased damage and will always critical strike.
+ spear_of_bastion = { 90380, 376079, 1 }, -- Throw a spear at the target location, dealing 3,865 Physical damage instantly and an additional 4,370 damage over 4 sec. Deals reduced damage beyond 5 targets. Enemies hit are chained to the spear's location for the duration. Generates 20 Rage.
+ spell_reflection = { 90385, 23920 , 1 }, -- Raise your weapon, reflecting the first spell cast on you, and reduce magic damage you take by 20% for 5 sec.
+ storm_bolt = { 90337, 107570, 1 }, -- Hurls your weapon at an enemy, causing 667 Physical damage and stunning for 4 sec.
+ storm_of_steel = { 90389, 382953, 1 }, -- Ravager's damage is reduced by 40% but it now has 2 charges and generates 15 Rage each time it deals damage.
+ storm_of_swords = { 90420, 388903, 1 }, -- Whirlwind has a 7.0 sec cooldown, but deals 70% increased damage. Slam has a 12.0 sec cooldown and generates 10 Rage, but deals 100% increased damage.
+ sudden_death = { 90429, 280721, 1 }, -- Your attacks have a chance to reset the cooldown of Condemn and make it usable on any target, regardless of their health.
+ swift_strikes = { 90416, 383459, 2 }, -- Increases haste by 1%, Raging Blow generates an additional 1 Rage and Annihilator generates an 1 additional Rage.
+ tenderize = { 90423, 388933, 1 }, -- Onslaught Enrages you and Enrage now lasts 1 sec longer.
+ thunder_clap = { 90343, 6343 , 1 }, -- Blasts all enemies within 8 yards for 1,082 Physical damage. and reduces their movement speed by 20% for 10 sec. Deals reduced damage beyond 5 targets.
+ thunderous_roar = { 90359, 384318, 1 }, -- Roar explosively, dealing 3,748 Physical damage to enemies within 12 yds and cause them to bleed for 3,748 physical damage over 8 sec. Generates 10 Rage.
+ thunderous_words = { 90358, 384969, 1 }, -- Increases the duration of Thunderous Roar's Bleed effect by 2.0 sec and increases the damage of your bleed effects by 15% at all times.
+ titanic_rage = { 90417, 394329, 1 }, -- Odyn's Fury Enrages you and then greatly empowers Raging Blow for 6 sec.
+ titanic_throw = { 90341, 384090, 1 }, -- Throws your weapon at the enemy, causing 820 Physical damage to it and 5 nearby enemies. Generates high threat.
+ titans_torment = { 90362, 390135, 1 }, -- Activating Avatar casts Odyn's Fury, activating Odyn's Fury casts Avatar at reduced effectiveness.
+ unbridled_ferocity = { 90414, 389603, 1 }, -- Rampage has a 20% chance to grant Recklessness for 4 sec.
+ uproar = { 90357, 391572, 1 }, -- Thunderous Roar's cooldown reduced by 30 sec.
+ vicious_contempt = { 90404, 383885, 2 }, -- Bloodthirst deals 25% increased damage to enemies who are below 35% health.
+ war_machine = { 90386, 346002, 1 }, -- Your auto attacks generate 20% more Rage. Killing an enemy instantly generates 10 Rage, and increases your movement speed by 30% for 8 sec.
+ warpaint = { 90394, 208154, 1 }, -- You take 10% reduced damage while Enrage is active.
+ wild_strikes = { 90360, 382946, 2 }, -- Haste increased by 1% and your auto-attack critical strikes increase your auto-attack speed by 10% for 10 sec sec.
+ wrath_and_fury = { 90387, 392936, 1 }, -- Raging Blow deals 15% increased damage and while Enraged, Raging Blow has a 30% chance to instantly reset its own cooldown.
+ wrecking_throw = { 90351, 384110, 1 }, -- Hurl your weapon at the enemy, causing 2,231 Physical damage, ignoring armor. Deals up to 500% increased damage to absorb shields.
} )
-- PvP Talents
@@ -342,7 +342,8 @@ spec:RegisterAuras( {
elysian_might = {
id = 386286,
duration = 8,
- max_stack = 1
+ max_stack = 1,
+ copy = 311193 -- Covenant version.
},
enrage = {
id = 184362,
@@ -440,9 +441,10 @@ spec:RegisterAuras( {
},
spear_of_bastion = {
id = 376080,
- duration = 4,
+ duration = function () return ( legendary.elysian_might.enabled and 8 or 4 ) + ( talent.elysian_might.enabled and 2 or 0 ) end,
tick_time = 1,
- max_stack = 1
+ max_stack = 1,
+ copy = 307871 -- Covenant version.
},
spell_reflection = {
id = 23920,
@@ -764,9 +766,9 @@ spec:RegisterAbilities( {
applyBuff( "avatar" )
if talent.berserkers_torment.enabled then applyBuff ( "recklessness", 4) end
if talent.titans_torment.enabled then
- applyBuff ( "odyns_fury" )
+ applyBuff( "odyns_fury" )
active_dot.odyns_fury = max( active_dot.odyns_fury, active_enemies )
- if talent.titanic_rage.enabled then applyBuff( "crushing_impact" ) end
+ if talent.titanic_rage.enabled then applyBuff( "crushing_impact" ) end
end
end,
},
@@ -866,7 +868,7 @@ spec:RegisterAbilities( {
known = 23881,
cast = 0,
cooldown = function ()
- if talent.deft.experience.enabled then
+ if talent.deft_experience.enabled then
return 3 - talent.deft_experience.rank * 0.75
else
return 3
@@ -1597,22 +1599,28 @@ spec:RegisterAbilities( {
spear_of_bastion = {
- id = 376079,
+ id = function() return talent.spear_of_bastion.enabled and 376079 or 307865 end,
cast = 0,
cooldown = 90,
gcd = "spell",
- spend = function () return (-25 * ( talent.piercing_verdict.enabled and 2 or 1 ) ) end,
+ spend = function () return ( -25 * ( talent.piercing_verdict.enabled and 2 or 1 ) ) * ( 1 + conduit.piercing_verdict.mod * 0.01 ) end,
spendType = "rage",
- talent = "spear_of_bastion",
+ talent = function()
+ if covenant.kyrian then return end
+ return "spear_of_bastion"
+ end,
startsCombat = false,
texture = 3565453,
toggle = "cooldowns",
+ velocity = 30,
+
handler = function ()
- applyDebuff ("target", "spear_of_bastion" )
+ applyDebuff( "target", "spear_of_bastion" )
+ if legendary.elysian_might.enabled or talent.elysian_might.enabled then applyBuff( "elysian_might" ) end
end,
},
@@ -1814,4 +1822,4 @@ spec:RegisterSetting( "heroic_charge", false, {
} )
-spec:RegisterPack( "Fury", 20221028, [[Hekili:fNvFVTnVr8pl(FCtW6CSCIBt7smW2d2gAXd6aM7WgWWJKOLOT4IeLhjvs9dm0N9Dh1BKYIkoPDB)rlIPU349YV7ojFp)V6VoMOO(FzX8fl8MV42zZVDXh88xRoSN6VEpj6bYo4p4Km4))tfId4HhsZjXiVY8cre8GeLAV8JxD1oMkPyZSO8SRKSSIuIILZJeKTk83rx5VEtblv9jU)MHu8T38b)1KcvsUWF9Aw2pbsMfhtRiNkJ8x7VoLjvsTYz8DP0afrSJQGd(I(6q5KnP0y))G)6ibtrfmcQ1TBNjOrpKsLso8Vzf7ldpESmu)ekxa3sGGmcJlldVRmCxuCfbxugIpSmCvzON38YWPLHkskLRML)iv8ucnndmKaTeQvEz4LNY8Tv8o5fWU242kO8F9GLX5nBj4NIqNR)AbjBpgJuGVeDanNt)gnQa8WgEeGKRnjjkNhtZ49i5MXDJ1oR48N4TxY6BeHZzjmiQNl6Ulv35HJax2zlBsZZJvjmHuHgXYZYiqzmvBbY90006Cb5SNa5K(eJhxf2QStbHfhqFuBOXXYzmE1txAzhqcm4ue5fYarorG2Y7()LTKhFGld2IvDGz8ENMXKNnc03qrBOMfffVVSFTn9Zq)CzkPyxIoICRt1hLGxvz1nWmXChMzdb2Nq()WlL)irHmXucEZpRarxMPBNsV8UnevIwdUHqoBz1Ld7zvp2uNAxS5D93LgH4tMwmUlAhn5WTTV0027Cs9S(3zFd7c49O79wWowb2EuERjLT1o9P6dwuH4kO8ujI(cuHno2sks76q0W2(ISmAApjVWD4GLba53DFz48zlRYVYai8m0Zgd9Ki8OkGEdS5Qm7wC3bL7fwObdlYfl1vXdrxnYXn2ihjacglkiLs23cP3EVZRBqyEVDJ3wHJnlMQRXIisf4QbOCqCN4lhfSmkppfRnNrEKac1QJ21MzrpcLjIHq8QMczh5rAAq(wiCtd2IjSbeXgulDczeAAGYSYTRazTDjUbSgQzMHaPcjvGjKNdOLLyq3tNGsza0Rm4FveVdd1DauneaxmQ287xEyb8GzrsLGKgers7NVpc(ZWMNorSozqYO7OBGuHhOIUhA3RXWVq2PJicw0dYNb0QP3edQbKbaGLoxFSoAvTERon9GKr4bzO)RTDhGdgbfnCciOhoaAHBvXuLu2b99myPJyzx4AANQws6QjembyoiMr15)lM7YyCxp9mT8hRCREkeNKGakZBDBnkQIOwDm61XOE2Wn01l47Pv1js09OjJKL4EDG6l6llKbd9rey(9geHeoPTn1Gg2ZmJOXqZzuIkicqYH1fATPHMFeTPX4CO2QyhV(auTnVa0IGQFeGlDvT6vqfiS9Yx6(S7bpAEgmLG)O7IbwNOGt3MdCcii74uLgwOQsIghGiNYz0)DbB)(Xc7wGCBHNKO30SF)F4a4(lrQAw28DGlGi4OE8x)3)9)1V8PV8N)yzyz4xtGyllBFUqvgcwyz4BSUOVbSD0Wey(Vmhhiawxnpd2Kfoa62ZH5yNv(5FMXHh5bY8NY5G21p(n152)dqkQCJF3KHdNFXIVDzl)38k43ZG)3))E(jGF7p(x(5EcYB(pmj9k8PoK01)WK0Rio1xsLF(zsdRhI9fMa(kSm7R2YVxb8UxHamRb8(bKeQDNBZtHTnGIz0JjiqtUNOc48cjkwe)uHKvHNugIqDimQQHoEUowuWTOoogjog6xaW(0pcbYWFleymMlcJTFnHb6BViFllfJSWpYysP2yKf7nIZ7OCaLmceVGXFaBnG5dFsvXKgGnd3xpgna8Ec9aehqzZYbe2dOTfLweJBttzGnkASP)5FtsrjrZK)YBHlvclkXKAc)qNwRVU0VTpLfXuPDY1823O0FxzyUOrnFTseqK7xqHgBE0cdn)eln14gvlsvdPAVH(iErgmrToFpnxbHZpPlmWdU2oEHj(6oRrWQdlWgsAhEttc5S2ou)M7VYSBYBzBVFYlPPu5NhsKD9GWGEnf3xTAu7Vb6Q2kevkotXD3d7tE84jl(TAPjpgl0HmEXyRmUAXYPdVQ4QBwEPPuRwf06eT1QTn379zYq96AihogN8URnPhQ3cGrbYElohX9U3tZKNUv0SoTDplu5dotNb19wMAyw07WyWu7cwMhAVpLLfzUHJBnm116tt7nUQPs1U0Q4YalG0JZPxm4IqhpoP3kqxoSoMmSsUyiN8XJNoG8DlMBj5(fBNoL)uxjpEhp64rRUzoCHSwoXHTmMPm5uBXK8(J13gv77RpXRyVkX54LAhlhvIJfew5nDYqd3F84PReC3IHP1clQ3q(vLLwd9AaMnZ6b3x)knDv(v7dS)6k3Tlk(4XlWJw55nFAT7)KpgYLneD78PtgHiTkS)gj35nBPdtgUX1Fxe3eu)vrCtGXRkTF6aMMcg(a53tgYdDPBL077qmuENZuKHsgw5TCeT19Lg(VTIA(KcoQ96bKHLnvirnFLc3I241pR7gv9vfw5nsK28frFM80(QWho0pcAYZLh9syTUYZnb4hg4Lk0E2ZyiJUDlNv85mdjUjR7fM4Me7Vka(Ia8)pp]] )
\ No newline at end of file
+spec:RegisterPack( "Fury", 20221030.1, [[Hekili:fN1xVTTnq8pl(fxBScflN4K0bhdSvGn0GH8WCb2BsMwI2Ml6pEKsjnfc6Z(osklrstk7S209qlIjpE8(7V7oXa)GphSmgvGdEy6KPt9NC5ep)R9V9QRdww8YECWY9OOhrBH)idLc))VvsFHV4lj5Oy(Hz5L0iyJDff7z)8fxSLuSRCTxuE6fmsAzcQGKNfrrBk4)o6IGLRljjfFklyT9BEwWsuzXUCAWYLK0pcCMehJLKJzrbldwMqyfmXLtY2MGdlq0T4cyHhe6dodTobhh8RblJOKcmLG436MnEuC0Jjygld(Nx5(6vvv1Re7GZOGwceKIizS6vZRxTnkwsWO6v8nRxTOELV)K6vdRxvGsWzfE5pHPpVdNKccsOGdnxE9QXhF4BLNDWR44cHBdfN91x0eoFpUDkIBCdwsrP75(OcWwYnahwh)fCujyHvSiajxQssuEwmonZGKR63m2ySIZFoRvjB0iuwgzhb8650oDrQZ29aJ7KL1j55Xf7iuwbxiMDwcbNhdfsaBpojPjwG59mWNKNjzXs3MuoPisCi(jHGghZ8izYDNPjhqamyuO5LSqAoIYLLR))swYJFjJfUHN1bIXnofJbN0dykOCzO5ifyU(s(AB4NY9NXsqLB3j8i3686J2XvvMududm3YJSbh7Z8Z)Hx75JOLSDQCWFYz5i6ImDBumI7wJk2jUb3qiNnV6IH91YhpKNQNS5F530nc(NubBCN02BWHBzFMQS3zKmK(R11WohUbD3Ob7O5ynO8wvkBZDmP6dAuXXv48Ryh1KHf8chBqLjDvioCS9LPP4edop1T7GKca5ZVRE1eVzY4RuacpLBzJHAsOSijqVc2SmYUf31kFhPHgyNLtNjYITrxdYXv6ih7aemsuycgTVfsVvVZBkqOQ3UXBL4yEXyroweIvaMAakhy3r2YEblJYZt45MEONqat1QODPAu0tqAc1gINSlKTONWjH5Ba3noCdpGnerxZVLoM0dnhGY0ITLGS6Me3aw2kMPWqmLHP8aYZb0sJnCZthJsia0ll8VlJ3YD1DauhiaumSq8ntp0aE4rrSckkjmcLygV7R1qqjdhcsxkZKQt0tWrkHLIokgi0wHRHsIEK1b20hiybbsgyHaYLiOVHuRL2K1GLRM8cJGYct5gY26EduBzrNKw(YPlbVfknIOV4IOXT8tQzEqHFeLRAR5zjWcpM1wlQn6)iIAZdAAsujnwMP0H0Eca(ESsJC1cMOpZCgtq1gUcgQMyo1Pa5UDKt0lsF4a(gglts4iDtAn7hUijrAoVEvjfWgfZrx5NVL6OhXXtaJypY19Sknk7H1oPhZmCtuKZnM0j6DDOAUdjDpfkdfh2sM1U(tXOIWiOuemVJSRF39aZL)Vx3IT2i4kVzpETfRb0Xq5pc5dzkh1muw0rFytrFf7bNuEk0vuqVZEcciTmdVjhoPhJSndxiq)KjPGEXRuW8W)tjz)((IK0a13a7StmzTz)oWcGjGXPQD4AWeGOz87jy5F9l)5dF6HF)NRxvV6Z7G(ladCoTacLYP1RENMI(oq25cgLBSz58gGGXZZtHj3HfGUBYG(29QV)pizWw(ap)yEgC7ITFNR5CbUwK3Z(h8VaDJ8)Y4Fy8)k78xjD3GZwacm55n)44z7GCgC8Ob8oYUo5nqi9D4T(2y6LVfm97RFV((tKH1mpYRm3AMdNUwjFtpV1(bos)V(TJ1VfH)ozQOYOj)06n4iwD73v5R((pj80CwD5HUcHgj5FXsyBEjJ8nKe8byCMxBnKF6UluX7FpzZDdEnLnQV3gl7QsWfUgkUtoSw7Vb6KZPYVu(uUZVdMWTQ6Orrxmt9mkJyYp4O(gIDX0zdTp86IRMnwLRYHt1wriTczZ9KOQhOzas(jC0h58lvP)WqpVNxP)o3toQEMUHg1wTDYp(LBTrofQngVZ(redtPCO2r(uxuFcpB6gttmvN)Y91o0O)u1luyoL(elWbgNC4iRtJvvnyuZXToGvv1jMaBmWHEN8QQ6KtDT42jJTRzdSRAJS5wRQ4ZBmuRz85t15Sz69XakdDfU6ROi6BT4QjGrqdRZHS0NOm4yzrLCtBxBiJPh(yRI2elvv9AGA7sNZFhZHSWF4Hyg3ZfmCGTjcGOLJN4y(0)78tda1y2bjwIwV0kiWEABCxZxg2fMrJzu)rQMVncsqgXxAHV)KHnkXr96o(ar3oz4GEisCf6p10CFVzoezqJBEEj3e084sUjq5loBgrflsEhzjfzGnl0y3xIXZ5yl01zOMTaMf(Z6526EWM36l6WlZ4i91abUQYCwa3Sw5R4lkHkFCMf(94Pv)E(N5zAFrb7U(EaKovC0R5OnzEUjG)(kVwMAip9bU62SCw(NZ0L4MSUVVJBsmECfiiok4HBMk(sdb)7]] )
\ No newline at end of file
diff --git a/Interface/AddOns/Hekili/Dragonflight/WarriorProtection.lua b/Interface/AddOns/Hekili/Dragonflight/WarriorProtection.lua
index 21c749c46..114f04d72 100644
--- a/Interface/AddOns/Hekili/Dragonflight/WarriorProtection.lua
+++ b/Interface/AddOns/Hekili/Dragonflight/WarriorProtection.lua
@@ -72,109 +72,109 @@ spec:RegisterResource( Enum.PowerType.Rage, {
-- Talents
spec:RegisterTalents( {
- anger_management = { 90311, 152278, 1 }, --
- armored_to_the_teeth = { 90259, 394855, 2 }, --
- avatar = { 90365, 107574, 1 }, --
- barbaric_training = { 90377, 390675, 1 }, --
- battering_ram = { 90262, 394312, 1 }, --
- battle_stance = { 90261, 386164, 1 }, --
- battlescarred_veteran = { 90435, 386394, 1 }, --
- berserker_rage = { 90372, 18499 , 1 }, --
- berserker_shout = { 90348, 384100, 1 }, --
- best_served_cold = { 90304, 202560, 1 }, --
- bitter_immunity = { 90356, 383762, 1 }, --
- blood_and_thunder = { 90342, 384277, 1 }, --
- bloodborne = { 90448, 385704, 2 }, --
- bloodsurge = { 90300, 384361, 1 }, --
- bolster = { 90264, 280001, 1 }, --
- booming_voice = { 90314, 202743, 1 }, --
- bounding_stride = { 90355, 202163, 1 }, --
- brace_for_impact = { 90296, 386030, 1 }, --
- brutal_vitality = { 90451, 384036, 1 }, --
- cacophonous_roar = { 90383, 382954, 1 }, --
- challenging_shout = { 90309, 1161 , 1 }, --
- champions_bulwark = { 90316, 386328, 1 }, --
- concussive_blows = { 90334, 383115, 1 }, --
- crackling_thunder = { 90342, 203201, 1 }, --
- cruel_strikes = { 90381, 392777, 2 }, --
- crushing_force = { 90369, 390642, 2 }, --
- dance_of_death = { 90260, 393965, 1 }, --
- defensive_stance = { 90330, 386208, 1 }, --
- demoralizing_shout = { 90305, 1160 , 1 }, --
- devastator = { 90299, 236279, 1 }, --
- disrupting_shout = { 90307, 386071, 1 }, --
- double_time = { 90382, 103827, 1 }, --
- elysian_might = { 90323, 386285, 1 }, --
- endurance_training = { 90339, 382940, 1 }, --
- enduring_alacrity = { 90433, 384063, 1 }, --
- enduring_defenses = { 90313, 386027, 1 }, --
- fast_footwork = { 90371, 382260, 1 }, --
- focused_vigor = { 90318, 384067, 1 }, --
- frothing_berserker = { 90370, 392790, 1 }, --
- fueled_by_violence = { 90451, 383103, 1 }, --
- furious_blows = { 90336, 390354, 1 }, --
- heavy_repercussions = { 90319, 203177, 1 }, --
- heroic_leap = { 90346, 6544 , 1 }, --
- honed_reflexes = { 90361, 391271, 1 }, --
- ignore_pain = { 90295, 190456, 1 }, --
- immovable_object = { 90364, 394307, 1 }, --
- impending_victory = { 90326, 202168, 1 }, --
- impenetrable_wall = { 90310, 384072, 1 }, --
- improved_heroic_throw = { 90306, 386034, 1 }, --
- indomitable = { 90434, 202095, 1 }, --
- inspiring_presence = { 90332, 382310, 1 }, --
- instigate = { 90301, 394311, 1 }, --
- intervene = { 90329, 3411 , 1 }, --
- intimidating_shout = { 90384, 5246 , 1 }, --
- into_the_fray = { 90319, 202603, 1 }, --
- juggernaut = { 90449, 393967, 1 }, --
- last_stand = { 90297, 12975 , 1 }, --
- leeching_strikes = { 90344, 382258, 1 }, --
- massacre = { 90313, 281001, 1 }, --
- menace = { 90383, 275338, 1 }, --
- onehanded_weapon_specialization = { 90324, 382895, 1 }, --
- overwhelming_rage = { 90378, 382767, 2 }, --
- pain_and_gain = { 90353, 382549, 1 }, --
- piercing_howl = { 90348, 12323 , 1 }, --
- piercing_verdict = { 90379, 382948, 1 }, --
- punish = { 90449, 275334, 1 }, --
- rallying_cry = { 90331, 97462 , 1 }, --
- ravager = { 90432, 228920, 1 }, --
- reinforced_plates = { 90368, 382939, 1 }, --
- rend = { 90302, 394062, 1 }, --
- revenge = { 90298, 6572 , 1 }, --
- rumbling_earth = { 90374, 275339, 1 }, --
- second_wind = { 90332, 29838 , 1 }, --
- seismic_reverberation = { 90340, 382956, 1 }, --
- shattering_throw = { 90351, 64382 , 1 }, --
- shield_charge = { 90317, 385952, 1 }, --
- shield_specialization = { 90315, 386011, 2 }, --
- shield_wall = { 90312, 871 , 1 }, --
- shockwave = { 90375, 46968 , 1 }, --
- show_of_force = { 90320, 385843, 1 }, --
- sidearm = { 90334, 384404, 1 }, --
- sonic_boom = { 90321, 390725, 1 }, --
- spear_of_bastion = { 90380, 376079, 1 }, --
- spell_block = { 90450, 392966, 1 }, --
- spell_reflection = { 90385, 23920 , 1 }, --
- storm_bolt = { 90337, 107570, 1 }, --
- storm_of_steel = { 90431, 382953, 1 }, --
- strategist = { 90303, 384041, 1 }, --
- sudden_death = { 90320, 29725 , 1 }, --
- thunder_clap = { 90343, 6343 , 1 }, --
- thunderlord = { 90308, 385840, 1 }, --
- thunderous_roar = { 90359, 384318, 1 }, --
- thunderous_words = { 90358, 384969, 1 }, --
- titanic_throw = { 90341, 384090, 1 }, --
- tough_as_nails = { 90450, 385888, 1 }, --
- unbreakable_will = { 90310, 384074, 1 }, --
- unnerving_focus = { 90452, 384042, 1 }, --
- unstoppable_force = { 90364, 275336, 1 }, --
- uproar = { 90357, 391572, 1 }, --
- violent_outburst = { 90265, 386477, 1 }, --
- war_machine = { 90345, 316733, 1 }, --
- wild_strikes = { 90360, 382946, 2 }, --
- wrecking_throw = { 90351, 384110, 1 }, --
+ anger_management = { 90311, 152278, 1 }, -- Every 10 Rage you spend reduces the remaining cooldown on Avatar and Shield Wall by 1 sec.
+ armored_to_the_teeth = { 90259, 394855, 2 }, -- Gain Strength equal to 2% of your Armor.
+ avatar = { 90365, 107574, 1 }, -- Transform into a colossus for 20 sec, causing you to deal 20% increased damage and removing all roots and snares. Generates 10 Rage.
+ barbaric_training = { 90334, 390675, 1 }, -- Revenge deals 25% increased damage but now costs 10 more rage.
+ battering_ram = { 90262, 394312, 1 }, -- Shield Charge critical strike chance and critical strike damage increased by 15%, and Shield Charge increases your auto-attack speed by 20% for 20 sec.
+ battle_stance = { 90261, 386164, 1 }, -- A balanced combat state that increases the critical strike chance of your abilities by 3% and reduces the duration of movement impairing effects by 10%. Lasts until canceled.
+ battlescarred_veteran = { 90435, 386394, 1 }, -- When your health is brought below 30%, you take 80% less damage for 8 sec and healing you receive is increased by 100%. Cannot occur more than once every 180 sec.
+ berserker_rage = { 90372, 18499 , 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec.
+ berserker_shout = { 90348, 384100, 1 }, -- Go berserk, removing and granting immunity to Fear, Sap, and Incapacitate effects for 6 sec. Also remove fear effects from group members within 12 yards.
+ best_served_cold = { 90304, 202560, 1 }, -- Revenge deals 10% more damage, or 20% more damage when your successful dodges or parries have made it cost no Rage.
+ bitter_immunity = { 90356, 383762, 1 }, -- Restores 20% health instantly and removes all diseases, poisons and curses affecting you.
+ blood_and_thunder = { 90342, 384277, 1 }, -- Thunderclap deals 10% increased damage and if you have Rend, Thunder Clap affects 5 nearby targets with Rend.
+ bloodborne = { 90448, 385704, 2 }, -- Deep Wounds, Rend and Thunderous Roar's Bleed effects deal 10% increased damage.
+ bloodsurge = { 90300, 384361, 1 }, -- Your Bleed effects have a chance to grant you 5 Rage.
+ bolster = { 90264, 280001, 1 }, -- Last Stand's cooldown is reduced by 60 sec, and it grants you the Shield Block effect for its duration.
+ booming_voice = { 90314, 202743, 1 }, -- Demoralizing Shout also generates 30 Rage, and increases damage you deal to affected targets by 20%.
+ bounding_stride = { 90355, 202163, 1 }, -- Reduces the cooldown of Heroic Leap by 15 sec, and Heroic Leap now also increases your run speed by 70% for 3 sec.
+ brace_for_impact = { 90296, 386030, 1 }, -- Using Shield Slam increases the damage of Shield Slam by 5% for 16 sec, and it increases the amount of damage you block by 5%. Stacking up to 5 times.
+ brutal_vitality = { 90451, 384036, 1 }, -- 30% of damage you deal adds to your active Ignore Pain.
+ cacophonous_roar = { 90383, 382954, 1 }, -- Intimidating Shout can withstand 200% more damage before breaking.
+ challenging_shout = { 90309, 1161 , 1 }, -- Taunts all enemies within 10 yds to attack you for 6 sec.
+ champions_bulwark = { 90316, 386328, 1 }, -- Shield Charge deals 20% increased damage, grants you Shield Block, Revenge!, and generates an additional 20 Rage.
+ concussive_blows = { 90334, 383115, 1 }, -- Cooldown of Pummel reduced by 1.0 sec. Successfully interrupting an enemy increases the damage you deal to them by 5% for 10 sec.
+ crackling_thunder = { 90342, 203201, 1 }, -- Thunder Clap's radius is increased by 50%, and it reduces movement speed by an additional 20%.
+ cruel_strikes = { 90381, 392777, 2 }, -- Critical strike chance increased by 1% and critical strike damage of Execute increased by 5%.
+ crushing_force = { 90369, 390642, 2 }, -- Shield Slam deals an additional 5% damage and deals 5% increased critical strike damage.
+ dance_of_death = { 90260, 393965, 1 }, -- If your Ravager helps kill an enemy, it lasts 2.0 sec longer and deals 20% increased damage. This effect also applies to future Ravagers for the next 2 min.
+ defensive_stance = { 90330, 386208, 1 }, -- A defensive combat state that reduces all damage you take by 20%, and all damage you deal by 10%. Lasts until canceled.
+ demoralizing_shout = { 90305, 1160 , 1 }, -- Demoralizes all enemies within 15 yards, reducing the damage they deal to you by 25% for 8 sec. Generates 30 Rage.
+ devastator = { 90299, 236279, 1 }, -- Your auto attacks deal an additional 328 Physical damage and have a 20% chance to reset the remaining cooldown on Shield Slam.
+ disrupting_shout = { 90307, 386071, 1 }, -- Taunts all enemies within 14 yds to attack you for 6 sec, interrupts all spellcasting within 14 yds and prevents any spell in that school from being cast for 6 sec.
+ double_time = { 90382, 103827, 1 }, -- Increases the maximum number of charges on Charge by 1, and reduces its cooldown by 3 sec.
+ elysian_might = { 90323, 386285, 1 }, -- Spear of Bastion's duration is increased by 2 sec. While you remain within Spear of Bastion's area your critical strike damage is increased by 25%.
+ endurance_training = { 90339, 382940, 1 }, -- Stamina increased by 5% and the duration of Fear, Sap and Incapacitate effects on you is reduced by 10.0%.
+ enduring_alacrity = { 90433, 384063, 1 }, -- Increases Stamina and Armor by 5% and your Haste by 1%.
+ enduring_defenses = { 90313, 386027, 1 }, -- Shield Block lasts 2 sec longer.
+ fast_footwork = { 90371, 382260, 1 }, -- Movement speed increased by 5%.
+ focused_vigor = { 90318, 384067, 1 }, -- Increases Strength and Armor by 5% and your critical strike chance by 1%.
+ frothing_berserker = { 90370, 392790, 1 }, -- Revenge has a 20% chance to immediately refund 50% of the Rage spent.
+ fueled_by_violence = { 90451, 383103, 1 }, -- You are healed for 50% of the damage dealt by Deep Wounds.
+ furious_blows = { 90336, 390354, 1 }, -- Auto-attack speed increased by 5%.
+ heavy_repercussions = { 90319, 203177, 1 }, -- Shield Slam generates 2 more Rage and extends the duration of Shield Block by 1.0 sec.
+ heroic_leap = { 90346, 6544 , 1 }, -- Leap through the air toward a target location, slamming down with destructive force to deal 349 Physical damage to all enemies within 8 yards, and resetting the remaining cooldown on Taunt.
+ honed_reflexes = { 90361, 391271, 1 }, -- Cooldown of Shield Slam and Pummel reduced by 1.0 sec.
+ ignore_pain = { 90295, 190456, 1 }, -- Fight through the pain, ignoring 55% of damage taken, up to 5,202 total damage prevented.
+ immovable_object = { 90364, 394307, 1 }, -- Activating Avatar or Shield Wall casts the other at reduced effectiveness.
+ impending_victory = { 90326, 202168, 1 }, -- Instantly attack the target, causing 743 damage and healing you for 30% of your maximum health. Killing an enemy that yields experience or honor resets the cooldown of Impending Victory and makes it cost no Rage.
+ impenetrable_wall = { 90310, 384072, 1 }, -- Shield Slam generates an additional 3 Rage and reduces the remaining cooldown of Shield Wall by 5 sec.
+ improved_heroic_throw = { 90306, 386034, 1 }, -- Heroic Throw deals 100% increased damage and inflicts Deep Wounds.
+ indomitable = { 90434, 202095, 1 }, -- Your maximum health is increased by 10%, and every 10 Rage you spend heals you for 1% of your maximum health.
+ inspiring_presence = { 90332, 382310, 1 }, -- Rallying Cry's duration is increased by 3 sec and it grants a further 5% maximum health.
+ instigate = { 90301, 394311, 1 }, -- Devastate deals 20% increased damage and generates 2 Rage. Devastator deals 10% increased damage and generates 1 Rage.
+ intervene = { 90329, 3411 , 1 }, -- Run at high speed toward an ally, intercepting all melee and ranged attacks against them for 6 sec while they remain within 10 yds.
+ intimidating_shout = { 90384, 5246 , 1 }, -- Causes the targeted enemy to cower in fear, and up to 5 additional enemies within 8 yards to flee. Targets are disoriented for 8 sec.
+ into_the_fray = { 90319, 202603, 1 }, -- You gain 2% Haste for each enemy or ally within 10 yards, up to 10% Haste.
+ juggernaut = { 90449, 393967, 1 }, -- Execute increases Execute's damage dealt by 3% for 20 sec, stacking up to 15 times.
+ last_stand = { 90297, 12975 , 1 }, -- Increases maximum health by 30% for 15 sec, and instantly heals you for that amount.
+ leeching_strikes = { 90344, 382258, 1 }, -- Leech increased by 5%.
+ massacre = { 90313, 281001, 1 }, -- Condemn is now usable on targets below 35% health.
+ menace = { 90383, 275338, 1 }, -- Intimidating Shout will knock back all nearby enemies except your primary target, and cause them all to cower in fear for 15 sec instead of fleeing.
+ onehanded_weapon_specialization = { 90324, 382895, 1 }, -- Damage with one-handed weapons and Leech increased by 5%.
+ overwhelming_rage = { 90378, 382767, 2 }, -- Maximum Rage increased by 15.
+ pain_and_gain = { 90353, 382549, 1 }, -- When you take any damage, heal for 4.50% of your maximum health. This can only occur once every 10 sec.
+ piercing_howl = { 90348, 12323 , 1 }, -- Snares all enemies within 12 yards, reducing their movement speed by 70% for 8 sec.
+ piercing_verdict = { 90379, 382948, 1 }, -- Spear of Bastion's instant damage increased by 50% and its Rage generation is increased by 100%.
+ punish = { 90449, 275334, 1 }, -- Shield Slam deals 10% increased damage, and reduces enemies' damage against you by 3% for 9 sec. Multiple punishments may overlap.
+ rallying_cry = { 90331, 97462 , 1 }, -- Lets loose a rallying cry, granting all party or raid members within 40 yards 19% temporary and maximum health for 13.2 sec.
+ ravager = { 90432, 228920, 1 }, -- Throws a whirling weapon at the target location that chases nearby enemies, inflicting 7,563 Physical damage to all enemies over 9.8 sec. Deals reduced damage beyond 8 targets. Generates 10 Rage each time it deals damage.
+ reinforced_plates = { 90368, 382939, 1 }, -- Armor increased by 20%.
+ rend = { 90302, 394062, 1 }, -- Wounds the target, causing 477 Physical damage instantly and an additional 1,575 Bleed damage over 15 sec.
+ revenge = { 90298, 6572 , 1 }, -- Swing in a wide arc, dealing 919 Physical damage to all enemies in front of you. Deals reduced damage beyond 5 targets. Your successful dodges and parries have a chance to make your next Revenge cost no Rage.
+ rumbling_earth = { 90374, 275339, 1 }, -- Shockwave's range increased by 6 yards and when Shockwave strikes at least 3 targets, its cooldown is reduced by 15 sec.
+ second_wind = { 90332, 29838 , 1 }, -- Restores 6% health every 1 sec when you have not taken damage for 5 sec.
+ seismic_reverberation = { 90340, 382956, 1 }, -- If Whirlwind or Revenge hits 3 or more enemies, it hits them 1 additional time for 30% damage.
+ shattering_throw = { 90351, 64382 , 1 }, -- Hurl your weapon at the enemy, causing 1,486 Physical damage, ignoring armor, and removing any magical immunities. Deals up to 500% increased damage to absorb shields.
+ shield_charge = { 90317, 385952, 1 }, -- Charge to an enemy with your shield, dealing 4,087 Physical damage to it and 1,635 Physical damage to all enemies within 10 yards. Also stuns the primary target for 4 sec. Generates 20 Rage.
+ shield_specialization = { 90315, 386011, 2 }, -- Increases Block chance by 6% and your Block value by 15%.
+ shield_wall = { 90312, 871 , 1 }, -- Reduces all damage you take by 40% for 8 sec.
+ shockwave = { 90375, 46968 , 1 }, -- Sends a wave of force in a frontal cone, causing 446 damage and stunning all enemies within 16 yards for 2 sec. Generates 10 Rage.
+ show_of_force = { 90320, 385843, 1 }, -- Revenge damage increased by 10% and Revenge increases the damage of your next Thunder Clap by 20%.
+ sidearm = { 90377, 384404, 1 }, -- Your auto-attacks have a 20% chance to hurl weapons at your target and 3 other enemies in front of you, dealing an additional 297 Physical damage.
+ sonic_boom = { 90321, 390725, 1 }, -- Shockwave deals 350% increased damage and will always critical strike.
+ spear_of_bastion = { 90380, 376079, 1 }, -- Throw a spear at the target location, dealing 2,452 Physical damage instantly and an additional 2,739 damage over 4 sec. Deals reduced damage beyond 5 targets. Enemies hit are chained to the spear's location for the duration. Generates 20 Rage.
+ spell_block = { 90450, 392966, 1 }, -- You are able to block spells for 20 sec.
+ spell_reflection = { 90385, 23920 , 1 }, -- Raise your shield, reflecting the first spell cast on you, and reduce magic damage you take by 20% for 5 sec.
+ storm_bolt = { 90337, 107570, 1 }, -- Hurls your weapon at an enemy, causing 424 Physical damage and stunning for 4 sec.
+ storm_of_steel = { 90431, 382953, 1 }, -- Ravager's damage is reduced by 40% but it now has 2 charges and generates 15 Rage each time it deals damage.
+ strategist = { 90303, 384041, 1 }, -- Devastate, Thunder Clap, Revenge, and Execute have a 30% chance to reset the remaining cooldown on Shield Slam.
+ sudden_death = { 90320, 29725 , 1 }, -- Your attacks have a chance to make your next Condemn cost no Rage, be usable on any target regardless of their health, and deal damage as if you spent 40 Rage.
+ thunder_clap = { 90343, 6343 , 1 }, -- Blasts all enemies within 8 yards for 755 Physical damage. and reduces their movement speed by 20% for 10 sec. Deals reduced damage beyond 5 targets. Generates 5 Rage.
+ thunderlord = { 90308, 385840, 1 }, -- Increases the radius of Demoralizing Shout by 5 yards. Each enemy hit by Thunder Clap reduces the remaining cooldown on Demoralizing Shout by 1.0 sec, up to 3.0 sec.
+ thunderous_roar = { 90359, 384318, 1 }, -- Roar explosively, dealing 2,378 Physical damage to enemies within 12 yds and cause them to bleed for 2,378 physical damage over 8 sec. Generates 10 Rage.
+ thunderous_words = { 90358, 384969, 1 }, -- Increases the duration of Thunderous Roar's Bleed effect by 2.0 sec and increases the damage of your bleed effects by 15% at all times.
+ titanic_throw = { 90341, 384090, 1 }, -- Throws your weapon at the enemy, causing 1,040 Physical damage to it and 5 nearby enemies. Generates high threat.
+ tough_as_nails = { 90450, 385888, 1 }, -- Blocking an attack deals 445 Physical damage to the attacker, ignoring armor. Generates high threat.
+ unbreakable_will = { 90310, 384074, 1 }, -- Shield Wall gains 1 additional charge, and grants 50% of its effect to all party members.
+ unnerving_focus = { 90452, 384042, 1 }, -- Last Stand increases your Rage generation by 50%.
+ unstoppable_force = { 90364, 275336, 1 }, -- Avatar increases the damage of Thunder Clap and Shockwave by 50%, and reduces the cooldown of Thunder Clap by 50%.
+ uproar = { 90357, 391572, 1 }, -- Thunderous Roar's cooldown reduced by 30 sec.
+ violent_outburst = { 90265, 386477, 1 }, -- Consuming 30 rage grants a stack of Seeing Red, which transforms at 8 stacks into Violent Outburst, causing your next Shield Slam or Thunder Clap to deal 200% increased damage, generate 100% more Rage and grant Ignore Pain.
+ war_machine = { 90345, 316733, 1 }, -- Your auto attacks generate 50% more Rage. Killing an enemy instantly generates 10 Rage, and increases your movement speed by 30% for 8 sec.
+ wild_strikes = { 90360, 382946, 2 }, -- Haste increased by 1% and your auto-attack critical strikes increase your auto-attack speed by 10% for 10 sec sec.
+ wrecking_throw = { 90351, 384110, 1 }, -- Hurl your weapon at the enemy, causing 1,486 Physical damage, ignoring armor. Deals up to 500% increased damage to absorb shields.
} )
-- PvP Talents
@@ -441,6 +441,11 @@ spec:RegisterAuras( {
duration = 5,
max_stack = 1
},
+ storm_bolt = {
+ id = 107570,
+ duration = 4,
+ max_stack = 1
+ },
sudden_death = {
id = 52437,
duration = 10,
@@ -862,7 +867,7 @@ spec:RegisterAbilities( {
handler = function ()
applyDebuff( "target", "disrupting_shout" )
- active_dot.disrupting_shout = active_enemie
+ active_dot.disrupting_shout = active_enemies
end,
},
@@ -1104,7 +1109,11 @@ spec:RegisterAbilities( {
toggle = "cooldowns",
usable = function()
- return incoming_damage_3s > 0.3 * health.max, "requires 30% health incoming damage in 3s"
+ if settings.last_stand_offensively and talent.unnerving_focus.enabled then
+ return true
+ else
+ return incoming_damage_3s > 0.3 * health.max, "requires 30% health incoming damage in 3s"
+ end
end,
handler = function ()
@@ -1730,6 +1739,17 @@ spec:RegisterSetting( "stack_shield_block", false, {
width = "full"
} )
+spec:RegisterSetting( "last_stand_offensively", false, {
+ name = "Use |T135871:0|t Last Stand Offensively",
+ desc = function()
+ return "If checked, the addon will recommend using |T135871:0|t Last Stand to generate rage.\n\n"
+ .. "If unchecked, the addon will only recommend |T135871:0|t Last Stand defensively after taking significant damage.\n\n"
+ .. ( state.talent.unnerving_focus.enabled and "|cFF00FF00" or "|cFFFF0000" ) .. "Requires |T571316:0|t Unnerving Focus|r"
+ end,
+ type = "toggle",
+ width = "full"
+} )
+
spec:RegisterOptions( {
enabled = true,
@@ -1742,10 +1762,10 @@ spec:RegisterOptions( {
damage = true,
damageExpiration = 8,
- potion = "potion_of_phantom_fire",
+ potion = "potion_of_spectral_strength",
package = "Protection Warrior",
} )
-spec:RegisterPack( "Protection Warrior", 20221026, [[Hekili:1M1EVTTTw8plRfWXg3cfzNy7KI4a0BxXwlcslQhW2FjjAjkBDJSOVuuPldg6Z(ohs9GuVCsxhkQJm55878GhEEy5m153CwhqeuN7NzpB2u7zlSME1u7lx4Sw80bQZ6de)hiBHhsi7Hp)cNjO(IiwsU3Vt48ighP5PygjaXkLLX9b62jehsF75NVnsSlBJLpB)5Pr7ZIjiR(CsOa)U)5oR3Kffl(yIZMUvK5aMhO(o3V8ca1OGaQIuAQFNAt(NMTi37Z(c2gkp3dbl3B80WGnxn76j5Fk)tFmjserIZ9(zozlljmoA7orUx0(dmUWcSgolmkgSHx)6CVoLaUXPKcsZWscPIiHo16aNcUOneX)z15HX00DsxKeNCVp8Nu)mbni3J(iL)uUNiApf(Ch8baaOrErPWJpsIIjBIPwv4cO5VJW3sFtu4kKRv267DiB)EAS(kGRoo2LtbDqz0O8)zAijlgu839L7ode0R(vkNf5N79Ej2VQq85ELRFhLCi3lKfhZ(gQ2BEQKwqRz5EbW)tzOneq2tWvjjazBPjuoecK79vyrdRyNez3yay0usPcruY2uRI1vg5iEwcnKbpzXPh4rPK4r(mwCa7BjwksGn2tIssVzRFq3EPNp0Wz2JwtT0unDeJseu(JGfHGUjlmeye(kaaQoJgdre0BUY(4r5dlxosstmjv4Mka3Hv2HjDivDrKLsDJe09POiQmuimqq4vg6kWspEucEXozg65MyglWnmJ)uLI2nDuEkL)a4AgMUWiovI5WKrs8PPcoj21NehpmTqgKKak31pwD6lPKLj2KXtfaTJgpwUukLcQhe9gybUq)hUDr9XF6UiACGBAmzFPR52ztMyOssz3wai)g3Ay4tTv5JhfyOIWcVO5kyUbr0BMnVX1lc3Lf6UboNLxVQ3Ri8Ov4cAFfaVJsIf7So4lUDge5OUSQ2l1s3lD7ftg00ncu3MW4u3dW6YSeTe1Qz2DPbRUYE0p5ZaLKKiSG)i29eFIkWg2CEFkaj4jvSEXYqWI)ds3NIZf21Cgq3ZGyKO)cpxt3bhjfaiiXGaT2Wy7XTEeUbsTanbY(fuc0snGQUuamxU)L)tfuhxzlXE(8UL9aSuMlWK5E8D6r)d5mVW(LdLH21j6tEdM6Hfg6cjxwn1icxJsmCACB(rLPiJKX6LzSgkWDYOUUkORa1AFprZxBxDrTE5BwzIs74bfAdemiZJVWUdNbAaDM3sYcCCBKgilXv9n34OuXBW2UwryQAtdCH3OAgKsTniYYRq5z9K6KTy2ibS8dgjfiCFscMeJZblgLDr9kdxn2otQ7)lly7EGk9(zafg44rGhUXI155AUSU10Cpn)OUqkmO2cQydGtQQ1PU2Ya02BpCrhJAcAC1Y4Q3kG(ieAID4Ug6Ilf2v1QR91tHEC)gHNGTD4S(3F3xV)J3)lVn3l373Ww8uTlI9tbn6DwGQzSZY940)FguSnOSxksMGTNi7teAAb0IuOfQ7IsGTUeq79SeqUYTpRUVI)4mvlz6lvgsFg2s7FoPcL5)qqzX3lkeWh8HpFxfCqN8spdIYLYoHXkQEyapA5oRLpHdLarrWFUxoSJImN1fbnoRleGZ)1rahigKOomBqYf6KOhL0GUl1PtlyZKmHZ6IqKVhnSi8EinSxjRuW6vw7ZHMj5reCKSMX69yXakZpThBHojAxdA4hkISR8dAQwjZQMXvt)XJoOw8fpEKUPQODvUNDlNRA6Ob9TnMw6eo4s20MyOHP0CslZbT(xAolD3r3t)K7ncs30AwKY7MYT7zqRCVBab6hufQ0za33VyBpewROLYiW(d11NmtI6yqUs)fO8qnpVJh1wy5sjnT7vk3BYju5ADRA8qu9w2R61ZuDGESs6wvQM5Ci1cPAaruixnSpOd2Rhne5)6xo)vJmI8p1(fdq1SKs(BMu408BoKPeKzpZKE4PPkqyCH)T50L5E3cfZmJ97AulKSzYqJj9NfD6fpt9YmzSYMLaCIS51dwlJyApPQm0E2CT0FYXCLypVrspJzyBK0B6Z8UwTdUvZ4kxwX1U(75vs2fLx6g6mODbkurBERR6Qz9aXgvk6qnxP0Z(TJvQ8hab)eQIMdlxQ6vzBKKpFiZbMARo5tJPY0ttHiTW2eP(MXvs1qJ20e4LnawFa3M0E5poLONCUMYB(8H0TNfeMj87c0botAMa55CqDH9)m4Byn9k1jQkcfZTJDzHxd6VUW4UasvJSQQtxtWltLmCoXjfN3DFZVv3Rs4LAB)vH656312gz803(MvMcR2pk7fS)6vNmoTQxHf26D(2m0xkMtuwR5jEb0YOYU7YhbT)YCNkFQwUsZFjc18uUQxdeorfkNMLTQA9QXVaHbZLd8GaymLKXphrZ5E6V7rTw10knA8lyirWyoKg)4fTMgP6nY40CUS63pttMGfGHW3HVsS1vVSR3lPe)NZFd]] )
\ No newline at end of file
+spec:RegisterPack( "Protection Warrior", 20221028, [[Hekili:9QvBVTnos4FlTfWXE3ufjN4e3I4a02T9UeKnTOU469jlrlrBZlsIA1ljnhm0V9DgskjkkzNKU7Dy32gtoCMHpZlCMXzHZIVTyEajNU4MX2Jh7ypEQLZBCCCoBX88hsOlMNq8VLSg(Hyse83ZV(lP8CC5hc5Ka84z8IuFyRn55jzV9OJwZY3uS0YNhDuglQiKKZ4X(PKv54N9pAX8LfSW8lJxSux22NyFgi7JNobyzc1FXnNDmWuwqavsjnZFXCu6uFKJLEFNKMY4PLEVU0735bSvmFHSYk9Iib0sVv4M)2Nk9wsYObLE4HMFn8Nl)9p8R46jP0esU)gRYR(SFoFjfOF808nhc)dOsLxvE1h2qIxtZEB5vV(DGQaC59S8CKWlJIkIz5pu6DuP3xPXbIF4BBkIdOP8cql(kNKkweUg0qyFGzPRPaR(e7hiR(nAeV0lBdViV0lLcqweWhI86DpGJG048iw86sV)fN5d3PC4aXCGC(D0uFscCoW8yHQ6na0iu0pgtwgI0Ub(Rd2qjHahoO0JOaUqwgWag8tb0vKIq4ddFLZKrWARk9EGxacNeNlfwgfyczjlKLZOz4HVfw4ogGxPWDpTiBJ4oYIsaDxOQ1BclJspFtwopgV3FhUK3kO5BBs53lrmwoimMVCnsUyX)jaHvlbKbyaa6bwGJxkFfleC3E1Rk96ZB4kCJ3LKYcl9otZqIlRmMYpaEnGffCDGl2AfMhYxJsvaYuqUZzrFai7lxBvFMRzR3KtJBmQVpK7FlarOdWLRJ5Pa88fIaDjrGTbr6CccAP0)OGLsbBCEwdd)k4eChUlpxOfeqXlYehKdMJRjOXAoGrb6NbdrG1F5Nsr7ZxP3rHB2lrZvEUaGf6tQI3CWvif)ywEktayAkWNiHHymcElewC48H0xNJ(Q5yqcaRc)C07q4t9Up)rtVPnKmHJ5gHWr2eWfELGm(4pO(f5Od)s6kb(aE6lrl9s6AgQkEVZ3NMKlyr8RHOKOvfHvIidJCdFa4M6ZwjIyfGdZG)KhsDLHqD3)xND0QqA2gr6N(33Nh)hfG3wAM7ssCmat9swcxCBnVqaUJo65SOQ4nc67dyfO1K7iSqmuSr1N5Rsb8km6xf8b(xhaK)YkNEzAIxQystWW1umEFfpmKFVanFOoLIcXbJhh1KkppHtWAkCRG8SGBImvHsxGB1gbNDdbgFiB1mLZtMLADPYoiTigTBWzH8LPSms4aFopmGFFSLKeyJiWLp781(b68xU7ZJ1aQFNLJLMQPZXKcihzO(kGT3)27j3jetaDzXQvw(qqdinRIKbVq6hBXa7lplt)Kfzuxwonkdpz9ncSAWrQVrZGR02TcUQ2POLcTmKZdCxvaUb6RstZOPIuDARsGm2XuxWbjfYbOVtiMvjZ9)ueSoYyRvqkdHqAXPyFmwMe66JrV6sMS2LVYfJZVT1TvQ9TWsHpnE5BF9GRlGudwH6KBfomEsldlivx5hDXeahILhmlQov6HYenZCqUZI9fpI5kDlDNKDHDlMzgcIhQXZyDiVn429MaWbdGnxikhaE0HOLhscLKIGYs0TaJI3JSB7AHP4DxIz4RHj9fTqpMEorwijQ(aqQPLfPz5gooWfSlcs40wqhO6aqlDHZSYLfx46hssUy2XpUbre6dPoUQjPgiHzPacUwpthSiWJaOuc44PCsNT0LS5EPYhFmxwdk0LVsL6QdQn2LE0SDFyClJIWd2a5hGLjD(Sjt6JJGtqankUVTOYu9pIE0326q2JykD2UTo9JgxRYbnO9LPLpNMav2brWdCzVy2P2duj)KvHzL4NFXyBf4OihXMouD(SX2keZz6G9PBpbMbI8PGppRlzFBPk70vusAp7xxHQBvbQ957rVdssGVwQ5Z2KxBgtuHNBcC3Rb6j2slK2Ec9)q8bg(QvUWtiZC6JDOw1MHDrp0umSNLNAp4f(q1DXq1ZwW)KV5H0rdgkn9tNSlRgj4HTBR9pQjc8)5WZjS)lIpIYPK0cMZqG3wlL9H4Eh2gIfv0HrqfJotJr1pFQjOt(Rkij(gcwg3mrLWyiUK3tM0VS3ZrMA33H7atdmZHuDQJTFoNQhfz0tYZW81NHVOgIcZG35AScVOhrmyOSeRm3vPs2tcVWXA62TDFoE0o0GU2QdHwjPUGsFQqJuULyRQSyhawr2Ch1fcNIGUfVWbuJH998VLZKFr5mhr(X2TAPEo2E02TA31D63HN81IKuNypAxxHgqPVkroo7cPK18HIzreSyHakb0O6YahVFR09W7V7OwhPeADhhBVyo05qgWIUt)4EsAmwQ8I5F)DF9MlV5F82spStyQOjBEAUAYghO6E)G6oldQQ)NuKZJiIou8L98cL9Fny6G(HbU9bEmiDX2h0uN1)(azBe6lvH4WwdD(XOAUC8FlCX5SFw2Gnp(XpFDn)kV6sb0GCzs7EtXR(I5aISHNUy(86rs9bSNWfZfKGZXs9ga8J34u9xW(kzU49apeCfhfLzyXI5(qlYWXjlMBeuaAZ2TsnQjWO07IzW1V0BuP3aW6EvL)SOH8urVBifhBJMEKcV9fpa65nJ105kfv5BkteOFva6pgVZveQkgZGKt0jjVEWwIcZmiDcsApqLQYkD8bj)0DqUQAltYpRF7rdr1zlenJbb7Uk1TcHeG4qCGxQYvGKKIsmegh9vvb8LENx6DYinic2e1LPgQUMMAI74Jc4rEZopIqS3X4OY72Q2NoaVOojKBo2MSJKiPuNZn(qNAlU8DQGa2fNoMebmkIBxN48zYJmOYjfxWzQyH9vL4Zsic1sh4fhqC1DA50Q2OTNOZyDAQlNRnv54oIKNvEw6akoQ5uMcuF2Z6rZ5xg3PcoRxwocJ(ch71hPZine42lQHo1Gn09(udePogUx(UJbEiTP4CCASz1tgOri1ZoPo6VANMbIyCfpTfv1diXGQZ0PQ9atmOCQoLgdqXG03OtA9avm9CSBj6wtyXK0woITg5YEDhLaPjj722Bm2jPfbNIf6c0A(mI8vJNO5LjgUJG)72hOB1kIWpi6toecm2OXD2yedY3oDLFXqn1eje5KEYyVuxYTYQa5qSTFIcs91ziKYPpo2EMHn1ymrMK3YNYCUrMe3YRQZGKmOECN021yXUNmGmd(4EnhgZpQfir4Y0oMz2EsiCvHqI0K1Za)zKO8V0u(1dRAMTFNKOnJ1VtMDnxXE0zToVAbNA9H3Z7OqvLYN96Tr)AT7Nxo99oyZJTd7)HsGGP2vphyolGQIlhQxq50j77TAO9vzoMovp8OTVREmF31OAY4ZmySEV7M0EYFFkrLjSvZYMYBYK9PBpjwm1(XyApqFfN1NySbxo2(NJl7qPhT)ApgQk0OVXoi1SxSd(w561DieIOjhRPYZ33lqJwywjTygi9votfD91sMAuflMF6oQrUjQQAag7OxnTw1gk()D9UPf2U3Vu9TElBOd5OXRDOrCKChdeEVbo7ObXrkZOzpy7(z(JLQRuRmC17D8hQk)1k3Q2Cxxz3tsYtAl5EWg9s)1MTsvPH7PTCJUDB94KXVbgEfIFHqWVZ6qX3VEkntmyfCKdIV1BJVD)IeRo1L19lcsl9dOfrj4ZAUllcVNKEBRuqnnpnSEswJThvvv7EUKlf)2N4Yu)YN0tJcbmr9e4jD9H4FADwKEiiHZY4X7Jc4NPebtKVUwv)vppTUJQ7ej71Ea0Cm8vVEUNBT(O93NCMAxLp7Ndc7NFNSF(P9R4IzjrcIXMfXweB9lxJemX60()08M(FW4MAkfT3XhPBg2rmAl6pPh6FctDQo1E3JjNzsNQ5oV555HMDy1ebxedM0KerqaupBZ1FKHw0Qle9r)0MSwDI07SlQ(Vf)5p]] )
diff --git a/Interface/AddOns/Hekili/Events.lua b/Interface/AddOns/Hekili/Events.lua
index 2ac24af19..0aee3621d 100644
--- a/Interface/AddOns/Hekili/Events.lua
+++ b/Interface/AddOns/Hekili/Events.lua
@@ -2080,7 +2080,7 @@ do
-- If bar is disabled assume paging / stance switching on bar 1
if actionBarNumber > 1 and bar and not bar.disabled then
- bindingKeyName = "CLICK BT4Button" .. actionBarButtonId .. ":LeftButton"
+ bindingKeyName = "CLICK BT4Button" .. actionBarButtonId .. ":Keybind"
end
StoreKeybindInfo( actionBarNumber, GetBindingKey( bindingKeyName ), GetActionInfo( actionBarButtonId ) )
@@ -2235,7 +2235,7 @@ local function ReadOneKeybinding( event, slot )
-- If bar is disabled assume paging / stance switching on bar 1
if actionBarNumber > 1 and bar and not bar.disabled then
- bindingKeyName = "CLICK BT4Button" .. slot .. ":LeftButton"
+ bindingKeyName = "CLICK BT4Button" .. slot .. ":Keybind"
end
ability = StoreKeybindInfo( actionBarNumber, GetBindingKey( bindingKeyName ), GetActionInfo( slot ) )
diff --git a/Interface/AddOns/Hekili/Hekili.lua b/Interface/AddOns/Hekili/Hekili.lua
index e70460685..6d4bec9aa 100644
--- a/Interface/AddOns/Hekili/Hekili.lua
+++ b/Interface/AddOns/Hekili/Hekili.lua
@@ -36,7 +36,7 @@ ns.PTR = false
ns.Patrons = "|cFFFFD100Current Dragonflight Status|r\n\n"
.. "|cFF00FF00Up to Date|r\n"
- .. "- Death Knights, Demon Hunters, Balance and Feral Druids, Beast Mastery and Marksmanship Hunters, Retribution Paladin, Enhancement Shaman\n\n"
+ .. "- Death Knights, Demon Hunters, Balance and Feral Druids, Beast Mastery and Marksmanship Hunters, Windwalker Monk, Retribution Paladin, Elemental and Enhancement Shamans\n\n"
.. "|cFFFFAE42Beta|r\n"
.. "- Guardian Druid, Warriors\n\n"
.. "|cFFBB3F3FNot Yet Implemented|r\n"
diff --git a/Interface/AddOns/Hekili/Hekili.toc b/Interface/AddOns/Hekili/Hekili.toc
index 41f0df37c..aa73f921e 100644
--- a/Interface/AddOns/Hekili/Hekili.toc
+++ b/Interface/AddOns/Hekili/Hekili.toc
@@ -1,5 +1,5 @@
## Interface: 100000
-## Version: v10.0.0-03
+## Version: v10.0.0-05.3
## Title: Hekili
## Author: Hekili
## Notes: Priority helper for many DPS and tanking specializations, based on SimulationCraft action lists.
@@ -44,13 +44,13 @@ Dragonflight\DruidGuardian.lua
# Dragonflight\EvokerPreservation.lua
Dragonflight\HunterBeastMastery.lua
Dragonflight\HunterMarksmanship.lua
-# Dragonflight\HunterSurvival.lua
+Dragonflight\HunterSurvival.lua
# Dragonflight\MageArcane.lua
# Dragonflight\MageFire.lua
# Dragonflight\MageFrost.lua
# Dragonflight\MonkBrewmaster.lua
# Dragonflight\MonkMistweaver.lua
-# Dragonflight\MonkWindwalker.lua
+Dragonflight\MonkWindwalker.lua
Dragonflight\PaladinRetribution.lua
# Dragonflight\PriestDiscipline.lua
# Dragonflight\PriestHoly.lua
@@ -58,7 +58,7 @@ Dragonflight\PaladinRetribution.lua
# Dragonflight\RogueAssassination.lua
# Dragonflight\RogueOutlaw.lua
# Dragonflight\RogueSubtlety.lua
-# Dragonflight\ShamanElemental.lua
+Dragonflight\ShamanElemental.lua
Dragonflight\ShamanEnhancement.lua
# Dragonflight\ShamanRestoration.lua
# Dragonflight\WarlockAffliction.lua
diff --git a/Interface/AddOns/Hekili/Libs/SpellFlashCore/API.txt b/Interface/AddOns/Hekili/Libs/SpellFlashCore/API.txt
index 20622b51a..c5ef4e85d 100644
--- a/Interface/AddOns/Hekili/Libs/SpellFlashCore/API.txt
+++ b/Interface/AddOns/Hekili/Libs/SpellFlashCore/API.txt
@@ -5,7 +5,7 @@
This is used to flash an action bar spell.
-<>SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros)<>
+<>SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -21,6 +21,12 @@ This is used to flash an action bar spell.
: (boolean) If true will make the action button fade in and out.
; ** NoMacros
: (boolean) If true will skip checking for macros.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -30,7 +36,7 @@ This is used to flash an action bar spell.
This is used to flash an action bar item.
-<>SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros)<>
+<>SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -46,6 +52,12 @@ This is used to flash an action bar item.
: (boolean) If true will make the action button fade in and out.
; ** NoMacros
: (boolean) If true will skip checking for macros.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -55,7 +67,7 @@ This is used to flash an action bar item.
This is used to flash a stance, form, presence, aura or aspect bar spell.
-<>SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink)<>
+<>SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -69,6 +81,12 @@ This is used to flash a stance, form, presence, aura or aspect bar spell.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -78,7 +96,7 @@ This is used to flash a stance, form, presence, aura or aspect bar spell.
This is used to flash a pet bar spell.
-<>SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink)<>
+<>SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -92,6 +110,12 @@ This is used to flash a pet bar spell.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -101,7 +125,7 @@ This is used to flash a pet bar spell.
This is used to flash a vehicle bar spell.
-<>SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink)<>
+<>SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -115,6 +139,12 @@ This is used to flash a vehicle bar spell.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -124,7 +154,7 @@ This is used to flash a vehicle bar spell.
This is used to flash the multiple totem call button.
-<>SpellFlashCore.FlashTotemCall(color, size, brightness, blink)<>
+<>SpellFlashCore.FlashTotemCall(color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -136,6 +166,12 @@ This is used to flash the multiple totem call button.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -145,7 +181,7 @@ This is used to flash the multiple totem call button.
This is used to flash the multiple totem recall button.
-<>SpellFlashCore.FlashTotemRecall(color, size, brightness, blink)<>
+<>SpellFlashCore.FlashTotemRecall(color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -157,6 +193,12 @@ This is used to flash the multiple totem recall button.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
@@ -166,7 +208,7 @@ This is used to flash the multiple totem recall button.
This is used to flash a frame.
-<>SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)<>
+<>SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)<>
===== ** Arguments:
@@ -180,6 +222,12 @@ This is used to flash a frame.
: (number or nil) Percent for the flash brightness or nil for default.
; ** blink
: (boolean) If true will make the action button fade in and out.
+; ** texture
+: (string or number or nil) Path to texture (like: "Interface\\Cooldown\\starburst") or FileDataID (like: 131009) or AtlasID (like: "AftLevelup-WhiteStarBurst") or nil for default. Default: "Interface\\Cooldown\\star4"
+; ** fixedSize
+: (boolean or nil) If true will stop pulse animation. Default: false
+; ** fixedBrightness
+: (boolean or nil) If true will stop flicker animation. Default: false
\\
----
diff --git a/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.lua b/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.lua
index 5e33d2813..87f979ca0 100644
--- a/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.lua
+++ b/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.lua
@@ -1,11 +1,20 @@
-local MinBuild, OverBuild, Build = 80000, 0, select(4, GetBuildInfo())
+local MinBuild, OverBuild, Build = 100000, 0, select(4, GetBuildInfo())
if Build < (MinBuild or 0) or ( (OverBuild or 0) > 0 and Build >= OverBuild ) then return end
local AddonName, a = ...
a.AddonName = AddonName
local AddonTitle = select(2, GetAddOnInfo(AddonName))
local PlainAddonTitle = AddonTitle:gsub("|c........", ""):gsub("|r", "")
local L = a.Localize
-SpellFlashCore = {}
+function a.print(...)
+ print("|cFF0099FF["..PlainAddonTitle.."]|r", ...)
+end
+if SpellFlashCore and not SpellFlashCore.LS then
+ a.print(L["Old uncompletable version of SFC detected, shuttingdown. \r\n Please update other copies of SFC before use."])
+ return
+end
+SpellFlashCore = LibStub:NewLibrary("SpellFlashCore", tonumber("20221031034336") or tonumber(date("%Y%m%d%H%M%S")))
+if not SpellFlashCore then return end
+SpellFlashCore.LS = true
local FrameNames = {}
local ButtonFrames = {}
ButtonFrames.Action = {}
@@ -91,10 +100,6 @@ function SpellFlashCore.CopyTable(Table)
return t
end
-function a.print(...)
- print("|cFF00FFFF["..PlainAddonTitle.."]|r", ...)
-end
-
a.PetActions = {
["Attack"] = "PET_ACTION_ATTACK",
["Follow"] = "PET_ACTION_FOLLOW",
@@ -140,7 +145,7 @@ local function RegisterButtons()
Frames.Macro = a:CreateTable(Frames.Macro, 1)
Frames.Item = a:CreateTable(Frames.Item, 1)
SpellFlashCore.debug("- Button Slots Found:")
- for i = 1, 144 do
+ for i = 1, 180 do
if HasAction(i) then
local Type, ID = GetActionInfo(i)
if Type == "macro" then
@@ -278,7 +283,7 @@ local function FrameScriptCheck(script,tipe)
if script == _G["PetActionButton" .. i]:GetScript("OnClick") then return true end
end
elseif tipe == "Action" then
- local BarNames = {"Action","MultiBarBottomRight","MultiBarBottomLeft","MultiBarRight","MultiBarLeft"}
+ local BarNames = {"Action","MultiBarBottomRight","MultiBarBottomLeft","MultiBarRight","MultiBarLeft","MultiBar5","MultiBar6","MultiBar7"}
for _, BarName in pairs(BarNames) do
for i=1, 12, 1 do
if script == _G[BarName .. "Button" .. i]:GetScript("OnClick") then return true end
@@ -369,14 +374,14 @@ local function FlashFrameOnUpdate(self, elapsed)
if self.show then
self.modifier = self.FlashModifier
self.FlashModifier = self.modifier - self.modifier * TimeSinceLastUpdate
- self.alpha = self.FlashModifier * self.FlashBrightness
+ self.alpha = self.FixedBrightness and self.FlashBrightness or (self.FlashModifier * self.FlashBrightness)
if self.modifier < 0.1 or self.alpha <= 0 then
self.show = false
self:SetAlpha(0)
self:Hide()
else
- self.FlashTexture:SetHeight(self.modifier * self:GetHeight() * self.FlashSize)
- self.FlashTexture:SetWidth(self.modifier * self:GetWidth() * self.FlashSize)
+ self.FlashTexture:SetHeight(self.FixedSize and (self:GetHeight() * self.FlashSize) or (self.modifier * self:GetHeight() * self.FlashSize))
+ self.FlashTexture:SetWidth(self.FixedSize and (self:GetWidth() * self.FlashSize) or (self.modifier * self:GetWidth() * self.FlashSize))
self.FlashTexture:SetAlpha(self.alpha)
end
else
@@ -570,7 +575,7 @@ end
FrameFlashEventFrame:SetScript("OnUpdate", FrameFlashOnUpdate)
FrameFlashEventFrame:Show()
-function SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+function SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
if frame and frame:IsVisible() then
if blink and frame:GetName() and not FrameIsFading(frame) then
FrameFlash(frame, 0, 0.2, 0.2, true, 0, 0)
@@ -580,15 +585,21 @@ function SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
frame[FlashFrameName]:SetAlpha(0)
frame[FlashFrameName]:SetAllPoints(frame)
frame[FlashFrameName].FlashTexture = frame[FlashFrameName]:CreateTexture(nil, "OVERLAY")
- frame[FlashFrameName].FlashTexture:SetTexture("Interface\\Cooldown\\star4")
+ if texture and C_Texture.GetAtlasInfo(texture) then
+ frame[FlashFrameName].FlashTexture:SetAtlas(texture or "AftLevelup-WhiteStarBurst")
+ else
+ frame[FlashFrameName].FlashTexture:SetTexture(texture or "Interface\\Cooldown\\star4")
+ end
frame[FlashFrameName].FlashTexture:SetPoint("CENTER", frame[FlashFrameName], "CENTER")
frame[FlashFrameName].FlashTexture:SetBlendMode("ADD")
frame[FlashFrameName].UpdateInterval = 0.02
frame[FlashFrameName].TimeSinceLastUpdate = 0
frame[FlashFrameName]:SetScript("OnUpdate", FlashFrameOnUpdate)
end
- frame[FlashFrameName].FlashModifier = 1
+ frame[FlashFrameName].FlashModifier = 1
+ frame[FlashFrameName].FixedSize = fixedSize or false
frame[FlashFrameName].FlashSize = (size or 240) / 100
+ frame[FlashFrameName].FixedBrightness = fixedBrightness or false
frame[FlashFrameName].FlashBrightness = (brightness or 100) / 100
frame[FlashFrameName].FlashTexture:SetHeight(frame[FlashFrameName]:GetHeight() * frame[FlashFrameName].FlashSize)
frame[FlashFrameName].FlashTexture:SetWidth(frame[FlashFrameName]:GetWidth() * frame[FlashFrameName].FlashSize)
@@ -613,15 +624,15 @@ function SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
return false
end
-local function FlashActionButton(button, color, size, brightness, blink)
+local function FlashActionButton(button, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
if FRAMESREGISTERED and button then
for frame in pairs(ButtonFrames.Action) do
if frame._state_action then
if frame._state_action == button then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif frame.action == button then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -808,10 +819,10 @@ function SpellFlashCore.ItemFlashable(ItemName, NoMacros)
return SpellFlashCore.Flashable(SpellFlashCore.ItemName(ItemName) or ItemName, NoMacros)
end
-function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros)
+function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)
if type(SpellName) == "table" then
for _, SpellName in ipairs(SpellName) do
- SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros)
+ SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)
end
elseif FRAMESREGISTERED and BUTTONSREGISTERED then
local SpellName, PlainName = SpellName, SpellName
@@ -830,22 +841,22 @@ function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, N
if SpellName then
if Buttons.Spell[SpellName] then
for button in pairs(Buttons.Spell[SpellName]) do
- FlashActionButton(button, color, size, brightness, blink)
+ FlashActionButton(button, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
if Buttons.Item[SpellName] then
for button in pairs(Buttons.Item[SpellName]) do
- FlashActionButton(button, color, size, brightness, blink)
+ FlashActionButton(button, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
if Frames.Spell[SpellName] then
for frame in pairs(Frames.Spell[SpellName]) do
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
if Frames.Item[SpellName] then
for frame in pairs(Frames.Item[SpellName]) do
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
if not NoMacros and type(SpellName) == "string" and ( GetSpellInfo(SpellName) or GetItemCount(SpellName) > 0 ) then
@@ -855,7 +866,7 @@ function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, N
local name, Texture, body = GetMacroInfo(tonumber(ID))
if Texture and ( Texture == SpellTexture or Texture == ItemTexture ) and body and body:lower():find(PlainName:lower(), nil, true) then
for button in pairs(Table) do
- FlashActionButton(button, color, size, brightness, blink)
+ FlashActionButton(button, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -863,7 +874,7 @@ function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, N
local name, Texture, body = GetMacroInfo(tonumber(ID))
if Texture and ( Texture == SpellTexture or Texture == ItemTexture ) and body and body:lower():find(PlainName:lower(), nil, true) then
for frame in pairs(Table) do
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -872,20 +883,20 @@ function SpellFlashCore.FlashAction(SpellName, color, size, brightness, blink, N
end
end
-function SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros)
+function SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)
if type(ItemName) == "table" then
for _, ItemName in ipairs(ItemName) do
- SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros)
+ SpellFlashCore.FlashItem(ItemName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)
end
else
- SpellFlashCore.FlashAction(SpellFlashCore.ItemName(ItemName) or ItemName, color, size, brightness, blink, NoMacros)
+ SpellFlashCore.FlashAction(SpellFlashCore.ItemName(ItemName) or ItemName, color, size, brightness, blink, NoMacros, texture, fixedSize, fixedBrightness)
end
end
-function SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink)
+function SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
if type(SpellName) == "table" then
for _, SpellName in ipairs(SpellName) do
- SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink)
+ SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif FRAMESREGISTERED and UnitInVehicle("player") then
local SpellName = SpellName
@@ -899,19 +910,19 @@ function SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink)
for frame in pairs(ButtonFrames.Vehicle) do
if frame._state_action then
if frame._state_action == i then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif frame.action == i then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
for frame in pairs(ButtonFrames.Action) do
if frame._state_action then
if frame._state_action == i then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif frame.action == i then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -920,10 +931,10 @@ function SpellFlashCore.FlashVehicle(SpellName, color, size, brightness, blink)
end
end
-function SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink)
+function SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
if type(SpellName) == "table" then
for _, SpellName in ipairs(SpellName) do
- SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink)
+ SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif FRAMESREGISTERED then
local SpellName = SpellName
@@ -937,10 +948,10 @@ function SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink)
for frame in pairs(ButtonFrames.Pet) do
if frame.id then
if frame.id == n then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif frame:GetID() == n then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -949,10 +960,10 @@ function SpellFlashCore.FlashPet(SpellName, color, size, brightness, blink)
end
end
-function SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink)
+function SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
if type(SpellName) == "table" then
for _, SpellName in ipairs(SpellName) do
- SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink)
+ SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif FRAMESREGISTERED then
local SpellName = SpellName
@@ -965,10 +976,10 @@ function SpellFlashCore.FlashForm(SpellName, color, size, brightness, blink)
for frame in pairs(ButtonFrames.Form) do
if frame.id then
if frame.id == n then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
elseif frame:GetID() == n then
- SpellFlashCore.FlashFrame(frame, color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(frame, color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
end
@@ -985,9 +996,9 @@ local TotemCallFrames = {
"DominosSpellButton32", -- Dominos
}
-function SpellFlashCore.FlashTotemCall(color, size, brightness, blink)
+function SpellFlashCore.FlashTotemCall(color, size, brightness, blink, texture, fixedSize, fixedBrightness)
for _, frame in ipairs(TotemCallFrames) do
- SpellFlashCore.FlashFrame(_G[frame], color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(_G[frame], color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
@@ -998,9 +1009,9 @@ local TotemRecallFrames = {
"DominosSpellButton33", -- Dominos
}
-function SpellFlashCore.FlashTotemRecall(color, size, brightness, blink)
+function SpellFlashCore.FlashTotemRecall(color, size, brightness, blink, texture, fixedSize, fixedBrightness)
for _, frame in ipairs(TotemRecallFrames) do
- SpellFlashCore.FlashFrame(_G[frame], color, size, brightness, blink)
+ SpellFlashCore.FlashFrame(_G[frame], color, size, brightness, blink, texture, fixedSize, fixedBrightness)
end
end
diff --git a/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.toc b/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.toc
index 24a42e600..05288dbc1 100644
--- a/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.toc
+++ b/Interface/AddOns/Hekili/Libs/SpellFlashCore/SpellFlashCore.toc
@@ -1,5 +1,5 @@
## Interface: 100002
-## Version: 2.3
+## Version: 2.4
## Author: BigRedBrent & LightSpell
## Title: SpellFlashCore
## Notes: This addon contains the button flashing functionality.
diff --git a/Interface/AddOns/Hekili/Libs/SpellFlashCore/libs/BigLibTimer/BigLibTimer.lua b/Interface/AddOns/Hekili/Libs/SpellFlashCore/libs/BigLibTimer/BigLibTimer.lua
index f20fc0494..ac06d2cea 100644
--- a/Interface/AddOns/Hekili/Libs/SpellFlashCore/libs/BigLibTimer/BigLibTimer.lua
+++ b/Interface/AddOns/Hekili/Libs/SpellFlashCore/libs/BigLibTimer/BigLibTimer.lua
@@ -1,6 +1,6 @@
local MajorVersion = "BigLibTimer6"
-local BigLibTimer = LibStub:NewLibrary(MajorVersion, tonumber("20221027150133") or tonumber(date("%Y%m%d%H%M%S")))
+local BigLibTimer = LibStub:NewLibrary(MajorVersion, tonumber("20221031034336") or tonumber(date("%Y%m%d%H%M%S")))
if not BigLibTimer then return end
BigLibTimer.API = BigLibTimer.API or {}
diff --git a/Interface/AddOns/Hekili/Options.lua b/Interface/AddOns/Hekili/Options.lua
index 442eddac3..f83aa3758 100644
--- a/Interface/AddOns/Hekili/Options.lua
+++ b/Interface/AddOns/Hekili/Options.lua
@@ -110,6 +110,14 @@ local oneTimeFixes = {
p.runOnce.forceDeleteBrokenMultiDisplay_20220319 = nil
end,
+
+ forceSpellFlashBrightness_20221030 = function( p )
+ for display, data in pairs( p.displays ) do
+ if data.flash and data.flash.brightness and data.flash.brightness > 100 then
+ data.flash.brightness = 100
+ end
+ end
+ end,
}
@@ -2289,8 +2297,7 @@ do
desc = "Specify the brightness of the SpellFlash glow. The default brightness is |cFFFFD100100|r.",
order = 4,
min = 0,
- softMax = 100,
- max = 200,
+ max = 100,
step = 1,
width = 1.49,
hidden = function () return SF == nil end,
@@ -3464,6 +3471,9 @@ do
end
end
+ if lists.precombat:len() == 0 then lists.precombat = "actions+=/heart_essence,enabled=0" end
+ if lists.default :len() == 0 then lists.default = "actions+=/heart_essence,enabled=0" end
+
local count = 0
local output = {}
@@ -3484,7 +3494,8 @@ do
output[ name ] = import
for i, entry in ipairs( import ) do
- entry.enabled = not ( entry.action == 'heroism' or entry.action == 'bloodlust' )
+ if entry.enabled == nil then entry.enabled = not ( entry.action == 'heroism' or entry.action == 'bloodlust' )
+ elseif entry.enabled == "0" then entry.enabled = false end
end
count = count + 1
@@ -3531,6 +3542,28 @@ local snapshots = {
}
+local config = {
+ qsDisplay = 99999,
+
+ qsShowTypeGroup = false,
+ qsDisplayType = 99999,
+ qsTargetsAOE = 3,
+
+ displays = {}, -- auto-populated and recycled.
+ displayTypes = {
+ [1] = "Primary",
+ [2] = "AOE",
+ [3] = "Automatic",
+ [99999] = " "
+ },
+
+ expanded = {
+ cooldowns = true
+ },
+ adding = {},
+}
+
+
local specs = {}
local activeSpec
@@ -8335,8 +8368,6 @@ do
if not aggregate[v.name] then aggregate[v.name] = {} end
aggregate[v.name].id = v.spell
aggregate[v.name].pvptalent = true
- print( k, v.spell, v.name, v.talent )
- for x,y in pairs( v ) do print( x, y ) end
end
-- append( select( 2, GetSpecializationInfo(GetSpecialization())) .. "\nKey\tID\tIs Aura\tIs Ability\tIs Talent\tIs PvP" )
@@ -8435,7 +8466,7 @@ function Hekili:GenerateProfile()
for k, v in orderedPairs( s.talent ) do
if v.enabled then
- if talents then talents = format( "%s\n %s", talents, k )
+ if talents then talents = format( "%s\n %s = %d/%d", talents, k, v.rank, v.max )
else talents = k end
end
end
@@ -9662,6 +9693,96 @@ do
elseif ( "move" ):match( "^" .. args[1] ) and Hekili.Config then
ns.StopConfiguration()
end
+
+ elseif ("stress" ):match( "^" .. args[1] ) then
+ if InCombatLockdown() then
+ Hekili:Print( "Unable to stress test abilities and auras while in combat." )
+ return
+ end
+
+ local precount = 0
+ for k, v in pairs( self.ErrorDB ) do
+ precount = precount + v.n
+ end
+
+ local results, count, specs = "", 0, {}
+ for i in ipairs( class.specs ) do
+ if i ~= 0 then insert( specs, i ) end
+ end
+ sort( specs )
+
+ for i, specID in ipairs( specs ) do
+ local spec = class.specs[ specID ]
+ results = format( "%sSpecialization: %s\n", results, spec.name )
+
+ for key, aura in ipairs( spec.auras ) do
+ local keyNamed = false
+ -- Avoid duplicates.
+ if aura.key == key then
+ for k, v in pairs( aura ) do
+ if type( v ) == "function" then
+ local ok, val = pcall( v )
+ if not ok then
+ if not keyNamed then results = format( "%s - Aura: %s\n", results, k ); keyNamed = true end
+ results = format( "%s - %s = %s\n", results, tostring( val ) )
+ count = count + 1
+ end
+ end
+ end
+ for k, v in pairs( aura.funcs ) do
+ if type( v ) == "function" then
+ local ok, val = pcall( v )
+ if not ok then
+ if not keyNamed then results = format( "%s - Aura: %s\n", results, k ); keyNamed = true end
+ results = format( "%s - %s = %s\n", results, tostring( val ) )
+ count = count + 1
+ end
+ end
+ end
+ end
+ end
+
+ for key, ability in ipairs( spec.abilities ) do
+ local keyNamed = false
+ -- Avoid duplicates.
+ if ability.key == key then
+ for k, v in pairs( ability ) do
+ if type( v ) == "function" then
+ local ok, val = pcall( v )
+ if not ok then
+ if not keyNamed then results = format( "%s - Ability: %s\n", results, k ); keyNamed = true end
+ results = format( "%s - %s = %s\n", results, tostring( val ) )
+ count = count + 1
+ end
+ end
+ end
+ for k, v in pairs( ability.funcs ) do
+ if type( v ) == "function" then
+ local ok, val = pcall( v )
+ if not ok then
+ if not keyNamed then results = format( "%s - Ability: %s\n", results, k ); keyNamed = true end
+ results = format( "%s - %s = %s\n", results, tostring( val ) )
+ count = count + 1
+ end
+ end
+ end
+ end
+ end
+ end
+
+ local postcount = 0
+ for k, v in pairs( self.ErrorDB ) do
+ postcount = postcount + v.n
+ end
+
+ if count > 0 then
+ Hekili:Print( results )
+ Hekili:Error( results )
+ end
+
+ if postcount > precount then Hekili:Print( "New warnings were loaded in /hekili > Warnings." ) end
+ if count == 0 and postcount == precount then Hekili:Print( "Stress test completed; no issues found." ) end
+
elseif ( "lock" ):match( "^" .. args[1] ) then
if Hekili.Config then
ns.StopConfiguration()
@@ -9895,347 +10016,185 @@ end
-- End Import/Export Strings
--- Begin APL Parsing
-
-local ignore_actions = {
- snapshot_stats = 1,
- flask = 1,
- food = 1,
- augmentation = 1
-}
-
+local Sanitize
-local function Sanitize( segment, i, line, warnings )
- if i == nil then return end
-
- local operators = {
- [">"] = true,
- ["<"] = true,
- ["="] = true,
- ["~"] = true,
- ["+"] = true,
- ["-"] = true,
- ["%%"] = true,
- ["*"] = true
- }
-
- local maths = {
- ['+'] = true,
- ['-'] = true,
- ['*'] = true,
- ['%%'] = true
+-- Begin APL Parsing
+do
+ local ignore_actions = {
+ snapshot_stats = 1,
+ flask = 1,
+ food = 1,
+ augmentation = 1
}
- for token in i:gmatch( "stealthed" ) do
- while( i:find(token) ) do
- local strpos, strend = i:find(token)
-
- local pre = strpos > 1 and i:sub( strpos - 1, strpos - 1 ) or ''
- local post = strend < i:len() and i:sub( strend + 1, strend + 1 ) or ''
- local start = strpos > 1 and i:sub( 1, strpos - 1 ) or ''
- local finish = strend < i:len() and i:sub( strend + 1 ) or ''
-
- if pre ~= '.' and pre ~= '_' and not pre:match('%a') and post ~= '.' and post ~= '_' and not post:match('%a') then
- i = start .. '\a' .. finish
- else
- i = start .. '\v' .. finish
- end
-
- end
-
- i = i:gsub( '\v', token )
- i = i:gsub( '\a', token..'.rogue' )
- end
-
- for token in i:gmatch( "cooldown" ) do
- while( i:find(token) ) do
- local strpos, strend = i:find(token)
-
- local pre = strpos > 1 and i:sub( strpos - 1, strpos - 1 ) or ''
- local post = strend < i:len() and i:sub( strend + 1, strend + 1 ) or ''
- local start = strpos > 1 and i:sub( 1, strpos - 1 ) or ''
- local finish = strend < i:len() and i:sub( strend + 1 ) or ''
-
- if pre ~= '.' and pre ~= '_' and not pre:match('%a') and post ~= '.' and post ~= '_' and not post:match('%a') then
- i = start .. '\a' .. finish
- else
- i = start .. '\v' .. finish
+ local expressions = {
+ { "stealthed" , "stealthed.rogue" },
+ { "cooldown" , "action_cooldown" },
+ { "covenant%.([%w_]+)%.enabled" , "covenant.%1" },
+ { "talent%.([%w_]+)" , "talent.%1.enabled" },
+ { "legendary%.([%w_]+)" , "legendary.%1.enabled" },
+ { "runeforge%.([%w_]+)" , "runeforge.%1.enabled" },
+ { "rune_word%.([%w_]+)" , "buff.rune_word_%1.up" },
+ { "rune_word%.([%w_]+)%.enabled" , "buff.rune_word_%1.up" },
+ { "conduit%.([%w_]+)" , "conduit.%1.enabled" },
+ { "soulbind%.([%w_]+)" , "soulbind.%1.enabled" },
+ { "pet.([%w_]+)%.([%w_]+)%.([%w%._]+)" , "%3" },
+ { "essence%.([%w_]+).rank(%d)" , "essence.%1.rank>=%2" },
+ { "target%.1%.time_to_die" , "time_to_die" },
+ { "time_to_pct_(%d+)%.remains" , "time_to_pct_%1" },
+ { "trinket%.(%d)%.([%w%._]+)" , "trinket.t%1.%2" },
+ { "trinket%.([%w_]+)%.cooldown" , "trinket.%1.cooldown.duration" },
+ { "trinket%.([%w_]+)%.cooldown.([%w_]+)" , "trinket.%1.cooldown.%2" },
+ { "trinket%.([%w_]+)%.proc%.([%w_]+)%.duration" , "trinket.%1.buff_duration" },
+ { "trinket%.([%w_]+)%.proc%.([%w_]+)%.[%w_]+" , "trinket.%1.has_use_buff" },
+ { "trinket%.([%w_]+)%.has_buff%.([%w_]+)" , "trinket.%1.has_use_buff" },
+ { "min:([%w_]+)" , "%1" },
+ { "position_back" , "true" },
+ { "max:(%w_]+)" , "%1" },
+ { "incanters_flow_time_to%.(%d+)" , "incanters_flow_time_to_%.%1.any" },
+ { "exsanguinated%.([%w_]+)" , "debuff.%1.exsanguinated" },
+ { "time_to_sht%.(%d+)%.plus" , "time_to_sht_plus.%1" },
+ { "target" , "target.unit" },
+ { "player" , "player.unit" },
+
+ { "equipped%.(%d+)", nil, function( item )
+ item = tonumber( item )
+
+ if not item then return "equipped.none" end
+
+ if class.abilities[ item ] then
+ return "equipped." .. ( class.abilities[ item ].key or "none" )
end
- end
-
- i = i:gsub( '\v', token )
- i = i:gsub( '\a', 'action_cooldown' )
- end
-
- for token in i:gmatch( "equipped%.[0-9]+" ) do
- local itemID = tonumber( token:match( "([0-9]+)" ) )
- local itemName = GetItemInfo( itemID )
- local itemKey = formatKey( itemName )
-
- if itemKey and itemKey ~= '' then
- i = i:gsub( tostring( itemID ), itemKey )
- end
-
- end
-
- local times = 0
-
- i, times = i:gsub( "==", "=" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Corrected equality check from '==' to '=' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "([^%%])[ ]*%%[ ]*([^%%])", "%1 / %2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted SimC syntax % to Lua division operator (/) (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "%%%%", "%%" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted SimC syntax %% to Lua modulus operator (%) (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "covenant%.([%w_]+)%.enabled", "covenant.%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'covenant.X.enabled' to 'covenant.X' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "talent%.([%w_]+)([%+%-%*%%/%&%|= ()<>])", "talent.%1.enabled%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'talent.X' to 'talent.X.enabled' (" .. times .. "x)." )
- end
- i, times = i:gsub( "talent%.([%w_]+)$", "talent.%1.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'talent.X' to 'talent.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "legendary%.([%w_]+)([%+%-%*%%/%&%|= ()<>])", "legendary.%1.enabled%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'legendary.X' to 'legendary.X.enabled' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "legendary%.([%w_]+)$", "legendary.%1.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'legendary.X' to 'legendary.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "([^%.])runeforge%.([%w_]+)([%+%-%*%%/=%&%| ()<>])", "%1runeforge.%2.enabled%3" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'runeforge.X' to 'runeforge.X.enabled' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "([^%.])runeforge%.([%w_]+)$", "%1runeforge.%2.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'runeforge.X' to 'runeforge.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "^runeforge%.([%w_]+)([%+%-%*%%/%&%|= ()<>)])", "runeforge.%1.enabled%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'runeforge.X' to 'runeforge.X.enabled' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "^runeforge%.([%w_]+)$", "runeforge.%1.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'runeforge.X' to 'runeforge.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "rune_word%.([%w_]+)([%+%-%*%%/%&%|= ()<>])", "buff.rune_word_%1.up%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'rune_word.X' to 'buff.rune_word_X.up' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "rune_word%.([%w_]+)$", "buff.rune_word_%1.up" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'rune_word.X' to 'buff.rune_word_X.up' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "rune_word%.([%w_]+)%.enabled([%+%-%*%%/%&%|= ()<>])", "buff.rune_word_%1.up%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'rune_word.X.enabled' to 'buff.rune_word_X.up' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "rune_word%.([%w_]+)%.enabled$", "buff.rune_word_%1.up" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'rune_word.X.enabled' to 'buff.rune_word_X.up' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "([^a-z0-9_])conduit%.([%w_]+)([%+%-%*%%/&|= ()<>)])", "%1conduit.%2.enabled%3" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'conduit.X' to 'conduit.X.enabled' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "([^a-z0-9_])conduit%.([%w_]+)$", "%1conduit.%2.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'conduit.X' to 'conduit.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "soulbind%.([%w_]+)([%+%-%*%%/&|= ()<>)])", "soulbind.%1.enabled%2" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'soulbind.X' to 'soulbind.X.enabled' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "soulbind%.([%w_]+)$", "soulbind.%1.enabled" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'soulbind.X' to 'soulbind.X.enabled' at EOL (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "pet%.[%w_]+%.([%w_]+)%.", "%1." )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'pet.X.Y...' to 'Y...' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "(essence%.[%w_]+)%.([%w_]+)%.rank(%d)", "(%1.%2&%1.rank>=%3)" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'essence.X.[major|minor].rank#' to '(essence.X.[major|minor]&essence.X.rank>=#)' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "pet%.[%w_]+%.[%w_]+%.([%w_]+)%.", "%1." )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'pet.X.Y.Z...' to 'Z...' (" .. times .. "x)." )
- end
-
- -- target.1.time_to_die is basically the end of an encounter.
- i, times = i:gsub( "target%.1%.time_to_die", "time_to_die" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'target.1.time_to_die' to 'time_to_die' (" .. times .."x)." )
- end
-
- -- target.time_to_pct_XX.remains is redundant, Monks.
- i, times = i:gsub( "time_to_pct_(%d+)%.remains", "time_to_pct_%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'time_to_pct_XX.remains' to 'time_to_pct_XX' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "trinket%.1%.", "trinket.t1." )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'trinket.1.X' to 'trinket.t1.X' (" .. times .. "x)." )
- end
-
- i, times = i:gsub( "trinket%.2%.", "trinket.t2." )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'trinket.2.X' to 'trinket.t2.X' (" .. times .. "x)." )
- end
+ return "equipped[" .. item .. "]"
+ end },
+ }
- i, times = i:gsub( "trinket%.([%w_][%w_][%w_]+)%.cooldown", "cooldown.%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'trinket.abc.cooldown' to 'cooldown.abc' (" .. times .. "x)." )
- end
+ local operations = {
+ { "==" , "=" },
+ { "%%%%", "//" },
+ { "%%" , "/" },
+ { "//" , "%%" },
+ -- { "%%", "/" },
+ -- { "//", "%" },
+ }
- i, times = i:gsub( "%.(proc%.any)%.", ".has_buff." )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'proc.any' to 'has_buff' (" .. times .. "x)." )
- end
- i, times = i:gsub( "min:[a-z0-9_%.]+(,?$?)", "%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Removed min:X check (not available in emulation) (" .. times .. "x)." )
+ function Hekili:AddSanitizeExpr( from, to, func )
+ insert( expressions, { from, to, func } )
end
- i, times = i:gsub( "([%|%&]position_back)", "" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Removed position_back check (not available in emulation) (" .. times .. "x)." )
+ function Hekili:AddSanitizeOper( from, to )
+ insert( operations, { from, to } )
end
- i, times = i:gsub( "(position_back[%|%&]?)", "" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Removed position_back check (not available in emulation) (" .. times .. "x)." )
- end
+ Sanitize = function( segment, i, line, warnings )
+ if i == nil then return end
- i, times = i:gsub( "max:[a-z0-9_%.]+(,?$?)", "%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Removed max:X check (not available in emulation) (" .. times .. "x)." )
- end
+ local operators = {
+ [">"] = true,
+ ["<"] = true,
+ ["="] = true,
+ ["~"] = true,
+ ["+"] = true,
+ ["-"] = true,
+ ["%%"] = true,
+ ["*"] = true
+ }
- i, times = i:gsub( "(incanters_flow_time_to%.%d+)(^%.)", "%1.any%2")
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted directionless 'incanters_flow_time_to.X' to 'incanters_flow_time_to.X.any' (" .. times .. "x)." )
- end
+ local maths = {
+ ['+'] = true,
+ ['-'] = true,
+ ['*'] = true,
+ ['%%'] = true
+ }
- i, times = i:gsub( "exsanguinated%.([a-z0-9_]+)", "debuff.%1.exsanguinated" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'exsanguinated.X' to 'debuff.X.exsanguinated' (" .. times .. "x).")
- end
+ local times, orig = 0
+ local output = ""
- i, times = i:gsub( "time_to_sht%.(%d+)%.plus", "time_to_sht_plus.%1" )
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted 'time_to_sht.X.plus' to 'time_to_sht_plus.X' (" .. times .. "x).")
- end
+ local dbg = "Start: " .. i .. "\n"
- if segment == 'c' then
- for token in i:gmatch( "target" ) do
- local times = 0
- while (i:find(token)) do
- local strpos, strend = i:find(token)
+ for op1, token, op2 in gmatch( i, "([^%w%._ ]*)([%w%._]+)([^%w%._ ]*)" ) do
+ dbg = dbg .. "Matches: " .. ( op1 or "nil" ) .. " / " .. ( token or "nil" ) .. " / " .. ( op2 or "nil" ) .. "\n"
+ local pre
- local pre = i:sub( strpos - 1, strpos - 1 )
- local post = i:sub( strend + 1, strend + 1 )
+ if op1 and op1:len() > 0 then
+ pre = op1
+ for _, subs in ipairs( operations ) do
+ op1, times = op1:gsub( subs[1], subs[2] )
- if pre ~= '_' and post ~= '.' then
- i = i:sub( 1, strpos - 1 ) .. '\v.unit' .. i:sub( strend + 1 )
- times = times + 1
- else
- i = i:sub( 1, strpos - 1 ) .. '\v' .. i:sub( strend + 1 )
+ if times > 0 then
+ insert( warnings, "Line " .. line .. ": Converted '" .. pre .. "' to '" .. op1 .. "' (" ..times .. "x)." )
+ end
end
end
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted non-specific 'target' to 'target.unit' (" .. times .. "x)." )
+ if token and token:len() > 0 then
+ pre = token
+ for _, subs in ipairs( expressions ) do
+ if subs[2] then
+ times = 0
+ local s1, s2, s3, s4, s5 = token:match( "^" .. subs[1] .. "$" )
+ if s1 then
+ token = subs[2]
+ token, times = token:gsub( "%%1", s1 )
+
+ if s2 then token = token:gsub( "%%2", s2 ) end
+ if s3 then token = token:gsub( "%%3", s3 ) end
+ if s4 then token = token:gsub( "%%4", s4 ) end
+ if s5 then token = token:gsub( "%%5", s5 ) end
+
+ if times > 0 then
+ insert( warnings, "Line " .. line .. ": Converted '" .. pre .. "' to '" .. token .. "' (" ..times .. "x)." )
+ end
+ end
+ elseif subs[3] then
+ local val = token:match( "^" .. subs[1] .. "$" )
+ if val ~= nil then
+ token = subs[3]( val )
+ insert( warnings, "Line " .. line .. ":Converted '" .. pre .. "' to '" .. token .. "'." )
+ end
+ end
+ end
end
- i = i:gsub( '\v', token )
- end
- end
-
-
- for token in i:gmatch( "player" ) do
- local times = 0
- while (i:find(token)) do
- local strpos, strend = i:find(token)
- local pre = i:sub( strpos - 1, strpos - 1 )
- local post = i:sub( strend + 1, strend + 1 )
-
- if pre ~= '_' and post ~= '.' then
- i = i:sub( 1, strpos - 1 ) .. '\v.unit' .. i:sub( strend + 1 )
- times = times + 1
- else
- i = i:sub( 1, strpos - 1 ) .. '\v' .. i:sub( strend + 1 )
+ if op2 and op2:len() > 0 then
+ pre = op2
+ for _, subs in ipairs( operations ) do
+ op2, times = op2:gsub( subs[1], subs[2] )
+ if times > 0 then
+ insert( warnings, "Line " .. line .. ": Converted '" .. pre .. "' to '" .. op2 .. "' (" ..times .. "x)." )
+ end
+ end
end
- end
- if times > 0 then
- insert( warnings, "Line " .. line .. ": Converted non-specific 'player' to 'player.unit' (" .. times .. "x)." )
+ output = output .. ( op1 or "" ) .. ( token or "" ) .. ( op2 or "" )
end
- i = i:gsub( '\v', token )
- end
- return i
-end
+ return output
+ end
+ local function strsplit( str, delimiter )
+ local result = {}
+ local from = 1
-local function strsplit( str, delimiter )
- local result = {}
- local from = 1
+ if not delimiter or delimiter == "" then
+ result[1] = str
+ return result
+ end
- if not delimiter or delimiter == "" then
- result[1] = str
- return result
- end
+ local delim_from, delim_to = string.find( str, delimiter, from )
- local delim_from, delim_to = string.find( str, delimiter, from )
+ while delim_from do
+ insert( result, string.sub( str, from, delim_from - 1 ) )
+ from = delim_to + 1
+ delim_from, delim_to = string.find( str, delimiter, from )
+ end
- while delim_from do
- insert( result, string.sub( str, from, delim_from - 1 ) )
- from = delim_to + 1
- delim_from, delim_to = string.find( str, delimiter, from )
+ insert( result, string.sub( str, from ) )
+ return result
end
- insert( result, string.sub( str, from ) )
- return result
-end
-
-
-do
local parseData = {
warnings = {},
missing = {},
@@ -10251,7 +10210,6 @@ do
}
function Hekili:ParseActionList( list )
-
local line, times = 0, 0
local output, warnings, missing = {}, parseData.warnings, parseData.missing
@@ -10275,6 +10233,7 @@ do
end
end
+ -- TODO: Revise to start from beginning of string.
for i in list:gmatch( "action.-=/?([^\n^$]*)") do
line = line + 1
diff --git a/Interface/AddOns/Hekili/Shadowlands/Covenants.lua b/Interface/AddOns/Hekili/Shadowlands/Covenants.lua
index b7ca4f58b..d94bb48b9 100644
--- a/Interface/AddOns/Hekili/Shadowlands/Covenants.lua
+++ b/Interface/AddOns/Hekili/Shadowlands/Covenants.lua
@@ -321,12 +321,12 @@ if baseClass == "DEATHKNIGHT" then
id = 324128,
cast = 0,
charges = function ()
- if not pvptalent.deaths_echo.enabled then return end
+ if not talent.deaths_echo.enabled then return end
return 2
end,
cooldown = 15,
recharge = function ()
- if not pvptalent.deaths_echo.enabled then return end
+ if not talent.deaths_echo.enabled then return end
return 15
end,
gcd = "spell",
@@ -564,6 +564,10 @@ elseif baseClass == "DEMONHUNTER" then
}
} )
elseif baseClass == "DRUID" then
+ local SinfulHysteriaHandler = setfenv( function ()
+ applyBuff( "ravenous_frenzy_sinful_hysteria" )
+ end, state )
+
all:RegisterAbilities( {
kindred_spirits = {
id = 326434,
diff --git a/Interface/AddOns/Hekili/State.lua b/Interface/AddOns/Hekili/State.lua
index 0d5532fa4..2b5352b47 100644
--- a/Interface/AddOns/Hekili/State.lua
+++ b/Interface/AddOns/Hekili/State.lua
@@ -915,9 +915,7 @@ local function applyBuff( aura, duration, stacks, value, v2, v3, applied )
end
end
- if aura == "heroism" or aura == "time_warp" or aura == "ancient_hysteria" then
- applyBuff( "bloodlust", duration, stacks, value )
- elseif aura ~= "potion" and class.auras.potion and class.auras[ aura ].id == class.auras.potion.id then
+ if aura ~= "potion" and class.auras.potion and class.auras[ aura ].id == class.auras.potion.id then
applyBuff( "potion", duration, stacks, value )
end
end
@@ -2158,7 +2156,7 @@ do
local aura_name = ability and ability.aura or t.this_action
local aura = aura_name and class.auras[ aura_name ]
- local app = aura and ( ( t.buff[ aura_name ].up and t.buff[ aura_name ] ) or ( t.debuff[ aura_name ].up and t.debuff[ aura_name ] ) )
+ local app = aura and ( ( t.buff[ aura_name ].up and t.buff[ aura_name ] ) or ( t.debuff[ aura_name ].up and t.debuff[ aura_name ] ) or t.buff[ aura_name ] )
if not app then
if ability and ability.startsCombat then
@@ -2872,10 +2870,6 @@ do
end
- elseif not state:IsKnown( t.id ) then
- start = state.now
- duration = 0
-
end
t.duration = max( duration or 0, ability.cooldown or 0, ability.recharge or 0 )
@@ -2919,11 +2913,8 @@ do
elseif k == "charges" then
if not raw then
- if not state:IsKnown( t.key ) then
- return ability.charges or 1
- elseif ( state:IsDisabled( t.key ) or ability.disabled ) then
- return 0
- end
+ if ( state:IsDisabled( t.key ) or ability.disabled ) then return 0 end
+ if not state:IsKnown( t.key ) then return ability.charges or 1 end
end
return floor( t.charges_fractional )
@@ -2936,11 +2927,8 @@ do
elseif k == "time_to_max_charges" or k == "full_recharge_time" then
if not raw then
- if not state:IsKnown( t.key ) then
- return 0
- elseif ( state:IsDisabled( t.key ) or ability.disabled ) then
- return ( ability.charges or 1 ) * t.duration
- end
+ if ( state:IsDisabled( t.key ) or ability.disabled ) then return ( ability.charges or 1 ) * t.duration end
+ if not state:IsKnown( t.key ) then return 0 end
end
return ( ( ability.charges or 1 ) - ( raw and t.true_charges_fractional or t.charges_fractional ) ) * max( ability.cooldown, t.true_duration )
@@ -2953,8 +2941,8 @@ do
-- If the ability is toggled off in the profile, we may want to fake its CD.
-- Revisit this if I add base_cooldown to the ability tables.
if not raw then
- if not state:IsKnown( t.key ) then return 0
- elseif ( state:IsDisabled( t.key ) or ability.disabled ) then return ability.cooldown end
+ if ( state:IsDisabled( t.key ) or ability.disabled ) then return ability.cooldown end
+ if not state:IsKnown( t.key ) then return 0 end
end
local bonus_cdr = 0
@@ -2964,8 +2952,8 @@ do
elseif k == "charges_fractional" then
if not raw then
- if not state:IsKnown( t.key ) then return ability.charges or 1
- elseif state:IsDisabled( t.key ) or ability.disabled then return 0 end
+ if state:IsDisabled( t.key ) or ability.disabled then return 0 end
+ if not state:IsKnown( t.key ) then return ability.charges or 1 end
end
if ability.charges and ability.charges > 1 then
@@ -3790,7 +3778,7 @@ do
if not aura then
if Hekili.PLAYER_ENTERING_WORLD and not buffs_warned[ k ] then
- Hekili:Error( "Unknown buff: " .. k .. " [" .. state.scriptID .. "]\n\n" .. debugstack() )
+ Hekili:Error( "Unknown buff in [" .. state.scriptID .. "]: " .. k .. "\n\n" .. debugstack() )
buffs_warned[ k ] = true
end
return unknown_buff
@@ -4771,7 +4759,7 @@ do
else
if Hekili.PLAYER_ENTERING_WORLD and not debuffs_warned[ k ] then
- Hekili:Error( "Unknown debuff: " .. k )
+ Hekili:Error( "Unknown debuff in [" .. ( state.scriptID or "unknown" ) .. "]: " .. k .. "\n\n" .. debugstack() )
debuffs_warned[ k ] = true
end
@@ -6671,7 +6659,7 @@ do
end
-function state:IsKnown( sID, notoggle )
+function state:IsKnown( sID )
local original = sID
if type(sID) ~= "number" then sID = class.abilities[ sID ] and class.abilities[ sID ].id or nil end
diff --git a/Interface/AddOns/Immersion/CHANGELOG.md b/Interface/AddOns/Immersion/CHANGELOG.md
index 062233c6a..425a84ea9 100644
--- a/Interface/AddOns/Immersion/CHANGELOG.md
+++ b/Interface/AddOns/Immersion/CHANGELOG.md
@@ -1,6 +1,7 @@
# Immersion
-## [1.4.11](https://github.com/seblindfors/Immersion/tree/1.4.11) (2022-10-28)
-[Full Changelog](https://github.com/seblindfors/Immersion/compare/1.4.10...1.4.11) [Previous Releases](https://github.com/seblindfors/Immersion/releases)
+## [1.4.13](https://github.com/seblindfors/Immersion/tree/1.4.13) (2022-10-30)
+[Full Changelog](https://github.com/seblindfors/Immersion/compare/1.4.12...1.4.13) [Previous Releases](https://github.com/seblindfors/Immersion/releases)
-- Fix friendship and reputation bar on retail
+- Fix reputation bar breaking WotLK version
+- Fix frame levels on title buttons
diff --git a/Interface/AddOns/Immersion/Mixins/Button.lua b/Interface/AddOns/Immersion/Components/Button.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Button.lua
rename to Interface/AddOns/Immersion/Components/Button.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Elements.lua b/Interface/AddOns/Immersion/Components/Elements.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Elements.lua
rename to Interface/AddOns/Immersion/Components/Elements.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Model.lua b/Interface/AddOns/Immersion/Components/Model.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Model.lua
rename to Interface/AddOns/Immersion/Components/Model.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Scaler.lua b/Interface/AddOns/Immersion/Components/Scaler.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Scaler.lua
rename to Interface/AddOns/Immersion/Components/Scaler.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Text.lua b/Interface/AddOns/Immersion/Components/Text.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Text.lua
rename to Interface/AddOns/Immersion/Components/Text.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Titles.lua b/Interface/AddOns/Immersion/Components/Titles.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Titles.lua
rename to Interface/AddOns/Immersion/Components/Titles.lua
diff --git a/Interface/AddOns/Immersion/Mixins/Tooltip.lua b/Interface/AddOns/Immersion/Components/Tooltip.lua
similarity index 100%
rename from Interface/AddOns/Immersion/Mixins/Tooltip.lua
rename to Interface/AddOns/Immersion/Components/Tooltip.lua
diff --git a/Interface/AddOns/Immersion/Display/Frame.xml b/Interface/AddOns/Immersion/Display/Frame.xml
index 3e937edad..6cd9a1ce5 100644
--- a/Interface/AddOns/Immersion/Display/Frame.xml
+++ b/Interface/AddOns/Immersion/Display/Frame.xml
@@ -202,8 +202,8 @@
-
-
+
+
diff --git a/Interface/AddOns/Immersion/Display/Onload.lua b/Interface/AddOns/Immersion/Display/Onload.lua
index cd34f1543..c7d7b0e26 100644
--- a/Interface/AddOns/Immersion/Display/Onload.lua
+++ b/Interface/AddOns/Immersion/Display/Onload.lua
@@ -203,6 +203,9 @@ L.Mixin(elements, L.ElementsMixin)
----------------------------------
L.Mixin(talkbox.ReputationBar, NPCFriendshipStatusBarMixin or {})
talkbox.ReputationBar.Update = talkbox.ReputationBar.Update or nop;
+if talkbox.ReputationBar.SetColorFill then
+ talkbox.ReputationBar:SetColorFill(1, 1, 1)
+end
----------------------------------
-- Set up dynamically sized frames
diff --git a/Interface/AddOns/Immersion/Immersion.toc b/Interface/AddOns/Immersion/Immersion.toc
index 943e0903c..c3f2383c9 100644
--- a/Interface/AddOns/Immersion/Immersion.toc
+++ b/Interface/AddOns/Immersion/Immersion.toc
@@ -1,7 +1,7 @@
## Interface: 100000
## Title: Immersion
## Notes: Immersive replacement for quest & gossip
-## Version: 1.4.11
+## Version: 1.4.13
## Author: Sebastian Lindfors
## X-Website: https://github.com/seblindfors/Immersion
@@ -29,14 +29,14 @@ Interface.lua
Utils.lua
Config.lua
-# Mixins
-Mixins\Scaler.lua
-Mixins\Titles.lua
-Mixins\Text.lua
-Mixins\Model.lua
-Mixins\Button.lua
-Mixins\Tooltip.lua
-Mixins\Elements.lua
+# Components
+Components\Scaler.lua
+Components\Titles.lua
+Components\Text.lua
+Components\Model.lua
+Components\Button.lua
+Components\Tooltip.lua
+Components\Elements.lua
# Display
Display\Animation.lua
@@ -45,7 +45,9 @@ Display\Onload.lua
Display\Fademgr.lua
# Logic
-Logic\Logic.lua
+Logic\Input.lua
+Logic\Frame.lua
+Logic\Talkbox.lua
Logic\Events.lua
Logic\Inspector.lua
Logic\Controller.lua
diff --git a/Interface/AddOns/Immersion/Immersion_TBC.toc b/Interface/AddOns/Immersion/Immersion_TBC.toc
index 83c7f99d6..37feb608e 100644
--- a/Interface/AddOns/Immersion/Immersion_TBC.toc
+++ b/Interface/AddOns/Immersion/Immersion_TBC.toc
@@ -1,7 +1,7 @@
## Interface: 20504
## Title: Immersion
## Notes: Immersive replacement for quest & gossip
-## Version: 1.4.11
+## Version: 1.4.13
## Author: Sebastian Lindfors
## X-Website: https://github.com/seblindfors/Immersion
@@ -29,14 +29,14 @@ Interface.lua
Utils.lua
Config.lua
-# Mixins
-Mixins\Scaler.lua
-Mixins\Titles.lua
-Mixins\Text.lua
-Mixins\Model.lua
-Mixins\Button.lua
-Mixins\Tooltip.lua
-Mixins\Elements.lua
+# Components
+Components\Scaler.lua
+Components\Titles.lua
+Components\Text.lua
+Components\Model.lua
+Components\Button.lua
+Components\Tooltip.lua
+Components\Elements.lua
# Display
Display\Animation.lua
@@ -45,7 +45,9 @@ Display\Onload.lua
Display\Fademgr.lua
# Logic
-Logic\Logic.lua
+Logic\Input.lua
+Logic\Frame.lua
+Logic\Talkbox.lua
Logic\Events.lua
Logic\Inspector.lua
Logic\Controller.lua
diff --git a/Interface/AddOns/Immersion/Immersion_Vanilla.toc b/Interface/AddOns/Immersion/Immersion_Vanilla.toc
index 19ed8b53a..8637fde9d 100644
--- a/Interface/AddOns/Immersion/Immersion_Vanilla.toc
+++ b/Interface/AddOns/Immersion/Immersion_Vanilla.toc
@@ -1,7 +1,7 @@
## Interface: 11402
## Title: Immersion
## Notes: Immersive replacement for quest & gossip
-## Version: 1.4.11
+## Version: 1.4.13
## Author: Sebastian Lindfors
## X-Website: https://github.com/seblindfors/Immersion
@@ -29,14 +29,14 @@ Interface.lua
Utils.lua
Config.lua
-# Mixins
-Mixins\Scaler.lua
-Mixins\Titles.lua
-Mixins\Text.lua
-Mixins\Model.lua
-Mixins\Button.lua
-Mixins\Tooltip.lua
-Mixins\Elements.lua
+# Components
+Components\Scaler.lua
+Components\Titles.lua
+Components\Text.lua
+Components\Model.lua
+Components\Button.lua
+Components\Tooltip.lua
+Components\Elements.lua
# Display
Display\Animation.lua
@@ -45,7 +45,9 @@ Display\Onload.lua
Display\Fademgr.lua
# Logic
-Logic\Logic.lua
+Logic\Input.lua
+Logic\Frame.lua
+Logic\Talkbox.lua
Logic\Events.lua
Logic\Inspector.lua
Logic\Controller.lua
diff --git a/Interface/AddOns/Immersion/Immersion_Wrath.toc b/Interface/AddOns/Immersion/Immersion_Wrath.toc
index 36b0dbd6a..601276905 100644
--- a/Interface/AddOns/Immersion/Immersion_Wrath.toc
+++ b/Interface/AddOns/Immersion/Immersion_Wrath.toc
@@ -1,7 +1,7 @@
## Interface: 30400
## Title: Immersion
## Notes: Immersive replacement for quest & gossip
-## Version: 1.4.11
+## Version: 1.4.13
## Author: Sebastian Lindfors
## X-Website: https://github.com/seblindfors/Immersion
@@ -29,14 +29,14 @@ Interface.lua
Utils.lua
Config.lua
-# Mixins
-Mixins\Scaler.lua
-Mixins\Titles.lua
-Mixins\Text.lua
-Mixins\Model.lua
-Mixins\Button.lua
-Mixins\Tooltip.lua
-Mixins\Elements.lua
+# Components
+Components\Scaler.lua
+Components\Titles.lua
+Components\Text.lua
+Components\Model.lua
+Components\Button.lua
+Components\Tooltip.lua
+Components\Elements.lua
# Display
Display\Animation.lua
@@ -45,7 +45,9 @@ Display\Onload.lua
Display\Fademgr.lua
# Logic
-Logic\Logic.lua
+Logic\Input.lua
+Logic\Frame.lua
+Logic\Talkbox.lua
Logic\Events.lua
Logic\Inspector.lua
Logic\Controller.lua
diff --git a/Interface/AddOns/Immersion/Logic/Events.lua b/Interface/AddOns/Immersion/Logic/Events.lua
index d21941df6..c699f0919 100644
--- a/Interface/AddOns/Immersion/Logic/Events.lua
+++ b/Interface/AddOns/Immersion/Logic/Events.lua
@@ -1,24 +1,24 @@
local _, L = ...
-local NPC, API = L.frame, ImmersionAPI
+local Events, API = L.frame, ImmersionAPI
----------------------------------
-- Events
----------------------------------
-function NPC:GOSSIP_SHOW(customGossipHandler)
+function Events:GOSSIP_SHOW(customGossipHandler)
self:HandleGossipOpenEvent(customGossipHandler)
end
-function NPC:GOSSIP_CLOSED(...)
+function Events:GOSSIP_CLOSED(...)
API:CloseGossip(true, ...)
self:PlayOutro()
L.ClickedTitleCache = nil
end
-function NPC:QUEST_GREETING(...)
+function Events:QUEST_GREETING(...)
self:PlayIntro('QUEST_GREETING')
self:UpdateTalkingHead(API:GetUnitName('questnpc') or API:GetUnitName('npc'), API:GetGreetingText(), 'AvailableQuest')
end
-function NPC:QUEST_PROGRESS(...) -- special case, doesn't use QuestInfo
+function Events:QUEST_PROGRESS(...) -- special case, doesn't use QuestInfo
self:PlayIntro('QUEST_PROGRESS')
self:AddHint('CROSS', CONTINUE)
self:ToggleHintState('CROSS', API:IsQuestCompletable())
@@ -35,14 +35,14 @@ function NPC:QUEST_PROGRESS(...) -- special case, doesn't use QuestInfo
self:ResetElements()
end
-function NPC:QUEST_COMPLETE(...)
+function Events:QUEST_COMPLETE(...)
self:PlayIntro('QUEST_COMPLETE')
self:UpdateTalkingHead(API:GetTitleText(), API:GetRewardText(), 'ActiveQuest')
self:AddQuestInfo('QUEST_REWARD')
self:AddHint('CROSS', COMPLETE_QUEST)
end
-function NPC:QUEST_FINISHED(...)
+function Events:QUEST_FINISHED(...)
API:CloseQuest(true)
self:PlayOutro()
-- if self:IsGossipAvailable(true) then
@@ -51,7 +51,7 @@ function NPC:QUEST_FINISHED(...)
-- end
end
-function NPC:QUEST_DETAIL(...)
+function Events:QUEST_DETAIL(...)
if self:IsQuestAutoAccepted(...) then
self:PlayOutro()
return
@@ -63,7 +63,7 @@ function NPC:QUEST_DETAIL(...)
end
-function NPC:QUEST_ITEM_UPDATE()
+function Events:QUEST_ITEM_UPDATE()
local questEvent = (self.lastEvent ~= 'QUEST_ITEM_UPDATE') and self.lastEvent or self.questEvent
self.questEvent = questEvent
@@ -73,7 +73,7 @@ function NPC:QUEST_ITEM_UPDATE()
end
end
-function NPC:ITEM_TEXT_BEGIN()
+function Events:ITEM_TEXT_BEGIN()
local title = ItemTextGetItem()
local creator = ItemTextGetCreator()
if creator then
@@ -85,7 +85,7 @@ function NPC:ITEM_TEXT_BEGIN()
self:UpdateTalkingHead(title, '', 'TrainerGossip', 'player')
end
-function NPC:ITEM_TEXT_READY()
+function Events:ITEM_TEXT_READY()
-- special case: pages need to be concatened together before displaying them.
-- each new page re-triggers this event, so keep changing page until we run out.
self.itemText = (self.itemText or '') .. '\n' .. (ItemTextGetText() or '')
@@ -98,7 +98,7 @@ function NPC:ITEM_TEXT_READY()
end
-function NPC:ITEM_TEXT_CLOSED()
+function Events:ITEM_TEXT_CLOSED()
local time = GetTime()
if not self.readEmoteCancelled and ( self.lastTextClosed ~= time ) then
DoEmote('read')
@@ -110,28 +110,28 @@ function NPC:ITEM_TEXT_CLOSED()
self:PlayOutro()
end
-function NPC:PLAYER_STARTED_MOVING()
+function Events:PLAYER_STARTED_MOVING()
self.readEmoteCancelled = true
return 'ITEM_TEXT_READY'
end
-function NPC:NAME_PLATE_UNIT_ADDED()
+function Events:NAME_PLATE_UNIT_ADDED()
self.TalkBox:UpdateNameplateAnchor()
return self.lastEvent
end
-function NPC:NAME_PLATE_UNIT_REMOVED()
+function Events:NAME_PLATE_UNIT_REMOVED()
self.TalkBox:UpdateNameplateAnchor()
return self.lastEvent
end
-function NPC:SUPER_TRACKING_CHANGED()
+function Events:SUPER_TRACKING_CHANGED()
self:PlaySuperTrackedQuestToast(ImmersionAPI:GetSuperTrackedQuestID())
return self.lastEvent
end
-function NPC:PLAYER_INTERACTION_MANAGER_FRAME_SHOW(type)
+function Events:PLAYER_INTERACTION_MANAGER_FRAME_SHOW(type)
if API:ShouldCloseOnInteraction(type) then
self:ForceClose(false)
end
diff --git a/Interface/AddOns/Immersion/Logic/Logic.lua b/Interface/AddOns/Immersion/Logic/Frame.lua
similarity index 58%
rename from Interface/AddOns/Immersion/Logic/Logic.lua
rename to Interface/AddOns/Immersion/Logic/Frame.lua
index a59f80674..092bbd7d9 100644
--- a/Interface/AddOns/Immersion/Logic/Logic.lua
+++ b/Interface/AddOns/Immersion/Logic/Frame.lua
@@ -1,11 +1,10 @@
local _, L = ...
-local NPC, TalkBox, API = {}, {}, ImmersionAPI
-local frame, GetTime, GetOffset = L.frame, GetTime, UIParent.GetBottom
+local Frame, TalkBox, API, GetTime = {}, {}, ImmersionAPI, GetTime
----------------------------------
-- Event handler
----------------------------------
-function NPC:OnEvent(event, ...)
+function Frame:OnEvent(event, ...)
self:ResetElements(event)
self:HandleGossipQuestOverlap(event)
if self[event] then
@@ -19,7 +18,7 @@ function NPC:OnEvent(event, ...)
return event
end
-function NPC:OnHide()
+function Frame:OnHide()
self:ClearImmersionFocus()
self.TalkBox.BackgroundFrame.OverlayKit:Hide()
end
@@ -27,7 +26,7 @@ end
----------------------------------
-- Content handler (gossip & quest)
----------------------------------
-function NPC:AddQuestInfo(template)
+function Frame:AddQuestInfo(template)
local elements = self.TalkBox.Elements
local content = elements.Content
local height = elements:Display(template, 'Stone')
@@ -46,7 +45,7 @@ function NPC:AddQuestInfo(template)
self.TalkBox.NameFrame.FadeIn:Play()
end
-function NPC:IsGossipAvailable(ignoreAutoSelect)
+function Frame:IsGossipAvailable(ignoreAutoSelect)
-- if there is only a non-gossip option, then go to it directly
if (API:GetNumGossipAvailableQuests() == 0) and
(API:GetNumGossipActiveQuests() == 0) and
@@ -60,7 +59,7 @@ function NPC:IsGossipAvailable(ignoreAutoSelect)
return true
end
-function NPC:IsQuestAutoAccepted(questStartItemID)
+function Frame:IsQuestAutoAccepted(questStartItemID)
-- Auto-accepted quests need to be treated differently from other quests,
-- and different from eachother depending on the source of the quest.
-- Handling here is prone to cause bugs/weird behaviour, update with caution.
@@ -98,7 +97,7 @@ function NPC:IsQuestAutoAccepted(questStartItemID)
end
-- Iterate through gossip options and simulate a click on the best option.
-function NPC:SelectBestOption()
+function Frame:SelectBestOption()
local button = self.TitleButtons:GetBestOption()
if button then
button.Hilite:SetAlpha(1)
@@ -108,21 +107,21 @@ function NPC:SelectBestOption()
end
end
-function NPC:GetRemainingSpeechTime()
+function Frame:GetRemainingSpeechTime()
return self.TalkBox.TextFrame.Text:GetTimeRemaining()
end
-function NPC:IsSpeechFinished()
+function Frame:IsSpeechFinished()
return self.TalkBox.TextFrame.Text:IsFinished()
end
-- hack to figure out if event is related to quests
-function NPC:IsObstructingQuestEvent(forceEvent)
+function Frame:IsObstructingQuestEvent(forceEvent)
local event = forceEvent or self.lastEvent or ''
return ( event:match('^QUEST') and event ~= 'QUEST_ACCEPTED' )
end
-function NPC:HandleGossipQuestOverlap(event)
+function Frame:HandleGossipQuestOverlap(event)
-- Since Blizzard handles this transition by mutually exclusive gossip/quest frames,
-- and their visibility to determine whether to close gossip or quest interaction,
-- events need to be checked so that an NPC interaction is correctly transitioned.
@@ -135,7 +134,7 @@ function NPC:HandleGossipQuestOverlap(event)
end
end
-function NPC:HandleGossipOpenEvent(kit)
+function Frame:HandleGossipOpenEvent(kit)
if not self.gossipHandlers[kit] then
self:SetBackground(kit)
self:UpdateTalkingHead(API:GetUnitName('npc'), API:GetGossipText(), 'GossipGossip')
@@ -145,7 +144,7 @@ function NPC:HandleGossipOpenEvent(kit)
end
end
-function NPC:SetBackground(kit)
+function Frame:SetBackground(kit)
local backgroundFrame = self.TalkBox.BackgroundFrame;
local overlay = backgroundFrame.OverlayKit;
@@ -169,7 +168,7 @@ function NPC:SetBackground(kit)
end
end
-function NPC:UpdateBackground()
+function Frame:UpdateBackground()
local theme = API:GetQuestDetailsTheme(GetQuestID())
local kit = theme and theme.background and theme.background:gsub('QuestBG%-', '')
if kit then
@@ -177,7 +176,7 @@ function NPC:UpdateBackground()
end
end
-function NPC:ResetElements(event)
+function Frame:ResetElements(event)
if ( self.IgnoreResetEvent[event] ) then return end
self.Inspector:Hide()
@@ -185,7 +184,7 @@ function NPC:ResetElements(event)
self:SetBackground(nil)
end
-function NPC:UpdateTalkingHead(title, text, npcType, explicitUnit, isToastPlayback)
+function Frame:UpdateTalkingHead(title, text, npcType, explicitUnit, isToastPlayback)
local unit = explicitUnit
if not unit then
if ( UnitExists('questnpc') and not UnitIsUnit('questnpc', 'player') and not UnitIsDead('questnpc') ) then
@@ -221,7 +220,7 @@ end
----------------------------------
-- Content handler (items)
----------------------------------
-function NPC:SetItemTooltip(tooltip, item)
+function Frame:SetItemTooltip(tooltip, item)
local objType = item.objectType
if objType == 'item' then
tooltip:SetQuestItem(item.type, item:GetID())
@@ -231,7 +230,7 @@ function NPC:SetItemTooltip(tooltip, item)
tooltip.Icon.Texture:SetTexture(item.itemTexture or item.Icon:GetTexture())
end
-function NPC:GetItemColumn(owner, id)
+function Frame:GetItemColumn(owner, id)
local columns = owner and owner.Columns
if columns and id then
local column = columns[id]
@@ -254,7 +253,7 @@ function NPC:GetItemColumn(owner, id)
end
end
-function NPC:ShowItems()
+function Frame:ShowItems()
local inspector = self.Inspector
local items, hasChoice, hasExtra = inspector.Items
local active, extras, choices = inspector.Active, inspector.Extras, inspector.Choices
@@ -316,7 +315,7 @@ function NPC:ShowItems()
end
end
-function NPC:UpdateItems()
+function Frame:UpdateItems()
local items = self.Inspector.Items
wipe(items)
-- count item rewards
@@ -345,7 +344,7 @@ end
----------------------------------
-- Animation players
----------------------------------
-function NPC:PlayIntro(event, freeFloating)
+function Frame:PlayIntro(event, freeFloating)
local isShown = self:IsVisible()
local shouldAnimate = not isShown and not L('disableglowani')
self.playbackEvent = event
@@ -378,13 +377,13 @@ function NPC:PlayIntro(event, freeFloating)
end
-- This will also hide the frames after the animation is done.
-function NPC:PlayOutro(optionFrameOpen)
+function Frame:PlayOutro(optionFrameOpen)
self:EnableKeyboard(false)
self:FadeOut(0.5)
self:PlayToasts(optionFrameOpen)
end
-function NPC:ForceClose(optionFrameOpen)
+function Frame:ForceClose(optionFrameOpen)
API:CloseGossip()
API:CloseQuest()
API:CloseItemText()
@@ -394,69 +393,17 @@ end
----------------------------------
-- Key input handler
----------------------------------
-local inputs = {
- accept = function(self)
- local text = self.TalkBox.TextFrame.Text
- local numActive = self.TitleButtons:GetNumActive()
- if ( not self:IsModifierDown() and text:GetNumRemaining() > 1 and text:IsSequence() ) then
- text:ForceNext()
- elseif ( self.lastEvent == 'GOSSIP_SHOW' and numActive < 1 ) then
- API:CloseGossip()
- elseif ( self.lastEvent == 'GOSSIP_SHOW' and numActive == 1 ) then
- API:SelectGossipOption(1)
- elseif ( numActive > 1 ) then
- self:SelectBestOption()
- else
- self.TalkBox:OnLeftClick()
- end
- end,
- reset = function(self)
- self.TalkBox.TextFrame.Text:RepeatTexts()
- end,
- goodbye = function(self)
- API:CloseGossip()
- API:CloseQuest()
- end,
- number = function(self, id)
- if self.hasItems then
- local choiceIterator = 0
- for _, item in ipairs(self.TalkBox.Elements.Content.RewardsFrame.Buttons) do
- if item:IsVisible() and item.type == 'choice' then
- choiceIterator = choiceIterator + 1
- if choiceIterator == id then
- item:Click()
- return
- end
- end
- end
- else
- local button = self.TitleButtons.Buttons[id]
- if button then
- button.Hilite:SetAlpha(1)
- button:Click()
- button:OnLeave()
- PlaySound(SOUNDKIT.IG_QUEST_LIST_SELECT)
- end
- end
- end,
-}
-
-local modifierStates = {
- SHIFT = IsShiftKeyDown;
- CTRL = IsControlKeyDown;
- ALT = IsAltKeyDown;
- NOMOD = function() return false end;
-}
+local inputs, modifierStates = L.Inputs, L.ModifierStates;
-function NPC:IsInspectModifier(button)
+function Frame:IsInspectModifier(button)
return button and button:match(L('inspect')) and true
end
-function NPC:IsModifierDown(modifier)
+function Frame:IsModifierDown(modifier)
return modifierStates[modifier or L('inspect')]()
end
-function NPC:OnKeyDown(button)
+function Frame:OnKeyDown(button)
if (button == 'ESCAPE' or GetBindingAction(button) == 'TOGGLEGAMEMENU') then
self:ForceClose()
return
@@ -487,7 +434,7 @@ function NPC:OnKeyDown(button)
end
end
-function NPC:OnKeyUp(button)
+function Frame:OnKeyUp(button)
local inspector = self.Inspector
if ( inspector.ShowFocusedTooltip and ( self:IsInspectModifier(button) or button:match('SHIFT') ) ) then
inspector:ShowFocusedTooltip(false)
@@ -496,195 +443,10 @@ function NPC:OnKeyUp(button)
end
end
-NPC.OnGamePadButtonDown = NPC.OnKeyDown;
-NPC.OnGamePadButtonUp = NPC.OnKeyUp;
-
-----------------------------------
--- TalkBox "button"
-----------------------------------
-function TalkBox:SetOffset(x, y)
---[[if self:UpdateNameplateAnchor() then
- return
- end]]
-
- local point = L('boxpoint')
- local anidivisor = L('anidivisor')
- x = x or L('boxoffsetX')
- y = y or L('boxoffsetY')
-
- self.offsetX = x
- self.offsetY = y
-
- local isBottom = ( point:match('Bottom') )
-
- y = y + ( isBottom and self.extraY or 0 )
-
- local comp = y
-
- if ( not isBottom ) or ( anidivisor <= 1 ) or ( not self:IsVisible() ) then
- self:SetPoint(point, UIParent, x, y)
- return
- end
- self:SetScript('OnUpdate', function(self)
- self.isOffsetting = true
- local offset = (GetOffset(self) or 0) - (GetOffset(UIParent) or 0)
- local diff = ( comp - offset )
- if (offset == 0) or abs( comp - offset ) < 0.3 then
- self:SetPoint(point, UIParent, x, y)
- self.isOffsetting = false
- self:SetScript('OnUpdate', nil)
- else
- self:SetPoint(point, UIParent, x, offset + ( diff / anidivisor ))
- end
- end)
-end
-
--- Temporarily increase the frame offset, in case we want to show extra stuff,
--- like quest descriptions, quest rewards, items needed for quest progress, etc.
-function TalkBox:SetExtraOffset(newOffset)
- local currX = ( self.offsetX or L('boxoffsetX') )
- local currY = ( self.offsetY or L('boxoffsetY') )
- local allowExtra = L('anidivisor') > 0
- self.extraY = allowExtra and newOffset or 0
- self:SetOffset(currX, currY)
-end
-
-function TalkBox:UpdateNameplateAnchor()
- if self.plateInHiding then
- self.plateInHiding:SetAlpha(1)
- self.plateInHiding = nil
- end
- if L('nameplatemode') then
- local plate = API:GetNamePlateForUnit('npc')
- if plate then
- if self.isOffsetting then
- self:SetScript('OnUpdate', nil)
- self.isOffsetting = false
- end
- self:ClearAllPoints()
- self:SetPoint('CENTER', plate, 'TOP', 0, self.extraY or 0)
- if plate.UnitFrame then
- self.plateInHiding = plate.UnitFrame
- self.plateInHiding:SetAlpha(0)
- end
- return true
- end
- end
-end
-
-function TalkBox:OnEnter()
- -- Highlight the button when it can be clicked
- if not L('disableboxhighlight') then
- local lastEvent = self.lastEvent
- if L('immersivemode') or ( ( ( lastEvent == 'QUEST_COMPLETE' ) and
- not (self.Elements.itemChoice == 0 and GetNumQuestChoices() > 1) ) or
- ( lastEvent == 'QUEST_ACCEPTED' ) or
- ( lastEvent == 'QUEST_DETAIL' ) or
- ( lastEvent == 'ITEM_TEXT_READY' ) or
- ( lastEvent ~= 'GOSSIP_SHOW' and IsQuestCompletable() ) ) then
- L.UIFrameFadeIn(self.Hilite, 0.15, self.Hilite:GetAlpha(), 1)
- end
- end
-end
-
-function TalkBox:OnLeave()
- L.UIFrameFadeOut(self.Hilite, 0.15, self.Hilite:GetAlpha(), 0)
-end
-
-function TalkBox:OnDragStart()
- if ( L('boxlock') or self.isOffsetting ) then return end
- self:StartMoving()
-end
-
-function TalkBox:OnDragStop()
- if ( L('boxlock') or self.isOffsetting ) then return end
- self:StopMovingOrSizing()
- local point, _, _, x, y = self:GetPoint()
-
- point = point:sub(1,1) .. point:sub(2):lower()
-
- -- convert center point to bottom
- if ( point == 'Center' ) then
- point = 'Bottom'
- -- calculate the horz offset from the center of the screen
- x = ( self:GetCenter() * ImmersionFrame:GetScale() ) - ( GetScreenWidth() / 2 )
- y = self:GetBottom()
- end
-
- local isBottom = point == 'Bottom'
- if isBottom then
- y = y - (self.extraY or 0)
- end
-
- self:ClearAllPoints()
- self.offsetX, self.offsetY = x, y
-
- L.Set('boxpoint', point)
- L.Set('boxoffsetX', x)
- L.Set('boxoffsetY', y)
- self:SetPoint(point, UIParent, point, x, isBottom and y + (self.extraY or 0) or y)
-end
-
-function TalkBox:OnLeftClick()
- -- Complete quest
- if self.lastEvent == 'QUEST_COMPLETE' then
- self.Elements:CompleteQuest()
- -- Accept quest
- elseif self.lastEvent == 'QUEST_DETAIL' or self.lastEvent == 'QUEST_ACCEPTED' then
- self.Elements:AcceptQuest()
- elseif self.lastEvent == 'ITEM_TEXT_READY' then
- local text = self.TextFrame.Text
- if text:GetNumRemaining() > 1 and text:IsSequence() then
- text:ForceNext()
- else
- API:CloseItemText()
- end
- -- Progress quest to completion
- elseif self.lastEvent == 'QUEST_PROGRESS' then
- if IsQuestCompletable() then
- CompleteQuest()
- else
- ImmersionFrame:ForceClose()
- end
- else
- ImmersionFrame:ForceClose()
- end
-end
-
-function TalkBox:OnClick(button)
- if L('flipshortcuts') then
- button = button == 'LeftButton' and 'RightButton' or 'LeftButton'
- end
- if button == 'LeftButton' then
- if L('immersivemode') then
- inputs.accept(ImmersionFrame)
- else
- self:OnLeftClick()
- end
- elseif button == 'RightButton' then
- local text = self.TextFrame.Text
- if text:GetNumRemaining() > 1 and text:IsSequence() then
- text:ForceNext()
- elseif text:IsSequence() then
- if ( ImmersionFrame.playbackEvent == 'IMMERSION_TOAST' ) then
- ImmersionFrame:RemoveToastByText(text.storedText)
- else
- text:RepeatTexts()
- end
- end
- end
-end
-
-function TalkBox:Dim()
- L.UIFrameFadeOut(self, 0.15, self:GetAlpha(), 0.05)
-end
-
-function TalkBox:Undim()
- L.UIFrameFadeIn(self, 0.15, self:GetAlpha(), 1)
-end
+Frame.OnGamePadButtonDown = Frame.OnKeyDown;
+Frame.OnGamePadButtonUp = Frame.OnKeyUp;
----------------------------------
-- Mixin with scripts
----------------------------------
-L.Mixin(frame, NPC)
-L.Mixin(frame.TalkBox, TalkBox)
\ No newline at end of file
+L.Mixin(L.frame, Frame)
\ No newline at end of file
diff --git a/Interface/AddOns/Immersion/Logic/Input.lua b/Interface/AddOns/Immersion/Logic/Input.lua
new file mode 100644
index 000000000..a318476c1
--- /dev/null
+++ b/Interface/AddOns/Immersion/Logic/Input.lua
@@ -0,0 +1,55 @@
+local API, _, L = ImmersionAPI, ...;
+
+L.Inputs = {
+ accept = function(self)
+ local text = self.TalkBox.TextFrame.Text
+ local numActive = self.TitleButtons:GetNumActive()
+ if ( not self:IsModifierDown() and text:GetNumRemaining() > 1 and text:IsSequence() ) then
+ text:ForceNext()
+ elseif ( self.lastEvent == 'GOSSIP_SHOW' and numActive < 1 ) then
+ API:CloseGossip()
+ elseif ( self.lastEvent == 'GOSSIP_SHOW' and numActive == 1 ) then
+ API:SelectGossipOption(1)
+ elseif ( numActive > 1 ) then
+ self:SelectBestOption()
+ else
+ self.TalkBox:OnLeftClick()
+ end
+ end,
+ reset = function(self)
+ self.TalkBox.TextFrame.Text:RepeatTexts()
+ end,
+ goodbye = function(self)
+ API:CloseGossip()
+ API:CloseQuest()
+ end,
+ number = function(self, id)
+ if self.hasItems then
+ local choiceIterator = 0
+ for _, item in ipairs(self.TalkBox.Elements.Content.RewardsFrame.Buttons) do
+ if item:IsVisible() and item.type == 'choice' then
+ choiceIterator = choiceIterator + 1
+ if choiceIterator == id then
+ item:Click()
+ return
+ end
+ end
+ end
+ else
+ local button = self.TitleButtons.Buttons[id]
+ if button then
+ button.Hilite:SetAlpha(1)
+ button:Click()
+ button:OnLeave()
+ PlaySound(SOUNDKIT.IG_QUEST_LIST_SELECT)
+ end
+ end
+ end,
+}
+
+L.ModifierStates = {
+ SHIFT = IsShiftKeyDown;
+ CTRL = IsControlKeyDown;
+ ALT = IsAltKeyDown;
+ NOMOD = function() return false end;
+}
diff --git a/Interface/AddOns/Immersion/Logic/Talkbox.lua b/Interface/AddOns/Immersion/Logic/Talkbox.lua
new file mode 100644
index 000000000..8654f6e82
--- /dev/null
+++ b/Interface/AddOns/Immersion/Logic/Talkbox.lua
@@ -0,0 +1,193 @@
+local TalkBox, GetOffset, _, L = {}, UIParent.GetBottom, ...
+
+----------------------------------
+-- Offsets
+----------------------------------
+function TalkBox:SetOffset(x, y)
+--[[if self:UpdateNameplateAnchor() then
+ return
+ end]]
+
+ local point = L('boxpoint')
+ local anidivisor = L('anidivisor')
+ x = x or L('boxoffsetX')
+ y = y or L('boxoffsetY')
+
+ self.offsetX = x
+ self.offsetY = y
+
+ local isBottom = ( point:match('Bottom') )
+
+ y = y + ( isBottom and self.extraY or 0 )
+
+ local comp = y
+
+ if ( not isBottom ) or ( anidivisor <= 1 ) or ( not self:IsVisible() ) then
+ self:SetPoint(point, UIParent, x, y)
+ return
+ end
+ self:SetScript('OnUpdate', function(self)
+ self.isOffsetting = true
+ local offset = (GetOffset(self) or 0) - (GetOffset(UIParent) or 0)
+ local diff = ( comp - offset )
+ if (offset == 0) or abs( comp - offset ) < 0.3 then
+ self:SetPoint(point, UIParent, x, y)
+ self.isOffsetting = false
+ self:SetScript('OnUpdate', nil)
+ else
+ self:SetPoint(point, UIParent, x, offset + ( diff / anidivisor ))
+ end
+ end)
+end
+
+-- Temporarily increase the frame offset, in case we want to show extra stuff,
+-- like quest descriptions, quest rewards, items needed for quest progress, etc.
+function TalkBox:SetExtraOffset(newOffset)
+ local currX = ( self.offsetX or L('boxoffsetX') )
+ local currY = ( self.offsetY or L('boxoffsetY') )
+ local allowExtra = L('anidivisor') > 0
+ self.extraY = allowExtra and newOffset or 0
+ self:SetOffset(currX, currY)
+end
+
+function TalkBox:UpdateNameplateAnchor()
+ if self.plateInHiding then
+ self.plateInHiding:SetAlpha(1)
+ self.plateInHiding = nil
+ end
+ if L('nameplatemode') then
+ local plate = API:GetNamePlateForUnit('npc')
+ if plate then
+ if self.isOffsetting then
+ self:SetScript('OnUpdate', nil)
+ self.isOffsetting = false
+ end
+ self:ClearAllPoints()
+ self:SetPoint('CENTER', plate, 'TOP', 0, self.extraY or 0)
+ if plate.UnitFrame then
+ self.plateInHiding = plate.UnitFrame
+ self.plateInHiding:SetAlpha(0)
+ end
+ return true
+ end
+ end
+end
+
+----------------------------------
+-- Scripts
+----------------------------------
+function TalkBox:OnEnter()
+ -- Highlight the button when it can be clicked
+ if not L('disableboxhighlight') then
+ local lastEvent = self.lastEvent
+ if L('immersivemode') or ( ( ( lastEvent == 'QUEST_COMPLETE' ) and
+ not (self.Elements.itemChoice == 0 and GetNumQuestChoices() > 1) ) or
+ ( lastEvent == 'QUEST_ACCEPTED' ) or
+ ( lastEvent == 'QUEST_DETAIL' ) or
+ ( lastEvent == 'ITEM_TEXT_READY' ) or
+ ( lastEvent ~= 'GOSSIP_SHOW' and IsQuestCompletable() ) ) then
+ L.UIFrameFadeIn(self.Hilite, 0.15, self.Hilite:GetAlpha(), 1)
+ end
+ end
+end
+
+function TalkBox:OnLeave()
+ L.UIFrameFadeOut(self.Hilite, 0.15, self.Hilite:GetAlpha(), 0)
+end
+
+function TalkBox:OnDragStart()
+ if ( L('boxlock') or self.isOffsetting ) then return end
+ self:StartMoving()
+end
+
+function TalkBox:OnDragStop()
+ if ( L('boxlock') or self.isOffsetting ) then return end
+ self:StopMovingOrSizing()
+ local point, _, _, x, y = self:GetPoint()
+
+ point = point:sub(1,1) .. point:sub(2):lower()
+
+ -- convert center point to bottom
+ if ( point == 'Center' ) then
+ point = 'Bottom'
+ -- calculate the horz offset from the center of the screen
+ x = ( self:GetCenter() * ImmersionFrame:GetScale() ) - ( GetScreenWidth() / 2 )
+ y = self:GetBottom()
+ end
+
+ local isBottom = point == 'Bottom'
+ if isBottom then
+ y = y - (self.extraY or 0)
+ end
+
+ self:ClearAllPoints()
+ self.offsetX, self.offsetY = x, y
+
+ L.Set('boxpoint', point)
+ L.Set('boxoffsetX', x)
+ L.Set('boxoffsetY', y)
+ self:SetPoint(point, UIParent, point, x, isBottom and y + (self.extraY or 0) or y)
+end
+
+function TalkBox:OnLeftClick()
+ -- Complete quest
+ if self.lastEvent == 'QUEST_COMPLETE' then
+ self.Elements:CompleteQuest()
+ -- Accept quest
+ elseif self.lastEvent == 'QUEST_DETAIL' or self.lastEvent == 'QUEST_ACCEPTED' then
+ self.Elements:AcceptQuest()
+ elseif self.lastEvent == 'ITEM_TEXT_READY' then
+ local text = self.TextFrame.Text
+ if text:GetNumRemaining() > 1 and text:IsSequence() then
+ text:ForceNext()
+ else
+ API:CloseItemText()
+ end
+ -- Progress quest to completion
+ elseif self.lastEvent == 'QUEST_PROGRESS' then
+ if IsQuestCompletable() then
+ CompleteQuest()
+ else
+ ImmersionFrame:ForceClose()
+ end
+ else
+ ImmersionFrame:ForceClose()
+ end
+end
+
+function TalkBox:OnClick(button)
+ if L('flipshortcuts') then
+ button = button == 'LeftButton' and 'RightButton' or 'LeftButton'
+ end
+ if button == 'LeftButton' then
+ if L('immersivemode') then
+ L.Inputs.accept(ImmersionFrame)
+ else
+ self:OnLeftClick()
+ end
+ elseif button == 'RightButton' then
+ local text = self.TextFrame.Text
+ if text:GetNumRemaining() > 1 and text:IsSequence() then
+ text:ForceNext()
+ elseif text:IsSequence() then
+ if ( ImmersionFrame.playbackEvent == 'IMMERSION_TOAST' ) then
+ ImmersionFrame:RemoveToastByText(text.storedText)
+ else
+ text:RepeatTexts()
+ end
+ end
+ end
+end
+
+function TalkBox:Dim()
+ L.UIFrameFadeOut(self, 0.15, self:GetAlpha(), 0.05)
+end
+
+function TalkBox:Undim()
+ L.UIFrameFadeIn(self, 0.15, self:GetAlpha(), 1)
+end
+
+----------------------------------
+-- Mixin with scripts
+----------------------------------
+L.Mixin(L.frame.TalkBox, TalkBox)
\ No newline at end of file
diff --git a/Interface/AddOns/Leatrix_Plus/CHANGELOG.txt b/Interface/AddOns/Leatrix_Plus/CHANGELOG.txt
index 06e62aef0..3a2cb4fec 100644
--- a/Interface/AddOns/Leatrix_Plus/CHANGELOG.txt
+++ b/Interface/AddOns/Leatrix_Plus/CHANGELOG.txt
@@ -1,3 +1,10 @@
+10.0.05 - 31st October 2022
+- The 'Faster auto loot' temporary fix now supports open loot window at mouse.
+
+10.0.04 - 30th October 2022
+- Fixed an issue with 'Restore chat messages' ('Chat') which may have caused a Lua error to show in BugSack when logging out.
+- Due to Blizzard's changes to the UI in Dragonflight, the 'Disable bag automation' option ('System') is unavailable for now.
+
10.0.03 - 29th October 2022
- The faster auto loot fix will no longer apply to ElvUI users.
diff --git a/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.lua b/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.lua
index 24083adb9..74287e09c 100644
--- a/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.lua
+++ b/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.lua
@@ -1,5 +1,5 @@
----------------------------------------------------------------------
--- Leatrix Plus 10.0.03 (29th October 2022)
+-- Leatrix Plus 10.0.05 (31st October 2022)
----------------------------------------------------------------------
-- 01:Functns, 02:Locks, 03:Restart, 20:Live, 30:Isolated, 40:Player
@@ -18,7 +18,7 @@
local void
-- Version
- LeaPlusLC["AddonVer"] = "10.0.03"
+ LeaPlusLC["AddonVer"] = "10.0.05"
-- Get locale table
local void, Leatrix_Plus = ...
@@ -2238,6 +2238,18 @@
-- Show the loot frame in the Edit Mode position
LootFrame.ScrollBox:SetDataProvider(dataProvider)
+
+ if GetCVarBool("lootUnderMouse") then
+ local x, y = GetCursorPosition()
+ x = x / (LootFrame:GetEffectiveScale()) - 30
+ y = math.max((y / LootFrame:GetEffectiveScale()) + 50, 350)
+ LootFrame:ClearAllPoints()
+ LootFrame:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", x, y)
+ LootFrame:Raise()
+ else
+ EditModeSystemMixin.ApplySystemAnchor(LootFrame)
+ end
+
LootFrame:Show()
LootFrame:Resize()
LootFrame:PlayOpenAnimation()
@@ -4247,24 +4259,27 @@
historyFrame:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGOUT" then
local name, realm = UnitFullName("player")
- LeaPlusDB["ChatHistoryName"] = name .. "-" .. realm
- LeaPlusDB["ChatHistoryTime"] = GetServerTime()
- for i = 1, 50 do
- if i ~= 2 and _G["ChatFrame" .. i] then
- if FCF_IsChatWindowIndexActive(i) then
- LeaPlusDB["ChatHistory" .. i] = {}
- local chtfrm = _G["ChatFrame" .. i]
- local NumMsg = chtfrm:GetNumMessages()
- local StartMsg = 1
- if NumMsg > 128 then StartMsg = NumMsg - 127 end
- for iMsg = StartMsg, NumMsg do
- local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
- if chatMessage then
- if r and g and b then
- local colorCode = RGBToColorCode(r, g, b)
- chatMessage = colorCode .. chatMessage
+ if not realm then realm = GetNormalizedRealmName() end
+ if name and realm then
+ LeaPlusDB["ChatHistoryName"] = name .. "-" .. realm
+ LeaPlusDB["ChatHistoryTime"] = GetServerTime()
+ for i = 1, 50 do
+ if i ~= 2 and _G["ChatFrame" .. i] then
+ if FCF_IsChatWindowIndexActive(i) then
+ LeaPlusDB["ChatHistory" .. i] = {}
+ local chtfrm = _G["ChatFrame" .. i]
+ local NumMsg = chtfrm:GetNumMessages()
+ local StartMsg = 1
+ if NumMsg > 128 then StartMsg = NumMsg - 127 end
+ for iMsg = StartMsg, NumMsg do
+ local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
+ if chatMessage then
+ if r and g and b then
+ local colorCode = RGBToColorCode(r, g, b)
+ chatMessage = colorCode .. chatMessage
+ end
+ tinsert(LeaPlusDB["ChatHistory" .. i], chatMessage)
end
- tinsert(LeaPlusDB["ChatHistory" .. i], chatMessage)
end
end
end
@@ -4275,62 +4290,65 @@
-- Restore chat messages on login
local name, realm = UnitFullName("player")
- if LeaPlusDB["ChatHistoryName"] and LeaPlusDB["ChatHistoryTime"] then
- local timeDiff = GetServerTime() - LeaPlusDB["ChatHistoryTime"]
- if LeaPlusDB["ChatHistoryName"] == name .. "-" .. realm and timeDiff and timeDiff < 10 then -- reload must be done within 15 seconds
-
- -- Store chat messages from current session and clear chat
- for i = 1, 50 do
- if i ~= 2 and _G["ChatFrame" .. i] and FCF_IsChatWindowIndexActive(i) then
- LeaPlusDB["ChatTemp" .. i] = {}
- local chtfrm = _G["ChatFrame" .. i]
- local NumMsg = chtfrm:GetNumMessages()
- for iMsg = 1, NumMsg do
- local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
- if chatMessage then
- if r and g and b then
- local colorCode = RGBToColorCode(r, g, b)
- chatMessage = colorCode .. chatMessage
+ if not realm then realm = GetNormalizedRealmName() end
+ if name and realm then
+ if LeaPlusDB["ChatHistoryName"] and LeaPlusDB["ChatHistoryTime"] then
+ local timeDiff = GetServerTime() - LeaPlusDB["ChatHistoryTime"]
+ if LeaPlusDB["ChatHistoryName"] == name .. "-" .. realm and timeDiff and timeDiff < 10 then -- reload must be done within 15 seconds
+
+ -- Store chat messages from current session and clear chat
+ for i = 1, 50 do
+ if i ~= 2 and _G["ChatFrame" .. i] and FCF_IsChatWindowIndexActive(i) then
+ LeaPlusDB["ChatTemp" .. i] = {}
+ local chtfrm = _G["ChatFrame" .. i]
+ local NumMsg = chtfrm:GetNumMessages()
+ for iMsg = 1, NumMsg do
+ local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
+ if chatMessage then
+ if r and g and b then
+ local colorCode = RGBToColorCode(r, g, b)
+ chatMessage = colorCode .. chatMessage
+ end
+ tinsert(LeaPlusDB["ChatTemp" .. i], chatMessage)
end
- tinsert(LeaPlusDB["ChatTemp" .. i], chatMessage)
end
+ chtfrm:Clear()
end
- chtfrm:Clear()
end
- end
- -- Restore chat messages from previous session
- for i = 1, 50 do
- if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatHistory" .. i] and FCF_IsChatWindowIndexActive(i) then
- LeaPlusDB["ChatHistory" .. i .. "Count"] = 0
- -- Add previous session messages to chat
- for k = 1, #LeaPlusDB["ChatHistory" .. i] do
- if LeaPlusDB["ChatHistory" .. i][k] ~= string.match(LeaPlusDB["ChatHistory" .. i][k], "|cffffd800" .. L["Restored"] .. " " .. ".*" .. " " .. L["message"] .. ".*.|r") then
- _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatHistory" .. i][k])
- LeaPlusDB["ChatHistory" .. i .. "Count"] = LeaPlusDB["ChatHistory" .. i .. "Count"] + 1
+ -- Restore chat messages from previous session
+ for i = 1, 50 do
+ if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatHistory" .. i] and FCF_IsChatWindowIndexActive(i) then
+ LeaPlusDB["ChatHistory" .. i .. "Count"] = 0
+ -- Add previous session messages to chat
+ for k = 1, #LeaPlusDB["ChatHistory" .. i] do
+ if LeaPlusDB["ChatHistory" .. i][k] ~= string.match(LeaPlusDB["ChatHistory" .. i][k], "|cffffd800" .. L["Restored"] .. " " .. ".*" .. " " .. L["message"] .. ".*.|r") then
+ _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatHistory" .. i][k])
+ LeaPlusDB["ChatHistory" .. i .. "Count"] = LeaPlusDB["ChatHistory" .. i .. "Count"] + 1
+ end
+ end
+ -- Show how many messages were restored
+ if LeaPlusDB["ChatHistory" .. i .. "Count"] == 1 then
+ _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["message from previous session"] .. ".|r")
+ else
+ _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["messages from previous session"] .. ".|r")
end
- end
- -- Show how many messages were restored
- if LeaPlusDB["ChatHistory" .. i .. "Count"] == 1 then
- _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["message from previous session"] .. ".|r")
else
- _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["messages from previous session"] .. ".|r")
+ -- No messages to restore
+ LeaPlusDB["ChatHistory" .. i] = nil
end
- else
- -- No messages to restore
- LeaPlusDB["ChatHistory" .. i] = nil
end
- end
- -- Restore chat messages from this session
- for i = 1, 50 do
- if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatTemp" .. i] and FCF_IsChatWindowIndexActive(i) then
- for k = 1, #LeaPlusDB["ChatTemp" .. i] do
- _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatTemp" .. i][k])
+ -- Restore chat messages from this session
+ for i = 1, 50 do
+ if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatTemp" .. i] and FCF_IsChatWindowIndexActive(i) then
+ for k = 1, #LeaPlusDB["ChatTemp" .. i] do
+ _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatTemp" .. i][k])
+ end
end
end
- end
+ end
end
end
@@ -11090,6 +11108,10 @@
end
end
+ if not LeaPlusLC.ElvUI then
+ LockDF("NoBagAutomation", "Cannot use this right now.") -- Causes block taint (open vendor, close vendor, open vendor, buy alcohol, drink from bag)
+ end
+
-- Run other startup items
LeaPlusLC:Live()
LeaPlusLC:Isolated()
diff --git a/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.toc b/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.toc
index 1ebf2efb8..3df27f816 100644
--- a/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.toc
+++ b/Interface/AddOns/Leatrix_Plus/Leatrix_Plus.toc
@@ -8,7 +8,7 @@
## Notes-zhCN: 哆啦A梦的百宝袋
## Notes-zhTW: 哆啦A夢的百寶袋
-## Version: 10.0.03
+## Version: 10.0.05
## Author: Leatrix
## SavedVariables: LeaPlusDB
diff --git a/Interface/AddOns/LoggerHead/CHANGELOG.md b/Interface/AddOns/LoggerHead/CHANGELOG.md
index dab650075..5ca876df5 100644
--- a/Interface/AddOns/LoggerHead/CHANGELOG.md
+++ b/Interface/AddOns/LoggerHead/CHANGELOG.md
@@ -1,148 +1,11 @@
# LoggerHead
-## [release-9.2.5](https://github.com/dratr/loggerhead/tree/release-9.2.5) (2022-06-05)
-[Full Changelog](https://github.com/dratr/loggerhead/commits/release-9.2.5) [Previous Releases](https://github.com/dratr/loggerhead/releases)
+## [10.0.0](https://github.com/dratr/loggerhead/tree/10.0.0) (2022-10-28)
+[Full Changelog](https://github.com/dratr/loggerhead/compare/release-9.2.5...10.0.0) [Previous Releases](https://github.com/dratr/loggerhead/releases)
-- Bump toc version for 9.2.5
- Remove outdated email contact for original author
-- Change github dep to use https:// not git://
-- Fix github actions
-- Add tagging template
- Add curse project id
-- Create main.yml
-- Create README.md
-- toc bump for 9.2
-- Bump toc version for 9.1.5
-- Bump toc for 9.1
-- Update toc for patch 9.0.5
-- Bump version to hopefully get curseforge packager to run again
-- Version bump
-- Add Torghast as a loggable difficulty.
-- Disable nolib creation as new curse client is pulling nolib version by
- default causing problems for most users
-- TOC bump for 9.0.2
-- Remove use and reliance on LibDialog (not updated for 9.0), replace with
- singleton dialog made directly.
-- toc bump for 9.0
-- Bump toc for 8.3
-- Bump toc to 8.1.5
- Push new release to pick up new libs, esp libsink
-- Remove referenced but no longer relevant deps
-- TOC bump for 8.0/bfa
-- Show "prompt" dialog even if in cinematic. Beginning of Antorus is, for but
- a brief moment, flagged as cinematic by the game api.... This made the
- dialog not show
-- Update references to new urls
-- 7.0.3 compatible sound reference
-- Update TOC for 7.3
-- Update toc for Legion patch 7.1
-- Update toc for Legion
-- Add long overdue mythic difficulty for dungeons, as well as timewalking
-- Update for 6.2
-- Fix instance ID for alliance level 2 garrison (finally I went to the dark side)
-- Update toc for 6.1
-- Ignore Garrisons for horder and alliance
-- Use true/false rather than 1 and nil/0 for WoD/6.0
-- LoggingChat and LoggingCombat use nil to disable not 0
-- 6.0 update, might just work
-- make it work for flexible, thanks dratr
-- toc update
-- okay, toc bump for you, too
-- fix tickets #46 and #47
-- stop hard-embedding
-- make this less scary
-- TOC Update and fix library listings (actually works now)
-- remove newline from prompt localization reference, not just the strings themselves, derp?
-- securehook LoggingCombat and update LDB on slash command
-- deal with nil difficulty/zone names that make it through to the dialog spawn after last commit
-- fix the difficulty index check on update function as well
-- don't skip update checks on zone type none, it breaks log disabling on instance exit
-- 5.1 toc, also touch for locale regen, since newline escape sequences get munged by the localization app, ugh
-- remove localization override
-- move locale files into subdirectory for no good reason
-- add esES, esMX, ptBR translations
-- fix .pkgmeta, SOME THINGS ARE CASE SENSITIVE DAMMIT
-- say goodbye to the Bad Idea(tm) that is transcriptor toggling
-- revert prompt localization to full string so we don't break source checkouts, localization app still needs to be updated
-- fallback to english localization for dialog prompt string until such time as the wowace localization entries are updated
-- use LibDialog instead of FrameXML StaticPopup, please report any issues in IRC.
-- create ldb with actual correct icon/text values.
- clean up locale and db namespaces a bit.
-- UPDATE\_INSTANCE\_INFO fires a second time post zone change when difficulty is available, we do not need to schedule a timer, period
-- fix logic on bogus zone/difficulty retry timer
-- ARR license be damned, fix staticpopup taint and utterly stupid InterfaceOptionsFrame\_OnHide hook
-- Changed versioning scheme to "revision" instead of weird GamveVersion.Revision
-- Fixed a typo in .toc for LibDataBroker-1.1. Users with case-insensitive file-systems were affected.
-- Really removed libraries being hard-embedded this time.
-- Re-added project variables in .toc
- Added itIT localization - Need help translating!
-- Left over some debug prints.
- Might as well add debug tags if we're here.
-- RAID\_FINDER not RAID\_DIFFICULTY\_RAIDFINDER
- Forgot to actually remove embeds.xml last commit...
-- Bumped .toc
- Removed embeds.xml, using .toc to load libraries
- Fixed Lua error on scenarios
- Cleaned up the difficulties and made it return the correct values with the new changes to GetInstanceInfo()
-- make sure we don't override the user's manual click to enable/disable logging on random events
-- a bit of workaround for the option/saved variable errors
-- make transcriptor toggling silent
-- .TOC update
-- Removed unused libs from embeds.xml
-- Changes:
- Fixed the issue with combat logging not being disabled
- Tweaked the events that are registered
-- Fixed typo
-- Fixed(hopefully) localization issue with GetRaidInfo. Did some Global optimzation as well.
-- Fixed the slash command
-- fixed missing comma. Damn drycoding
-- Updated .toc and .pkgmeta
-- Removed dependencies for BabbleZone and TouristLib
-- Updated .toc
-- ALERT! This version blows away your current DB. You have been warned!
- Changes:
- - removed LibTourist dependency: No more waiting to have is updated when a patch comes out and no more listening to it's maintainer bitch at me when I check updates into it.
- - removed LibBabble-Zone dependency: see above
- - no longer has configuration options for normal zones. They were just cluttering the menu and taking up memory.
- - zones/instances are now classified as follows: arena, party, pvp, and raid. These are read directly from GetInstanceInfo()
- - supports dynamic difficulty instances properly. When you switch difficulty in an instance, it knows.
-- bump .TOC, hopefully will pick up LibBabble-Zone and LibTourist 3.3.5 updates
-- updated .TOC
-- Fix for Onyxia's Lair
-- - Fix for prompting of unvisited instances locations
-- First turn off Transcriptor logging, then combatlog logging.
-- - Updated Interface number
- - Bump version
-- Added:
- - 3.2 Raid difficulty levels
- - Trail of the Champion and Trial of the Crusader
- - Transcriptor support
-- - Removed debugging text.
-- - updated LibDataBroker-1.1.lua to the latest version (was causing issues with LibDBIcon)
- - added LibStub and CallbackHandler-1.0 as static libs for stand alone operation.
- - updated externals.xml and .toc for stand alone operation
-- - fix .pkgmeta to pull LibDBIcon correctly
-- Don't cry on svn checkouts =)
-- - fixed attempt to index nil
-- - Added Chat Logging option
- - Added missing localization
-- - Added support for area difficulty (Normal/Heroic)
- - reworked config panel
- - added LibDBIcon support
- - switched to the WowAce Localization tool
- - using updated TouristLib with Ulduar support
- - added AddonLoader support
-- Changed LDB to "data source"
-- locale update
-- Add type argument to the LDB register call
-- Fix for non enUS config menu errors.
-- Added preliminary Northrend config options
- Config now loads dynamically reducing memory footprint
-- add ruRU locale
-- Removed Embeds
- Moved LibDataBroker
- Updated .toc
-- Fix .pkgmeta
-- Hopefully fix .pkgmeta
-- Facilitate WowAce-on-CurseForge transition
-- Importing old repo data under /trunk
\ No newline at end of file
+- Add artifacts
+- Fix project ids in git workflow
+- toc bump for 10.0
+ set version from packager
+ Change packager to run on all tags
+- Add wowinterface id
diff --git a/Interface/AddOns/LoggerHead/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceAddon-3.0/AceAddon-3.0.lua
index 46fde43f8..0ea93d19b 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -28,7 +28,7 @@
-- end
-- @class file
-- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local MAJOR, MINOR = "AceAddon-3.0", 13
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -49,10 +49,6 @@ local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local loadstring, assert, error = loadstring, assert, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
-
--[[
xpcall safecall implementation
]]
diff --git a/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 8bac7e3cd..a4240cefe 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file
-- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @release $Id: AceConfigCmd-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
--[[
AceConfigCmd-3.0
@@ -37,17 +37,10 @@ local error, assert = error, assert
-- WoW APIs
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
-
-
local L = setmetatable({}, { -- TODO: replace with proper locale
__index = function(self,k) return k end
})
-
-
local function print(msg)
(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
end
@@ -401,7 +394,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
return
end
- local str = strsub(info.input,inputpos);
+ local strInput = strsub(info.input,inputpos);
if tab.type=="execute" then
------------ execute --------------------------------------------
@@ -414,21 +407,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
local res = true
if tab.pattern then
- if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
- if not strmatch(str, tab.pattern) then
- usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
+ if type(tab.pattern)~="string" then err(info, inputpos, "'pattern' - expected a string") end
+ if not strmatch(strInput, tab.pattern) then
+ usererr(info, inputpos, "'"..strInput.."' - " .. L["invalid input"])
return
end
end
- do_final(info, inputpos, tab, "set", str)
+ do_final(info, inputpos, tab, "set", strInput)
elseif tab.type=="toggle" then
------------ toggle --------------------------------------------
local b
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
if str=="" then
b = callmethod(info, inputpos, tab, "get")
@@ -465,9 +458,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="range" then
------------ range --------------------------------------------
- local val = tonumber(str)
+ local val = tonumber(strInput)
if not val then
- usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
+ usererr(info, inputpos, "'"..strInput.."' - "..L["expected number"])
return
end
if type(info.step)=="number" then
@@ -487,7 +480,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="select" then
------------ select ------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
local values = tab.values
if type(values) == "function" or type(values) == "string" then
@@ -528,7 +521,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="multiselect" then
------------ multiselect -------------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
local values = tab.values
if type(values) == "function" or type(values) == "string" then
@@ -565,7 +558,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
--check that the opt is valid
local ok
- for k,v in pairs(values) do
+ for k in pairs(values) do
if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches)
ok = true
@@ -634,7 +627,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="color" then
------------ color --------------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
if str == "" then
--TODO: Show current value
return
@@ -706,7 +699,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="keybinding" then
------------ keybinding --------------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
if str == "" then
--TODO: Show current value
return
diff --git a/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 0422fd347..e112e8deb 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,13 +1,13 @@
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
-- @class file
-- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1262 2022-04-07 23:00:32Z funkehdude $
+-- @release $Id: AceConfigDialog-3.0.lua 1292 2022-09-29 08:00:11Z nevcairiel $
local LibStub = LibStub
local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-3.0")
-local MAJOR, MINOR = "AceConfigDialog-3.0", 82
+local MAJOR, MINOR = "AceConfigDialog-3.0", 85
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigDialog then return end
@@ -29,12 +29,6 @@ local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unp
local tostring, tonumber = tostring, tonumber
local math_min, math_max, math_floor = math.min, math.max, math.floor
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL
--- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
--- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
-
local emptyTbl = {}
--[[
@@ -194,9 +188,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
--We have a function to call
local info = new()
--traverse the options table, picking up the handler and filling the info with the path
- local handler
local group = options
- handler = group.handler or handler
+ local handler = group.handler
for i = 1, #path do
group = GetSubOption(group, path[i])
@@ -535,8 +528,7 @@ local function OptionOnMouseLeave(widget, event)
end
local function GetFuncName(option)
- local type = option.type
- if type == "execute" then
+ if option.type == "execute" then
return "func"
else
return "set"
@@ -576,7 +568,7 @@ do
text:SetPoint("TOP", 0, -16)
frame.text = text
- local function newButton(text)
+ local function newButton(newText)
local button = CreateFrame("Button", nil, frame)
button:SetSize(128, 21)
button:SetNormalFontObject(GameFontNormal)
@@ -587,7 +579,7 @@ do
button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight"
button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
- button:SetText(text)
+ button:SetText(newText)
return button
end
@@ -674,7 +666,7 @@ local function ActivateControl(widget, event, ...)
if group[funcname] ~= nil then
func = group[funcname]
end
- handler = group.handler or handler
+ handler = group.handler
confirm = group.confirm
validate = group.validate
for i = 1, #path do
@@ -738,7 +730,6 @@ local function ActivateControl(widget, event, ...)
end
end
- local rootframe = user.rootframe
if not validated or type(validated) == "string" then
if not validated then
if usage then
@@ -753,8 +744,8 @@ local function ActivateControl(widget, event, ...)
end
-- show validate message
- if rootframe.SetStatusText then
- rootframe:SetStatusText(validated)
+ if user.rootframe.SetStatusText then
+ user.rootframe:SetStatusText(validated)
else
validationErrorPopup(validated)
end
@@ -791,14 +782,14 @@ local function ActivateControl(widget, event, ...)
if type(confirm) == "boolean" then
if confirm then
if not confirmText then
- local name, desc = option.name, option.desc
- if type(name) == "function" then
- name = name(info)
+ local option_name, desc = option.name, option.desc
+ if type(option_name) == "function" then
+ option_name = option_name(info)
end
if type(desc) == "function" then
desc = desc(info)
end
- confirmText = name
+ confirmText = option_name
if desc then
confirmText = confirmText.." - "..desc
end
@@ -1140,8 +1131,6 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
--Control to feed
local control
- local name = GetOptionsMemberValue("name", v, options, path, appName)
-
if v.type == "execute" then
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
@@ -1244,7 +1233,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end
tsort(sorting, sortTblAsStrings)
end
- for k, value in ipairs(sorting) do
+ for _, value in ipairs(sorting) do
local text = values[value]
local radio = gui:Create("CheckBox")
radio:SetLabel(text)
@@ -1326,8 +1315,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetWidth(width_multiplier)
end
--check:SetTriState(v.tristate)
- for i = 1, #valuesort do
- local key = valuesort[i]
+ for s = 1, #valuesort do
+ local key = valuesort[s]
local value = GetOptionsMemberValue("get",v, options, path, appName, key)
control:SetItemValue(key,value)
end
@@ -1339,8 +1328,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:PauseLayout()
local width = GetOptionsMemberValue("width",v,options,path,appName)
- for i = 1, #valuesort do
- local value = valuesort[i]
+ for s = 1, #valuesort do
+ local value = valuesort[s]
local text = values[value]
local check = gui:Create("CheckBox")
check:SetLabel(text)
@@ -1427,8 +1416,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end
control:SetImageSize(width, height)
end
- local width = GetOptionsMemberValue("width",v,options,path,appName)
- control.width = not width and "fill"
+ local controlWidth = GetOptionsMemberValue("width",v,options,path,appName)
+ control.width = not controlWidth and "fill"
end
--Common Init
@@ -1683,29 +1672,29 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
elseif grouptype == "select" then
- local select = gui:Create("DropdownGroup")
- select:SetTitle(name)
- InjectInfo(select, options, group, path, rootframe, appName)
- select:SetCallback("OnGroupSelected", GroupSelected)
+ local selectGroup = gui:Create("DropdownGroup")
+ selectGroup:SetTitle(name)
+ InjectInfo(selectGroup, options, group, path, rootframe, appName)
+ selectGroup:SetCallback("OnGroupSelected", GroupSelected)
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
- select:SetStatusTable(status.groups)
+ selectGroup:SetStatusTable(status.groups)
local grouplist, orderlist = BuildSelect(group, options, path, appName)
- select:SetGroupList(grouplist, orderlist)
- select:SetUserData("grouplist", grouplist)
- select:SetUserData("orderlist", orderlist)
+ selectGroup:SetGroupList(grouplist, orderlist)
+ selectGroup:SetUserData("grouplist", grouplist)
+ selectGroup:SetUserData("orderlist", orderlist)
local firstgroup = orderlist[1]
if firstgroup then
- select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
+ selectGroup:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end
- select.width = "fill"
- select.height = "fill"
+ selectGroup.width = "fill"
+ selectGroup.height = "fill"
- container:AddChild(select)
+ container:AddChild(selectGroup)
--assume tree group by default
--if parenttype is tree then this group is already a node on that tree
@@ -1933,13 +1922,13 @@ end
-- convert pre-39 BlizOptions structure to the new format
if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then
local old = AceConfigDialog.BlizOptions
- local new = {}
+ local newOpt = {}
for key, widget in pairs(old) do
local appName = widget:GetUserData("appName")
- if not new[appName] then new[appName] = {} end
- new[appName][key] = widget
+ if not newOpt[appName] then newOpt[appName] = {} end
+ newOpt[appName][key] = widget
end
- AceConfigDialog.BlizOptions = new
+ AceConfigDialog.BlizOptions = newOpt
else
AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {}
end
@@ -1972,6 +1961,7 @@ end
-- @param parent The parent to use in the interface options tree.
-- @param ... The path in the options table to feed into the interface options panel.
-- @return The reference to the frame registered into the Interface Options.
+-- @return The category ID to pass to Settings.OpenToCategory (or InterfaceOptionsFrame_OpenToCategory)
function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = AceConfigDialog.BlizOptions
@@ -1987,7 +1977,6 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
if not BlizOptions[appName][key] then
local group = gui:Create("BlizOptionsGroup")
BlizOptions[appName][key] = group
- group:SetName(name or appName, parent)
group:SetTitle(name or appName)
group:SetUserData("appName", appName)
@@ -2000,8 +1989,30 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
end
group:SetCallback("OnShow", FeedToBlizPanel)
group:SetCallback("OnHide", ClearBlizPanel)
- InterfaceOptions_AddCategory(group.frame)
- return group.frame
+ if Settings and Settings.RegisterCanvasLayoutCategory then
+ local categoryName = name or appName
+ if parent then
+ local category = Settings.GetCategory(parent)
+ if not category then
+ error(("The parent category '%s' was not found"):format(parent), 2)
+ end
+ local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName)
+
+ -- force the generated ID to be used for subcategories, as these can have very simple names like "Profiles"
+ group:SetName(subcategory.ID, parent)
+ else
+ local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName)
+ -- using appName here would be cleaner, but would not be 100% compatible
+ -- but for top-level categories it should be fine, as these are typically addon names
+ category.ID = categoryName
+ group:SetName(categoryName, parent)
+ Settings.RegisterAddOnCategory(category)
+ end
+ else
+ group:SetName(name or appName, parent)
+ InterfaceOptions_AddCategory(group.frame)
+ end
+ return group.frame, group.frame.name
else
error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
end
diff --git a/Interface/AddOns/LoggerHead/Libs/AceConsole-3.0/AceConsole-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceConsole-3.0/AceConsole-3.0.lua
index 781511173..8ce5f8bd6 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceConsole-3.0/AceConsole-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceConsole-3.0/AceConsole-3.0.lua
@@ -9,7 +9,7 @@
-- make into AceConsole.
-- @class file
-- @name AceConsole-3.0
--- @release $Id: AceConsole-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @release $Id: AceConsole-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local MAJOR,MINOR = "AceConsole-3.0", 7
local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -29,10 +29,6 @@ local max = math.max
-- WoW APIs
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: DEFAULT_CHAT_FRAME, SlashCmdList, hash_SlashCmdList
-
local tmp={}
local function Print(self,frame,...)
local n=0
@@ -174,7 +170,7 @@ function AceConsole:GetArgs(str, numargs, startpos)
while true do
-- find delimiter or hyperlink
- local ch,_
+ local _
pos,_,ch = strfind(str, delim_or_pipe, pos)
if not pos then break end
diff --git a/Interface/AddOns/LoggerHead/Libs/AceDB-3.0/AceDB-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceDB-3.0/AceDB-3.0.lua
index 647808629..9e84705c5 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceDB-3.0/AceDB-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceDB-3.0/AceDB-3.0.lua
@@ -40,7 +40,7 @@
-- end
-- @class file
-- @name AceDB-3.0.lua
--- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $
+-- @release $Id: AceDB-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
@@ -53,10 +53,6 @@ local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-- WoW APIs
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub
-
AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame")
@@ -98,11 +94,11 @@ local function copyDefaults(dest, src)
-- This is a metatable used for table defaults
local mt = {
-- This handles the lookup and creation of new subtables
- __index = function(t,k)
- if k == nil then return nil end
+ __index = function(t,k2)
+ if k2 == nil then return nil end
local tbl = {}
copyDefaults(tbl, v)
- rawset(t, k, tbl)
+ rawset(t, k2, tbl)
return tbl
end,
}
@@ -115,7 +111,7 @@ local function copyDefaults(dest, src)
end
else
-- Values are not tables, so this is just a simple return
- local mt = {__index = function(t,k) return k~=nil and v or nil end}
+ local mt = {__index = function(t,k2) return k2~=nil and v or nil end}
setmetatable(dest, mt)
end
elseif type(v) == "table" then
diff --git a/Interface/AddOns/LoggerHead/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
index b7ef49788..f5d45abf8 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
@@ -1,7 +1,7 @@
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
-- @class file
-- @name AceDBOptions-3.0
--- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @release $Id: AceDBOptions-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
@@ -13,10 +13,6 @@ local pairs, next = pairs, next
-- WoW APIs
local UnitClass = UnitClass
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NORMAL_FONT_COLOR_CODE, FONT_COLOR_CODE_CLOSE
-
AceDBOptions.optionTables = AceDBOptions.optionTables or {}
AceDBOptions.handlers = AceDBOptions.handlers or {}
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/AceGUI-3.0.lua
index 3c376c7f4..7d9a2cf94 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -24,7 +24,7 @@
-- f:AddChild(btn)
-- @class file
-- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $
+-- @release $Id: AceGUI-3.0.lua 1288 2022-09-25 14:19:00Z funkehdude $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
@@ -35,17 +35,11 @@ local tinsert, wipe = table.insert, table.wipe
local select, pairs, next, type = select, pairs, next, type
local error, assert = error, assert
local setmetatable, rawget = setmetatable, rawget
-local math_max = math.max
+local math_max, math_min, math_ceil = math.max, math.min, math.ceil
-- WoW APIs
local UIParent = UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: geterrorhandler, LibStub
-
---local con = LibStub("AceConsole-3.0",true)
-
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
@@ -94,38 +88,38 @@ do
AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor
- function newWidget(type)
- if not WidgetRegistry[type] then
+ function newWidget(widgetType)
+ if not WidgetRegistry[widgetType] then
error("Attempt to instantiate unknown widget type", 2)
end
- if not objPools[type] then
- objPools[type] = {}
+ if not objPools[widgetType] then
+ objPools[widgetType] = {}
end
- local newObj = next(objPools[type])
+ local newObj = next(objPools[widgetType])
if not newObj then
- newObj = WidgetRegistry[type]()
- newObj.AceGUIWidgetVersion = WidgetVersions[type]
+ newObj = WidgetRegistry[widgetType]()
+ newObj.AceGUIWidgetVersion = WidgetVersions[widgetType]
else
- objPools[type][newObj] = nil
+ objPools[widgetType][newObj] = nil
-- if the widget is older then the latest, don't even try to reuse it
-- just forget about it, and grab a new one.
- if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
- return newWidget(type)
+ if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[widgetType] then
+ return newWidget(widgetType)
end
end
return newObj
end
-- Releases an instance to the Pool
- function delWidget(obj,type)
- if not objPools[type] then
- objPools[type] = {}
+ function delWidget(obj,widgetType)
+ if not objPools[widgetType] then
+ objPools[widgetType] = {}
end
- if objPools[type][obj] then
+ if objPools[widgetType][obj] then
error("Attempt to Release Widget that is already released", 2)
end
- objPools[type][obj] = true
+ objPools[widgetType][obj] = true
end
end
@@ -141,9 +135,9 @@ end
-- OnAcquire function on it, before returning.
-- @param type The type of the widget.
-- @return The newly created widget.
-function AceGUI:Create(type)
- if WidgetRegistry[type] then
- local widget = newWidget(type)
+function AceGUI:Create(widgetType)
+ if WidgetRegistry[widgetType] then
+ local widget = newWidget(widgetType)
if rawget(widget, "Acquire") then
widget.OnAcquire = widget.Acquire
@@ -161,7 +155,7 @@ function AceGUI:Create(type)
if widget.OnAcquire then
widget:OnAcquire()
else
- error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
+ error(("Widget type %s doesn't supply an OnAcquire Function"):format(widgetType))
end
-- Set the default Layout ("List")
safecall(widget.SetLayout, widget, "List")
@@ -589,25 +583,25 @@ AceGUI.counts = AceGUI.counts or {}
-- This is used by widgets that require a named frame, e.g. when a Blizzard
-- Template requires it.
-- @param type The widget type
-function AceGUI:GetNextWidgetNum(type)
- if not self.counts[type] then
- self.counts[type] = 0
+function AceGUI:GetNextWidgetNum(widgetType)
+ if not self.counts[widgetType] then
+ self.counts[widgetType] = 0
end
- self.counts[type] = self.counts[type] + 1
- return self.counts[type]
+ self.counts[widgetType] = self.counts[widgetType] + 1
+ return self.counts[widgetType]
end
--- Return the number of created widgets for this type.
-- In contrast to GetNextWidgetNum, the number is not incremented.
--- @param type The widget type
-function AceGUI:GetWidgetCount(type)
- return self.counts[type] or 0
+-- @param widgetType The widget type
+function AceGUI:GetWidgetCount(widgetType)
+ return self.counts[widgetType] or 0
end
--- Return the version of the currently registered widget type.
--- @param type The widget type
-function AceGUI:GetWidgetVersion(type)
- return WidgetVersions[type]
+-- @param widgetType The widget type
+function AceGUI:GetWidgetVersion(widgetType)
+ return WidgetVersions[widgetType]
end
-------------
@@ -770,7 +764,6 @@ AceGUI:RegisterLayout("Flow",
usedwidth = 0
rowstart = frame
- rowstartoffset = frameoffset
if child.DoLayout then
child:DoLayout()
@@ -813,7 +806,8 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
or colObj and (colObj["align" .. dir] or colObj.align)
or tableObj["align" .. dir] or tableObj.align
or "CENTERLEFT"
- local child, cell, val = child or 0, cell or 0, nil
+ local val
+ child, cell = child or 0, cell or 0
if type(fn) == "string" then
fn = fn:lower()
@@ -827,7 +821,7 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
val = fn
end
- return fn, max(0, min(val, cell))
+ return fn, math_max(0, math_min(val, cell))
end
-- Get width or height for multiple cells combined
@@ -836,7 +830,7 @@ local GetCellDimension = function (dir, laneDim, from, to, space)
for cell=from,to do
dim = dim + (laneDim[cell] or 0)
end
- return dim + max(0, to - from) * (space or 0)
+ return dim + math_max(0, to - from) * (space or 0)
end
--[[ Options
@@ -882,7 +876,7 @@ AceGUI:RegisterLayout("Table",
repeat
n = n + 1
local col = (n - 1) % #cols + 1
- local row = ceil(n / #cols)
+ local row = math_ceil(n / #cols)
local rowspan = rowspans[col]
local cell = rowspan and rowspan.child or child
local cellObj = cell:GetUserData("cell")
@@ -898,7 +892,7 @@ AceGUI:RegisterLayout("Table",
end
-- Colspan
- local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
+ local colspan = math_max(0, math_min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
n = n + colspan
-- Place the cell
@@ -915,7 +909,7 @@ AceGUI:RegisterLayout("Table",
end
end
- local rows = ceil(n / #cols)
+ local rows = math_ceil(n / #cols)
-- Determine fixed size cols and collect weights
local extantH, totalWeight = totalH, 0
@@ -940,16 +934,16 @@ AceGUI:RegisterLayout("Table",
f:ClearAllPoints()
local childH = f:GetWidth() or 0
- laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
+ laneH[col] = math_max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
end
end
- laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col]))
+ laneH[col] = math_max(colObj.min or colObj[1] or 0, math_min(laneH[col], colObj.max or colObj[2] or laneH[col]))
else
-- Rel./Abs. width
laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width
end
- extantH = max(0, extantH - laneH[col])
+ extantH = math_max(0, extantH - laneH[col])
end
end
@@ -988,7 +982,7 @@ AceGUI:RegisterLayout("Table",
child:DoLayout()
end
- rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
+ rowV = math_max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
end
end
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
index 79e89c892..bf1eae73d 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
@@ -2,7 +2,7 @@
BlizOptionsGroup Container
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
-------------------------------------------------------------------------------]]
-local Type, Version = "BlizOptionsGroup", 22
+local Type, Version = "BlizOptionsGroup", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -108,6 +108,11 @@ local function Constructor()
frame.default = default
frame.refresh = refresh
+ -- 10.0 support function aliases (cancel has been removed)
+ frame.OnCommit = okay
+ frame.OnDefault = default
+ frame.OnRefresh = refresh
+
frame:SetScript("OnHide", OnHide)
frame:SetScript("OnShow", OnShow)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index 1e1892f24..ca9089015 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
Frame Container
-------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 28
+local Type, Version = "Frame", 30
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -13,10 +13,6 @@ local wipe = table.wipe
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
@@ -190,7 +186,11 @@ local function Constructor()
frame:SetFrameLevel(100) -- Lots of room to draw under it
frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0, 0, 0, 1)
- frame:SetMinResize(400, 200)
+ if frame.SetResizeBounds then -- WoW 10.0
+ frame:SetResizeBounds(400, 200)
+ else
+ frame:SetMinResize(400, 200)
+ end
frame:SetToplevel(true)
frame:SetScript("OnShow", Frame_OnShow)
frame:SetScript("OnHide", Frame_OnClose)
@@ -271,7 +271,7 @@ local function Constructor()
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
- local x = 0.1 * 8/17
+ x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame", nil, frame)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index e87c8b038..8a5756f89 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -2,7 +2,7 @@
TabGroup Container
Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 37
+local Type, Version = "TabGroup", 38
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -14,10 +14,6 @@ local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-
-- local upvalue storage used by BuildTabs
local widths = {}
local rowwidths = {}
@@ -26,6 +22,143 @@ local rowends = {}
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
+
+local function PanelTemplates_TabResize(tab, padding, absoluteSize, minWidth, maxWidth, absoluteTextSize)
+ local tabName = tab:GetName();
+
+ local buttonMiddle = tab.Middle or tab.middleTexture or _G[tabName.."Middle"];
+ local buttonMiddleDisabled = tab.MiddleDisabled or (tabName and _G[tabName.."MiddleDisabled"]);
+ local left = tab.Left or tab.leftTexture or _G[tabName.."Left"];
+ local sideWidths = 2 * left:GetWidth();
+ local tabText = tab.Text or _G[tab:GetName().."Text"];
+ local highlightTexture = tab.HighlightTexture or (tabName and _G[tabName.."HighlightTexture"]);
+
+ local width, tabWidth;
+ local textWidth;
+ if ( absoluteTextSize ) then
+ textWidth = absoluteTextSize;
+ else
+ tabText:SetWidth(0);
+ textWidth = tabText:GetWidth();
+ end
+ -- If there's an absolute size specified then use it
+ if ( absoluteSize ) then
+ if ( absoluteSize < sideWidths) then
+ width = 1;
+ tabWidth = sideWidths
+ else
+ width = absoluteSize - sideWidths;
+ tabWidth = absoluteSize
+ end
+ tabText:SetWidth(width);
+ else
+ -- Otherwise try to use padding
+ if ( padding ) then
+ width = textWidth + padding;
+ else
+ width = textWidth + 24;
+ end
+ -- If greater than the maxWidth then cap it
+ if ( maxWidth and width > maxWidth ) then
+ if ( padding ) then
+ width = maxWidth + padding;
+ else
+ width = maxWidth + 24;
+ end
+ tabText:SetWidth(width);
+ else
+ tabText:SetWidth(0);
+ end
+ if (minWidth and width < minWidth) then
+ width = minWidth;
+ end
+ tabWidth = width + sideWidths;
+ end
+
+ if ( buttonMiddle ) then
+ buttonMiddle:SetWidth(width);
+ end
+ if ( buttonMiddleDisabled ) then
+ buttonMiddleDisabled:SetWidth(width);
+ end
+
+ tab:SetWidth(tabWidth);
+
+ if ( highlightTexture ) then
+ highlightTexture:SetWidth(tabWidth);
+ end
+end
+
+local function PanelTemplates_DeselectTab(tab)
+ local name = tab:GetName();
+
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Show();
+ middle:Show();
+ right:Show();
+ --tab:UnlockHighlight();
+ tab:Enable();
+ local text = tab.Text or _G[name.."Text"];
+ text:SetPoint("CENTER", tab, "CENTER", (tab.deselectedTextX or 0), (tab.deselectedTextY or 2));
+
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Hide();
+ middleDisabled:Hide();
+ rightDisabled:Hide();
+end
+
+local function PanelTemplates_SelectTab(tab)
+ local name = tab:GetName();
+
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Hide();
+ middle:Hide();
+ right:Hide();
+ --tab:LockHighlight();
+ tab:Disable();
+ tab:SetDisabledFontObject(GameFontHighlightSmall);
+ local text = tab.Text or _G[name.."Text"];
+ text:SetPoint("CENTER", tab, "CENTER", (tab.selectedTextX or 0), (tab.selectedTextY or -3));
+
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Show();
+ middleDisabled:Show();
+ rightDisabled:Show();
+
+ if GameTooltip:IsOwned(tab) then
+ GameTooltip:Hide();
+ end
+end
+
+local function PanelTemplates_SetDisabledTabState(tab)
+ local name = tab:GetName();
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Show();
+ middle:Show();
+ right:Show();
+ --tab:UnlockHighlight();
+ tab:Disable();
+ tab.text = tab:GetText();
+ -- Gray out text
+ tab:SetDisabledFontObject(GameFontDisableSmall);
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Hide();
+ middleDisabled:Hide();
+ rightDisabled:Hide();
+end
+
local function UpdateTabLook(frame)
if frame.disabled then
PanelTemplates_SetDisabledTabState(frame)
@@ -103,11 +236,64 @@ local methods = {
["CreateTab"] = function(self, id)
local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
- local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
+ local tab = CreateFrame("Button", tabname, self.border)
+ tab:SetSize(115, 24)
+ tab.deselectedTextY = -3
+ tab.selectedTextY = -2
+
+ tab.LeftDisabled = tab:CreateTexture(tabname .. "LeftDisabled", "BORDER")
+ tab.LeftDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.LeftDisabled:SetSize(20, 24)
+ tab.LeftDisabled:SetPoint("BOTTOMLEFT", 0, -3)
+ tab.LeftDisabled:SetTexCoord(0, 0.15625, 0, 1.0)
+
+ tab.MiddleDisabled = tab:CreateTexture(tabname .. "MiddleDisabled", "BORDER")
+ tab.MiddleDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.MiddleDisabled:SetSize(88, 24)
+ tab.MiddleDisabled:SetPoint("LEFT", tab.LeftDisabled, "RIGHT")
+ tab.MiddleDisabled:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+ tab.RightDisabled = tab:CreateTexture(tabname .. "RightDisabled", "BORDER")
+ tab.RightDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.RightDisabled:SetSize(20, 24)
+ tab.RightDisabled:SetPoint("LEFT", tab.MiddleDisabled, "RIGHT")
+ tab.RightDisabled:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+ tab.Left = tab:CreateTexture(tabname .. "Left", "BORDER")
+ tab.Left:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Left:SetSize(20, 24)
+ tab.Left:SetPoint("TOPLEFT")
+ tab.Left:SetTexCoord(0, 0.15625, 0, 1.0)
+
+ tab.Middle = tab:CreateTexture(tabname .. "Middle", "BORDER")
+ tab.Middle:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Middle:SetSize(88, 24)
+ tab.Middle:SetPoint("LEFT", tab.Left, "RIGHT")
+ tab.Middle:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+ tab.Right = tab:CreateTexture(tabname .. "Right", "BORDER")
+ tab.Right:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Right:SetSize(20, 24)
+ tab.Right:SetPoint("LEFT", tab.Middle, "RIGHT")
+ tab.Right:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+ tab.Text = tab:CreateFontString(tabname .. "Text")
+ tab:SetFontString(tab.Text)
+
+ tab:SetNormalFontObject(GameFontNormalSmall)
+ tab:SetHighlightFontObject(GameFontHighlightSmall)
+ tab:SetDisabledFontObject(GameFontHighlightSmall)
+ tab:SetHighlightTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight", "ADD")
+ tab.HighlightTexture = tab:GetHighlightTexture()
+ tab.HighlightTexture:ClearAllPoints()
+ tab.HighlightTexture:SetPoint("LEFT", tab, "LEFT", 10, -4)
+ tab.HighlightTexture:SetPoint("RIGHT", tab, "RIGHT", -10, -4)
+ _G[tabname .. "HighlightTexture"] = tab.HighlightTexture
+
tab.obj = self
tab.id = id
- tab.text = _G[tabname .. "Text"]
+ tab.text = tab.Text -- compat
tab.text:ClearAllPoints()
tab.text:SetPoint("LEFT", 14, -3)
tab.text:SetPoint("RIGHT", -12, -3)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index 077b7e37d..ca9b2df25 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,22 +2,18 @@
TreeGroup Container
Container that uses a tree control to switch between groups.
-------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 45
+local Type, Version = "TreeGroup", 47
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
-local math_min, math_max, floor = math.min, math.max, floor
+local math_min, math_max, floor = math.min, math.max, math.floor
local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: FONT_COLOR_CODE_CLOSE
-
-- Recycling functions
local new, del
do
@@ -567,7 +563,11 @@ local methods = {
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable)
end
- treeframe:SetMaxResize(maxtreewidth, 1600)
+ if treeframe.SetResizeBounds then
+ treeframe:SetResizeBounds(100, 1, maxtreewidth, 1600)
+ else
+ treeframe:SetMaxResize(maxtreewidth, 1600)
+ end
end,
["OnHeightSet"] = function(self, height)
@@ -646,8 +646,12 @@ local function Constructor()
treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
treeframe:SetResizable(true)
- treeframe:SetMinResize(100, 1)
- treeframe:SetMaxResize(400, 1600)
+ if treeframe.SetResizeBounds then -- WoW 10.0
+ treeframe:SetResizeBounds(100, 1, 400, 1600)
+ else
+ treeframe:SetMinResize(100, 1)
+ treeframe:SetMaxResize(400, 1600)
+ end
treeframe:SetScript("OnUpdate", FirstFrameUpdate)
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index a9192b34c..5729bfda1 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -7,10 +7,6 @@ local pairs, assert, type = pairs, assert, type
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontNormal
-
----------------
-- Main Frame --
----------------
@@ -21,7 +17,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent
]]
do
local Type = "Window"
- local Version = 6
+ local Version = 8
local function frameOnShow(this)
this.obj:Fire("OnShow")
@@ -186,7 +182,11 @@ do
frame:SetScript("OnShow",frameOnShow)
frame:SetScript("OnHide",frameOnClose)
- frame:SetMinResize(240,240)
+ if frame.SetResizeBounds then -- WoW 10.0
+ frame:SetResizeBounds(240,240)
+ else
+ frame:SetMinResize(240,240)
+ end
frame:SetToplevel(true)
local titlebg = frame:CreateTexture(nil, "BACKGROUND")
@@ -300,7 +300,7 @@ do
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
- local x = 0.1 * 8/17
+ x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame",nil,frame)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index d2adb8889..6e642922e 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -12,10 +12,6 @@ local select, pairs = select, pairs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: SetDesaturation, GameFontHighlight
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -199,14 +195,14 @@ local methods = {
["SetDescription"] = function(self, desc)
if desc then
if not self.desc then
- local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
- desc:ClearAllPoints()
- desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
- desc:SetWidth(self.frame.width - 30)
- desc:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
- desc:SetJustifyH("LEFT")
- desc:SetJustifyV("TOP")
- self.desc = desc
+ local f = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
+ f:ClearAllPoints()
+ f:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
+ f:SetWidth(self.frame.width - 30)
+ f:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
+ f:SetJustifyH("LEFT")
+ f:SetJustifyV("TOP")
+ self.desc = f
end
self.desc:Show()
--self.text:SetFontObject(GameFontNormal)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index f4cab66ba..699d58307 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -11,10 +11,6 @@ local pairs = pairs
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ColorPickerFrame, OpacitySliderFrame
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 9dd4b6036..0ad94f8d9 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1272 2022-08-29 15:56:35Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0")
@@ -41,7 +41,7 @@ local ItemBase = {
-- NOTE: The ItemBase version is added to each item's version number
-- to ensure proper updates on ItemBase changes.
-- Use at least 1000er steps.
- version = 1000,
+ version = 2000,
counter = 0,
}
@@ -178,7 +178,7 @@ function ItemBase.Create(type)
highlight:Hide()
self.highlight = highlight
- local check = frame:CreateTexture("OVERLAY")
+ local check = frame:CreateTexture(nil, "OVERLAY")
check:SetWidth(16)
check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1)
@@ -186,7 +186,7 @@ function ItemBase.Create(type)
check:Hide()
self.check = check
- local sub = frame:CreateTexture("OVERLAY")
+ local sub = frame:CreateTexture(nil, "OVERLAY")
sub:SetWidth(16)
sub:SetHeight(16)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index 4fe2aa4ce..3d8dd115d 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1262 2022-04-07 23:00:32Z funkehdude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1284 2022-09-25 09:15:30Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0")
-- Lua APIs
@@ -11,10 +11,6 @@ local PlaySound = PlaySound
local UIParent, CreateFrame = UIParent, CreateFrame
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
index cc1b6a3f7..85a32a0e0 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
@@ -14,10 +14,6 @@ local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, Get
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
index ce9a889b9..96f7e5b4f 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
@@ -13,10 +13,6 @@ local pairs = pairs
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NOT_BOUND
-
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index 2cf419c61..6bbcf3ba5 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -12,10 +12,6 @@ local max, select, pairs = math.max, select, pairs
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index cda887e7a..c33a98682 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -1,4 +1,4 @@
-local Type, Version = "MultiLineEditBox", 29
+local Type, Version = "MultiLineEditBox", 32
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -10,10 +10,6 @@ local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, Cl
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ACCEPT, ChatFontNormal
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -145,6 +141,14 @@ local function OnVerticalScroll(self, offset)
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
end
+local function OnScrollRangeChanged(self, xrange, yrange)
+ if yrange == 0 then
+ self.obj.editBox:SetHitRectInsets(0, 0, 0, 0)
+ else
+ OnVerticalScroll(self, self:GetVerticalScroll())
+ end
+end
+
local function OnShowFocus(frame)
frame.obj.editBox:SetFocus()
frame:SetScript("OnShow", nil)
@@ -257,8 +261,6 @@ local methods = {
["SetCursorPosition"] = function(self, ...)
return self.editBox:SetCursorPosition(...)
end,
-
-
}
--[[-----------------------------------------------------------------------------
@@ -321,6 +323,7 @@ local function Constructor()
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
+ scrollFrame:HookScript("OnScrollRangeChanged", OnScrollRangeChanged)
local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
editBox:SetAllPoints()
diff --git a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 7687bb02a..8989608fb 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -14,10 +14,6 @@ local tonumber, pairs = tonumber, pairs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -31,13 +27,13 @@ local function UpdateText(self)
end
local function UpdateLabels(self)
- local min, max = (self.min or 0), (self.max or 100)
+ local min_value, max_value = (self.min or 0), (self.max or 100)
if self.ispercent then
- self.lowtext:SetFormattedText("%s%%", (min * 100))
- self.hightext:SetFormattedText("%s%%", (max * 100))
+ self.lowtext:SetFormattedText("%s%%", (min_value * 100))
+ self.hightext:SetFormattedText("%s%%", (max_value * 100))
else
- self.lowtext:SetText(min)
- self.hightext:SetText(max)
+ self.lowtext:SetText(min_value)
+ self.hightext:SetText(max_value)
end
end
@@ -175,13 +171,13 @@ local methods = {
self.label:SetText(text)
end,
- ["SetSliderValues"] = function(self, min, max, step)
+ ["SetSliderValues"] = function(self, min_value, max_value, step)
local frame = self.slider
frame.setup = true
- self.min = min
- self.max = max
+ self.min = min_value
+ self.max = max_value
self.step = step
- frame:SetMinMaxValues(min or 0,max or 100)
+ frame:SetMinMaxValues(min_value or 0,max_value or 100)
UpdateLabels(self)
frame:SetValueStep(step or 1)
if self.value then
diff --git a/Interface/AddOns/LoggerHead/Libs/AceLocale-3.0/AceLocale-3.0.lua b/Interface/AddOns/LoggerHead/Libs/AceLocale-3.0/AceLocale-3.0.lua
index 2ecc0cb8e..e67f82c18 100644
--- a/Interface/AddOns/LoggerHead/Libs/AceLocale-3.0/AceLocale-3.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/AceLocale-3.0/AceLocale-3.0.lua
@@ -1,7 +1,7 @@
--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
-- @class file
-- @name AceLocale-3.0
--- @release $Id: AceLocale-3.0.lua 1035 2011-07-09 03:20:13Z kaelten $
+-- @release $Id: AceLocale-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local MAJOR,MINOR = "AceLocale-3.0", 6
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -12,10 +12,6 @@ if not AceLocale then return end -- no upgrade needed
local assert, tostring, error = assert, tostring, error
local getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GAME_LOCALE, geterrorhandler
-
local gameLocale = GetLocale()
if gameLocale == "enGB" then
gameLocale = "enUS"
@@ -93,7 +89,7 @@ local writedefaultproxy = setmetatable({}, {
function AceLocale:NewLocale(application, locale, isDefault, silent)
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
- local gameLocale = GAME_LOCALE or gameLocale
+ local activeGameLocale = GAME_LOCALE or gameLocale
local app = AceLocale.apps[application]
@@ -111,7 +107,7 @@ function AceLocale:NewLocale(application, locale, isDefault, silent)
AceLocale.appnames[app] = application
end
- if locale ~= gameLocale and not isDefault then
+ if locale ~= activeGameLocale and not isDefault then
return -- nop, we don't need these translations
end
diff --git a/Interface/AddOns/LoggerHead/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua b/Interface/AddOns/LoggerHead/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua
index dc23ef021..9d57b8d57 100644
--- a/Interface/AddOns/LoggerHead/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua
@@ -1,4 +1,4 @@
-
+--@curseforge-project-slug: libdbicon-1-0@
-----------------------------------------------------------------------
-- LibDBIcon-1.0
--
diff --git a/Interface/AddOns/LoggerHead/Libs/LibSink-2.0/LibSink-2.0.lua b/Interface/AddOns/LoggerHead/Libs/LibSink-2.0/LibSink-2.0.lua
index 81e070ad4..18ef30595 100644
--- a/Interface/AddOns/LoggerHead/Libs/LibSink-2.0/LibSink-2.0.lua
+++ b/Interface/AddOns/LoggerHead/Libs/LibSink-2.0/LibSink-2.0.lua
@@ -1,6 +1,7 @@
+--@curseforge-project-slug: libsink-2-0@
--[[
Name: Sink-2.0
-Revision: $Rev: 134 $
+Revision: $Rev: 147 $
Author(s): Funkydude
Description: Library that handles chat output.
Dependencies: LibStub, SharedMedia-3.0 (optional)
@@ -155,7 +156,7 @@ do
L["OUTPUT_DESC"] = "Wohin die Ausgaben dieses Addons geleitet werden sollen."
L["ROUTE"] = "Die Ausgaben dieses Addons werden durch %s geleitet."
L["SCROLL"] = "Unterabschnitt"
- L["SCROLL_DESC"] = [=[Stelle den Unterabschnitt ein, in dem die Nachrichten erscheinen sollen.
+ L["SCROLL_DESC"] = [=[Stelle den Unterabschnitt ein, in dem die Nachrichten erscheinen sollen.
Dies ist nur für manche Ausgaben verfügbar.]=]
L["STICKY"] = "Fixiert"
diff --git a/Interface/AddOns/LoggerHead/LoggerHead.toc b/Interface/AddOns/LoggerHead/LoggerHead.toc
index 3c60b1bec..d664e4d21 100644
--- a/Interface/AddOns/LoggerHead/LoggerHead.toc
+++ b/Interface/AddOns/LoggerHead/LoggerHead.toc
@@ -1,15 +1,16 @@
-## Interface: 90205
+## Interface: 100000
## Title: LoggerHead
## Notes: Automatically turns on the combat log for selected instances
## Notes-ruRU: Автоматически включает запись лога боя в выбранных подземельях
## Author:
## X-Category: Miscellaneous
-## Version: 200
+## Version: 10.0.0
## OptionalDeps: Ace3, LibSink-2.0, LibDBIcon-1.0
## SavedVariables: LoggerHeadDB
## LoadManagers: AddonLoader
## X-LoadOn-Always: delayed
## X-Curse-Project-ID: 14345
+## X-WoWI-ID: 26344
#@no-lib-strip@
Libs\LibStub\LibStub.lua
diff --git a/Interface/AddOns/ParagonBars/CHANGELOG.md b/Interface/AddOns/ParagonBars/CHANGELOG.md
index 7f6c9e317..7d0afd505 100644
--- a/Interface/AddOns/ParagonBars/CHANGELOG.md
+++ b/Interface/AddOns/ParagonBars/CHANGELOG.md
@@ -1,6 +1,8 @@
# ParagonBars
-## [9.2.5](https://github.com/ahakola/ParagonBars/tree/9.2.5) (2022-06-07)
-[Full Changelog](https://github.com/ahakola/ParagonBars/compare/9.2.0...9.2.5) [Previous Releases](https://github.com/ahakola/ParagonBars/releases)
+## [10.0.0](https://github.com/ahakola/ParagonBars/tree/10.0.0) (2022-10-29)
+[Full Changelog](https://github.com/ahakola/ParagonBars/compare/9.2.5...10.0.0) [Previous Releases](https://github.com/ahakola/ParagonBars/releases)
-- .toc bump
+- .toc bump for DF
+- Update packager workflow
+- Dragonflight fixes
diff --git a/Interface/AddOns/ParagonBars/ParagonBars.lua b/Interface/AddOns/ParagonBars/ParagonBars.lua
index fc76f2174..9321b9b08 100644
--- a/Interface/AddOns/ParagonBars/ParagonBars.lua
+++ b/Interface/AddOns/ParagonBars/ParagonBars.lua
@@ -8,40 +8,33 @@
mouse over progressbar like they show on uncapped reputations.
----------------------------------------------------------------------------]]--
-local color = { r = 0.26, g = 0.42, b = 1 } -- GameTooltipTemplate.xml#497
-
-local function hook_ReputationFrame_Update(...) -- ReputationFrame.lua#123
- local numFactions = GetNumFactions()
- local factionOffset = FauxScrollFrame_GetOffset(ReputationListScrollFrame)
-
- for i = 1, NUM_FACTIONS_DISPLAYED do
- local factionIndex = factionOffset + i
- local factionRow = _G["ReputationBar"..i]
- local factionBar = _G["ReputationBar"..i.."ReputationBar"]
-
- if factionIndex <= numFactions then
- local _, _, standingID, _, _, _, _, _, _, _, _, _, _, factionID = GetFactionInfo(factionIndex)
-
- if not standingID == MAX_REPUTATION_REACTION then return end
-
- if factionID and C_Reputation.IsFactionParagon(factionID) then
- local currentValue, threshold, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(factionID)
- if currentValue then
- local value = mod(currentValue, threshold)
- if hasRewardPending then
- value = value + threshold
- end
- factionRow.rolloverText = HIGHLIGHT_FONT_COLOR_CODE.." "..format(REPUTATION_PROGRESS_FORMAT, BreakUpLargeNumbers(value), BreakUpLargeNumbers(threshold))..FONT_COLOR_CODE_CLOSE
-
- factionBar:SetMinMaxValues(0, threshold)
- factionBar:SetValue(value)
- factionBar:SetStatusBarColor(color.r, color.g, color.b)
- end
+local color = { r = 0.26, g = 0.42, b = 1 } -- https://www.townlong-yak.com/framexml/7.2.0/GameTooltipTemplate.xml#497
+
+local function hook_ReputationFrame_Update(factionRow, elementData)
+ local factionIndex = elementData.index
+ local factionContainer = factionRow.Container
+ local factionBar = factionContainer.ReputationBar
+
+ local _, _, standingID, _, _, _, _, _, _, _, _, _, _, factionID = GetFactionInfo(factionIndex)
+
+ if not standingID == MAX_REPUTATION_REACTION then return end
+
+ if factionID and C_Reputation.IsFactionParagon(factionID) then
+ local currentValue, threshold, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(factionID)
+ if currentValue then
+ local value = mod(currentValue, threshold)
+ if hasRewardPending then
+ value = value + threshold
end
+ factionRow.rolloverText = HIGHLIGHT_FONT_COLOR_CODE.." "..format(REPUTATION_PROGRESS_FORMAT, BreakUpLargeNumbers(value), BreakUpLargeNumbers(threshold))..FONT_COLOR_CODE_CLOSE
+
+ factionBar:SetMinMaxValues(0, threshold)
+ factionBar:SetValue(value)
+ factionBar:SetStatusBarColor(color.r, color.g, color.b)
end
end
end
-hooksecurefunc("ReputationFrame_Update", hook_ReputationFrame_Update)
+hooksecurefunc("ReputationFrame_InitReputationRow", hook_ReputationFrame_Update) -- https://www.townlong-yak.com/framexml/10.0.0/ReputationFrame.lua#129
--EOF
\ No newline at end of file
diff --git a/Interface/AddOns/ParagonBars/ParagonBars.toc b/Interface/AddOns/ParagonBars/ParagonBars.toc
index a1e0aedbe..374a4a2dc 100644
--- a/Interface/AddOns/ParagonBars/ParagonBars.toc
+++ b/Interface/AddOns/ParagonBars/ParagonBars.toc
@@ -1,8 +1,8 @@
-## Interface: 90205
+## Interface: 100000
## Author: Sanex (Arathor EU)
## Title: ParagonBars
## Notes: Repurpose ReputationFrame elements to show actual progress as progressbar and in numbers when hovering mouse over progressbars for Paragon reputations.
-## Version: 9.2.5
+## Version: 10.0.0
## RequiredDeps:
## SavedVariables:
diff --git a/Interface/AddOns/Postal/CHANGES.txt b/Interface/AddOns/Postal/CHANGES.txt
index 8801ca58e..2ef26fc1a 100644
--- a/Interface/AddOns/Postal/CHANGES.txt
+++ b/Interface/AddOns/Postal/CHANGES.txt
@@ -1,16 +1,8 @@
------------------------------------------------------------------------
-r529 | Zimzarina | 2022-09-09 17:24:21 +0000 (Fri, 09 Sep 2022) | 1 line
+r536 | Zimzarina | 2022-10-31 15:27:07 +0000 (Mon, 31 Oct 2022) | 1 line
Changed paths:
- M /trunk/Modules/QuickAttach.lua
- M /trunk/Postal.lua
+ M /trunk/Modules/Express.lua
-Updated to support WotLK.
-------------------------------------------------------------------------
-r528 | Zimzarina | 2022-09-09 05:17:22 +0000 (Fri, 09 Sep 2022) | 1 line
-Changed paths:
- M /trunk/Postal.toc
- A /trunk/Postal_Wrath.toc
-
-TOC Update for Retail. Added new TOC file for Wrath Of The Lich King.
+Fixed an issue where attempt to index local 'itemLocation' (a nil value) could occur in Express.lua when clicking on items other then in bags.
------------------------------------------------------------------------
diff --git a/Interface/AddOns/Postal/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Interface/AddOns/Postal/Libs/AceAddon-3.0/AceAddon-3.0.lua
index 46fde43f8..0ea93d19b 100644
--- a/Interface/AddOns/Postal/Libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Interface/AddOns/Postal/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -28,7 +28,7 @@
-- end
-- @class file
-- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local MAJOR, MINOR = "AceAddon-3.0", 13
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -49,10 +49,6 @@ local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local loadstring, assert, error = loadstring, assert, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
-
--[[
xpcall safecall implementation
]]
diff --git a/Interface/AddOns/Postal/Libs/AceDB-3.0/AceDB-3.0.lua b/Interface/AddOns/Postal/Libs/AceDB-3.0/AceDB-3.0.lua
index 647808629..9e84705c5 100644
--- a/Interface/AddOns/Postal/Libs/AceDB-3.0/AceDB-3.0.lua
+++ b/Interface/AddOns/Postal/Libs/AceDB-3.0/AceDB-3.0.lua
@@ -40,7 +40,7 @@
-- end
-- @class file
-- @name AceDB-3.0.lua
--- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $
+-- @release $Id: AceDB-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
@@ -53,10 +53,6 @@ local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-- WoW APIs
local _G = _G
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub
-
AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame")
@@ -98,11 +94,11 @@ local function copyDefaults(dest, src)
-- This is a metatable used for table defaults
local mt = {
-- This handles the lookup and creation of new subtables
- __index = function(t,k)
- if k == nil then return nil end
+ __index = function(t,k2)
+ if k2 == nil then return nil end
local tbl = {}
copyDefaults(tbl, v)
- rawset(t, k, tbl)
+ rawset(t, k2, tbl)
return tbl
end,
}
@@ -115,7 +111,7 @@ local function copyDefaults(dest, src)
end
else
-- Values are not tables, so this is just a simple return
- local mt = {__index = function(t,k) return k~=nil and v or nil end}
+ local mt = {__index = function(t,k2) return k2~=nil and v or nil end}
setmetatable(dest, mt)
end
elseif type(v) == "table" then
diff --git a/Interface/AddOns/Postal/Libs/AceHook-3.0/AceHook-3.0.lua b/Interface/AddOns/Postal/Libs/AceHook-3.0/AceHook-3.0.lua
index ed24c757e..6bfc79870 100644
--- a/Interface/AddOns/Postal/Libs/AceHook-3.0/AceHook-3.0.lua
+++ b/Interface/AddOns/Postal/Libs/AceHook-3.0/AceHook-3.0.lua
@@ -9,7 +9,7 @@
-- make into AceHook.
-- @class file
-- @name AceHook-3.0
--- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $
+-- @release $Id: AceHook-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
@@ -195,7 +195,6 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
registry[self][method] = nil
end
handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
- uid = nil
end
local orig
diff --git a/Interface/AddOns/Postal/Libs/AceLocale-3.0/AceLocale-3.0.lua b/Interface/AddOns/Postal/Libs/AceLocale-3.0/AceLocale-3.0.lua
index 2ecc0cb8e..e67f82c18 100644
--- a/Interface/AddOns/Postal/Libs/AceLocale-3.0/AceLocale-3.0.lua
+++ b/Interface/AddOns/Postal/Libs/AceLocale-3.0/AceLocale-3.0.lua
@@ -1,7 +1,7 @@
--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
-- @class file
-- @name AceLocale-3.0
--- @release $Id: AceLocale-3.0.lua 1035 2011-07-09 03:20:13Z kaelten $
+-- @release $Id: AceLocale-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
local MAJOR,MINOR = "AceLocale-3.0", 6
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -12,10 +12,6 @@ if not AceLocale then return end -- no upgrade needed
local assert, tostring, error = assert, tostring, error
local getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GAME_LOCALE, geterrorhandler
-
local gameLocale = GetLocale()
if gameLocale == "enGB" then
gameLocale = "enUS"
@@ -93,7 +89,7 @@ local writedefaultproxy = setmetatable({}, {
function AceLocale:NewLocale(application, locale, isDefault, silent)
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
- local gameLocale = GAME_LOCALE or gameLocale
+ local activeGameLocale = GAME_LOCALE or gameLocale
local app = AceLocale.apps[application]
@@ -111,7 +107,7 @@ function AceLocale:NewLocale(application, locale, isDefault, silent)
AceLocale.appnames[app] = application
end
- if locale ~= gameLocale and not isDefault then
+ if locale ~= activeGameLocale and not isDefault then
return -- nop, we don't need these translations
end
diff --git a/Interface/AddOns/Postal/Localization.lua b/Interface/AddOns/Postal/Localization.lua
index 4c1922047..7bbee927e 100644
--- a/Interface/AddOns/Postal/Localization.lua
+++ b/Interface/AddOns/Postal/Localization.lua
@@ -240,7 +240,7 @@ L["Help"] = "Hilfe"
L["Herb"] = "Kräuter"
L["In Progress"] = "In Bearbeitung"
L["Inscription"] = "Inschriften"
-L["Jewelcrafting"] = "Juwelenkunst"
+L["Jewelcrafting"] = "Juwelierkunst"
L["Keep free space"] = "Platz freihalten"
L["Leather"] = "Leder"
L["Materials"] = "Materialien"
@@ -268,7 +268,7 @@ L["Other"] = "Andere"
L["Other options"] = "Weitere Optionen"
L["Part %d"] = "Teil %d"
L["Parts"] = "Teile"
-L["Please post bugs or suggestions at the CurseForge forums thread at |cFF00FFFFhttp://www.curseforge.com/wow/addons/postal/issues|r. When posting bugs, indicate your locale and Postal's version number v%s."] = "Bitte melde Fehler oder Anregungen im CurseForge-Forumsthread unter |cFF00FFFFhttp://www.curseforge.com/wow/addons/postal/issues|r. Wenn du Fehler meldest, gebe bitte deine Sprache und Postals Versionsnummer v%s an."
+L["Please post bugs or suggestions at the CurseForge forums thread at |cFF00FFFFhttp://www.curseforge.com/wow/addons/postal/issues|r. When posting bugs, indicate your locale and Postal's version number v%s."] = "Bitte melde Fehler oder Anregungen im CurseForge-Forenproblem unter |cFF00FFFFhttp://www.curseforge.com/wow/addons/postal/issues|r. Wenn du Fehler meldest, gebe bitte deine Sprache und die Versionsnummer v%s von Postal an."
L["Prints the amount of money collected during a mail session."] = "Gibt im Chat aus, wie viel Gold bei einer Nachrichtensitzung am Briefkasten entnommen wurde."
L["Processing Message"] = "Bearbeite Nachricht"
L["Profile"] = "Profil"
diff --git a/Interface/AddOns/Postal/Modules/Express.lua b/Interface/AddOns/Postal/Modules/Express.lua
index 8f938e244..335e7169f 100644
--- a/Interface/AddOns/Postal/Modules/Express.lua
+++ b/Interface/AddOns/Postal/Modules/Express.lua
@@ -11,7 +11,12 @@ local _G = getfenv(0)
function Postal_Express:MAIL_SHOW()
if Postal.db.profile.Express.EnableAltClick and not self:IsHooked(GameTooltip, "OnTooltipSetItem") then
self:HookScript(GameTooltip, "OnTooltipSetItem")
- self:RawHook("ContainerFrameItemButton_OnModifiedClick", true)
+ if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
+ self:RawHook("ContainerFrameItemButton_OnModifiedClick", true)
+ end
+ if Postal.WOWRetail then
+ hooksecurefunc("HandleModifiedItemClick", Postal_Express.HandleModifiedItemClick)
+ end
end
self:RegisterEvent("MAIL_CLOSED", "Reset")
self:RegisterEvent("PLAYER_LEAVING_WORLD", "Reset")
@@ -20,7 +25,9 @@ end
function Postal_Express:Reset(event)
if self:IsHooked(GameTooltip, "OnTooltipSetItem") then
self:Unhook(GameTooltip, "OnTooltipSetItem")
- self:Unhook("ContainerFrameItemButton_OnModifiedClick")
+ if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
+ self:Unhook("ContainerFrameItemButton_OnModifiedClick")
+ end
end
self:UnregisterEvent("MAIL_CLOSED")
self:UnregisterEvent("PLAYER_LEAVING_WORLD")
@@ -110,9 +117,8 @@ function Postal_Express:OnTooltipSetItem(tooltip, ...)
end
end
-function Postal_Express:ContainerFrameItemButton_OnModifiedClick(this, button, ...)
+function Postal_Express:ContainerFrameItemButtonOnModifiedClick(bag, slot, button)
if button == "LeftButton" and IsAltKeyDown() and SendMailFrame:IsVisible() and not CursorHasItem() then
- local bag, slot = this:GetParent():GetID(), this:GetID()
local texture, count = GetContainerItemInfo(bag, slot)
PickupContainerItem(bag, slot)
ClickSendMailItemButton()
@@ -126,7 +132,6 @@ function Postal_Express:ContainerFrameItemButton_OnModifiedClick(this, button, .
end
end
elseif button == "LeftButton" and IsControlKeyDown() and SendMailFrame:IsVisible() and not CursorHasItem() then
- local bag, slot = this:GetParent():GetID(), this:GetID()
local itemid = GetContainerItemID(bag, slot)
if not itemid then return end
local itemlocked = select(3,GetContainerItemInfo(bag,slot))
@@ -180,7 +185,21 @@ function Postal_Express:ContainerFrameItemButton_OnModifiedClick(this, button, .
ClearCursor()
end
else
- return self.hooks["ContainerFrameItemButton_OnModifiedClick"](this, button, ...)
+ return
+ end
+end
+
+function Postal_Express:ContainerFrameItemButton_OnModifiedClick(this, button, ...)
+ local bag, slot = this:GetParent():GetID(), this:GetID()
+ Postal_Express:ContainerFrameItemButtonOnModifiedClick(bag, slot, button)
+ return self.hooks["ContainerFrameItemButton_OnModifiedClick"](this, button, ...)
+end
+
+function Postal_Express.HandleModifiedItemClick(itemLink, itemLocation)
+ if itemLocation ~= nil then -- item location is only not nil for bag item clicks
+ local button = GetMouseButtonClicked()
+ local bag, slot = itemLocation.bagID, itemLocation.slotIndex
+ Postal_Express:ContainerFrameItemButtonOnModifiedClick(bag, slot, button)
end
end
@@ -190,12 +209,16 @@ function Postal_Express.SetEnableAltClick(dropdownbutton, arg1, arg2, checked)
if checked then
if MailFrame:IsVisible() and not self:IsHooked(GameTooltip, "OnTooltipSetItem") then
self:HookScript(GameTooltip, "OnTooltipSetItem")
- self:RawHook("ContainerFrameItemButton_OnModifiedClick", true)
+ if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
+ self:RawHook("ContainerFrameItemButton_OnModifiedClick", true)
+ end
end
else
if self:IsHooked(GameTooltip, "OnTooltipSetItem") then
self:Unhook(GameTooltip, "OnTooltipSetItem")
- self:Unhook("ContainerFrameItemButton_OnModifiedClick")
+ if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
+ self:Unhook("ContainerFrameItemButton_OnModifiedClick")
+ end
end
end
-- A hack to get the next button to disable/enable
diff --git a/Interface/AddOns/Postal/Modules/QuickAttach.lua b/Interface/AddOns/Postal/Modules/QuickAttach.lua
index b3f97801a..0289a65da 100644
--- a/Interface/AddOns/Postal/Modules/QuickAttach.lua
+++ b/Interface/AddOns/Postal/Modules/QuickAttach.lua
@@ -26,16 +26,15 @@ end
-- Create QuickAttach button
local function CreateQAButton(name, texture, classID, subclassID, toolTip)
- local ofsxBase, ofsyBase, ofsyIndex = 376, 0, -40
- local buttonWidth, buttonHeight, scale = 36, 36, 0.8
+ local ofsxBase, ofsyBase, ofsyGap = 0, 0, 0
+ local scale = 0.73 -- gives good results for classic and retail
local TempButton, QAButtonCharName
TempButton = CreateFrame("Button", name, SendMailFrame, "ActionButtonTemplate")
+ local buttonHeight = math.floor(TempButton:GetHeight() + 0.5)
+ TempButton:SetScale(scale)
TempButton.icon:SetTexture(texture)
- TempButton:SetSize(math.floor(buttonWidth * scale), math.floor(buttonHeight * scale))
TempButton:ClearAllPoints()
- TempButton:SetPoint("TOPRIGHT", "SendMailFrame", "TOPLEFT", ofsxBase - (buttonWidth - math.floor(buttonWidth * scale)), ofsyBase + math.floor(ofsyIndex * QAButtonPos * scale))
- TempButton.NormalTexture:SetPoint("TOPLEFT", TempButton ,"TOPLEFT", math.floor(-15 * scale), math.floor(15 * scale))
- TempButton.NormalTexture:SetPoint("BOTTOMRIGHT", TempButton ,"BOTTOMRIGHT", math.floor(15 * scale), math.floor(-15 * scale))
+ TempButton:SetPoint("TOPLEFT", "MailFrame", "TOPRIGHT", ofsxBase, ofsyBase - (buttonHeight + ofsyGap) * QAButtonPos)
TempButton:RegisterForClicks("AnyUp")
TempButton:SetScript("OnClick", function(self, button, down) Postal_QuickAttachButtonClick(button, classID, subclassID) end)
TempButton:SetFrameLevel(TempButton:GetFrameLevel() + 1)
diff --git a/Interface/AddOns/Postal/Modules/Rake.lua b/Interface/AddOns/Postal/Modules/Rake.lua
index ca7a1561e..1f60dc292 100644
--- a/Interface/AddOns/Postal/Modules/Rake.lua
+++ b/Interface/AddOns/Postal/Modules/Rake.lua
@@ -8,6 +8,9 @@ local flag = false
function Postal_Rake:OnEnable()
self:RegisterEvent("MAIL_SHOW")
+ if Postal.WOWRetail then
+ MailFrame:HookScript("OnHide", self.MAIL_CLOSED)
+ end
end
-- Disabling modules unregisters all events/hook automatically
diff --git a/Interface/AddOns/Postal/Modules/Select.lua b/Interface/AddOns/Postal/Modules/Select.lua
index 8c2ac9cb6..2013f02f2 100644
--- a/Interface/AddOns/Postal/Modules/Select.lua
+++ b/Interface/AddOns/Postal/Modules/Select.lua
@@ -105,7 +105,7 @@ function Postal_Select:OnEnable()
--now create the checkboxes
for i = 1, 7 do
if not _G["PostalInboxCB"..i] then
- local CB = CreateFrame("CheckButton", "PostalInboxCB"..i, _G["MailItem"..i], "OptionsCheckButtonTemplate")
+ local CB = CreateFrame("CheckButton", "PostalInboxCB"..i, _G["MailItem"..i], "InterfaceOptionsCheckButtonTemplate")
CB:SetID(i)
CB:SetPoint("RIGHT", "MailItem"..i, "LEFT", 1, -5)
CB:SetWidth(24)
diff --git a/Interface/AddOns/Postal/Postal.toc b/Interface/AddOns/Postal/Postal.toc
index dfdf7cd80..07a1232e7 100644
--- a/Interface/AddOns/Postal/Postal.toc
+++ b/Interface/AddOns/Postal/Postal.toc
@@ -1,9 +1,9 @@
-## Interface: 90207
+## Interface: 100000
## Title: Postal
-## Version: v3.8.2
-## X-Build: 529
-## X-ReleaseDate: 2022-09-09T17:24:21Z
-## X-Revision: 529
+## Version: v3.8.4
+## X-Build: 536
+## X-ReleaseDate: 2022-10-31T15:27:07Z
+## X-Revision: 536
## Author: Xinhuan
## X-Credits: Ammo, Rabbit, Grennon, Mikk, oscarucb, Jonny aka The_Original_Manbot
## X-Category: Mail
diff --git a/Interface/AddOns/Postal/Postal_TBC.toc b/Interface/AddOns/Postal/Postal_TBC.toc
index 3d6122103..c61d76e38 100644
--- a/Interface/AddOns/Postal/Postal_TBC.toc
+++ b/Interface/AddOns/Postal/Postal_TBC.toc
@@ -1,9 +1,9 @@
## Interface: 20504
## Title: Postal
-## Version: v3.8.2
-## X-Build: 529
-## X-ReleaseDate: 2022-09-09T17:24:21Z
-## X-Revision: 529
+## Version: v3.8.4
+## X-Build: 536
+## X-ReleaseDate: 2022-10-31T15:27:07Z
+## X-Revision: 536
## Author: Xinhuan
## X-Credits: Ammo, Rabbit, Grennon, Mikk, oscarucb, Jonny aka The_Original_Manbot
## X-Category: Mail
diff --git a/Interface/AddOns/Postal/Postal_Vanilla.toc b/Interface/AddOns/Postal/Postal_Vanilla.toc
index d6a081e54..14bf2b16d 100644
--- a/Interface/AddOns/Postal/Postal_Vanilla.toc
+++ b/Interface/AddOns/Postal/Postal_Vanilla.toc
@@ -1,9 +1,9 @@
## Interface: 11403
## Title: Postal
-## Version: v3.8.2
-## X-Build: 529
-## X-ReleaseDate: 2022-09-09T17:24:21Z
-## X-Revision: 529
+## Version: v3.8.4
+## X-Build: 536
+## X-ReleaseDate: 2022-10-31T15:27:07Z
+## X-Revision: 536
## Author: Xinhuan
## X-Credits: Ammo, Rabbit, Grennon, Mikk, oscarucb, Jonny aka The_Original_Manbot
## X-Category: Mail
diff --git a/Interface/AddOns/Postal/Postal_Wrath.toc b/Interface/AddOns/Postal/Postal_Wrath.toc
index 9470223d4..c09a4321e 100644
--- a/Interface/AddOns/Postal/Postal_Wrath.toc
+++ b/Interface/AddOns/Postal/Postal_Wrath.toc
@@ -1,9 +1,9 @@
## Interface: 30400
## Title: Postal
-## Version: v3.8.2
-## X-Build: 529
-## X-ReleaseDate: 2022-09-09T17:24:21Z
-## X-Revision: 529
+## Version: v3.8.4
+## X-Build: 536
+## X-ReleaseDate: 2022-10-31T15:27:07Z
+## X-Revision: 536
## Author: Xinhuan
## X-Credits: Ammo, Rabbit, Grennon, Mikk, oscarucb, Jonny aka The_Original_Manbot
## X-Category: Mail
diff --git a/Interface/AddOns/Rematch/Cards/Notes.xml b/Interface/AddOns/Rematch/Cards/Notes.xml
index 07f14c249..26cc7773b 100644
--- a/Interface/AddOns/Rematch/Cards/Notes.xml
+++ b/Interface/AddOns/Rematch/Cards/Notes.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/Interface/AddOns/Rematch/Cards/PetCard.xml b/Interface/AddOns/Rematch/Cards/PetCard.xml
index 946594a03..bb58fbfb9 100644
--- a/Interface/AddOns/Rematch/Cards/PetCard.xml
+++ b/Interface/AddOns/Rematch/Cards/PetCard.xml
@@ -198,7 +198,7 @@
-
+
diff --git a/Interface/AddOns/Rematch/Cards/WinRecord.xml b/Interface/AddOns/Rematch/Cards/WinRecord.xml
index 6b0146c6b..c6616b793 100644
--- a/Interface/AddOns/Rematch/Cards/WinRecord.xml
+++ b/Interface/AddOns/Rematch/Cards/WinRecord.xml
@@ -116,23 +116,11 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
@@ -308,7 +301,7 @@
- self.InsetBg:SetPoint("BOTTOMRIGHT",-6,26)
+ self.InsetBg:SetPoint("BOTTOMRIGHT",-5,26)
self:StartMoving()
diff --git a/Interface/AddOns/Rematch/Frames/Configure.lua b/Interface/AddOns/Rematch/Frames/Configure.lua
index d44a9b41b..fd537d957 100644
--- a/Interface/AddOns/Rematch/Frames/Configure.lua
+++ b/Interface/AddOns/Rematch/Frames/Configure.lua
@@ -71,7 +71,7 @@ function frame:ConfigureFrame()
-- frame.TitleBar:SetShown(not settings.Minimized or not settings.MiniMinimized)
-- frame.PanelTabs:SetShown(not settings.Minimized or not settings.MiniMinimized)
frame:UpdateSinglePanelButton()
- frame.TitleText:SetPoint("TOP",settings.Minimized and -10 or 0,-5)
+ --frame.Title:SetPoint("TOP",settings.Minimized and -10 or 0,-5)
-- set the size of the whole standalone window
frame:SetSize(config.frameWidth,config.frameHeight)
@@ -84,8 +84,6 @@ function frame:ConfigureFrame()
-- if toolbar buttons are at the bottom, show the "streaks" behind them
frame.BottomTileStreaks:SetShown(bottomToolbar)
- frame.ShadowCornerBottomLeft:SetShown(bottomToolbar)
- frame.ShadowCornerBottomRight:SetShown(bottomToolbar)
-- if a pet is on the cursor, sync the slot glows
local petID = rematch:GetCursorPet()
diff --git a/Interface/AddOns/Rematch/Frames/Frame.lua b/Interface/AddOns/Rematch/Frames/Frame.lua
index fed976c63..faa720951 100644
--- a/Interface/AddOns/Rematch/Frames/Frame.lua
+++ b/Interface/AddOns/Rematch/Frames/Frame.lua
@@ -16,7 +16,7 @@ rematch:InitModule(function()
for i=1,4 do
frame.PanelTabs.Tabs[i]:SetScript("OnClick",frame.PanelTabOnClick)
end
- frame.TitleText:SetText(L["Rematch"])
+ frame.Title:SetText(L["Rematch"])
frame.TitleBar.SinglePanelButton.tooltipTitle = L["Toggle Single Panel Mode"]
frame.TitleBar.SinglePanelButton.tooltipBody = L["Toggle between one panel or two panels side by side."]
end)
diff --git a/Interface/AddOns/Rematch/Frames/Frame.xml b/Interface/AddOns/Rematch/Frames/Frame.xml
index 6dd8cbed9..2eb43f73d 100644
--- a/Interface/AddOns/Rematch/Frames/Frame.xml
+++ b/Interface/AddOns/Rematch/Frames/Frame.xml
@@ -11,7 +11,7 @@
-
-
+
diff --git a/Interface/AddOns/Rematch/Textures/headers.tga b/Interface/AddOns/Rematch/Textures/headers.tga
new file mode 100644
index 000000000..dac12a950
Binary files /dev/null and b/Interface/AddOns/Rematch/Textures/headers.tga differ
diff --git a/Interface/AddOns/Rematch/Widgets/PanelTabs.lua b/Interface/AddOns/Rematch/Widgets/PanelTabs.lua
index 63ff2d0eb..89ea6cd6d 100644
--- a/Interface/AddOns/Rematch/Widgets/PanelTabs.lua
+++ b/Interface/AddOns/Rematch/Widgets/PanelTabs.lua
@@ -13,7 +13,7 @@ function rematch:SetupPanelTabs(frame,activeIndex,...)
totalWidth = totalWidth + 63
local index = button:GetID()
if index==1 then
- button:SetPoint("TOPLEFT",3,frame==rematch.Frame.PanelTabs and 0 or 1)
+ button:SetPoint("TOPLEFT",3,frame==rematch.Frame.PanelTabs and 3 or 1)
elseif index>1 then
button:SetPoint("LEFT",frame.Tabs[index-1],"RIGHT",-3,0)
end
diff --git a/Interface/AddOns/Rematch/changelog.txt b/Interface/AddOns/Rematch/changelog.txt
index 80af29de1..bcabd2a7f 100644
--- a/Interface/AddOns/Rematch/changelog.txt
+++ b/Interface/AddOns/Rematch/changelog.txt
@@ -1,3 +1,8 @@
+10/30/2022 version 4.14.4
+- Updated appearance of option list and target list headers.
+- Updated appearance of frame titlebar/borders for main window, pet card, notes, win record and dialogs.
+- Titlebar buttons adjusted to more precisely match close buttons.
+
10/28/2022 version 4.14.3
- Fix for potential lua errors due to C_Timer calls.
- Names in the keybindings interface changed for Rematch keybinds.
diff --git a/Interface/AddOns/Sorted/Category.lua b/Interface/AddOns/Sorted/Category.lua
index 7e99ae7b1..373309353 100644
--- a/Interface/AddOns/Sorted/Category.lua
+++ b/Interface/AddOns/Sorted/Category.lua
@@ -5,13 +5,16 @@ S.Category = {}
-- Table of attributes and their filter methods
S.Category.attributesTable = {
- --[[
["NAME"] = {
["name"] = NAME,
["attribute"] = "name",
- ["type"] = "STRINGS"
+ ["type"] = "STRINGS",
+ ["func"] = function(value, itemData)
+ if itemData.name then
+ return S.Utils.BasicTextSearch(value, itemData.name)
+ end
+ end
},
- ]]
["TYPE"] = {
["name"] = TYPE,
["type"] = "VALUES",
@@ -352,18 +355,13 @@ function S.Category.GetAttribute(id, attributeKey, guid)
if data then
return data
else
- return {}
+ return nil
end
end
-function S.Category.ToggleAttributeValue(id, attributeKey, valueKey, guid)
+-- Deletes an attribute table if all values are empty
+local function DeleteEmptyAttributeTable(id, attributeKey, guid)
local data = Data(id, guid).attributes
- if not data[attributeKey] then
- data[attributeKey] = {}
- end
- data[attributeKey][valueKey] = not data[attributeKey][valueKey]
-
- -- Delete the table if all values are false
local attributeHasData = false
for k,v in pairs(data[attributeKey]) do
if v then
@@ -373,29 +371,78 @@ function S.Category.ToggleAttributeValue(id, attributeKey, valueKey, guid)
if not attributeHasData then
data[attributeKey] = nil
end
+end
+
+function S.Category.ToggleAttributeValue(id, attributeKey, valueKey, guid)
+ local data = Data(id, guid).attributes
+ if not data[attributeKey] then
+ data[attributeKey] = {}
+ end
+ data[attributeKey][valueKey] = not data[attributeKey][valueKey]
+
+ -- Delete the table if all values are false
+ DeleteEmptyAttributeTable(id, attributeKey)
S.Utils.TriggerEvent("SettingChanged-categories2")
S.Utils.TriggerEvent("CategorySelected")
end
+function S.Category.SetAttributeString(id, attributeKey, stringIndex, stringText, guid)
+ local data = Data(id, guid).attributes
+ if not data[attributeKey] then
+ data[attributeKey] = {}
+ end
+ if #stringText == 0 then
+ -- It's empty, so if it exists in the table, delete it, shuffling up all the later strings
+ local numStrings = #data[attributeKey]
+ if stringIndex <= numStrings then
+ for i = stringIndex, numStrings - 1 do
+ data[attributeKey][i] = data[attributeKey][i + 1]
+ end
+ data[attributeKey][numStrings] = nil
+ end
+ else
+ data[attributeKey][stringIndex] = stringText
+ end
+
+ DeleteEmptyAttributeTable(id, attributeKey)
+end
+
function S.Category.Filter(id, itemData, guid)
local data = Data(id, guid).attributes
for attributeKey, attribute in pairs(data) do
- local filtered = false
- local func = S.Category.attributesTable[attributeKey].func
- local values = S.Category.attributesTable[attributeKey].values
- for value, enabled in pairs(attribute) do
- if enabled then
- if func(values[value].value, itemData) then
+ if S.Category.attributesTable[attributeKey].type == "VALUES" then
+ local filtered = false
+ local func = S.Category.attributesTable[attributeKey].func
+ local values = S.Category.attributesTable[attributeKey].values
+
+ for value, enabled in pairs(attribute) do
+ if enabled then
+ if func(values[value].value, itemData) then
+ filtered = true
+ end
+ end
+ end
+
+ if not filtered then
+ return true
+ end
+
+ elseif S.Category.attributesTable[attributeKey].type == "STRINGS" then
+ local func = S.Category.attributesTable[attributeKey].func
+ local filtered = false
+ for _, s in pairs(attribute) do
+ if func(s, itemData) then
filtered = true
end
end
- end
- if not filtered then
- return true
+ if not filtered then
+ return true
+ end
+
end
end
diff --git a/Interface/AddOns/Sorted/Data.lua b/Interface/AddOns/Sorted/Data.lua
index d3fd63067..879edc029 100644
--- a/Interface/AddOns/Sorted/Data.lua
+++ b/Interface/AddOns/Sorted/Data.lua
@@ -4,11 +4,13 @@ local pairs, ipairs, string, type, time = pairs, ipairs, string, type, time
-- Use new APIs
local useNewContainerAPI = false
local ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots = ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots
-if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
-if C_Container.GetContainerItemInfo then useNewContainerAPI = true; GetContainerItemInfo = C_Container.GetContainerItemInfo end
-if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
-if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
-if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+if C_Container then
+ if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
+ if C_Container.GetContainerItemInfo then useNewContainerAPI = true; GetContainerItemInfo = C_Container.GetContainerItemInfo end
+ if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
+ if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
+ if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+end
S.Data = {}
diff --git a/Interface/AddOns/Sorted/EntryButton_Currency.lua b/Interface/AddOns/Sorted/EntryButton_Currency.lua
index 65a45e435..ee62ac97e 100644
--- a/Interface/AddOns/Sorted/EntryButton_Currency.lua
+++ b/Interface/AddOns/Sorted/EntryButton_Currency.lua
@@ -138,33 +138,48 @@ function S.CreateCurrencyEntry(parent)
local f = CreateFrame("FRAME", "", self)
self.quantityString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.quantityString:SetPoint("RIGHT", -2, 0)
+ self.quantityString:SetPoint("TOPLEFT", 2, -4)
+ self.quantityString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.quantityString:SetJustifyH("RIGHT")
+ self.quantityString:SetJustifyV("MIDDLE")
self.quantityString:SetTextColor(0.96, 0.9, 0.82, 1)
self:AddFrameToColumn(f, "QUANTITY")
local f = CreateFrame("FRAME", "", self)
self.maxQuantityString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.maxQuantityString:SetPoint("LEFT", 3, -1)
+ self.maxQuantityString:SetPoint("TOPLEFT", 2, -4)
+ self.maxQuantityString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.maxQuantityString:SetJustifyH("LEFT")
+ self.maxQuantityString:SetJustifyV("MIDDLE")
self.maxQuantityString:SetTextColor(0.96, 0.9, 0.82, 1)
self.maxQuantityString:SetTextScale(0.9)
self:AddFrameToColumn(f, "MAX-QUANTITY")
local f = CreateFrame("FRAME", "", self)
self.weeklyQuantityString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.weeklyQuantityString:SetPoint("RIGHT", -2, 0)
+ self.weeklyQuantityString:SetPoint("TOPLEFT", 2, -4)
+ self.weeklyQuantityString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.weeklyQuantityString:SetJustifyH("RIGHT")
+ self.weeklyQuantityString:SetJustifyV("MIDDLE")
self.weeklyQuantityString:SetTextColor(0.96, 0.9, 0.82, 1)
self:AddFrameToColumn(f, "WEEKLY-QUANTITY")
local f = CreateFrame("FRAME", "", self)
self.maxWeeklyQuantityString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.maxWeeklyQuantityString:SetPoint("LEFT", 3, -1)
+ self.maxWeeklyQuantityString:SetPoint("TOPLEFT", 2, -4)
+ self.maxWeeklyQuantityString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.maxWeeklyQuantityString:SetJustifyH("LEFT")
+ self.maxWeeklyQuantityString:SetJustifyV("MIDDLE")
self.maxWeeklyQuantityString:SetTextColor(0.96, 0.9, 0.82, 1)
self.maxWeeklyQuantityString:SetTextScale(0.9)
self:AddFrameToColumn(f, "MAX-WEEKLY-QUANTITY")
local f = CreateFrame("FRAME", "", self)
self.categoryString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.categoryString:SetPoint("LEFT", 2, 0)
+ self.categoryString:SetPoint("TOPLEFT", 2, -4)
+ self.categoryString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.categoryString:SetJustifyH("LEFT")
+ self.categoryString:SetJustifyV("MIDDLE")
self.categoryString:SetTextColor(0.96, 0.9, 0.82, 1)
self:AddFrameToColumn(f, "CATEGORY")
diff --git a/Interface/AddOns/Sorted/EntryButton_Item.lua b/Interface/AddOns/Sorted/EntryButton_Item.lua
index de15b6257..d2a709860 100644
--- a/Interface/AddOns/Sorted/EntryButton_Item.lua
+++ b/Interface/AddOns/Sorted/EntryButton_Item.lua
@@ -2,8 +2,10 @@ local _, S = ...
local pairs, ipairs, string, type, time, GetTime = pairs, ipairs, string, type, time, GetTime
local GetContainerItemCooldown, ShowContainerSellCursor = GetContainerItemCooldown, ShowContainerSellCursor
-if C_Container.GetContainerItemCooldown then GetContainerItemCooldown = C_Container.GetContainerItemCooldown end
-if C_Container.ShowContainerSellCursor then ShowContainerSellCursor = C_Container.ShowContainerSellCursor end
+if C_Container then
+ if C_Container.GetContainerItemCooldown then GetContainerItemCooldown = C_Container.GetContainerItemCooldown end
+ if C_Container.ShowContainerSellCursor then ShowContainerSellCursor = C_Container.ShowContainerSellCursor end
+end
local WHITE = CreateColor(1, 1, 1)
local GREY = CreateColor(0.2, 0.2, 0.2)
@@ -565,8 +567,10 @@ function S.CreateItemEntry(list, template)
f = CreateFrame("FRAME", nil, self)
self.quantityString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
- self.quantityString:SetPoint("RIGHT", -2, 0)
- self.quantityString:SetTextColor(0.96, 0.9, 0.82, 1)
+ self.quantityString:SetPoint("TOPLEFT", 2, -4)
+ self.quantityString:SetPoint("BOTTOMRIGHT", -2, 4)
+ self.quantityString:SetJustifyH("RIGHT")
+ self.quantityString:SetJustifyV("MIDDLE")
self:AddFrameToColumn(f, "QUANTITY")
f = CreateFrame("FRAME", nil, self)
@@ -618,6 +622,9 @@ function S.CreateItemEntry(list, template)
self.valueIcon:SetPoint("RIGHT", -2, 0)
self.valueString = f:CreateFontString(nil, "OVERLAY", "SortedFont")
self.valueString:SetPoint("RIGHT", self.valueIcon, "LEFT", -2, 0)
+ self.valueString:SetPoint("LEFT", 2, 0)
+ self.valueString:SetHeight(1)
+ self.valueString:SetJustifyH("RIGHT")
self:AddFrameToColumn(f, "VALUE")
f = CreateFrame("FRAME", nil, self)
diff --git a/Interface/AddOns/Sorted/List.lua b/Interface/AddOns/Sorted/List.lua
index 359b8251e..94f76f386 100644
--- a/Interface/AddOns/Sorted/List.lua
+++ b/Interface/AddOns/Sorted/List.lua
@@ -818,7 +818,8 @@ local function PositionColumns(self)
local doCombineStacks = self.canCombineStacks and S.Settings.Get("combineStacks") == 1
-- Find the middle 'name' column which expands to fill the remaining space
for i,v in ipairs(self:GetColumnOrder()) do
- if not self.columns[v]:GetWidth() then
+ local key = self:GetColumnOrder()[i]
+ if key == "NAME" then
nameColumnIndex = i
nameColumnButton = self.columnHeadings[v]
nameColumnButton:SetPoint("TOP")
@@ -834,6 +835,13 @@ local function PositionColumns(self)
button:ClearAllPoints()
button:SetPoint("TOP", self.head)
button:SetPoint("BOTTOM", self.head)
+
+ -- Resize handle goes on the right
+ if button.resizeButton then
+ button.resizeButton:SetPoint("LEFT", button, "RIGHT", -3, 0)
+ button.resizeButton.invert = false
+ end
+
if lastEnabledColumnButton then
button:SetPoint("LEFT", lastEnabledColumnButton, "RIGHT")
else
@@ -843,7 +851,7 @@ local function PositionColumns(self)
button:SetPoint("LEFT", self.head)
end
end
- button:SetWidth(column:GetWidth())
+ button:SetWidth(column:GetWidth(key))
lastEnabledColumnButton = button
end
end
@@ -861,12 +869,19 @@ local function PositionColumns(self)
button:ClearAllPoints()
button:SetPoint("TOP", self.head)
button:SetPoint("BOTTOM", self.head)
+
+ -- Resize handle goes on the left
+ if button.resizeButton then
+ button.resizeButton:SetPoint("LEFT", -3, 0)
+ button.resizeButton.invert = true
+ end
+
if lastEnabledColumnButton then
button:SetPoint("RIGHT", lastEnabledColumnButton, "LEFT")
else
button:SetPoint("RIGHT", self.head)
end
- button:SetWidth(column:GetWidth())
+ button:SetWidth(column:GetWidth(key))
lastEnabledColumnButton = button
end
end
@@ -934,77 +949,81 @@ local function OnDropdownGroupingEntryClick(self)
end
end
local function ColumnOnClick(self, button, down)
- if button == "LeftButton" then
- local cs = self.list:GetColumnSettings()
- local col = self.list.columns[self.key]
- if col.sortMethods then
- if cs.selectedColumn == self.key then
- if not cs.sortAsc then
- cs.sortAsc = true
+ -- Don't trigger a click if the column has been dragged around
+ if not self.list.movedColumn then
+
+ if button == "LeftButton" then
+ local cs = self.list:GetColumnSettings()
+ local col = self.list.columns[self.key]
+ if col.sortMethods then
+ if cs.selectedColumn == self.key then
+ if not cs.sortAsc then
+ cs.sortAsc = true
+ else
+ cs.sortAsc = false
+ cs.sortMethod = cs.sortMethod + 1
+ if not col.sortMethods[cs.sortMethod] then
+ cs.sortMethod = 1
+ end
+ end
else
+ cs.selectedColumn = self.key
cs.sortAsc = false
- cs.sortMethod = cs.sortMethod + 1
- if not col.sortMethods[cs.sortMethod] then
- cs.sortMethod = 1
- end
+ cs.sortMethod = 1
end
- else
- cs.selectedColumn = self.key
- cs.sortAsc = false
- cs.sortMethod = 1
- end
- S.Utils.TriggerEvent("SortingChanged")
- elseif self.key == "FAVORITES" then
- cs.favoritesOnTop = not cs.favoritesOnTop
- S.Utils.TriggerEvent("SortingChanged")
- S.Utils.TriggerEvent("ColumnsChanged")
- end
- elseif button == "RightButton" then
- -- Dropdown menu
- if S.Dropdown.IsShown() then
- S.Dropdown.Hide()
- else
- S.Dropdown.Reset()
-
- S.Dropdown.AddEntry(S.Localize("CONFIG_GROUPING"), nil, nil, nil, S.Utils.GetButtonTextColor())
- local dropdownEntries = {}
- for k,v in pairs(self.list.groups) do
- table.insert(dropdownEntries, {
- ["key"] = k,
- ["name"] = v.name
- })
- end
- table.sort(dropdownEntries, function(a,b) return a.name < b.name end)
- for i,v in ipairs(dropdownEntries) do
- S.Dropdown.AddEntry(v.name, OnDropdownGroupingEntryClick, self.list, v.key)
- S.Dropdown.AddRadioButton(self.list:GetGrouping() == v.key)
+ S.Utils.TriggerEvent("SortingChanged")
+ elseif self.key == "FAVORITES" then
+ cs.favoritesOnTop = not cs.favoritesOnTop
+ S.Utils.TriggerEvent("SortingChanged")
+ S.Utils.TriggerEvent("ColumnsChanged")
end
+ elseif button == "RightButton" then
+ -- Dropdown menu
+ if S.Dropdown.IsShown() then
+ S.Dropdown.Hide()
+ else
+ S.Dropdown.Reset()
- S.Dropdown.AddEntry(S.Localize("CONFIG_COLUMNS"), nil, nil, nil, S.Utils.GetButtonTextColor())
- dropdownEntries = {}
- for k,v in pairs(self.list.columns) do
- if v:GetWidth() then -- Don't allow the name column to be disabled. It can be identified because it has no defined width
- local name = v.name
- if v.sortMethods then
- if v.sortMethods[1].title ~= name and #v.sortMethods[1].title > 0 then
- name = name.." ("..v.sortMethods[1].title..")"
- end
- end
+ S.Dropdown.AddEntry(S.Localize("CONFIG_GROUPING"), nil, nil, nil, S.Utils.GetButtonTextColor())
+ local dropdownEntries = {}
+ for k,v in pairs(self.list.groups) do
table.insert(dropdownEntries, {
["key"] = k,
- ["name"] = name
+ ["name"] = v.name
})
end
- end
- table.sort(dropdownEntries, function(a,b) return a.name < b.name end)
- for i,v in ipairs(dropdownEntries) do
- S.Dropdown.AddEntry(v.name, OnDropdownColumnEntryClick, self.list, v.key)
- S.Dropdown.AddCheckbox(self.list:ColumnEnabled(v.key))
- end
+ table.sort(dropdownEntries, function(a,b) return a.name < b.name end)
+ for i,v in ipairs(dropdownEntries) do
+ S.Dropdown.AddEntry(v.name, OnDropdownGroupingEntryClick, self.list, v.key)
+ S.Dropdown.AddRadioButton(self.list:GetGrouping() == v.key)
+ end
- local x,y = GetCursorPosition()
- x,y = x/UIParent:GetEffectiveScale(), y/UIParent:GetEffectiveScale()
- S.Dropdown.Show(UIParent, "TOPLEFT", "BOTTOMLEFT", x, y)
+ S.Dropdown.AddEntry(S.Localize("CONFIG_COLUMNS"), nil, nil, nil, S.Utils.GetButtonTextColor())
+ dropdownEntries = {}
+ for k,v in pairs(self.list.columns) do
+ if v:GetWidth() then -- Don't allow the name column to be disabled. It can be identified because it has no defined width
+ local name = v.name
+ if v.sortMethods then
+ if v.sortMethods[1].title ~= name and #v.sortMethods[1].title > 0 then
+ name = name.." ("..v.sortMethods[1].title..")"
+ end
+ end
+ table.insert(dropdownEntries, {
+ ["key"] = k,
+ ["name"] = name
+ })
+ end
+ end
+ table.sort(dropdownEntries, function(a,b) return a.name < b.name end)
+ for i,v in ipairs(dropdownEntries) do
+ S.Dropdown.AddEntry(v.name, OnDropdownColumnEntryClick, self.list, v.key)
+ S.Dropdown.AddCheckbox(self.list:ColumnEnabled(v.key))
+ end
+
+ local x,y = GetCursorPosition()
+ x,y = x/UIParent:GetEffectiveScale(), y/UIParent:GetEffectiveScale()
+ S.Dropdown.Show(UIParent, "TOPLEFT", "BOTTOMLEFT", x, y)
+ end
end
end
end
@@ -1028,8 +1047,9 @@ local function GetMinWidth(self)
local width = 100 -- Effectively the minimum width of the name column
for key, col in pairs(self.columns) do
if self:ColumnEnabled(key) then
- if col:GetWidth() then
- width = width + col:GetWidth()
+ local colWidth = col:GetWidth(key)
+ if colWidth then
+ width = width + colWidth
end
end
end
@@ -1105,10 +1125,60 @@ local function CreateColumnButton(self, key)
b:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Column-Heading-Highlight")
b:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\Column-Heading-Highlight")
b.nameString = b:CreateFontString(nil, "OVERLAY", "SortedFont")
- b.nameString:SetPoint("CENTER")
+ b.nameString:SetPoint("LEFT")
+ b.nameString:SetPoint("RIGHT")
+ b.nameString:SetHeight(1)
+
+ if self.columns[key].width then
+ b.resizeButton = CreateFrame("BUTTON", "", b)
+ b.resizeButton:SetPoint("TOP")
+ b.resizeButton:SetPoint("BOTTOM")
+ b.resizeButton:SetWidth(6)
+ b.resizeButton:SetFrameLevel(b:GetFrameLevel() + 10)
+ b.resizeButton:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Close-Button-Highlight")
+ b.resizeButton:GetHighlightTexture():SetTexCoord(0, 1, 0.3, 0.7)
+ b.resizeButton:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\Close-Button-Highlight")
+ b.resizeButton:GetPushedTexture():SetBlendMode("ADD")
+ b.resizeButton:GetPushedTexture():SetTexCoord(0, 1, 0.3, 0.7)
+ b.resizeButton.key = key
+ b.resizeButton.list = self
+ b.resizeButton:SetScript("OnMouseDown", function(self)
+ local settings = self.list:GetColumnSettings()
+ if not settings.widths then
+ settings.widths = {}
+ end
+ if not settings.widths[self.key] then
+ settings.widths[self.key] = self.list.columns[self.key].width
+ end
+ self.x, self.y = GetCursorPosition()
+ self.x = self.x / self:GetEffectiveScale()
+ self.y = self.y / self:GetEffectiveScale()
+ self.startWidth = settings.widths[self.key]
+
+ self:SetScript("OnUpdate", function(self)
+ local x, y = GetCursorPosition()
+ x = x / self:GetEffectiveScale()
+ y = y / self:GetEffectiveScale()
+ if self.invert then
+ settings.widths[self.key] = self.startWidth - (x - self.x)
+ else
+ settings.widths[self.key] = self.startWidth + (x - self.x)
+ end
+ if settings.widths[self.key] < 16 then
+ settings.widths[self.key] = 16
+ end
+ self.list:PositionColumns()
+ end)
+ end)
+ b.resizeButton:SetScript("OnMouseUp", function(self)
+ self:SetScript("OnUpdate", nil)
+ S.primaryFrame:UpdateMinSize()
+ S.primaryFrame.sideFrame:UpdateMinSize()
+ end)
+ end
b:RegisterForClicks("LeftButtonUp", "RightButtonUp")
- b:RegisterForDrag("LeftButton")
+ --b:RegisterForDrag("LeftButton")
b.key = key
b.list = self
@@ -1284,17 +1354,16 @@ function S.CreateList(parent, entryConstructor, tColumns, sColumnSettings, bColu
-- Column dragging
b:SetScript("OnClick", ColumnOnClick)
- b:SetScript("OnDragStart", function(self)
+ b:SetScript("OnMouseDown", function(self)
self.list.dragging = self.key
+ self.list.movedColumn = false
end)
b:SetScript("OnMouseUp", function(self)
self.list.dragging = nil
end)
- b:SetScript("OnDragStop", function(self)
- self.list.dragging = nil
- end)
b:SetScript("OnEnter", function(self)
if self.list.dragging then
+ self.list.movedColumn = true
for i,v in ipairs(self.list:GetColumnOrder()) do
if v == self.key then
self.list:GetColumnOrder()[i] = self.list.dragging
diff --git a/Interface/AddOns/Sorted/List_Currencies.lua b/Interface/AddOns/Sorted/List_Currencies.lua
index 1919de4f9..a87a24354 100644
--- a/Interface/AddOns/Sorted/List_Currencies.lua
+++ b/Interface/AddOns/Sorted/List_Currencies.lua
@@ -43,9 +43,16 @@ S.CurrencyGroups = {
-- Currency Columns
-local function GetColumnWidth(self)
+local function GetColumnWidth(self, key)
+ local settings = S.Settings.Get("currencyColumnSettings")
+ if settings.widths and settings.widths[key] then
+ return settings.widths[key]
+ end
return self.width
end
+local function GetIconSize(self)
+ return S.Settings.Get("iconSize") + 4
+end
S.CurrencyColumns = {
["FAVORITES"] = {
["name"] = S.Localize("COLUMN_FAVORITES"),
@@ -69,9 +76,7 @@ S.CurrencyColumns = {
},
["ICON"] = {
["name"] = S.Localize("COLUMN_ICON"),
- ["GetWidth"] = function()
- return S.Settings.Get("iconSize") + S.Settings.Get("padding") * 2
- end,
+ ["GetWidth"] = GetIconSize,
["align"] = "CENTER",
["sortMethods"] = {
{
diff --git a/Interface/AddOns/Sorted/List_Items.lua b/Interface/AddOns/Sorted/List_Items.lua
index 5b2d89db1..ec173d6e8 100644
--- a/Interface/AddOns/Sorted/List_Items.lua
+++ b/Interface/AddOns/Sorted/List_Items.lua
@@ -3,11 +3,13 @@ local pairs, ipairs, string, type, time, GetTime = pairs, ipairs, string, type,
-- Use new APIs
local ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots = ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots
-if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
-if C_Container.GetContainerItemInfo then GetContainerItemInfo = C_Container.GetContainerItemInfo end
-if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
-if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
-if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+if C_Container then
+ if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
+ if C_Container.GetContainerItemInfo then GetContainerItemInfo = C_Container.GetContainerItemInfo end
+ if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
+ if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
+ if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+end
-- Default item sort
@@ -136,17 +138,24 @@ S.ItemGroups = {
-- Item Columns
-local function GetColumnWidth(self)
+local function GetColumnWidth(self, key)
+ local settings = S.Settings.Get("itemColumnSettings")
+ if settings.widths and settings.widths[key] then
+ return settings.widths[key]
+ end
return self.width
end
-local function GetColumnMinWidthOrIconSize(self)
+local function GetIconSize(self)
+ return S.Settings.Get("iconSize") + 4
+end
+--[[local function GetColumnMinWidthOrIconSize(self)
local width = S.Settings.Get("iconSize") + 4
if width > self.minWidth then
return width
else
return self.minWidth
end
-end
+end]]
S.ItemColumns = {
["FAVORITES"] = {
["name"] = S.Localize("COLUMN_FAVORITES"),
@@ -170,8 +179,7 @@ S.ItemColumns = {
},
["ICON"] = {
["name"] = S.Localize("COLUMN_ICON"),
- ["minWidth"] = 0,
- ["GetWidth"] = GetColumnMinWidthOrIconSize,
+ ["GetWidth"] = GetIconSize,
["align"] = "CENTER",
["sortMethods"] = {
{
@@ -287,8 +295,8 @@ S.ItemColumns = {
},
["TYPE_ICON"] = {
["name"] = S.Localize("COLUMN_TYPE").." ("..S.Localize("COLUMN_ICON")..")",
- ["minWidth"] = 20,
- ["GetWidth"] = GetColumnMinWidthOrIconSize,
+ ["width"] = 24,
+ ["GetWidth"] = GetColumnWidth,
["align"] = "CENTER",
["sortMethods"] = {
{
@@ -301,10 +309,8 @@ S.ItemColumns = {
},
["EXPANSION"] = {
["name"] = S.Localize("COLUMN_EXPANSION"),
- ["minWidth"] = 20,
- ["GetWidth"] = function(self)
- return GetColumnMinWidthOrIconSize(self) * 2
- end,
+ ["width"] = 48,
+ ["GetWidth"] = GetColumnWidth,
["align"] = "CENTER",
["sortMethods"] = {
{
@@ -317,8 +323,8 @@ S.ItemColumns = {
},
["BINDING"] = {
["name"] = S.Localize("COLUMN_BINDING"),
- ["minWidth"] = 20,
- ["GetWidth"] = GetColumnMinWidthOrIconSize,
+ ["width"] = 24,
+ ["GetWidth"] = GetColumnWidth,
["align"] = "CENTER",
["sortMethods"] = {
{
diff --git a/Interface/AddOns/Sorted/Settings.lua b/Interface/AddOns/Sorted/Settings.lua
index f4554711f..b43763442 100644
--- a/Interface/AddOns/Sorted/Settings.lua
+++ b/Interface/AddOns/Sorted/Settings.lua
@@ -71,6 +71,7 @@ local defaultSettings = { -- Defaults
["BINDING"] = true,
["VALUE"] = true
},
+ ["widths"] = {},
["selectedColumn"] = "NAME",
["sortMethod"] = 1,
["sortAsc"] = false,
@@ -86,6 +87,7 @@ local defaultSettings = { -- Defaults
["NAME"] = true,
["QUANTITY"] = true
},
+ ["widths"] = {},
["selectedColumn"] = "NAME",
["sortMethod"] = 1,
["sortAsc"] = false,
@@ -847,6 +849,7 @@ local function CreateNewSettingsProfile(name)
end
end
Sorted_SettingsProfiles[index] = {}
+ S.Utils.CopyTable(defaultSettings, Sorted_SettingsProfiles[index])
if not name then
Sorted_SettingsProfiles[index].profileName = UnitName("player").." ("..GetRealmName()..")"
else
@@ -857,6 +860,7 @@ end
function S.Settings.CreateNewProfile(name)
local profile = CreateNewSettingsProfile(name)
S.Settings.SetProfile(profile)
+ return profile
end
local function CreateCopyOfSettingsProfile(origIndex)
diff --git a/Interface/AddOns/Sorted/SettingsFrame.lua b/Interface/AddOns/Sorted/SettingsFrame.lua
index 87763e26e..bea76f1f0 100644
--- a/Interface/AddOns/Sorted/SettingsFrame.lua
+++ b/Interface/AddOns/Sorted/SettingsFrame.lua
@@ -629,7 +629,7 @@ f.dropdown = CreateDropdown(f, S.Localize("CONFIG_PROFILES_PROFILE"), "profileNa
end)
f.dropdown:SetPoint("TOPLEFT", 64, -128)
f.buttonNew = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_NEW"), function(self)
- S.Settings.CreateNewProfile(nil)
+ local profile = S.Settings.CreateNewProfile(S.Localize("CONFIG_PROFILES_DEFAULT_NAME"))
end)
f.buttonCopy = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_COPY"), S.Settings.CopyProfile)
f.buttonDelete = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_DELETE"), function(self)
diff --git a/Interface/AddOns/Sorted/SettingsFrame_Categories.lua b/Interface/AddOns/Sorted/SettingsFrame_Categories.lua
index db3716f28..5b378f429 100644
--- a/Interface/AddOns/Sorted/SettingsFrame_Categories.lua
+++ b/Interface/AddOns/Sorted/SettingsFrame_Categories.lua
@@ -307,6 +307,90 @@ local function CreateValues(parent, key, name, values)
return f
end
+-- Strings (list of edit boxes)
+local function OnStringsEditBoxTextChanged(self)
+ S.Category.SetAttributeString(f.selectedCategory, f.selectedAttribute, self.index, self:GetText())
+ if #self:GetText() > 0 then
+ self.parent:GetStringsEditBox(self.index + 1)
+ end
+ self.parent:UpdateStrings()
+end
+local function CreateStringsEditBox(self, index)
+ self.editBoxes[index] = S.FrameTools.CreateEditBox(self, "", S.Localize("FILTER_NAME_SEARCH"))
+ self.editBoxes[index]:SetPoint("TOPLEFT", 48, -index * 40 + 80)
+ self.editBoxes[index].editBox:SetWidth(480)
+ self.editBoxes[index].editBox:HookScript("OnTextChanged", OnStringsEditBoxTextChanged)
+ self.editBoxes[index].editBox.parent = self
+ self.editBoxes[index].editBox.index = index
+end
+local function GetStringsEditBox(self, index)
+ if not self.editBoxes[index] then
+ CreateStringsEditBox(self, index)
+ end
+ self.editBoxes[index]:Show()
+ return self.editBoxes[index]
+end
+local function UpdateStrings(self)
+ local data = S.Category.GetAttribute(f.selectedCategory, f.selectedAttribute)
+ if data then
+ local i = 1
+ while i <= #data do
+ GetStringsEditBox(self, i).editBox:SetText(data[i])
+ i = i + 1
+ end
+ -- Add one more empty edit box
+ GetStringsEditBox(self, i).editBox:SetText("")
+ self.parent.scrollBar:SetMinMaxValues(0, i * 32 - 32)
+ i = i + 1
+ while i <= #self.editBoxes do
+ self.editBoxes[i]:Hide()
+ i = i + 1
+ end
+ else
+ for i,v in ipairs(self.editBoxes) do
+ v:SetShown(i == 1)
+ v.editBox:SetText("")
+ self.parent.scrollBar:SetMinMaxValues(0, 0)
+ end
+ end
+end
+local function CreateStrings(parent, key, name)
+ local f = CreateFrame("SCROLLFRAME", nil, parent)
+ f:SetAllPoints()
+
+ f.scrollBar = CreateFrame("SLIDER", "", f, "MinimalScrollBarTemplate")
+ f.scrollBar.trackBG:Hide()
+ f.scrollBar:SetPoint("TOPRIGHT")
+ f.scrollBar:SetPoint("BOTTOM", 0, 16)
+ f.scrollBar:SetMinMaxValues(0, 200)
+ f.scrollBar:SetValue(0)
+ f.scrollBar.Update = function(self)
+ f:SetVerticalScroll(f.scrollBar:GetValue())
+ end
+ f.scrollBar:SetScript("OnValueChanged", f.scrollBar.Update)
+ f:SetScript("OnMouseWheel", function(self, delta)
+ f.scrollBar:SetValue(f.scrollBar:GetValue() - delta * 20)
+ f.scrollBar:Update()
+ end)
+
+ f.scrollChild = CreateFrame("FRAME", nil, f)
+ f.scrollChild:SetSize(f:GetWidth(), 200)
+ f:SetScrollChild(f.scrollChild)
+
+ f.scrollChild.editBoxes = {}
+ CreateStringsEditBox(f.scrollChild, 1)
+
+ f.scrollChild.UpdateStrings = UpdateStrings
+ f.scrollChild.GetStringsEditBox = GetStringsEditBox
+ f.scrollChild.parent = f
+ f.scrollChild:SetScript("OnShow", UpdateStrings)
+ S.Utils.RunOnEvent(f.scrollChild, "SettingsFrame-CategorySelected", function(self)
+ if S.categoriesSettingsFrame.selectedAttribute == key then
+ UpdateStrings(self)
+ end
+ end)
+end
+
-- Build a settings frame for each attribute
local attributeFrames = {}
@@ -317,6 +401,8 @@ for k, v in pairs(S.Category.attributesTable) do
if v.type == "VALUES" then
CreateValues(frame, k, v.name, v.values)
+ elseif v.type == "STRINGS" then
+ CreateStrings(frame, k, v.name)
end
frame:Hide()
diff --git a/Interface/AddOns/Sorted/Sorted.toc b/Interface/AddOns/Sorted/Sorted.toc
index 088fdcba6..4e1df07e8 100644
--- a/Interface/AddOns/Sorted/Sorted.toc
+++ b/Interface/AddOns/Sorted/Sorted.toc
@@ -9,7 +9,7 @@
## Notes-esES: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-esMX: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-ptBR: Uma bolsa com interface moderana, com funções eficientes de filtros e procura.
-## Version: 2.0.4
+## Version: 2.0.5
## Author: Daft Vader
## SavedVariables: Sorted_Data, Sorted_SettingsProfiles
## DefaultState: enabled
diff --git a/Interface/AddOns/Sorted/Sorted_Mainline.toc b/Interface/AddOns/Sorted/Sorted_Mainline.toc
index 9fcb34a7a..fb0986d3e 100644
--- a/Interface/AddOns/Sorted/Sorted_Mainline.toc
+++ b/Interface/AddOns/Sorted/Sorted_Mainline.toc
@@ -9,7 +9,7 @@
## Notes-esES: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-esMX: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-ptBR: Uma bolsa com interface moderana, com funções eficientes de filtros e procura.
-## Version: 2.0.4
+## Version: 2.0.5
## Author: Daft Vader
## SavedVariables: Sorted_Data, Sorted_SettingsProfiles
## DefaultState: enabled
diff --git a/Interface/AddOns/Sorted/Sorted_Vanilla.toc b/Interface/AddOns/Sorted/Sorted_Vanilla.toc
index 5cba02f14..202ad4ca4 100644
--- a/Interface/AddOns/Sorted/Sorted_Vanilla.toc
+++ b/Interface/AddOns/Sorted/Sorted_Vanilla.toc
@@ -9,7 +9,7 @@
## Notes-esES: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-esMX: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-ptBR: Uma bolsa com interface moderana, com funções eficientes de filtros e procura.
-## Version: 2.0.4
+## Version: 2.0.5
## Author: Daft Vader
## SavedVariables: Sorted_Data, Sorted_SettingsProfiles
## DefaultState: enabled
diff --git a/Interface/AddOns/Sorted/Sorted_Wrath.toc b/Interface/AddOns/Sorted/Sorted_Wrath.toc
index 32ce3c41d..2d1acd25f 100644
--- a/Interface/AddOns/Sorted/Sorted_Wrath.toc
+++ b/Interface/AddOns/Sorted/Sorted_Wrath.toc
@@ -9,7 +9,7 @@
## Notes-esES: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-esMX: Interfaz de bolsa moderna con búsqueda eficiente y filtros.
## Notes-ptBR: Uma bolsa com interface moderana, com funções eficientes de filtros e procura.
-## Version: 2.0.4
+## Version: 2.0.5
## Author: Daft Vader
## SavedVariables: Sorted_Data, Sorted_SettingsProfiles
## DefaultState: enabled
diff --git a/Interface/AddOns/Sorted/Utilities.lua b/Interface/AddOns/Sorted/Utilities.lua
index 317f92948..a9271c939 100644
--- a/Interface/AddOns/Sorted/Utilities.lua
+++ b/Interface/AddOns/Sorted/Utilities.lua
@@ -3,11 +3,13 @@ local pairs, ipairs, string, type, time = pairs, ipairs, string, type, time
-- Use new APIs
local ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots = ContainerIDToInventoryID, GetContainerItemInfo, PickupContainerItem, GetContainerNumSlots, GetContainerNumFreeSlots
-if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
-if C_Container.GetContainerItemInfo then GetContainerItemInfo = C_Container.GetContainerItemInfo end
-if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
-if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
-if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+if C_Container then
+ if C_Container.ContainerIDToInventoryID then ContainerIDToInventoryID = C_Container.ContainerIDToInventoryID end
+ if C_Container.GetContainerItemInfo then GetContainerItemInfo = C_Container.GetContainerItemInfo end
+ if C_Container.PickupContainerItem then PickupContainerItem = C_Container.PickupContainerItem end
+ if C_Container.GetContainerNumSlots then GetContainerNumSlots = C_Container.GetContainerNumSlots end
+ if C_Container.GetContainerNumFreeSlots then GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots end
+end
S.Utils = {}
@@ -359,6 +361,15 @@ function S.Utils.GetButtonTextColor()
return buttonTextColor
end
+function S.Utils.BasicTextSearch(search, text)
+ for s in search:lower():gmatch("([^%s]+)") do
+ if string.find(text:lower():gsub("%s", ""), s) then
+ return true
+ end
+ end
+ return false
+end
+
function S.Utils.FormatValueString(value)
if value < 100 then
return GetMoneyString(value)
@@ -912,7 +923,7 @@ local function OnContainerItemPickup(bag, slot)
pickupLocationInventoryID = nil
end
end
-if C_Container.PickupContainerItem then
+if C_Container and C_Container.PickupContainerItem then
hooksecurefunc(C_Container, "PickupContainerItem", OnContainerItemPickup)
else
hooksecurefunc("PickupContainerItem", OnContainerItemPickup)
@@ -926,7 +937,7 @@ local function OnInventoryItemPickup(inventoryID)
end
hooksecurefunc("PickupInventoryItem", OnInventoryItemPickup)
-- Record when an item is from a split stack
-if C_Container.SplitContainerItem then
+if C_Container and C_Container.SplitContainerItem then
hooksecurefunc(C_Container, "SplitContainerItem", OnContainerItemPickup)
else
hooksecurefunc("SplitContainerItem", function()
diff --git a/Interface/AddOns/TomTom/CHANGELOG.md b/Interface/AddOns/TomTom/CHANGELOG.md
index 2a1eca18e..d1892979f 100644
--- a/Interface/AddOns/TomTom/CHANGELOG.md
+++ b/Interface/AddOns/TomTom/CHANGELOG.md
@@ -1,7 +1,6 @@
# TomTom
-## [v3.3.1-release](https://github.com/jnwhiteh/TomTom/tree/v3.3.1-release) (2022-10-29)
-[Full Changelog](https://github.com/jnwhiteh/TomTom/compare/v3.3.0-release...v3.3.1-release) [Previous Releases](https://github.com/jnwhiteh/TomTom/releases)
+## [v3.3.2-release](https://github.com/jnwhiteh/TomTom/tree/v3.3.2-release) (2022-10-31)
+[Full Changelog](https://github.com/jnwhiteh/TomTom/compare/v3.3.1-release...v3.3.2-release) [Previous Releases](https://github.com/jnwhiteh/TomTom/releases)
-- Fix world map dropdown
-- Update LibDropdown
+- Fix frame strata of world map elements
diff --git a/Interface/AddOns/TomTom/TomTom.lua b/Interface/AddOns/TomTom/TomTom.lua
index 04ecb3c99..4e92081ec 100644
--- a/Interface/AddOns/TomTom/TomTom.lua
+++ b/Interface/AddOns/TomTom/TomTom.lua
@@ -337,6 +337,9 @@ function TomTom:ShowHideWorldCoords()
-- Create the frame if it doesn't exist
if not TomTomWorldFrame then
TomTomWorldFrame = CreateFrame("Frame", "TomTomWorldFrame", WorldMapFrame.BorderFrame)
+ TomTomWorldFrame:SetFrameStrata("HIGH")
+ TomTomWorldFrame:SetFrameLevel(9000)
+ TomTomWorldFrame:SetAllPoints(true)
TomTomWorldFrame.Player = TomTomWorldFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
TomTomWorldFrame.Cursor = TomTomWorldFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
TomTomWorldFrame:SetScript("OnUpdate", WorldMap_OnUpdate)
diff --git a/Interface/AddOns/TomTom/TomTom.toc b/Interface/AddOns/TomTom/TomTom.toc
index c4eebf622..43fd1149b 100644
--- a/Interface/AddOns/TomTom/TomTom.toc
+++ b/Interface/AddOns/TomTom/TomTom.toc
@@ -1,7 +1,7 @@
## Interface: 100000
## Title: TomTom
## Author: Cladhaire, Ludovicus
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## License: All Rights Reserved
## Notes: Acts as your portable navigation assistant
## Notes-frFR: Agit comme un assistant de navigation portable
diff --git a/Interface/AddOns/TomTom/TomTom_Mainline.toc b/Interface/AddOns/TomTom/TomTom_Mainline.toc
index c4eebf622..43fd1149b 100644
--- a/Interface/AddOns/TomTom/TomTom_Mainline.toc
+++ b/Interface/AddOns/TomTom/TomTom_Mainline.toc
@@ -1,7 +1,7 @@
## Interface: 100000
## Title: TomTom
## Author: Cladhaire, Ludovicus
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## License: All Rights Reserved
## Notes: Acts as your portable navigation assistant
## Notes-frFR: Agit comme un assistant de navigation portable
diff --git a/Interface/AddOns/TomTom/TomTom_TBC.toc b/Interface/AddOns/TomTom/TomTom_TBC.toc
index c81f23d7a..f60d73477 100644
--- a/Interface/AddOns/TomTom/TomTom_TBC.toc
+++ b/Interface/AddOns/TomTom/TomTom_TBC.toc
@@ -1,7 +1,7 @@
## Interface: 20504
## Title: TomTom
## Author: Cladhaire, Ludovicus
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## License: All Rights Reserved
## Notes: Acts as your portable navigation assistant
## Notes-frFR: Agit comme un assistant de navigation portable
diff --git a/Interface/AddOns/TomTom/TomTom_Vanilla.toc b/Interface/AddOns/TomTom/TomTom_Vanilla.toc
index 945868dfe..1c84d43fc 100644
--- a/Interface/AddOns/TomTom/TomTom_Vanilla.toc
+++ b/Interface/AddOns/TomTom/TomTom_Vanilla.toc
@@ -1,7 +1,7 @@
## Interface: 11403
## Title: TomTom
## Author: Cladhaire, Ludovicus
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## License: All Rights Reserved
## Notes: Acts as your portable navigation assistant
## Notes-frFR: Agit comme un assistant de navigation portable
diff --git a/Interface/AddOns/TomTom/TomTom_Wrath.toc b/Interface/AddOns/TomTom/TomTom_Wrath.toc
index 9274ec768..a40642dbb 100644
--- a/Interface/AddOns/TomTom/TomTom_Wrath.toc
+++ b/Interface/AddOns/TomTom/TomTom_Wrath.toc
@@ -1,7 +1,7 @@
## Interface: 30400
## Title: TomTom
## Author: Cladhaire, Ludovicus
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## License: All Rights Reserved
## Notes: Acts as your portable navigation assistant
## Notes-frFR: Agit comme un assistant de navigation portable
diff --git a/Interface/AddOns/TomTom/libs/LibDropDown/LibDropDown.toc b/Interface/AddOns/TomTom/libs/LibDropDown/LibDropDown.toc
index 25d723015..dede19184 100644
--- a/Interface/AddOns/TomTom/libs/LibDropDown/LibDropDown.toc
+++ b/Interface/AddOns/TomTom/libs/LibDropDown/LibDropDown.toc
@@ -1,6 +1,6 @@
## Interface: 100000
## Author: p3lim
-## Version: v3.3.1-release
+## Version: v3.3.2-release
## Title: Lib: DropDown
## Notes: Library that allows easy creation of DropDown menus
## OptionalDeps: LibStub
diff --git a/Interface/AddOns/TradeSkillMaster/ChangeLog.md b/Interface/AddOns/TradeSkillMaster/ChangeLog.md
index be189a275..42f0deb66 100644
--- a/Interface/AddOns/TradeSkillMaster/ChangeLog.md
+++ b/Interface/AddOns/TradeSkillMaster/ChangeLog.md
@@ -1,5 +1,5 @@
-## v4.11.61 Changes
+## v4.11.64 Changes
-* [Classic] Fix issue with Mail UI
+* [Retail] Revert multi-crafting changes
[Known Issues](https://support.tradeskillmaster.com/en_US/known_issues)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/GoldTracker.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/GoldTracker.lua
index 28941ae5a..fd9f8cc7e 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/GoldTracker.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/GoldTracker.lua
@@ -13,6 +13,7 @@ local Math = TSM.Include("Util.Math")
local Log = TSM.Include("Util.Log")
local Table = TSM.Include("Util.Table")
local TempTable = TSM.Include("Util.TempTable")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Settings = TSM.Include("Service.Settings")
local PlayerInfo = TSM.Include("Service.PlayerInfo")
local private = {
@@ -38,7 +39,7 @@ local ERRONEOUS_ZERO_THRESHOLD = 5 * 1000 * COPPER_PER_GOLD
function GoldTracker.OnInitialize()
if not TSM.IsWowVanillaClassic() then
- Event.Register("GUILDBANKFRAME_OPENED", private.GuildLogGold)
+ DefaultUI.RegisterGuildBankVisibleCallback(private.GuildLogGold, true)
Event.Register("GUILDBANK_UPDATE_MONEY", private.GuildLogGold)
end
Event.Register("PLAYER_MONEY", private.PlayerLogGold)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Mail.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Mail.lua
index c3dfd0756..6c5c55d5b 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Mail.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Mail.lua
@@ -6,10 +6,10 @@
local _, TSM = ...
local Mail = TSM.Accounting:NewPackage("Mail")
-local Event = TSM.Include("Util.Event")
local Delay = TSM.Include("Util.Delay")
local String = TSM.Include("Util.String")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local InventoryInfo = TSM.Include("Service.InventoryInfo")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
@@ -29,8 +29,13 @@ local OUTBID_MATCH_TEXT = AUCTION_OUTBID_MAIL_SUBJECT:gsub("%%s", "(.+)")
-- ============================================================================
function Mail.OnInitialize()
- Event.Register("MAIL_SHOW", function() Delay.AfterTime("ACCOUNTING_GET_SELLERS", 0.1, private.RequestSellerInfo, 0.1) end)
- Event.Register("MAIL_CLOSED", function() Delay.Cancel("ACCOUNTING_GET_SELLERS") end)
+ DefaultUI.RegisterMailVisibleCallback(function(visible)
+ if visible then
+ Delay.AfterTime("ACCOUNTING_GET_SELLERS", 0.1, private.RequestSellerInfo, 0.1)
+ else
+ Delay.Cancel("ACCOUNTING_GET_SELLERS")
+ end
+ end)
-- hook certain mail functions
private.hooks.TakeInboxItem = TakeInboxItem
TakeInboxItem = function(...)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Merchant.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Merchant.lua
index 71eff3a52..5dd42da78 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Merchant.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Accounting/Merchant.lua
@@ -9,6 +9,7 @@ local Merchant = TSM.Accounting:NewPackage("Merchant")
local Event = TSM.Include("Util.Event")
local Math = TSM.Include("Util.Math")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local private = {
repairMoney = 0,
@@ -29,10 +30,9 @@ local private = {
-- ============================================================================
function Merchant.OnInitialize()
- Event.Register("MERCHANT_SHOW", private.SetupRepairCost)
+ DefaultUI.RegisterMerchantVisibleCallback(private.MechantVisibilityHandler)
Event.Register("BAG_UPDATE_DELAYED", private.OnMerchantUpdate)
Event.Register("UPDATE_INVENTORY_DURABILITY", private.AddRepairCosts)
- Event.Register("MERCHANT_CLOSED", private.OnMerchantClosed)
hooksecurefunc("UseContainerItem", private.CheckMerchantSale)
hooksecurefunc("BuyMerchantItem", private.OnMerchantBuy)
hooksecurefunc("BuybackItem", private.OnMerchantBuyback)
@@ -44,12 +44,17 @@ end
-- Repair Cost Tracking
-- ============================================================================
-function private.SetupRepairCost()
- private.repairMoney = GetMoney()
- private.couldRepair = CanMerchantRepair()
- -- if merchant can repair set up variables so we can track repairs
- if private.couldRepair then
- private.repairCost = GetRepairAllCost()
+function private.MechantVisibilityHandler(visible)
+ if visible then
+ private.repairMoney = GetMoney()
+ private.couldRepair = CanMerchantRepair()
+ -- if merchant can repair set up variables so we can track repairs
+ if private.couldRepair then
+ private.repairCost = GetRepairAllCost()
+ end
+ else
+ private.couldRepair = nil
+ private.repairCost = 0
end
end
@@ -83,11 +88,6 @@ function private.AddRepairCosts()
end
end
-function private.OnMerchantClosed()
- private.couldRepair = nil
- private.repairCost = 0
-end
-
-- ============================================================================
-- Merchant Purchases / Sales Tracking
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Auctioning/PostScan.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Auctioning/PostScan.lua
index 76c7a09f3..3f55d4fb8 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Auctioning/PostScan.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Auctioning/PostScan.lua
@@ -13,8 +13,8 @@ local SlotId = TSM.Include("Util.SlotId")
local Delay = TSM.Include("Util.Delay")
local Math = TSM.Include("Util.Math")
local Log = TSM.Include("Util.Log")
-local Event = TSM.Include("Util.Event")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Threading = TSM.Include("Service.Threading")
local ItemInfo = TSM.Include("Service.ItemInfo")
local BagTracking = TSM.Include("Service.BagTracking")
@@ -31,7 +31,6 @@ local private = {
subRowsTemp = {},
groupsQuery = nil, --luacheck: ignore 1004 - just stored for GC reasons
operationsQuery = nil, --luacheck: ignore 1004 - just stored for GC reasons
- isAHOpen = false,
}
local RESET_REASON_LOOKUP = {
minPrice = "postResetMin",
@@ -54,8 +53,7 @@ local MAX_COMMODITY_STACKS_PER_AUCTION = 40
function PostScan.OnInitialize()
BagTracking.RegisterCallback(private.UpdateOperationDB)
- Event.Register("AUCTION_HOUSE_SHOW", private.AuctionHouseShowHandler)
- Event.Register("AUCTION_HOUSE_CLOSED", private.AuctionHouseClosedHandler)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(private.UpdateOperationDB, true)
private.operationDB = Database.NewSchema("AUCTIONING_OPERATIONS")
:AddUniqueStringField("autoBaseItemString")
:AddStringField("firstOperation")
@@ -270,21 +268,12 @@ end
-- Private Helper Functions (General)
-- ============================================================================
-function private.AuctionHouseShowHandler()
- private.isAHOpen = true
- private.UpdateOperationDB()
-end
-
-function private.AuctionHouseClosedHandler()
- private.isAHOpen = false
-end
-
function private.OnGroupsOperationsChanged()
Delay.AfterFrame("POST_GROUP_OPERATIONS_CHANGED", 1, private.UpdateOperationDB)
end
function private.UpdateOperationDB()
- if not private.isAHOpen then
+ if not DefaultUI.IsAuctionHouseVisible() then
return
end
private.operationDB:TruncateAndBulkInsertStart()
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Banking/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Banking/Core.lua
index 832cbaae5..5e37888cd 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Banking/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Banking/Core.lua
@@ -6,11 +6,11 @@
local _, TSM = ...
local Banking = TSM:NewPackage("Banking")
-local Event = TSM.Include("Util.Event")
local TempTable = TSM.Include("Util.TempTable")
local String = TSM.Include("Util.String")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Threading = TSM.Include("Service.Threading")
local ItemInfo = TSM.Include("Service.ItemInfo")
local private = {
@@ -33,11 +33,9 @@ local MOVE_WAIT_TIMEOUT = 2
function Banking.OnInitialize()
private.moveThread = Threading.New("BANKING_MOVE", private.MoveThread)
- Event.Register("BANKFRAME_OPENED", private.BankOpened)
- Event.Register("BANKFRAME_CLOSED", private.BankClosed)
+ DefaultUI.RegisterBankVisibleCallback(private.BankVisibilityChanged)
if not TSM.IsWowVanillaClassic() then
- Event.Register(TSM.IsWowClassic() and "GUILDBANKFRAME_OPENED" or "PLAYER_INTERACTION_MANAGER_FRAME_SHOW", private.GuildBankOpened)
- Event.Register(TSM.IsWowClassic() and "GUILDBANKFRAME_CLOSED" or "PLAYER_INTERACTION_MANAGER_FRAME_HIDE", private.GuildBankClosed)
+ DefaultUI.RegisterGuildBankVisibleCallback(private.GuildBankVisibilityChanged)
end
end
@@ -232,51 +230,39 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.BankOpened()
- if private.openFrame == "BANK" then
- return
- end
- assert(not private.openFrame)
- private.openFrame = "BANK"
- for _, callback in ipairs(private.frameCallbacks) do
- callback(private.openFrame)
- end
-end
-
-function private.GuildBankOpened(event, frameType)
- if private.openFrame == "GUILD_BANK" then
- return
- end
- if not TSM.IsWowClassic() and frameType ~= Enum.PlayerInteractionType.GuildBanker then
- return
- end
- assert(not private.openFrame)
- private.openFrame = "GUILD_BANK"
- for _, callback in ipairs(private.frameCallbacks) do
- callback(private.openFrame)
- end
-end
-
-function private.BankClosed()
- if not private.openFrame then
- return
+function private.BankVisibilityChanged(visible)
+ if visible then
+ if private.openFrame == "BANK" then
+ return
+ end
+ assert(not private.openFrame)
+ private.openFrame = "BANK"
+ else
+ if not private.openFrame then
+ return
+ end
+ private.openFrame = nil
+ private.StopMove()
end
- private.openFrame = nil
- private.StopMove()
for _, callback in ipairs(private.frameCallbacks) do
callback(private.openFrame)
end
end
-function private.GuildBankClosed(event, frameType)
- if not private.openFrame then
- return
- end
- if not TSM.IsWowClassic() and frameType ~= Enum.PlayerInteractionType.GuildBanker then
- return
+function private.GuildBankVisibilityChanged(visible)
+ if visible then
+ if private.openFrame == "GUILD_BANK" then
+ return
+ end
+ assert(not private.openFrame)
+ private.openFrame = "GUILD_BANK"
+ else
+ if not private.openFrame then
+ return
+ end
+ private.openFrame = nil
+ private.StopMove()
end
- private.openFrame = nil
- private.StopMove()
for _, callback in ipairs(private.frameCallbacks) do
callback(private.openFrame)
end
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Core.lua
index a97d57aba..5e51ff7bb 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Core.lua
@@ -5,51 +5,4 @@
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
-local Mailing = TSM:NewPackage("Mailing")
-local Event = TSM.Include("Util.Event")
-local private = {
- mailOpen = false,
- frameCallbacks = {},
-}
-
-
-
--- ============================================================================
--- Module Functions
--- ============================================================================
-
-function Mailing.OnInitialize()
- Event.Register("MAIL_SHOW", private.MailShow)
- Event.Register("MAIL_CLOSED", private.MailClosed)
-end
-
-function Mailing.RegisterFrameCallback(callback)
- tinsert(private.frameCallbacks, callback)
-end
-
-function Mailing.IsOpen()
- return private.mailOpen
-end
-
-
-
--- ============================================================================
--- Private Helper Functions
--- ============================================================================
-
-function private.MailShow()
- private.mailOpen = true
- for _, callback in ipairs(private.frameCallbacks) do
- callback(true)
- end
-end
-
-function private.MailClosed()
- if not private.mailOpen then
- return
- end
- private.mailOpen = false
- for _, callback in ipairs(private.frameCallbacks) do
- callback(false)
- end
-end
+TSM:NewPackage("Mailing")
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Open.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Open.lua
index 6058cf4c1..f6760bcaa 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Open.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Mailing/Open.lua
@@ -8,12 +8,12 @@ local _, TSM = ...
local Open = TSM.Mailing:NewPackage("Open")
local L = TSM.Include("Locale").GetTable()
local Delay = TSM.Include("Util.Delay")
-local Event = TSM.Include("Util.Event")
local String = TSM.Include("Util.String")
local Money = TSM.Include("Util.Money")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
local Theme = TSM.Include("Util.Theme")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Threading = TSM.Include("Service.Threading")
local ItemInfo = TSM.Include("Service.ItemInfo")
local MailTracking = TSM.Include("Service.MailTracking")
@@ -34,9 +34,7 @@ local MAIL_REFRESH_TIME = TSM.IsWowClassic() and 60 or 15
function Open.OnInitialize()
private.thread = Threading.New("MAIL_OPENING", private.OpenMailThread)
-
- Event.Register("MAIL_SHOW", private.ScheduleCheck)
- Event.Register("MAIL_CLOSED", private.MailClosedHandler)
+ DefaultUI.RegisterMailVisibleCallback(private.FrameVisibleCallback)
end
function Open.KillThread()
@@ -144,6 +142,14 @@ end
-- Private Helper Functions
-- ============================================================================
+function private.FrameVisibleCallback(visible)
+ if visible then
+ private.ScheduleCheck()
+ else
+ Delay.Cancel("mailInboxCheck")
+ end
+end
+
function private.CheckInbox()
if private.isOpening then
private.ScheduleCheck()
@@ -227,7 +233,3 @@ function private.ScheduleCheck()
Delay.AfterTime("mailInboxCheck", nextUpdate, private.CheckInbox)
end
end
-
-function private.MailClosedHandler()
- Delay.Cancel("mailInboxCheck")
-end
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/MyAuctions/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/MyAuctions/Core.lua
index ce1884b97..a8c8f938d 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/MyAuctions/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/MyAuctions/Core.lua
@@ -11,12 +11,12 @@ local Database = TSM.Include("Util.Database")
local Event = TSM.Include("Util.Event")
local TempTable = TSM.Include("Util.TempTable")
local Log = TSM.Include("Util.Log")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
local ItemInfo = TSM.Include("Service.ItemInfo")
local AuctionHouseWrapper = TSM.Include("Service.AuctionHouseWrapper")
local private = {
pendingDB = nil,
- ahOpen = false,
pendingHashes = {},
expectedCounts = {},
auctionInfo = { numPosted = 0, numSold = 0, postedGold = 0, soldGold = 0 },
@@ -43,9 +43,7 @@ function MyAuctions.OnInitialize()
tinsert(private.dbHashFields, field)
end
end
-
- Event.Register("AUCTION_HOUSE_SHOW", private.AuctionHouseShowEventHandler)
- Event.Register("AUCTION_HOUSE_CLOSED", private.AuctionHouseHideEventHandler)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(private.AuctionHouseClosed, false)
if TSM.IsWowClassic() then
Event.Register("CHAT_MSG_SYSTEM", private.ChatMsgSystemEventHandler)
Event.Register("UI_ERROR_MESSAGE", private.UIErrorMessageEventHandler)
@@ -120,7 +118,7 @@ function MyAuctions.GetNumPending()
end
function MyAuctions.GetAuctionInfo()
- if not private.ahOpen then
+ if not DefaultUI.IsAuctionHouseVisible() then
return
end
return private.auctionInfo.numPosted, private.auctionInfo.numSold, private.auctionInfo.postedGold, private.auctionInfo.soldGold
@@ -132,12 +130,7 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.AuctionHouseShowEventHandler()
- private.ahOpen = true
-end
-
-function private.AuctionHouseHideEventHandler()
- private.ahOpen = false
+function private.AuctionHouseClosed()
if private.pendingFuture then
private.pendingFuture:Cancel()
private.pendingFuture = nil
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/OpenMailTask.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/OpenMailTask.lua
index d395b68f7..a76bb7f7e 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/OpenMailTask.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/OpenMailTask.lua
@@ -7,6 +7,7 @@
local _, TSM = ...
local OpenMailTask = TSM.Include("LibTSMClass").DefineClass("OpenMailTask", TSM.TaskList.ItemTask)
local L = TSM.Include("Locale").GetTable()
+local DefaultUI = TSM.Include("Service.DefaultUI")
TSM.TaskList.OpenMailTask = OpenMailTask
local private = {
activeTasks = {},
@@ -22,7 +23,7 @@ local private = {
function OpenMailTask.__init(self)
self.__super:__init()
if not private.registeredCallbacks then
- TSM.Mailing.RegisterFrameCallback(private.FrameCallback)
+ DefaultUI.RegisterMailVisibleCallback(private.FrameCallback)
private.registeredCallbacks = true
end
end
@@ -54,7 +55,7 @@ end
-- ============================================================================
function OpenMailTask._UpdateState(self)
- if not TSM.Mailing.IsOpen() then
+ if not DefaultUI.IsMailVisible() then
return self:_SetButtonState(false, L["NOT OPEN"])
else
return self:_SetButtonState(false, L["OPEN"])
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/SendMailTask.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/SendMailTask.lua
index ac638343a..699ba9874 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/SendMailTask.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/TaskList/Tasks/SendMailTask.lua
@@ -7,6 +7,7 @@
local _, TSM = ...
local SendMailTask = TSM.Include("LibTSMClass").DefineClass("SendMailTask", TSM.TaskList.ItemTask)
local L = TSM.Include("Locale").GetTable()
+local DefaultUI = TSM.Include("Service.DefaultUI")
TSM.TaskList.SendMailTask = SendMailTask
local private = {
registeredCallbacks = false,
@@ -25,7 +26,7 @@ function SendMailTask.__init(self)
self._target = nil
self._isSending = false
if not private.registeredCallbacks then
- TSM.Mailing.RegisterFrameCallback(private.FrameCallback)
+ DefaultUI.RegisterMailVisibleCallback(private.FrameCallback)
private.registeredCallbacks = true
end
end
@@ -68,7 +69,7 @@ end
-- ============================================================================
function SendMailTask._UpdateState(self)
- if not TSM.Mailing.IsOpen() then
+ if not DefaultUI.IsMailVisible() then
return self:_SetButtonState(false, L["NOT OPEN"])
elseif self._isSending then
return self:_SetButtonState(false, L["SENDING"])
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buy.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buy.lua
index 022ecd7ac..87bf594b1 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buy.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buy.lua
@@ -13,6 +13,7 @@ local Log = TSM.Include("Util.Log")
local TempTable = TSM.Include("Util.TempTable")
local Theme = TSM.Include("Util.Theme")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local Inventory = TSM.Include("Service.Inventory")
local private = {
@@ -41,8 +42,7 @@ function Buy.OnInitialize()
:AddNumberField("stackSize")
:AddNumberField("numAvailable")
:Commit()
- Event.Register("MERCHANT_SHOW", private.MerchantShowEventHandler)
- Event.Register("MERCHANT_CLOSED", private.MerchantClosedEventHandler)
+ DefaultUI.RegisterMerchantVisibleCallback(private.MechantVisibilityHandler)
Event.Register("MERCHANT_UPDATE", private.MerchantUpdateEventHandler)
Event.Register("CHAT_MSG_LOOT", private.ChatMsgLootEventHandler)
end
@@ -127,15 +127,15 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.MerchantShowEventHandler()
- Delay.AfterFrame("UPDATE_MERCHANT_DB", 1, private.UpdateMerchantDB)
-end
-
-function private.MerchantClosedEventHandler()
- private.ClearPendingContext()
- Delay.Cancel("UPDATE_MERCHANT_DB")
- Delay.Cancel("RESCAN_MERCHANT_DB")
- private.merchantDB:Truncate()
+function private.MechantVisibilityHandler(visible)
+ if visible then
+ Delay.AfterFrame("UPDATE_MERCHANT_DB", 1, private.UpdateMerchantDB)
+ else
+ private.ClearPendingContext()
+ Delay.Cancel("UPDATE_MERCHANT_DB")
+ Delay.Cancel("RESCAN_MERCHANT_DB")
+ private.merchantDB:Truncate()
+ end
end
function private.MerchantUpdateEventHandler()
diff --git a/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buyback.lua b/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buyback.lua
index 6388deb6a..dc9a50da4 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buyback.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/Service/Vendoring/Buyback.lua
@@ -10,6 +10,7 @@ local Database = TSM.Include("Util.Database")
local Delay = TSM.Include("Util.Delay")
local Event = TSM.Include("Util.Event")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local private = {
buybackDB = nil,
@@ -28,8 +29,7 @@ function Buyback.OnInitialize()
:AddNumberField("price")
:AddNumberField("quantity")
:Commit()
- Event.Register("MERCHANT_SHOW", private.MerchantShowEventHandler)
- Event.Register("MERCHANT_CLOSED", private.MerchantClosedEventHandler)
+ DefaultUI.RegisterMerchantVisibleCallback(private.MechantVisibilityHandler)
Event.Register("MERCHANT_UPDATE", private.MerchantUpdateEventHandler)
end
@@ -48,13 +48,13 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.MerchantShowEventHandler()
- Delay.AfterFrame("UPDATE_BUYBACK_DB", 1, private.UpdateBuybackDB)
-end
-
-function private.MerchantClosedEventHandler()
- Delay.Cancel("UPDATE_BUYBACK_DB")
- private.buybackDB:Truncate()
+function private.MechantVisibilityHandler(visible)
+ if visible then
+ Delay.AfterFrame("UPDATE_BUYBACK_DB", 1, private.UpdateBuybackDB)
+ else
+ Delay.Cancel("UPDATE_BUYBACK_DB")
+ private.buybackDB:Truncate()
+ end
end
function private.MerchantUpdateEventHandler()
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Auctioning.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Auctioning.lua
index 74ffea603..433d75c38 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Auctioning.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Auctioning.lua
@@ -8,7 +8,6 @@ local _, TSM = ...
local Auctioning = TSM.UI.AuctionUI:NewPackage("Auctioning")
local L = TSM.Include("Locale").GetTable()
local FSM = TSM.Include("Util.FSM")
-local Event = TSM.Include("Util.Event")
local Table = TSM.Include("Util.Table")
local Sound = TSM.Include("Util.Sound")
local Money = TSM.Include("Util.Money")
@@ -22,6 +21,7 @@ local BagTracking = TSM.Include("Service.BagTracking")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
local AuctionScan = TSM.Include("Service.AuctionScan")
local Settings = TSM.Include("Service.Settings")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local UIElements = TSM.Include("UI.UIElements")
local private = {
settings = nil,
@@ -834,9 +834,7 @@ function private.FSMCreate()
isScanning = false,
pendingFuture = nil,
}
- Event.Register("AUCTION_HOUSE_CLOSED", function()
- private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED")
- end)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(function() private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED") end, false)
local fsmPrivate = {}
function fsmPrivate.UpdateDepositCost(context)
if context.scanType ~= "POST" then
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Core.lua
index ba314d539..5123fc016 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Core.lua
@@ -14,6 +14,7 @@ local Money = TSM.Include("Util.Money")
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
local Settings = TSM.Include("Service.Settings")
local ItemLinked = TSM.Include("Service.ItemLinked")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local UIElements = TSM.Include("UI.UIElements")
local private = {
settings = nil,
@@ -48,7 +49,7 @@ function AuctionUI.OnInitialize()
private.AuctionFrameInit()
end)
end
- Event.Register("AUCTION_HOUSE_CLOSED", private.HideAuctionFrame)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(private.HideAuctionFrame, false)
if TSM.IsWowClassic() then
Delay.AfterTime(1, function() LoadAddOn("Blizzard_AuctionUI") end)
else
@@ -202,7 +203,6 @@ function private.AuctionFrameInit()
tab:SetPoint("LEFT", _G["AuctionFrameTab"..tabId - 1], "RIGHT", -8, 0)
else
tab:SetPoint("LEFT", AuctionHouseFrame.Tabs[tabId - 1], "RIGHT", -15, 0)
- tinsert(AuctionHouseFrame.Tabs, tab)
end
tab:Show()
PanelTemplates_SetNumTabs(private.defaultFrame, tabId)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Shopping.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Shopping.lua
index 3e6a32d6f..5e2d2fbdc 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Shopping.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Shopping.lua
@@ -17,6 +17,7 @@ local Log = TSM.Include("Util.Log")
local Math = TSM.Include("Util.Math")
local ItemString = TSM.Include("Util.ItemString")
local Delay = TSM.Include("Util.Delay")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local CustomPrice = TSM.Include("Service.CustomPrice")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
@@ -1817,9 +1818,7 @@ function private.FSMCreate()
pendingFuture = nil,
canSendAuctionQuery = true,
}
- Event.Register("AUCTION_HOUSE_CLOSED", function()
- private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED")
- end)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(function() private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED") end, false)
Event.Register("BAG_UPDATE_DELAYED", function()
private.fsm:ProcessEvent("EV_BAG_UPDATE_DELAYED")
end)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Sniper.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Sniper.lua
index a4d5b2f44..0fc26b7f4 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Sniper.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/AuctionUI/Sniper.lua
@@ -14,6 +14,7 @@ local Sound = TSM.Include("Util.Sound")
local Money = TSM.Include("Util.Money")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local AuctionScan = TSM.Include("Service.AuctionScan")
local MailTracking = TSM.Include("Service.MailTracking")
@@ -293,9 +294,7 @@ function private.FSMCreate()
Event.Register("AUCTION_HOUSE_SHOW_ERROR", private.FSMMessageErrorEventHandler)
Event.Register("COMMODITY_PURCHASE_SUCCEEDED", private.FSMBuyoutSuccess)
end
- Event.Register("AUCTION_HOUSE_CLOSED", function()
- private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED")
- end)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(function() private.fsm:ProcessEvent("EV_AUCTION_HOUSE_CLOSED") end, false)
AuctionHouseWrapper.RegisterAuctionIdUpdateCallback(function(...)
private.fsm:ProcessEvent("EV_AUCTION_ID_UPDATE", ...)
end)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Core.lua
index 45a83f3b3..b4d1a675b 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Core.lua
@@ -9,9 +9,9 @@ local MailingUI = TSM.UI:NewPackage("MailingUI")
local L = TSM.Include("Locale").GetTable()
local Delay = TSM.Include("Util.Delay")
local FSM = TSM.Include("Util.FSM")
-local Event = TSM.Include("Util.Event")
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
local Settings = TSM.Include("Service.Settings")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local UIElements = TSM.Include("UI.UIElements")
local private = {
settings = nil,
@@ -116,11 +116,12 @@ function private.FSMCreate()
local function MailShowDelayed()
private.fsm:ProcessEvent("EV_MAIL_SHOW")
end
- Event.Register("MAIL_SHOW", function()
- Delay.AfterFrame("MAIL_SHOW_DELAYED", 0, MailShowDelayed)
- end)
- Event.Register("MAIL_CLOSED", function()
- private.fsm:ProcessEvent("EV_MAIL_CLOSED")
+ DefaultUI.RegisterMailVisibleCallback(function(visible)
+ if visible then
+ Delay.AfterFrame("MAIL_SHOW_DELAYED", 0, MailShowDelayed)
+ else
+ private.fsm:ProcessEvent("EV_MAIL_CLOSED")
+ end
end)
MailFrame:UnregisterEvent("MAIL_SHOW")
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Send.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Send.lua
index 01b3c3591..1b8f07a44 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Send.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/MailingUI/Send.lua
@@ -19,6 +19,7 @@ local ItemInfo = TSM.Include("Service.ItemInfo")
local InventoryInfo = TSM.Include("Service.InventoryInfo")
local BagTracking = TSM.Include("Service.BagTracking")
local PlayerInfo = TSM.Include("Service.PlayerInfo")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local UIElements = TSM.Include("UI.UIElements")
local private = {
fsm = nil,
@@ -640,9 +641,7 @@ end
-- ============================================================================
function private.FSMCreate()
- Event.Register("MAIL_CLOSED", function()
- private.fsm:ProcessEvent("EV_MAIL_CLEAR")
- end)
+ DefaultUI.RegisterMailVisibleCallback(function() private.fsm:ProcessEvent("EV_MAIL_CLEAR") end, false)
Event.Register("MAIL_SEND_INFO_UPDATE", function()
private.fsm:ProcessEvent("EV_MAIL_INFO_UPDATE")
end)
diff --git a/Interface/AddOns/TradeSkillMaster/Core/UI/VendoringUI/Core.lua b/Interface/AddOns/TradeSkillMaster/Core/UI/VendoringUI/Core.lua
index 21519c37d..f795981e9 100644
--- a/Interface/AddOns/TradeSkillMaster/Core/UI/VendoringUI/Core.lua
+++ b/Interface/AddOns/TradeSkillMaster/Core/UI/VendoringUI/Core.lua
@@ -10,6 +10,7 @@ local L = TSM.Include("Locale").GetTable()
local Delay = TSM.Include("Util.Delay")
local FSM = TSM.Include("Util.FSM")
local Event = TSM.Include("Util.Event")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Settings = TSM.Include("Service.Settings")
local UIElements = TSM.Include("UI.UIElements")
local private = {
@@ -108,11 +109,12 @@ function private.FSMCreate()
local function CurrencyUpdate()
private.fsm:ProcessEvent("EV_CURRENCY_UPDATE")
end
- Event.Register("MERCHANT_SHOW", function()
- Delay.AfterFrame("MERCHANT_SHOW_DELAYED", 0, MerchantShowDelayed)
- end)
- Event.Register("MERCHANT_CLOSED", function()
- private.fsm:ProcessEvent("EV_MERCHANT_CLOSED")
+ DefaultUI.RegisterMerchantVisibleCallback(function(visible)
+ if visible then
+ Delay.AfterFrame("MERCHANT_SHOW_DELAYED", 0, MerchantShowDelayed)
+ else
+ private.fsm:ProcessEvent("EV_MERCHANT_CLOSED")
+ end
end)
local fsmContext = {
@@ -177,7 +179,6 @@ function private.FSMCreate()
end
MerchantFrame:ClearAllPoints()
MerchantFrame:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 100000, 100000)
- OpenAllBags()
context.frame = private.CreateMainFrame()
context.frame:Show()
context.frame:GetElement("titleFrame.switchBtn"):Show()
@@ -188,7 +189,6 @@ function private.FSMCreate()
private.isVisible = true
end)
:SetOnExit(function(context)
- CloseAllBags()
MerchantFrame:ClearAllPoints()
local point, region, relativePoint, x, y = unpack(context.defaultPoint)
if point and region and relativePoint and x and y then
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionHouseWrapper.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionHouseWrapper.lua
index 2f48278ea..a7799d948 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionHouseWrapper.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionHouseWrapper.lua
@@ -16,6 +16,7 @@ local Vararg = TSM.Include("Util.Vararg")
local Analytics = TSM.Include("Util.Analytics")
local Math = TSM.Include("Util.Math")
local Debug = TSM.Include("Util.Debug")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local APIWrapper = LibTSMClass.DefineClass("APIWrapper")
local private = {
wrappers = {},
@@ -24,7 +25,6 @@ local private = {
sortsPartsTemp = {},
itemKeyPartsTemp = {},
searchQueryAPITimes = {},
- isAHOpen = false,
lastResponseReceived = 0,
hookedTime = {},
lastAuctionCanceledAuctionId = nil,
@@ -202,8 +202,7 @@ local API_EVENT_INFO = TSM.IsWowClassic() and
-- ============================================================================
AuctionHouseWrapper:OnModuleLoad(function()
- Event.Register("AUCTION_HOUSE_SHOW", private.AuctionHouseShowHandler)
- Event.Register("AUCTION_HOUSE_CLOSED", private.AuctionHouseClosedHandler)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(private.AuctionHouseClosed, false)
-- setup wrappers
for apiName in pairs(API_EVENT_INFO) do
@@ -247,10 +246,6 @@ function AuctionHouseWrapper.RegisterAuctionIdUpdateCallback(callback)
tinsert(private.auctionIdUpdateCallbacks, callback)
end
-function AuctionHouseWrapper.IsOpen()
- return private.isAHOpen
-end
-
function AuctionHouseWrapper.RegisterCanSendAuctionQueryCallback(callback)
tinsert(private.canSendAuctionQueryCallbacks, callback)
end
@@ -505,7 +500,7 @@ function APIWrapper._HandleAPICall(self, ...)
end
Vararg.IntoTable(self._args, ...)
local timeout = nil
- if not private.isAHOpen then
+ if not DefaultUI.IsAuctionHouseVisible() then
timeout = 0
elseif self._name == "QueryAuctionItems" and select(7, ...) then
timeout = GET_ALL_TIMEOUT
@@ -612,12 +607,7 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.AuctionHouseShowHandler()
- private.isAHOpen = true
-end
-
-function private.AuctionHouseClosedHandler()
- private.isAHOpen = false
+function private.AuctionHouseClosed()
for _, wrapper in pairs(private.wrappers) do
wrapper:CancelIfPending()
end
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionScanClasses/Scanner.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionScanClasses/Scanner.lua
index 1b183f664..4415c7d1b 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionScanClasses/Scanner.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionScanClasses/Scanner.lua
@@ -12,6 +12,7 @@ local Future = TSM.Include("Util.Future")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
local Event = TSM.Include("Util.Event")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local AuctionHouseWrapper = TSM.Include("Service.AuctionHouseWrapper")
local Util = TSM.Include("Service.AuctionScanClasses.Util")
@@ -236,7 +237,7 @@ Scanner:OnModuleLoad(function()
:AddState(FSM.NewState("ST_RESET_SELLER_CACHE")
:SetOnEnter(function()
assert(not TSM.IsWowClassic())
- if not AuctionHouseWrapper.IsOpen() then
+ if not DefaultUI.IsAuctionHouseVisible() then
return "ST_CANCELING"
end
if private.useCachedData and private.searchRow:HasCachedSearchData() then
@@ -264,7 +265,7 @@ Scanner:OnModuleLoad(function()
:AddState(FSM.NewState("ST_SEARCH_SEND")
:SetOnEnter(function()
assert(not TSM.IsWowClassic())
- if not AuctionHouseWrapper.IsOpen() then
+ if not DefaultUI.IsAuctionHouseVisible() then
return "ST_CANCELING"
end
local future, delayTime = private.searchRow:SearchSend()
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionTracking.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionTracking.lua
index c012cef30..b4f6df536 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionTracking.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/AuctionTracking.lua
@@ -17,6 +17,7 @@ local Sound = TSM.Include("Util.Sound")
local Money = TSM.Include("Util.Money")
local Theme = TSM.Include("Util.Theme")
local Analytics = TSM.Include("Util.Analytics")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local Settings = TSM.Include("Service.Settings")
local AuctionHouseWrapper = TSM.Include("Service.AuctionHouseWrapper")
@@ -25,7 +26,6 @@ local private = {
indexDB = nil,
quantityDB = nil,
updateQuery = nil, -- luacheck: ignore 1004 - just stored for GC reasons
- isAHOpen = false,
callbacks = {},
expiresCallbacks = {},
indexUpdates = {
@@ -68,8 +68,7 @@ AuctionTracking:OnSettingsLoad(function()
:AddKey("factionrealm", "internalData", "expiringAuction")
:AddKey("sync", "internalData", "auctionQuantity")
:AddKey("global", "coreOptions", "auctionSaleSound")
- Event.Register("AUCTION_HOUSE_SHOW", private.AuctionHouseShowHandler)
- Event.Register("AUCTION_HOUSE_CLOSED", private.AuctionHouseClosedHandler)
+ DefaultUI.RegisterAuctionHouseVisibleCallback(private.AuctionHouseVisibilityHandler)
if TSM.IsWowClassic() then
Event.Register("AUCTION_OWNED_LIST_UPDATE", private.AuctionOwnedListUpdateHandler)
else
@@ -277,7 +276,7 @@ function AuctionTracking.GetQuantityByLevelItemString(levelItemString)
end
function AuctionTracking.QueryOwnedAuctions()
- if not private.isAHOpen then
+ if not DefaultUI.IsAuctionHouseVisible() then
return
end
if TSM.IsWowClassic() then
@@ -301,22 +300,20 @@ end
-- Event Handlers
-- ============================================================================
-function private.AuctionHouseShowHandler()
- private.isAHOpen = true
- if TSM.IsWowClassic() then
- AuctionTracking.QueryOwnedAuctions()
- -- We don't always get AUCTION_OWNED_LIST_UPDATE events, so do our own scanning if needed
- Delay.AfterTime("AUCTION_BACKGROUND_SCAN", 1, private.DoBackgroundScan, 1)
+function private.AuctionHouseVisibilityHandler(visible)
+ if visible then
+ if TSM.IsWowClassic() then
+ AuctionTracking.QueryOwnedAuctions()
+ -- We don't always get AUCTION_OWNED_LIST_UPDATE events, so do our own scanning if needed
+ Delay.AfterTime("AUCTION_BACKGROUND_SCAN", 1, private.DoBackgroundScan, 1)
+ else
+ Delay.AfterTime(0.1, AuctionTracking.QueryOwnedAuctions)
+ end
else
- Delay.AfterTime(0.1, AuctionTracking.QueryOwnedAuctions)
+ Delay.Cancel("AUCTION_BACKGROUND_SCAN")
end
end
-function private.AuctionHouseClosedHandler()
- private.isAHOpen = false
- Delay.Cancel("AUCTION_BACKGROUND_SCAN")
-end
-
function private.DoBackgroundScan()
if private.GetNumOwnedAuctions() ~= private.lastScanNum then
private.AuctionOwnedListUpdateHandler()
@@ -369,7 +366,7 @@ function private.AuctionCanceledHandler(_, auctionId)
end
function private.AuctionOwnedListUpdateDelayed()
- if not private.isAHOpen then
+ if not DefaultUI.IsAuctionHouseVisible() then
return
elseif AuctionFrame and AuctionFrame:IsVisible() and AuctionFrame.selectedTab == 3 then
-- default UI auctions tab is visible, so scan later
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/BagTracking.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/BagTracking.lua
index 04fce9a3d..01e8c8c3c 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/BagTracking.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/BagTracking.lua
@@ -13,6 +13,7 @@ local SlotId = TSM.Include("Util.SlotId")
local Log = TSM.Include("Util.Log")
local TempTable = TSM.Include("Util.TempTable")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local InventoryInfo = TSM.Include("Service.InventoryInfo")
local Settings = TSM.Include("Service.Settings")
@@ -33,7 +34,6 @@ local private = {
pending = {},
list = {},
},
- bankOpen = false,
isFirstBankOpen = true,
callbackQuery = nil, -- luacheck: ignore 1004 - just stored for GC reasons
callbacks = {},
@@ -67,8 +67,7 @@ end
BagTracking:OnSettingsLoad(function()
Event.Register("BAG_UPDATE", private.BagUpdateHandler)
Event.Register("BAG_UPDATE_DELAYED", private.BagUpdateDelayedHandler)
- Event.Register("BANKFRAME_OPENED", private.BankOpenedHandler)
- Event.Register("BANKFRAME_CLOSED", private.BankClosedHandler)
+ DefaultUI.RegisterBankVisibleCallback(private.BankVisible, true)
Event.Register("PLAYERBANKSLOTS_CHANGED", private.BankSlotChangedHandler)
if not TSM.IsWowClassic() then
Event.Register("PLAYERREAGENTBANKSLOTS_CHANGED", private.ReagentBankSlotChangedHandler)
@@ -247,7 +246,7 @@ function BagTracking.CreateQueryBankItem(itemString)
end
function BagTracking.ForceBankQuantityDeduction(itemString, quantity)
- if private.bankOpen then
+ if DefaultUI.IsBankVisible() then
return
end
private.slotDB:SetQueryUpdatesPaused(true)
@@ -296,7 +295,7 @@ end
-- Event Handlers
-- ============================================================================
-function private.BankOpenedHandler()
+function private.BankVisible()
if private.isFirstBankOpen then
private.isFirstBankOpen = false
-- this is the first time opening the bank so we'll scan all the items so wipe our existing quantities
@@ -320,7 +319,6 @@ function private.BankOpenedHandler()
query:Release()
private.quantityDB:SetQueryUpdatesPaused(false)
end
- private.bankOpen = true
private.BagUpdateHandler(nil, BANK_CONTAINER)
for bag = NUM_REAL_BAG_SLOTS + 1, NUM_REAL_BAG_SLOTS + NUM_BANKBAGSLOTS do
private.BagUpdateHandler(nil, bag)
@@ -335,10 +333,6 @@ function private.BankOpenedHandler()
private.ReagentBankSlotUpdateDelayed()
end
-function private.BankClosedHandler()
- private.bankOpen = false
-end
-
function private.BagUpdateHandler(_, bag)
if private.bagUpdates.pending[bag] then
return
@@ -371,7 +365,7 @@ function private.BagUpdateDelayedHandler()
Delay.AfterFrame("bagBankScan", 2, private.BagUpdateDelayedHandler)
end
- if private.bankOpen then
+ if DefaultUI.IsBankVisible() then
-- scan any pending bank bags
for i = #private.bagUpdates.bankList, 1, -1 do
local bag = private.bagUpdates.bankList[i]
@@ -404,7 +398,7 @@ end
-- this is not a WoW event, but we fake it based on a delay from private.BankSlotChangedHandler
function private.BankSlotUpdateDelayed()
- if not private.bankOpen then
+ if not DefaultUI.IsBankVisible() then
return
end
private.slotDB:SetQueryUpdatesPaused(true)
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/DefaultUI.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/DefaultUI.lua
new file mode 100644
index 000000000..180612a8e
--- /dev/null
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/DefaultUI.lua
@@ -0,0 +1,150 @@
+-- ------------------------------------------------------------------------------ --
+-- TradeSkillMaster --
+-- https://tradeskillmaster.com --
+-- All Rights Reserved - Detailed license information included with addon. --
+-- ------------------------------------------------------------------------------ --
+
+--- DefaultUI Functions
+-- @module DefaultUI
+
+local _, TSM = ...
+local DefaultUI = TSM.Init("Service.DefaultUI")
+local Event = TSM.Include("Util.Event")
+local private = {
+ visible = {},
+ callbacks = {},
+ callbackFilter = {},
+}
+local FRAMES = {
+ MAIL = "MAIL",
+ AUCTION_HOUSE = "AUCTION_HOUSE",
+ BANK = "BANK",
+ GUILDBANK = "GUILDBANK",
+ MERCHANT = "MERCHANT",
+}
+
+
+
+-- ============================================================================
+-- Module Loading
+-- ============================================================================
+
+DefaultUI:OnModuleLoad(function()
+ for _, frame in pairs(FRAMES) do
+ private.visible[frame] = false
+ private.callbacks[frame] = {}
+ private.callbackFilter[frame] = {}
+ end
+ if TSM.IsWowClassic() then
+ Event.Register("MAIL_SHOW", function() private.HandleEvent(FRAMES.MAIL, true) end)
+ Event.Register("MAIL_CLOSED", function() private.HandleEvent(FRAMES.MAIL, false) end)
+ Event.Register("AUCTION_HOUSE_SHOW", function() private.HandleEvent(FRAMES.AUCTION_HOUSE, true) end)
+ Event.Register("AUCTION_HOUSE_CLOSED", function() private.HandleEvent(FRAMES.AUCTION_HOUSE, false) end)
+ Event.Register("BANKFRAME_OPENED", function() private.HandleEvent(FRAMES.BANK, true) end)
+ Event.Register("BANKFRAME_CLOSED", function() private.HandleEvent(FRAMES.BANK, false) end)
+ Event.Register("GUILDBANKFRAME_OPENED", function() private.HandleEvent(FRAMES.GUILDBANK, true) end)
+ Event.Register("GUILDBANKFRAME_CLOSED", function() private.HandleEvent(FRAMES.GUILDBANK, false) end)
+ Event.Register("MERCHANT_SHOW", function() private.HandleEvent(FRAMES.MERCHANT, true) end)
+ Event.Register("MERCHANT_CLOSED", function() private.HandleEvent(FRAMES.MERCHANT, false) end)
+ else
+ Event.Register("PLAYER_INTERACTION_MANAGER_FRAME_SHOW", function(_, frameType)
+ if frameType == Enum.PlayerInteractionType.MailInfo then
+ private.HandleEvent(FRAMES.MAIL, true)
+ elseif frameType == Enum.PlayerInteractionType.Auctioneer then
+ private.HandleEvent(FRAMES.AUCTION_HOUSE, true)
+ elseif frameType == Enum.PlayerInteractionType.Banker then
+ private.HandleEvent(FRAMES.BANK, true)
+ elseif frameType == Enum.PlayerInteractionType.GuildBanker then
+ private.HandleEvent(FRAMES.GUILDBANK, true)
+ elseif frameType == Enum.PlayerInteractionType.Merchant then
+ private.HandleEvent(FRAMES.MERCHANT, true)
+ end
+ end)
+ Event.Register("PLAYER_INTERACTION_MANAGER_FRAME_HIDE", function(_, frameType)
+ if frameType == Enum.PlayerInteractionType.MailInfo then
+ private.HandleEvent(FRAMES.MAIL, false)
+ elseif frameType == Enum.PlayerInteractionType.Auctioneer then
+ private.HandleEvent(FRAMES.AUCTION_HOUSE, false)
+ elseif frameType == Enum.PlayerInteractionType.Banker then
+ private.HandleEvent(FRAMES.BANK, false)
+ elseif frameType == Enum.PlayerInteractionType.GuildBanker then
+ private.HandleEvent(FRAMES.GUILDBANK, false)
+ elseif frameType == Enum.PlayerInteractionType.Merchant then
+ private.HandleEvent(FRAMES.MERCHANT, false)
+ end
+ end)
+ end
+end)
+
+
+
+-- ============================================================================
+-- Module Functions
+-- ============================================================================
+
+function DefaultUI.IsMailVisible()
+ return private.visible[FRAMES.MAIL]
+end
+
+function DefaultUI.IsAuctionHouseVisible()
+ return private.visible[FRAMES.AUCTION_HOUSE]
+end
+
+function DefaultUI.IsBankVisible()
+ return private.visible[FRAMES.BANK]
+end
+
+function DefaultUI.IsGuildBankVisible()
+ return private.visible[FRAMES.GUILDBANK]
+end
+
+function DefaultUI.IsMerchantVisible()
+ return private.visible[FRAMES.MERCHANT]
+end
+
+function DefaultUI.RegisterMailVisibleCallback(callback, visibleFilter)
+ private.RegisterCallback(FRAMES.MAIL, callback, visibleFilter)
+end
+
+function DefaultUI.RegisterAuctionHouseVisibleCallback(callback, visibleFilter)
+ private.RegisterCallback(FRAMES.AUCTION_HOUSE, callback, visibleFilter)
+end
+
+function DefaultUI.RegisterBankVisibleCallback(callback, visibleFilter)
+ private.RegisterCallback(FRAMES.BANK, callback, visibleFilter)
+end
+
+function DefaultUI.RegisterGuildBankVisibleCallback(callback, visibleFilter)
+ private.RegisterCallback(FRAMES.GUILDBANK, callback, visibleFilter)
+end
+
+function DefaultUI.RegisterMerchantVisibleCallback(callback, visibleFilter)
+ private.RegisterCallback(FRAMES.MERCHANT, callback, visibleFilter)
+end
+
+
+
+-- ============================================================================
+-- Private Helper Functions
+-- ============================================================================
+
+function private.RegisterCallback(frame, callback, visibleFilter)
+ tinsert(private.callbacks[frame], callback)
+ private.callbackFilter[frame][callback] = visibleFilter
+end
+
+function private.HandleEvent(frame, visible)
+ assert(type(visible) == "boolean")
+ if private.visible[frame] == visible then
+ return
+ end
+ private.visible[frame] = visible
+ for _, callback in ipairs(private.callbacks[frame]) do
+ local filter = private.callbackFilter[frame][callback]
+ if filter == nil then
+ callback(visible)
+ elseif filter == visible then
+ callback()
+ end
+ end
+end
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/GuildTracking.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/GuildTracking.lua
index 25e207017..30cd2bc90 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/GuildTracking.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/GuildTracking.lua
@@ -13,12 +13,12 @@ local TempTable = TSM.Include("Util.TempTable")
local SlotId = TSM.Include("Util.SlotId")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Settings = TSM.Include("Service.Settings")
local private = {
settings = nil,
slotDB = nil,
quantityDB = nil,
- isOpen = nil,
pendingPetSlotIds = {},
}
local PLAYER_NAME = UnitName("player")
@@ -53,8 +53,7 @@ GuildTracking:OnSettingsLoad(function()
:AddNumberField("quantity")
:Commit()
if not TSM.IsWowVanillaClassic() then
- Event.Register(TSM.IsWowClassic() and "GUILDBANKFRAME_OPENED" or "PLAYER_INTERACTION_MANAGER_FRAME_SHOW", private.GuildBankFrameOpenedHandler)
- Event.Register(TSM.IsWowClassic() and "GUILDBANKFRAME_CLOSED" or "PLAYER_INTERACTION_MANAGER_FRAME_HIDE", private.GuildBankFrameClosedHandler)
+ DefaultUI.RegisterGuildBankVisibleCallback(private.GuildBankFrameVisible, true)
Event.Register("GUILDBANKBAGSLOTS_CHANGED", private.GuildBankBagSlotsChangedHandler)
Delay.AfterFrame(1, private.GetGuildName)
Event.Register("PLAYER_GUILD_UPDATE", private.GetGuildName)
@@ -150,23 +149,12 @@ function private.RebuildQuantityDB()
private.quantityDB:BulkInsertEnd()
end
-function private.GuildBankFrameOpenedHandler(event, frameType)
- if not TSM.IsWowClassic() and frameType ~= Enum.PlayerInteractionType.GuildBanker then
- return
- end
+function private.GuildBankFrameVisible()
local initialTab = GetCurrentGuildBankTab()
for i = 1, GetNumGuildBankTabs() do
QueryGuildBankTab(i)
end
QueryGuildBankTab(initialTab)
- private.isOpen = true
-end
-
-function private.GuildBankFrameClosedHandler(event, frameType)
- if not TSM.IsWowClassic() and frameType ~= Enum.PlayerInteractionType.GuildBanker then
- return
- end
- private.isOpen = nil
end
function private.GuildBankBagSlotsChangedHandler()
@@ -174,7 +162,7 @@ function private.GuildBankBagSlotsChangedHandler()
end
function private.GuildBankChangedDelayed()
- if not private.isOpen then
+ if not DefaultUI.IsGuildBankVisible() then
return
end
if not PLAYER_GUILD then
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemInfo.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemInfo.lua
index 20e95451a..f5492f2e4 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemInfo.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemInfo.lua
@@ -22,6 +22,7 @@ local Math = TSM.Include("Util.Math")
local String = TSM.Include("Util.String")
local Log = TSM.Include("Util.Log")
local Table = TSM.Include("Util.Table")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local Settings = TSM.Include("Service.Settings")
local private = {
db = nil,
@@ -289,7 +290,7 @@ ItemInfo:OnSettingsLoad(function()
-- process pending item info every 0.05 seconds
Delay.AfterTime("PROCESS_ITEM_INFO", 0, private.ProcessItemInfo, ITEM_INFO_INTERVAL)
-- scan the merchant when the goods are shown
- Event.Register("MERCHANT_SHOW", private.ScanMerchant)
+ DefaultUI.RegisterMerchantVisibleCallback(private.ScanMerchant, true)
Event.Register("MERCHANT_UPDATE", private.UpdateMerchant)
end)
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemLinked.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemLinked.lua
index 11c1a991f..b23e3b22b 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemLinked.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/ItemLinked.lua
@@ -24,12 +24,12 @@ local private = {
ItemLinked:OnModuleLoad(function()
local origHandleModifiedItemClick = HandleModifiedItemClick
- HandleModifiedItemClick = function(link)
- return private.ItemLinkedHook(origHandleModifiedItemClick, link)
+ HandleModifiedItemClick = function(...)
+ return private.ItemLinkedHook(origHandleModifiedItemClick, ...)
end
local origChatEdit_InsertLink = ChatEdit_InsertLink
- ChatEdit_InsertLink = function(link)
- return private.ItemLinkedHook(origChatEdit_InsertLink, link)
+ ChatEdit_InsertLink = function(...)
+ return private.ItemLinkedHook(origChatEdit_InsertLink, ...)
end
end)
@@ -52,11 +52,12 @@ end
-- Private Helper Functions
-- ============================================================================
-function private.ItemLinkedHook(origFunc, itemLink)
- local putIntoChat = origFunc(itemLink)
+function private.ItemLinkedHook(origFunc, ...)
+ local putIntoChat = origFunc(...)
if putIntoChat then
return putIntoChat
end
+ local itemLink = ...
local name = ItemInfo.GetName(itemLink)
if not name or not private.HandleItemLinked(name, itemLink) then
return putIntoChat
diff --git a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/MailTracking.lua b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/MailTracking.lua
index 2ddc95665..b07dca2b9 100644
--- a/Interface/AddOns/TradeSkillMaster/LibTSM/Service/MailTracking.lua
+++ b/Interface/AddOns/TradeSkillMaster/LibTSM/Service/MailTracking.lua
@@ -12,6 +12,7 @@ local Event = TSM.Include("Util.Event")
local TempTable = TSM.Include("Util.TempTable")
local Log = TSM.Include("Util.Log")
local ItemString = TSM.Include("Util.ItemString")
+local DefaultUI = TSM.Include("Service.DefaultUI")
local ItemInfo = TSM.Include("Service.ItemInfo")
local Settings = TSM.Include("Service.Settings")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
@@ -20,7 +21,6 @@ local private = {
mailDB = nil,
itemDB = nil,
quantityDB = nil,
- isOpen = false,
tooltip = nil,
callbacks = {},
expiresCallbacks = {},
@@ -91,8 +91,6 @@ MailTracking:OnSettingsLoad(function()
:Commit()
private.settings.pendingMail[PLAYER_NAME] = private.settings.pendingMail[PLAYER_NAME] or {}
- Event.Register("MAIL_SHOW", private.MailShowHandler)
- Event.Register("MAIL_CLOSED", private.MailClosedHandler)
Event.Register("MAIL_INBOX_UPDATE", private.MailInboxUpdateHandler)
if TSM.IsWowClassic() then
@@ -232,16 +230,8 @@ end
-- Event Handlers
-- ============================================================================
-function private.MailShowHandler()
- private.isOpen = true
-end
-
-function private.MailClosedHandler()
- private.isOpen = false
-end
-
function private.MailInboxUpdateHandler()
- if not private.isOpen then
+ if not DefaultUI.IsMailVisible() then
return
end
@@ -249,7 +239,7 @@ function private.MailInboxUpdateHandler()
end
function private.MailInboxUpdateDelayed()
- if not private.isOpen then
+ if not DefaultUI.IsMailVisible() then
return
end
diff --git a/Interface/AddOns/TradeSkillMaster/Locale/Locale.lua b/Interface/AddOns/TradeSkillMaster/Locale/Locale.lua
index 15b7b4a92..d86c7715a 100644
--- a/Interface/AddOns/TradeSkillMaster/Locale/Locale.lua
+++ b/Interface/AddOns/TradeSkillMaster/Locale/Locale.lua
@@ -1854,9 +1854,9 @@ L["Deposit Cost"] = "Anzahlungs-Kosten"
L["Deposit reagents"] = "Deposit reagents"
L["Deselect All"] = "Alles abwählen"
L["Destroy Next"] = "Nächstes zerstören"
-L["Destroy Value"] = "Zerstörungswert"
--[[Translation missing --]]
L["Destroy value"] = "Destroy value"
+L["Destroy Value"] = "Zerstörungswert"
--[[Translation missing --]]
L["Destroy value source"] = "Destroy value source"
L["Destroying"] = "Destroying"
@@ -2245,10 +2245,10 @@ L["Make Operations Global?"] = "Make Operations Global?"
L["Management Options"] = "Verwaltungsoptionen"
L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."] = "Viele häufig verwendete Aktionen in TSM können in ein Makro umgewandelt und an dein Mausrad gebunden werden. Benutze dazu die folgenden Optionen."
L["Map Ping"] = "Klick auf Minimap"
-L["Market Value"] = "Marktwert"
L["Market value"] = "Marktwert"
-L["Market value price source"] = "Marktpreis Preisquelle"
+L["Market Value"] = "Marktwert"
L["Market Value Price Source"] = "Marktwert-Preisquelle"
+L["Market value price source"] = "Marktpreis Preisquelle"
L["Mat cost"] = "Mats Kosten"
L["Mat Price"] = "Mat Preis"
--[[Translation missing --]]
@@ -3836,9 +3836,9 @@ L["Deposit reagents"] = "Deposit reagents"
L["Deselect All"] = "Deselect All"
--[[Translation missing --]]
L["Destroy Next"] = "Destroy Next"
-L["Destroy Value"] = "Valor de Destrucción"
--[[Translation missing --]]
L["Destroy value"] = "Destroy value"
+L["Destroy Value"] = "Valor de Destrucción"
--[[Translation missing --]]
L["Destroy value source"] = "Destroy value source"
--[[Translation missing --]]
@@ -4400,14 +4400,14 @@ L["Many commonly-used actions in TSM can be added to a macro and bound to your s
--[[Translation missing --]]
L["Map Ping"] = "Map Ping"
--[[Translation missing --]]
-L["Market Value"] = "Market Value"
---[[Translation missing --]]
L["Market value"] = "Market value"
--[[Translation missing --]]
-L["Market value price source"] = "Market value price source"
+L["Market Value"] = "Market Value"
--[[Translation missing --]]
L["Market Value Price Source"] = "Market Value Price Source"
--[[Translation missing --]]
+L["Market value price source"] = "Market value price source"
+--[[Translation missing --]]
L["Mat cost"] = "Mat cost"
--[[Translation missing --]]
L["Mat Price"] = "Mat Price"
@@ -4442,10 +4442,10 @@ L["Max restock quantity"] = "Max restock quantity"
--[[Translation missing --]]
L["Max Sell Price"] = "Max Sell Price"
--[[Translation missing --]]
-L["Max Shopping Price"] = "Max Shopping Price"
---[[Translation missing --]]
L["Max shopping price"] = "Max shopping price"
--[[Translation missing --]]
+L["Max Shopping Price"] = "Max Shopping Price"
+--[[Translation missing --]]
L["Max sniper price"] = "Max sniper price"
--[[Translation missing --]]
L["Maximum amount already posted."] = "Maximum amount already posted."
@@ -4478,10 +4478,10 @@ L["Min 0.5 - Max 10"] = "Min 0.5 - Max 10"
--[[Translation missing --]]
L["Min Buy Price"] = "Min Buy Price"
--[[Translation missing --]]
-L["Min Buyout"] = "Min Buyout"
---[[Translation missing --]]
L["Min buyout"] = "Min buyout"
--[[Translation missing --]]
+L["Min Buyout"] = "Min Buyout"
+--[[Translation missing --]]
L["Min number of expires"] = "Min number of expires"
--[[Translation missing --]]
L["Min profit amount"] = "Min profit amount"
@@ -5007,10 +5007,10 @@ L["Sale information"] = "Sale information"
--[[Translation missing --]]
L["Sale Price"] = "Sale Price"
--[[Translation missing --]]
-L["Sale Rate"] = "Sale Rate"
---[[Translation missing --]]
L["Sale rate"] = "Sale rate"
--[[Translation missing --]]
+L["Sale Rate"] = "Sale Rate"
+--[[Translation missing --]]
L["Sales"] = "Sales"
--[[Translation missing --]]
L["SALES"] = "SALES"
@@ -6259,8 +6259,8 @@ L["Deposit reagents"] = "Deposit reagents"
L["Deselect All"] = "Desmarcar todo"
--[[Translation missing --]]
L["Destroy Next"] = "Destroy Next"
-L["Destroy Value"] = "Borrar Valor"
L["Destroy value"] = "Borrar valor"
+L["Destroy Value"] = "Borrar Valor"
--[[Translation missing --]]
L["Destroy value source"] = "Destroy value source"
--[[Translation missing --]]
@@ -6732,14 +6732,14 @@ L["Management Options"] = "Opciones de Manejo"
--[[Translation missing --]]
L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."] = "Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."
L["Map Ping"] = "Ping en Mapa"
-L["Market Value"] = "Valor del Mercado"
--[[Translation missing --]]
L["Market value"] = "Market value"
---[[Translation missing --]]
-L["Market value price source"] = "Market value price source"
+L["Market Value"] = "Valor del Mercado"
--[[Translation missing --]]
L["Market Value Price Source"] = "Market Value Price Source"
--[[Translation missing --]]
+L["Market value price source"] = "Market value price source"
+--[[Translation missing --]]
L["Mat cost"] = "Mat cost"
--[[Translation missing --]]
L["Mat Price"] = "Mat Price"
@@ -8253,8 +8253,8 @@ L["Deposit Cost"] = "Coût du dépôt"
L["Deposit reagents"] = "Dépôt des composants"
L["Deselect All"] = "Tout désélectionner"
L["Destroy Next"] = "Détruire le suivant"
-L["Destroy Value"] = "Valeur à la destruction"
L["Destroy value"] = "Valeur à la destruction"
+L["Destroy Value"] = "Valeur à la destruction"
L["Destroy value source"] = "Source de la valeur à la destruction"
L["Destroying"] = "Détruire"
L["Destroying %s button"] = "Bouton %s de destruction"
@@ -8563,10 +8563,10 @@ L["Make Operations Global?"] = "Rendre les opérations globales?"
L["Management Options"] = "Options de gestion"
L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."] = "Un grand nombre d'actions usuelles de TSM peuvent être ajoutées à une macro et associées à la molette de la souris. Utilisez les options ci-dessous pour paramétrer cette fonction."
L["Map Ping"] = "Ping sur la carte"
-L["Market Value"] = "Valeur du marché"
L["Market value"] = "Valeur du marché"
-L["Market value price source"] = "Source du prix de la valeur du marché"
+L["Market Value"] = "Valeur du marché"
L["Market Value Price Source"] = "Source du prix de la valeur du marché"
+L["Market value price source"] = "Source du prix de la valeur du marché"
L["Mat cost"] = "Coût du composant"
L["Mat Price"] = "Prix des matières premières"
L["Match stack size"] = "Faire correspondre la taille de la pile"
@@ -9719,8 +9719,8 @@ L["Deposit Cost"] = "Costo di Deposito"
L["Deposit reagents"] = "Deposito reagenti"
L["Deselect All"] = "Deseleziona Tutto"
L["Destroy Next"] = "Distruggi il Prossimo"
-L["Destroy value"] = "valore Distruzione"
L["Destroy Value"] = "Valore Distruzione"
+L["Destroy value"] = "valore Distruzione"
L["Destroy value source"] = "Fonte del valore di Distruzione"
L["Destroying"] = "Distruggendo"
L["Destroying %s button"] = "Distruggendo %s button"
@@ -10082,10 +10082,10 @@ L["Management Options"] = "Opzioni di Gestioni"
L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."] = "Molte azioni di uso comune in TSM possono essere aggiunte a una macro e associate alla rotella di scorrimento. Utilizzare le opzioni seguenti per impostare questa macro e l'associazione con la rotellina di scorrimento."
--[[Translation missing --]]
L["Map Ping"] = "Map Ping"
-L["Market value"] = "Valore di mercato"
L["Market Value"] = "Valore di Mercato"
-L["Market Value Price Source"] = "Fonte di Prezzo del Valore di Mercato"
+L["Market value"] = "Valore di mercato"
L["Market value price source"] = "Fonte di prezzo del valore di mercato"
+L["Market Value Price Source"] = "Fonte di Prezzo del Valore di Mercato"
L["Mat cost"] = "Costo dei Materiali"
L["Mat Price"] = "Prezzo dei Materiali"
L["Match stack size"] = "Abbina le dimensioni della stack"
@@ -11271,10 +11271,10 @@ L["Deposit reagents"] = "재료 은행"
L["Deselect All"] = "모두 선택 해제하기"
L["Destroy Next"] = "다음 물건 뽀각하기"
--[[Translation missing --]]
-L["Destroy Value"] = "Destroy Value"
---[[Translation missing --]]
L["Destroy value"] = "Destroy value"
--[[Translation missing --]]
+L["Destroy Value"] = "Destroy Value"
+--[[Translation missing --]]
L["Destroy value source"] = "Destroy value source"
L["Destroying"] = "마력 추출"
--[[Translation missing --]]
@@ -11725,10 +11725,10 @@ L["Max quantity"] = "최대 수량"
L["Max restock quantity"] = "Max restock quantity"
L["Max Sell Price"] = "최대 판매 가격"
--[[Translation missing --]]
-L["Max Shopping Price"] = "Max Shopping Price"
---[[Translation missing --]]
L["Max shopping price"] = "Max shopping price"
--[[Translation missing --]]
+L["Max Shopping Price"] = "Max Shopping Price"
+--[[Translation missing --]]
L["Max sniper price"] = "Max sniper price"
--[[Translation missing --]]
L["Maximum amount already posted."] = "Maximum amount already posted."
@@ -11758,8 +11758,8 @@ L["Min 0 - Max 20"] = "Min 0 - Max 20"
L["Min 0.5 - Max 10"] = "Min 0.5 - Max 10"
--[[Translation missing --]]
L["Min Buy Price"] = "Min Buy Price"
-L["Min Buyout"] = "최소 즉시 구매"
L["Min buyout"] = "최소 즉시 구매"
+L["Min Buyout"] = "최소 즉시 구매"
--[[Translation missing --]]
L["Min number of expires"] = "Min number of expires"
--[[Translation missing --]]
@@ -12153,8 +12153,8 @@ L["Sale"] = "판매"
L["Sale Data"] = "판매 데이터"
L["Sale information"] = "판매 정보"
L["Sale Price"] = "판매 가격"
-L["Sale Rate"] = "판매율"
L["Sale rate"] = "판매율"
+L["Sale Rate"] = "판매율"
L["Sales"] = "판매"
L["SALES"] = "소득"
L["Save"] = "저장"
@@ -14866,8 +14866,8 @@ L["Deposit Cost"] = "Стоимость залога"
L["Deposit reagents"] = "Залоговые реагенты"
L["Deselect All"] = "Убрать выделение со всего"
L["Destroy Next"] = "Уничтожить следующее"
-L["Destroy Value"] = "Стоимость уничтожения"
L["Destroy value"] = "Цена уничтожения"
+L["Destroy Value"] = "Стоимость уничтожения"
L["Destroy value source"] = "Источник цены уничтожения"
L["Destroying"] = "Уничтожение"
L["Destroying %s button"] = "Кнопка уничтожить %s"
@@ -15176,10 +15176,10 @@ L["Make Operations Global?"] = "Сделать операции глобальн
L["Management Options"] = "Дополнительные настройки"
L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."] = "Многие часто используемые действия в TSM можно привязать к прокрутке колеса мыши с помощью макросов. Используйте настройки ниже, чтобы экономить время."
L["Map Ping"] = "Звук пингования по карте"
-L["Market Value"] = "Рыночная цена аукциона (14дн.)"
L["Market value"] = "Рыночная цена аукциона (14дн.)"
-L["Market value price source"] = "Источник рыночной цены"
+L["Market Value"] = "Рыночная цена аукциона (14дн.)"
L["Market Value Price Source"] = "Источник рыночной цены"
+L["Market value price source"] = "Источник рыночной цены"
L["Mat cost"] = "Стоимость мат-ов"
L["Mat Price"] = "Цена мат-ов"
L["Match stack size"] = "Совпадение размера стопки"
@@ -16599,8 +16599,8 @@ L["Max Price"] = "最高价格"
L["Max quantity"] = "最大数量"
L["Max restock quantity"] = "最大补货数量"
L["Max Sell Price"] = "最高卖价"
-L["Max Shopping Price"] = "最高商店价格"
L["Max shopping price"] = "最高商店价格"
+L["Max Shopping Price"] = "最高商店价格"
L["Max sniper price"] = "最高狙击价格"
L["Maximum amount already posted."] = "已发布最大数量"
L["Maximum auction price"] = "最高拍卖价"
@@ -16617,8 +16617,8 @@ L["Min"] = "最小"
L["Min 0 - Max 20"] = "最小 0 - 最大 20"
L["Min 0.5 - Max 10"] = "最小 0.5 - 最大 10"
L["Min Buy Price"] = "最低买入价"
-L["Min Buyout"] = "最低一口价"
L["Min buyout"] = "最低一口价"
+L["Min Buyout"] = "最低一口价"
L["Min number of expires"] = "最小过期数"
L["Min profit amount"] = "最小利润额"
L["Min restock quantity"] = "最少补货量"
@@ -16893,8 +16893,8 @@ L["Sale"] = "出售"
L["Sale Data"] = "销售数据"
L["Sale information"] = "销售信息"
L["Sale Price"] = "销售价格"
-L["Sale Rate"] = "成交率"
L["Sale rate"] = "销售率"
+L["Sale Rate"] = "成交率"
L["Sales"] = "出售"
L["SALES"] = "出售"
L["Save"] = "保存"
@@ -17979,8 +17979,8 @@ L["Max Price"] = "最高價格"
L["Max quantity"] = "最大數量"
L["Max restock quantity"] = "最大補貨數量"
L["Max Sell Price"] = "最高售價"
-L["Max shopping price"] = "最高商店價格"
L["Max Shopping Price"] = "最高商店價格"
+L["Max shopping price"] = "最高商店價格"
L["Max sniper price"] = "最高狙擊價格"
L["Maximum amount already posted."] = "已發佈的最大數量"
L["Maximum auction price"] = "最高拍賣價格"
@@ -17997,8 +17997,8 @@ L["Min"] = "最小"
L["Min 0 - Max 20"] = "最少 0 - 最多 20"
L["Min 0.5 - Max 10"] = "最小 0.5 - 最大 10"
L["Min Buy Price"] = "最低進價"
-L["Min buyout"] = "最低一口價"
L["Min Buyout"] = "最低一口價"
+L["Min buyout"] = "最低一口價"
L["Min number of expires"] = "最小過期數"
L["Min profit amount"] = "最低利潤"
L["Min restock quantity"] = "最小補貨量"
@@ -18273,8 +18273,8 @@ L["Sale"] = "出售"
L["Sale Data"] = "出售數據"
L["Sale information"] = "出售信息"
L["Sale Price"] = "售價"
-L["Sale rate"] = "成交率"
L["Sale Rate"] = "成交率"
+L["Sale rate"] = "成交率"
L["Sales"] = "銷貨收入"
L["SALES"] = "銷貨收入"
L["Save"] = "保存"
diff --git a/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.lua b/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.lua
index 6ed2c98ec..54fc68f23 100644
--- a/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.lua
+++ b/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.lua
@@ -37,7 +37,7 @@ local APP_INFO_REQUIRED_KEYS = { "version", "lastSync", "message", "news" }
local LOGOUT_TIME_WARNING_THRESHOLD_MS = 20
do
-- show a message if we were updated
- if GetAddOnMetadata("TradeSkillMaster", "Version") ~= "v4.11.61" then
+ if GetAddOnMetadata("TradeSkillMaster", "Version") ~= "v4.11.64" then
Wow.ShowBasicMessage("TSM was just updated and may not work properly until you restart WoW.")
end
end
diff --git a/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.toc b/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.toc
index a4462a975..f5aef801d 100644
--- a/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.toc
+++ b/Interface/AddOns/TradeSkillMaster/TradeSkillMaster.toc
@@ -2,7 +2,7 @@
## Title: |cff00fe00TradeSkillMaster|r
## Notes: Auction house and gold making addon.
## Author: TradeSkillMaster Team
-## Version: v4.11.61
+## Version: v4.11.64
## SavedVariables: TradeSkillMasterDB, TSMItemInfoDB
## OptionalDeps: ArkInventory, Auc-Advanced, Auctionator, TheUndermineJournal, BootyBayGazette, AuctionDB
## X-Embeds: AccurateTime, Ace3, LibDataBroker-1.1, LibDBIcon-1.0, LibRealmInfo, LibDeflate, LibSerialize
@@ -84,6 +84,7 @@ LibTSM\Util\ScriptWrapper.lua
# LibTSM service files
LibTSM\Service\ErrorHandler.lua
+LibTSM\Service\DefaultUI.lua
LibTSM\Service\Threading.lua
LibTSM\Service\SlashCommands.lua
LibTSM\Service\Settings.lua