|
|
|
@ -5,6 +5,8 @@ local LBF = LibStub("Masque", true)
|
|
|
|
|
|
|
|
|
|
local lbfGroup
|
|
|
|
|
|
|
|
|
|
local WowVer = select(4, GetBuildInfo())
|
|
|
|
|
|
|
|
|
|
local MillingId = 51005
|
|
|
|
|
local MillingItemSubType = babbleInv["Herb"]
|
|
|
|
|
local MillingItemSecondarySubType = babbleInv["Other"]
|
|
|
|
@ -26,12 +28,28 @@ local AdditionalMillableItems = {
|
|
|
|
|
124105,
|
|
|
|
|
124106,
|
|
|
|
|
128304,
|
|
|
|
|
151565,
|
|
|
|
|
-- BfA herbs
|
|
|
|
|
152505,
|
|
|
|
|
152506,
|
|
|
|
|
152507,
|
|
|
|
|
152508,
|
|
|
|
|
152509,
|
|
|
|
|
152510,
|
|
|
|
|
152511,
|
|
|
|
|
168487,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local AdditionalProspectableItems = {
|
|
|
|
|
-- Legion ore
|
|
|
|
|
123918,
|
|
|
|
|
123919,
|
|
|
|
|
151564,
|
|
|
|
|
-- BfA ore
|
|
|
|
|
152512,
|
|
|
|
|
152513,
|
|
|
|
|
152579,
|
|
|
|
|
168185,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local MassMilling = {
|
|
|
|
@ -50,6 +68,7 @@ local MassMilling = {
|
|
|
|
|
[124105] = 209662,
|
|
|
|
|
[124106] = 209664,
|
|
|
|
|
[128304] = 210116,
|
|
|
|
|
[151565] = 247861,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local HerbCombineItems = {
|
|
|
|
@ -81,6 +100,7 @@ local OreCombineItems = {
|
|
|
|
|
-- MoP
|
|
|
|
|
97512, -- ghost iron nugget
|
|
|
|
|
97546, -- kyparite fragment
|
|
|
|
|
90407, -- sparkling shard
|
|
|
|
|
-- WoD
|
|
|
|
|
109991, -- true iron nugget
|
|
|
|
|
109992, -- blackrock fragment
|
|
|
|
@ -91,6 +111,10 @@ local DisenchantTypes = {babbleInv["Armor"], babbleInv["Weapon"]}
|
|
|
|
|
local CanDisenchant = false
|
|
|
|
|
local EnchantingProfessionId = 333
|
|
|
|
|
|
|
|
|
|
local AdditionalDisenchantableItems = {
|
|
|
|
|
137195, -- highmountain armor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local PickLockId = 1804
|
|
|
|
|
local PickableItems = {
|
|
|
|
|
16882, -- battered junkbox
|
|
|
|
@ -118,6 +142,8 @@ local PickableItems = {
|
|
|
|
|
68729, -- elementium lockbox
|
|
|
|
|
88567, -- ghost iron lockbox
|
|
|
|
|
116920, -- true steel lockbox
|
|
|
|
|
121331, -- leystone lockbox
|
|
|
|
|
169475, -- barnacled lockbox
|
|
|
|
|
}
|
|
|
|
|
local CanPickLock = false
|
|
|
|
|
|
|
|
|
@ -180,6 +206,7 @@ function Breakables:OnInitialize()
|
|
|
|
|
buttonScale = 1,
|
|
|
|
|
fontSize = 11,
|
|
|
|
|
growDirection = 2,
|
|
|
|
|
ignoreList = {},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
self.db = LibStub("AceDB-3.0"):New("BreakablesDB", self.defaults, true)
|
|
|
|
@ -312,7 +339,7 @@ function Breakables:RegisterEvents()
|
|
|
|
|
|
|
|
|
|
self:RegisterEvent("MODIFIER_STATE_CHANGED", "FindBreakables")
|
|
|
|
|
|
|
|
|
|
if CanDisenchant then
|
|
|
|
|
if CanDisenchant and WowVer < 80000 then
|
|
|
|
|
self:RegisterEvent("TRADE_SKILL_UPDATE", "OnTradeSkillUpdate")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -384,7 +411,7 @@ function Breakables:OnTradeSkillUpdate()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:OnBagItemLockPicked()
|
|
|
|
|
nextCheck[1] = GetTime() + BagUpdateCheckDelay
|
|
|
|
|
self:FindBreakables()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:FindLevelOfProfessionIndex(idx)
|
|
|
|
@ -408,6 +435,29 @@ function Breakables:GetEnchantingLevel()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function GetIgnoreListOptions()
|
|
|
|
|
local ret = {}
|
|
|
|
|
|
|
|
|
|
for k,v in pairs(Breakables.settings.ignoreList) do
|
|
|
|
|
local name, _, _, _, _, _, _, _, _, texture = GetItemInfo(k)
|
|
|
|
|
if texture ~= nil and name ~= nil then
|
|
|
|
|
ret[k] = ("|T%s:0|t %s"):format(texture, name)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function IsIgnoringAnything()
|
|
|
|
|
for k,v in pairs(Breakables.settings.ignoreList) do
|
|
|
|
|
if v ~= nil then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:GetOptions()
|
|
|
|
|
local opts = {
|
|
|
|
|
name = L["Breakables"],
|
|
|
|
@ -541,6 +591,39 @@ function Breakables:GetOptions()
|
|
|
|
|
end,
|
|
|
|
|
order = 7,
|
|
|
|
|
},
|
|
|
|
|
ignoreList = {
|
|
|
|
|
type = 'multiselect',
|
|
|
|
|
name = L["Ignore list"],
|
|
|
|
|
desc = L["Items that have been right-clicked to exclude from the breakable list. Un-check the box to remove the item from the ignore list."],
|
|
|
|
|
get = function(info, key)
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, key)
|
|
|
|
|
Breakables.settings.ignoreList[key] = nil
|
|
|
|
|
Breakables:FindBreakables()
|
|
|
|
|
end,
|
|
|
|
|
confirm = function()
|
|
|
|
|
return L["Are you sure you want to remove this item from the ignore list?"]
|
|
|
|
|
end,
|
|
|
|
|
values = GetIgnoreListOptions,
|
|
|
|
|
hidden = function() return not IsIgnoringAnything() end,
|
|
|
|
|
order = 30,
|
|
|
|
|
},
|
|
|
|
|
clearIgnoreList = {
|
|
|
|
|
type = 'execute',
|
|
|
|
|
func = function()
|
|
|
|
|
for k,v in pairs(Breakables.settings.ignoreList) do
|
|
|
|
|
Breakables.settings.ignoreList[k] = nil
|
|
|
|
|
end
|
|
|
|
|
Breakables:FindBreakables()
|
|
|
|
|
end,
|
|
|
|
|
name = L["Clear ignore list"],
|
|
|
|
|
confirm = function()
|
|
|
|
|
return L["Are you sure you want to clear the ignore list?"]
|
|
|
|
|
end,
|
|
|
|
|
hidden = function() return not IsIgnoringAnything() end,
|
|
|
|
|
order = 31,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -677,7 +760,7 @@ end
|
|
|
|
|
function Breakables:GetSpellIdFromProfessionButton(itemType, itemId)
|
|
|
|
|
if itemType == BREAKABLE_HERB and itemId ~= nil then
|
|
|
|
|
if MassMilling[itemId] ~= nil and IsPlayerSpell(MassMilling[itemId]) then
|
|
|
|
|
return MassMilling[itemId]
|
|
|
|
|
--return MassMilling[itemId]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -727,6 +810,14 @@ function Breakables:OnMouseUp(frame)
|
|
|
|
|
self.settings.buttonFrameTop[frameNum] = frame:GetTop()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function IgnoreFunc(self, button)
|
|
|
|
|
if button == "RightButton" and not InCombatLockdown() then
|
|
|
|
|
Breakables.settings.ignoreList[self.itemId] = true
|
|
|
|
|
Breakables:FindBreakables()
|
|
|
|
|
LibStub("AceConfigRegistry-3.0"):NotifyChange("Breakables")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:FindBreakables(bag)
|
|
|
|
|
if self.settings.hide then
|
|
|
|
|
return
|
|
|
|
@ -774,7 +865,7 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if (foundBreakables[i][IDX_BREAKABLETYPE] == self.buttonFrame[j].type or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_COMBINE and foundBreakables[i][IDX_COUNT] >= 10)) and numBreakableStacks[j] < self.settings.maxBreakablesToShow then
|
|
|
|
|
local isDisenchantable = self:BreakableIsDisenchantable(foundBreakables[i][IDX_TYPE], foundBreakables[i][IDX_LEVEL], foundBreakables[i][IDX_RARITY])
|
|
|
|
|
local isDisenchantable = self:BreakableIsDisenchantable(foundBreakables[i][IDX_TYPE], foundBreakables[i][IDX_LEVEL], foundBreakables[i][IDX_RARITY], foundBreakables[i][IDX_LINK])
|
|
|
|
|
local isLockedItem = foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_PICK
|
|
|
|
|
|
|
|
|
|
if (CanDisenchant and isDisenchantable) or (CanPickLock and isLockedItem) or (foundBreakables[i][IDX_COUNT] >= 5) then
|
|
|
|
@ -796,7 +887,7 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
btn:EnableMouse(true)
|
|
|
|
|
btn:RegisterForClicks("AnyUp")
|
|
|
|
|
|
|
|
|
|
btn:SetAttribute("type", "spell")
|
|
|
|
|
btn:SetAttribute("type1", "spell")
|
|
|
|
|
|
|
|
|
|
if not btn.text then
|
|
|
|
|
btn.text = btn:CreateFontString()
|
|
|
|
@ -804,11 +895,15 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
end
|
|
|
|
|
btn.text:SetFont(NumberFont_Outline_Med:GetFont(), self.settings.fontSize, "OUTLINE")
|
|
|
|
|
|
|
|
|
|
btn:HookScript("OnClick", IgnoreFunc)
|
|
|
|
|
|
|
|
|
|
if lbfGroup then
|
|
|
|
|
lbfGroup:AddButton(btn)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
btn.itemId = self:GetItemIdFromLink(foundBreakables[i][IDX_LINK])
|
|
|
|
|
|
|
|
|
|
local attachFrom = "LEFT"
|
|
|
|
|
local attachTo = "RIGHT"
|
|
|
|
|
if self.settings.growDirection then
|
|
|
|
@ -847,13 +942,13 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
--or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_DE and DisenchantId)
|
|
|
|
|
--or PickLockId)
|
|
|
|
|
if BreakableAbilityName then
|
|
|
|
|
btn:SetAttribute("type", "spell")
|
|
|
|
|
btn:SetAttribute("type1", "spell")
|
|
|
|
|
btn:SetAttribute("spell", BreakableAbilityName)
|
|
|
|
|
|
|
|
|
|
btn:SetAttribute("target-bag", foundBreakables[i][IDX_BAG])
|
|
|
|
|
btn:SetAttribute("target-slot", foundBreakables[i][IDX_SLOT])
|
|
|
|
|
else
|
|
|
|
|
btn:SetAttribute("type", "item")
|
|
|
|
|
btn:SetAttribute("type1", "item")
|
|
|
|
|
btn:SetAttribute("item", "item:" .. self:GetItemIdFromLink(foundBreakables[i][IDX_LINK]))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -932,6 +1027,8 @@ function Breakables:OnEnterBreakableButton(this)
|
|
|
|
|
|
|
|
|
|
GameTooltip:AddLine(" ")
|
|
|
|
|
GameTooltip:AddLine(L["You can click on this button to break this item without having to click on the profession button first."], 1, 1, 1, 1)
|
|
|
|
|
GameTooltip:AddLine(" ")
|
|
|
|
|
GameTooltip:AddLine(L["You can right-click on this button to ignore this item. Items can be unignored from the options screen."], 1, 1, 1, 1)
|
|
|
|
|
GameTooltip:Show()
|
|
|
|
|
showingTooltip = this
|
|
|
|
|
end
|
|
|
|
@ -977,12 +1074,17 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
|
|
|
|
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bagId, slotId)
|
|
|
|
|
if texture then
|
|
|
|
|
local itemLink = GetContainerItemLink(bagId, slotId)
|
|
|
|
|
local itemId = self:GetItemIdFromLink(itemLink)
|
|
|
|
|
if self.settings.ignoreList[itemId] then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local itemName, _, itemRarity, itemLevel, _, itemType, itemSubType, _, equipSlot, itemTexture, vendorPrice = GetItemInfo(itemLink)
|
|
|
|
|
|
|
|
|
|
self.myTooltip:SetBagItem(bagId, slotId)
|
|
|
|
|
|
|
|
|
|
if CanDisenchant and itemRarity and itemRarity >= RARITY_UNCOMMON and itemRarity < RARITY_HEIRLOOM
|
|
|
|
|
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity) then
|
|
|
|
|
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId) then
|
|
|
|
|
local i = 1
|
|
|
|
|
local soulbound = false
|
|
|
|
|
for i=1,15 do
|
|
|
|
@ -997,7 +1099,7 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
|
|
|
|
|
|
|
|
|
local isInEquipmentSet = false
|
|
|
|
|
if self.settings.hideEqManagerItems then
|
|
|
|
|
isInEquipmentSet = self:IsInEquipmentSet(self:GetItemIdFromLink(itemLink))
|
|
|
|
|
isInEquipmentSet = self:IsInEquipmentSet(itemId)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local isTabard = false
|
|
|
|
@ -1006,7 +1108,7 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local shouldHideThisItem = (self.settings.hideEqManagerItems and isInEquipmentSet) or (self.settings.hideTabards and isTabard)
|
|
|
|
|
or equipSlot == nil or equipSlot == ""
|
|
|
|
|
or equipSlot == nil or (equipSlot == "" and not IsArtifactRelicItem(itemLink))
|
|
|
|
|
|
|
|
|
|
if (not soulbound or self.settings.showSoulbound) and not shouldHideThisItem then
|
|
|
|
|
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_DE, soulbound, itemName, itemRarity}
|
|
|
|
@ -1030,7 +1132,6 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local itemId = self:GetItemIdFromLink(itemLink)
|
|
|
|
|
if CanMill and not millable then
|
|
|
|
|
for i=1,#AdditionalMillableItems do
|
|
|
|
|
if AdditionalMillableItems[i] == itemId then
|
|
|
|
@ -1132,13 +1233,26 @@ do
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:IsInEquipmentSet(itemId)
|
|
|
|
|
for setIdx=1, GetNumEquipmentSets() do
|
|
|
|
|
local set = GetEquipmentSetInfo(setIdx)
|
|
|
|
|
local itemArray = GetEquipmentSetItemIDs(set)
|
|
|
|
|
if WowVer < 80000 then
|
|
|
|
|
for setIdx=1, GetNumEquipmentSets() do
|
|
|
|
|
local set = GetEquipmentSetInfo(setIdx)
|
|
|
|
|
local itemArray = GetEquipmentSetItemIDs(set)
|
|
|
|
|
|
|
|
|
|
for i=1, EQUIPPED_LAST do
|
|
|
|
|
if itemArray[i] and itemArray[i] == itemId then
|
|
|
|
|
return true
|
|
|
|
|
for i=1, EQUIPPED_LAST do
|
|
|
|
|
if itemArray[i] and itemArray[i] == itemId then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
local sets = C_EquipmentSet.GetEquipmentSetIDs()
|
|
|
|
|
for k, v in ipairs(sets) do
|
|
|
|
|
local itemArray = C_EquipmentSet.GetItemIDs(v)
|
|
|
|
|
|
|
|
|
|
for i=1, EQUIPPED_LAST do
|
|
|
|
|
if itemArray[i] and itemArray[i] == itemId then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@ -1152,10 +1266,8 @@ function Breakables:GetItemIdFromLink(itemLink)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:MergeBreakables(foundBreakable, breakableList)
|
|
|
|
|
local foundItemId = self:GetItemIdFromLink(foundBreakable[IDX_LINK])
|
|
|
|
|
for n=1,#breakableList do
|
|
|
|
|
local listItemId = self:GetItemIdFromLink(breakableList[n][IDX_LINK])
|
|
|
|
|
if foundItemId == listItemId then
|
|
|
|
|
if foundBreakable[IDX_LINK] == breakableList[n][IDX_LINK] then
|
|
|
|
|
-- always prefer the larger stack
|
|
|
|
|
if foundBreakable[IDX_COUNT] > breakableList[n][IDX_COUNT] then
|
|
|
|
|
breakableList[n][IDX_BAG] = foundBreakable[IDX_BAG]
|
|
|
|
@ -1183,9 +1295,14 @@ function Breakables:SortBreakables(foundBreakables)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity)
|
|
|
|
|
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId)
|
|
|
|
|
for i=1,#DisenchantTypes do
|
|
|
|
|
if DisenchantTypes[i] == itemType then
|
|
|
|
|
if DisenchantTypes[i] == itemType or IsArtifactRelicItem(itemLink) then
|
|
|
|
|
-- temp hack for bfa until disenchant item level scales are identified
|
|
|
|
|
if WowVer >= 80000 then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- account for WoD and higher no longer needing specific ilvl. numbers from http://wow.gamepedia.com/Item_level
|
|
|
|
|
if (itemRarity == RARITY_UNCOMMON and itemLevel >= 483)
|
|
|
|
|
or (itemRarity == RARITY_RARE and itemLevel >= 515)
|
|
|
|
@ -1281,5 +1398,11 @@ function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i=1,#AdditionalDisenchantableItems do
|
|
|
|
|
if AdditionalDisenchantableItems[i] == itemId then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|