mirror of
https://github.com/parnic/breakables.git
synced 2025-06-17 01:41:51 -05:00
Compare commits
86 Commits
Author | SHA1 | Date | |
---|---|---|---|
4a1d004502
|
|||
a775f7af33
|
|||
3a9db4082a
|
|||
59b1cafee3
|
|||
a27b2a7301
|
|||
8abe349758
|
|||
4cb1d01204
|
|||
016cc6f226
|
|||
f71b527f71
|
|||
a65674510e
|
|||
41592a7c76
|
|||
62c8db483e
|
|||
abf769bf9d
|
|||
9bd5541f81
|
|||
80e495f707
|
|||
3257ce5645
|
|||
93739030f4
|
|||
70fa098fc3
|
|||
154da46002
|
|||
0779f4c5ae
|
|||
6d3bef90c0
|
|||
abfc519084
|
|||
4c4f48d5d9
|
|||
1798e824b4
|
|||
481793c8ff
|
|||
7f53ef3d90
|
|||
4dce99e2ab
|
|||
92a4758371
|
|||
e01b0cdd78
|
|||
e764d54642
|
|||
6ab9d09140
|
|||
5a760da5ac
|
|||
592621cf4e
|
|||
82a97f4e05
|
|||
3273a5d7ce
|
|||
433a1f4660
|
|||
67c8c85978
|
|||
806666937f
|
|||
aeaac05586
|
|||
8553efb4a6
|
|||
0c89d98639
|
|||
4d0b368ba6
|
|||
ca215c2382
|
|||
66c35b8277
|
|||
e3d271e0ff
|
|||
7b3cca585f
|
|||
bcc53b8ed0
|
|||
9775e3c30e
|
|||
9595af7979
|
|||
5ae7a5efb1
|
|||
bd0d8b51f8
|
|||
0dbf1d7705
|
|||
a94cba6c34
|
|||
d000f77a53
|
|||
3c50d6fab5
|
|||
b4416d6daa
|
|||
e904b2c12f | |||
5c44d9ae23 | |||
d73336f725 | |||
3897e6378d | |||
5e0cafd2c3 | |||
33e8bfd9b8 | |||
fee9785107 | |||
a339435212 | |||
5e4bd58d92 | |||
129875fa02 | |||
575f2843aa | |||
2e4b7e413c | |||
db9fb7627b | |||
fbb4e090b6 | |||
8116c0a843 | |||
1d0ad0f0ed | |||
09d8e16e07 | |||
1b3533e9f6 | |||
6dbd396b87 | |||
9a4714e599 | |||
4b31136512 | |||
f6641909ed | |||
466f952018 | |||
798fc314a3 | |||
5ff9be70da | |||
f9b0d201ea | |||
9aba362e1b | |||
6624d74b2a | |||
619e0f7479 | |||
80bf120abf |
58
.github/workflows/release.yml
vendored
Normal file
58
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
# description of this workflow, can be anything you want
|
||||
name: Package and release
|
||||
|
||||
# we need to let GitHub know _when_ we want to release, typically only when we create a new tag.
|
||||
# this will target only tags, and not all pushes to the master branch.
|
||||
# this part can be heavily customized to your liking, like targeting only tags that match a certain word,
|
||||
# other branches or even pullrequests.
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '**'
|
||||
|
||||
# a workflow is built up as jobs, and within these jobs are steps
|
||||
jobs:
|
||||
|
||||
# "release" is a job, you can name it anything you want
|
||||
release:
|
||||
|
||||
# we can run our steps on pretty much anything, but the "ubuntu-latest" image is a safe bet
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# specify the environment variables used by the packager, matching the secrets from the project on GitHub
|
||||
env:
|
||||
CF_API_KEY: ${{ secrets.CF_API_KEY }}
|
||||
WOWI_API_TOKEN: ${{ secrets.WOWI_API_TOKEN }}
|
||||
WAGO_API_TOKEN: ${{ secrets.WAGO_API_TOKEN }}
|
||||
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} # "GITHUB_TOKEN" is a secret always provided to the workflow
|
||||
# for your own token, the name cannot start with "GITHUB_"
|
||||
|
||||
# "steps" holds a list of all the steps needed to package and release our AddOn
|
||||
steps:
|
||||
|
||||
# we first have to clone the AddOn project, this is a required step
|
||||
- name: Clone project
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0 # gets git history for changelogs
|
||||
|
||||
# once cloned, we just run the GitHub Action for the packager project
|
||||
- name: Package and release
|
||||
uses: BigWigsMods/packager@v2
|
||||
|
||||
# another example where we supply additional arguments, this example is specifically to release
|
||||
# for the Classic version of the game
|
||||
- name: Package and release for Classic
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g classic -w 0
|
||||
|
||||
- name: Package and release for TBC
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g bcc -w 0
|
||||
|
||||
- name: Package and release for Wrath
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g wrath -w 0
|
1
.mailmap
1
.mailmap
@ -1,3 +1,4 @@
|
||||
parnic <parnic@parnic.com> Parnic <chris@parnic.com>
|
||||
parnic <parnic@parnic.com> Parnic <parnic@parnic.com>
|
||||
parnic <parnic@parnic.com> Chris Pickett <cpickett@perniciousgames.com>
|
||||
parnic <parnic@parnic.com> root <root@parnic.com>
|
||||
|
7
.pkgmeta
7
.pkgmeta
@ -34,3 +34,10 @@ externals:
|
||||
libs/LibBabble-Inventory-3.0:
|
||||
url: svn://svn.wowace.com/wow/libbabble-inventory-3-0/mainline/trunk
|
||||
tag: latest
|
||||
|
||||
ignore:
|
||||
- readme.md
|
||||
|
||||
manual-changelog: changelog.txt
|
||||
|
||||
enable-nolib-creation: yes
|
||||
|
633
Breakables.lua
633
Breakables.lua
@ -5,6 +5,41 @@ local LBF = LibStub("Masque", true)
|
||||
|
||||
local lbfGroup
|
||||
|
||||
local IsArtifactRelicItem = IsArtifactRelicItem
|
||||
if not IsArtifactRelicItem then
|
||||
IsArtifactRelicItem = function()
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local WowVer = select(4, GetBuildInfo())
|
||||
local IsClassic = false
|
||||
local IsClassicBC = false
|
||||
local IsClassicWrath = false
|
||||
if GetClassicExpansionLevel then
|
||||
IsClassic = GetClassicExpansionLevel() == 0
|
||||
IsClassicBC = GetClassicExpansionLevel() == 1
|
||||
IsClassicWrath = GetClassicExpansionLevel() == 2
|
||||
else
|
||||
IsClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
|
||||
IsClassicBC = false
|
||||
IsClassicWrath = false
|
||||
if WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC then
|
||||
if not LE_EXPANSION_LEVEL_CURRENT or LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_BURNING_CRUSADE then
|
||||
IsClassicBC = true
|
||||
elseif LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_WRATH_OF_THE_LICH_KING then
|
||||
IsClassicWrath = true
|
||||
end
|
||||
elseif WOW_PROJECT_WRATH_CLASSIC and WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC then
|
||||
IsClassicWrath = true
|
||||
end
|
||||
end
|
||||
|
||||
local ShouldHookTradeskillUpdate = WowVer < 80000
|
||||
local ShouldShowTabardControls = WowVer >= 80000
|
||||
local UseNonNativeEqManagerChecks = WowVer < 80000
|
||||
local IgnoreEnchantingSkillLevelForDisenchant = WowVer >= 80000
|
||||
|
||||
local MillingId = 51005
|
||||
local MillingItemSubType = babbleInv["Herb"]
|
||||
local MillingItemSecondarySubType = babbleInv["Other"]
|
||||
@ -26,6 +61,44 @@ local AdditionalMillableItems = {
|
||||
124105,
|
||||
124106,
|
||||
128304,
|
||||
151565,
|
||||
-- BfA herbs
|
||||
152505,
|
||||
152506,
|
||||
152507,
|
||||
152508,
|
||||
152509,
|
||||
152510,
|
||||
152511,
|
||||
168487,
|
||||
-- Shadowlands herbs
|
||||
168586, -- rising glory
|
||||
168589, -- marrowroot
|
||||
170554, -- vigil's torch
|
||||
168583, -- widowbloom
|
||||
169701, -- death blossom
|
||||
171315, -- nightshade
|
||||
187699, -- first flower, 9.2.0
|
||||
}
|
||||
|
||||
local AdditionalProspectableItems = {
|
||||
-- Legion ore
|
||||
123918,
|
||||
123919,
|
||||
151564,
|
||||
-- BfA ore
|
||||
152512,
|
||||
152513,
|
||||
152579,
|
||||
168185,
|
||||
-- Shadowlands ore
|
||||
171828, -- laestrite
|
||||
171833, -- elethium
|
||||
171829, -- solenium
|
||||
171830, -- oxxein
|
||||
171831, -- phaedrum
|
||||
171832, -- sinvyr
|
||||
187700, -- progenium ore, 9.2.0
|
||||
}
|
||||
|
||||
local MassMilling = {
|
||||
@ -44,6 +117,39 @@ local MassMilling = {
|
||||
[124105] = 209662,
|
||||
[124106] = 209664,
|
||||
[128304] = 210116,
|
||||
[151565] = 247861,
|
||||
-- shadowlands
|
||||
[168586] = 311417,
|
||||
[168589] = 311416,
|
||||
[170554] = 311414,
|
||||
[168583] = 311415,
|
||||
[169701] = 311413,
|
||||
[171315] = 311418,
|
||||
[187699] = 359490,
|
||||
}
|
||||
|
||||
local HerbCombineItems = {
|
||||
-- MoP
|
||||
97619, -- torn green tea leaf
|
||||
97620, -- rain poppy petal
|
||||
97621, -- silkweed stem
|
||||
97622, -- snow lily petal
|
||||
97623, -- fool's cap spores
|
||||
97624, -- desecrated herb pod
|
||||
-- WoD
|
||||
109624, -- broken frostweed stem
|
||||
109625, -- broken fireweed stem
|
||||
109626, -- gorgrond flytrap ichor
|
||||
109627, -- starflower petal
|
||||
109628, -- nagrand arrowbloom petal
|
||||
109629, -- talador orchid petal
|
||||
-- shadowlands
|
||||
169550, -- rising glory petal
|
||||
168591, -- marrowroot petal
|
||||
169699, -- vigil's torch petal
|
||||
169698, -- widowbloom petal
|
||||
169700, -- death blossom petal
|
||||
169697, -- nightshade petal
|
||||
}
|
||||
|
||||
local UnProspectableItems = {
|
||||
@ -54,11 +160,25 @@ local ProspectingId = 31252
|
||||
local ProspectingItemSubType = babbleInv["Metal & Stone"]
|
||||
local CanProspect = false
|
||||
|
||||
local OreCombineItems = {
|
||||
-- MoP
|
||||
97512, -- ghost iron nugget
|
||||
97546, -- kyparite fragment
|
||||
90407, -- sparkling shard
|
||||
-- WoD
|
||||
109991, -- true iron nugget
|
||||
109992, -- blackrock fragment
|
||||
}
|
||||
|
||||
local DisenchantId = 13262
|
||||
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
|
||||
@ -86,6 +206,14 @@ local PickableItems = {
|
||||
68729, -- elementium lockbox
|
||||
88567, -- ghost iron lockbox
|
||||
116920, -- true steel lockbox
|
||||
121331, -- leystone lockbox
|
||||
169475, -- barnacled lockbox
|
||||
-- shadowlands
|
||||
179311, -- venthyr
|
||||
180532, -- maldraxxi
|
||||
180533, -- kyrian
|
||||
180522, -- night fae
|
||||
186161, -- stygian lockbox, 9.1.0
|
||||
}
|
||||
local CanPickLock = false
|
||||
|
||||
@ -112,8 +240,10 @@ local BREAKABLE_HERB = 1
|
||||
local BREAKABLE_ORE = 2
|
||||
local BREAKABLE_DE = 3
|
||||
local BREAKABLE_PICK = 4
|
||||
local BREAKABLE_COMBINE = 5
|
||||
|
||||
local BagUpdateCheckDelay = 1.0
|
||||
local BagUpdateCheckDelay = 0.1
|
||||
local PickLockFinishedDelay = 1
|
||||
local nextCheck = {}
|
||||
for i=0,NUM_BAG_SLOTS do
|
||||
nextCheck[i] = -1
|
||||
@ -128,8 +258,14 @@ local validGrowDirections = {L["Left"], L["Right"], L["Up"], L["Down"]}
|
||||
-- can be 1, 2, or 3 (in the case of a rogue with pick lock)
|
||||
local numEligibleProfessions = 0
|
||||
|
||||
local showingTooltip = nil
|
||||
|
||||
Breakables.optionsFrame = {}
|
||||
Breakables.justClicked = false
|
||||
Breakables.justClickedBag = -1
|
||||
Breakables.justClickedSlot = -1
|
||||
Breakables.justPickedBag = -1
|
||||
Breakables.justPickedSlot = -1
|
||||
|
||||
function Breakables:OnInitialize()
|
||||
self.defaults = {
|
||||
@ -142,9 +278,13 @@ function Breakables:OnInitialize()
|
||||
hideEqManagerItems = true,
|
||||
hide = false,
|
||||
hideInCombat = false,
|
||||
hideInPetBattle = true,
|
||||
buttonScale = 1,
|
||||
fontSize = 11,
|
||||
growDirection = 2,
|
||||
ignoreList = {},
|
||||
showTooltipForBreakables = true,
|
||||
showTooltipForProfession = true,
|
||||
}
|
||||
}
|
||||
self.db = LibStub("AceDB-3.0"):New("BreakablesDB", self.defaults, true)
|
||||
@ -199,12 +339,28 @@ function Breakables:InitLDB()
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnEnable()
|
||||
function Breakables:SetCapabilities()
|
||||
CanMill = IsUsableSpell(GetSpellInfo(MillingId))
|
||||
CanProspect = IsUsableSpell(GetSpellInfo(ProspectingId))
|
||||
CanDisenchant = IsUsableSpell(GetSpellInfo(DisenchantId))
|
||||
CanPickLock = IsUsableSpell(GetSpellInfo(PickLockId))
|
||||
end
|
||||
|
||||
function Breakables:OnSpellsChanged()
|
||||
local couldMill = CanMill
|
||||
local couldProspect = CanProspect
|
||||
local couldDisenchant = CanDisenchant
|
||||
local couldPick = CanPickLock
|
||||
self:SetCapabilities()
|
||||
|
||||
if couldMill ~= CanMill or couldProspect ~= CanProspect or couldDisenchant ~= CanDisenchant or couldPick ~= CanPickLock then
|
||||
self:SetupButtons()
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnEnable()
|
||||
self:SetCapabilities()
|
||||
|
||||
self.EnchantingLevel = 0
|
||||
|
||||
LibStub("AceConfig-3.0"):RegisterOptionsTable("Breakables", self:GetOptions(), "breakables")
|
||||
@ -221,7 +377,16 @@ function Breakables:OnEnable()
|
||||
|
||||
self:RegisterEvents()
|
||||
|
||||
if CanMill or CanProspect or CanDisenchant or CanPickLock then
|
||||
self:SetupButtons()
|
||||
end
|
||||
|
||||
local canBreakSomething = function()
|
||||
return CanMill or CanProspect or CanDisenchant or CanPickLock
|
||||
end
|
||||
|
||||
function Breakables:SetupButtons()
|
||||
numEligibleProfessions = 0
|
||||
if canBreakSomething() then
|
||||
if CanMill then
|
||||
numEligibleProfessions = numEligibleProfessions + 1
|
||||
end
|
||||
@ -247,7 +412,7 @@ function Breakables:OnEnable()
|
||||
end
|
||||
self.frame:SetScript("OnUpdate", self.frame.OnUpdateFunc)
|
||||
else
|
||||
self:UnregisterAllEvents()
|
||||
self:CreateButtonFrame()
|
||||
end
|
||||
end
|
||||
|
||||
@ -275,12 +440,24 @@ function Breakables:RegisterEvents()
|
||||
self:RegisterEvent("PLAYER_REGEN_DISABLED", "OnEnterCombat")
|
||||
self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnLeaveCombat")
|
||||
|
||||
if CanDisenchant then
|
||||
self:RegisterEvent("MODIFIER_STATE_CHANGED", "FindBreakables")
|
||||
self:RegisterEvent("SPELLS_CHANGED", "OnSpellsChanged")
|
||||
|
||||
if ShouldHookTradeskillUpdate then
|
||||
self:RegisterEvent("TRADE_SKILL_UPDATE", "OnTradeSkillUpdate")
|
||||
end
|
||||
|
||||
if CanPickLock then
|
||||
self:RegisterEvent("CHAT_MSG_OPENING", "OnBagItemLockPicked")
|
||||
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", "OnSpellCastSucceeded")
|
||||
|
||||
if UnitCanPetBattle then
|
||||
self:RegisterEvent("PET_BATTLE_OPENING_START", "PetBattleStarted")
|
||||
self:RegisterEvent("PET_BATTLE_OVER", "PetBattleEnded")
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnModifierChanged()
|
||||
if showingTooltip ~= nil and not self.bCombat then
|
||||
self:OnEnterBreakableButton(showingTooltip)
|
||||
end
|
||||
end
|
||||
|
||||
@ -336,12 +513,34 @@ function Breakables:OnLeaveCombat()
|
||||
end
|
||||
|
||||
function Breakables:OnTradeSkillUpdate()
|
||||
if not CanDisenchant then
|
||||
return
|
||||
end
|
||||
|
||||
self:GetEnchantingLevel()
|
||||
self:FindBreakables()
|
||||
end
|
||||
|
||||
function Breakables:OnBagItemLockPicked()
|
||||
nextCheck[1] = GetTime() + BagUpdateCheckDelay
|
||||
function Breakables:OnSpellCastSucceeded(evt, unit, guid, spell)
|
||||
if spell ~= PickLockId or not CanPickLock then
|
||||
return
|
||||
end
|
||||
|
||||
self.justPickedBag = self.justClickedBag
|
||||
self.justPickedSlot = self.justClickedSlot
|
||||
|
||||
self:FindBreakables()
|
||||
nextCheck[0] = GetTime() + PickLockFinishedDelay
|
||||
end
|
||||
|
||||
function Breakables:PetBattleStarted()
|
||||
if self.settings.hideInPetBattle then
|
||||
self:ToggleButtonFrameVisibility(false)
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:PetBattleEnded()
|
||||
self:ToggleButtonFrameVisibility(true)
|
||||
end
|
||||
|
||||
function Breakables:FindLevelOfProfessionIndex(idx)
|
||||
@ -352,19 +551,52 @@ function Breakables:FindLevelOfProfessionIndex(idx)
|
||||
end
|
||||
|
||||
function Breakables:GetEnchantingLevel()
|
||||
local prof1, prof2 = GetProfessions()
|
||||
if GetProfessions then
|
||||
local prof1, prof2 = GetProfessions()
|
||||
|
||||
local skillId, rank = self:FindLevelOfProfessionIndex(prof1)
|
||||
if skillId ~= nil and skillId == EnchantingProfessionId then
|
||||
self.EnchantingLevel = rank
|
||||
else
|
||||
skillId, rank = self:FindLevelOfProfessionIndex(prof2)
|
||||
local skillId, rank = self:FindLevelOfProfessionIndex(prof1)
|
||||
if skillId ~= nil and skillId == EnchantingProfessionId then
|
||||
self.EnchantingLevel = rank
|
||||
else
|
||||
skillId, rank = self:FindLevelOfProfessionIndex(prof2)
|
||||
if skillId ~= nil and skillId == EnchantingProfessionId then
|
||||
self.EnchantingLevel = rank
|
||||
end
|
||||
end
|
||||
elseif GetSkillLineInfo then
|
||||
for i=1,100 do
|
||||
local skillName, header, isExpanded, skillRank, numTempPoints, skillModifier, skillMaxRank, isAbandonable, stepCost, rankCost, minLevel, skillCostType = GetSkillLineInfo(i)
|
||||
if skillName == babbleInv["Enchanting"] then
|
||||
self.EnchantingLevel = skillRank
|
||||
break
|
||||
end
|
||||
end
|
||||
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"],
|
||||
@ -498,26 +730,92 @@ function Breakables:GetOptions()
|
||||
end,
|
||||
order = 7,
|
||||
},
|
||||
showTooltipForBreakables = {
|
||||
type = "toggle",
|
||||
name = L["Show tooltip on breakables"],
|
||||
desc = L["Whether or not to show an item tooltip when hovering over a breakable item button."],
|
||||
get = function(info)
|
||||
return self.settings.showTooltipForBreakables
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.showTooltipForBreakables = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78showTooltipForBreakables|r to " .. tostring(self.settings.showTooltipForBreakables))
|
||||
end
|
||||
end,
|
||||
order = 8,
|
||||
},
|
||||
showTooltipForProfession = {
|
||||
type = "toggle",
|
||||
name = L["Show tooltip on profession"],
|
||||
desc = L["Whether or not to show an item tooltip when hovering over a profession button on the Breakables bar."],
|
||||
get = function(info)
|
||||
return self.settings.showTooltipForProfession
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.showTooltipForProfession = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78showTooltipForProfession|r to " .. tostring(self.settings.showTooltipForProfession))
|
||||
end
|
||||
end,
|
||||
order = 9,
|
||||
},
|
||||
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,
|
||||
},
|
||||
showSoulbound = {
|
||||
type = "toggle",
|
||||
name = L["Show soulbound items"],
|
||||
desc = L["Whether or not to display soulbound items as breakables."],
|
||||
get = function(info)
|
||||
return self.settings.showSoulbound
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.showSoulbound = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78showSoulbound|r to " .. tostring(self.settings.showSoulbound))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
hidden = function()
|
||||
return not CanDisenchant
|
||||
end,
|
||||
order = 20,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if CanDisenchant then
|
||||
opts.args.showSoulbound = {
|
||||
type = "toggle",
|
||||
name = L["Show soulbound items"],
|
||||
desc = L["Whether or not to display soulbound items as breakables."],
|
||||
get = function(info)
|
||||
return self.settings.showSoulbound
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.showSoulbound = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78showSoulbound|r to " .. tostring(self.settings.showSoulbound))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
order = 20,
|
||||
}
|
||||
if GetNumEquipmentSets or C_EquipmentSet then
|
||||
opts.args.hideEqManagerItems = {
|
||||
type = "toggle",
|
||||
name = L["Hide Eq. Mgr items"],
|
||||
@ -533,10 +831,13 @@ function Breakables:GetOptions()
|
||||
self:FindBreakables()
|
||||
end,
|
||||
hidden = function()
|
||||
return not self.settings.showSoulbound
|
||||
return not CanDisenchant and not self.settings.showSoulbound
|
||||
end,
|
||||
order = 21,
|
||||
}
|
||||
end
|
||||
|
||||
if ShouldShowTabardControls then
|
||||
opts.args.hideTabards = {
|
||||
type = "toggle",
|
||||
name = L["Hide Tabards"],
|
||||
@ -555,6 +856,43 @@ function Breakables:GetOptions()
|
||||
}
|
||||
end
|
||||
|
||||
if not IgnoreEnchantingSkillLevelForDisenchant then
|
||||
opts.args.ignoreEnchantingSkillLevel = {
|
||||
type = "toggle",
|
||||
name = L["Ignore Enchanting skill level"],
|
||||
desc = L["Whether or not items should be shown when Breakables thinks you don't have the appropriate skill level to disenchant it."],
|
||||
get = function(info)
|
||||
return self.settings.ignoreEnchantingSkillLevel
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.ignoreEnchantingSkillLevel = v
|
||||
self:FindBreakables()
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78ignoreEnchantingSkillLevel|r to " .. tostring(self.settings.ignoreEnchantingSkillLevel))
|
||||
end
|
||||
end,
|
||||
order = 10,
|
||||
}
|
||||
end
|
||||
|
||||
if UnitCanPetBattle then
|
||||
opts.args.hideInPetBattle = {
|
||||
type = "toggle",
|
||||
name = L["Hide during pet battles"],
|
||||
desc = L["Whether or not to hide the breakables bar when you enter a pet battle."],
|
||||
get = function(info)
|
||||
return self.settings.hideInPetBattle
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hideInPetBattle = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78hideInPetBattle|r to " .. tostring(self.settings.hideInPetBattle))
|
||||
end
|
||||
end,
|
||||
order = 3.5,
|
||||
}
|
||||
end
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
@ -567,6 +905,11 @@ function Breakables:CreateButtonFrame()
|
||||
self.buttonFrame = {}
|
||||
end
|
||||
|
||||
for i=numEligibleProfessions+1,#self.buttonFrame do
|
||||
self.buttonFrame[i]:ClearAllPoints()
|
||||
self.buttonFrame[i]:Hide()
|
||||
end
|
||||
|
||||
for i=1,numEligibleProfessions do
|
||||
if not self.buttonFrame[i] then
|
||||
self.buttonFrame[i] = CreateFrame("Button", "BREAKABLES_BUTTON_FRAME"..i, self.frame, "SecureActionButtonTemplate")
|
||||
@ -589,7 +932,7 @@ function Breakables:CreateButtonFrame()
|
||||
frame:SetHeight(buttonSize)
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:RegisterForClicks("LeftButtonUp")
|
||||
frame:RegisterForClicks("LeftButtonUp", "LeftButtonDown")
|
||||
|
||||
if not frame.OnMouseDownFunc then
|
||||
frame.OnMouseDownFunc = function(frame) self:OnMouseDown(frame) end
|
||||
@ -633,11 +976,15 @@ end
|
||||
|
||||
function Breakables:GetSpellIdFromProfessionButton(itemType, itemId)
|
||||
if itemType == BREAKABLE_HERB and itemId ~= nil then
|
||||
if MassMilling[itemId] ~= nil and IsSpellKnown(MassMilling[itemId]) then
|
||||
return MassMilling[itemId]
|
||||
if MassMilling[itemId] ~= nil and IsPlayerSpell(MassMilling[itemId]) then
|
||||
--return MassMilling[itemId]
|
||||
end
|
||||
end
|
||||
|
||||
if itemType == BREAKABLE_COMBINE then
|
||||
return nil
|
||||
end
|
||||
|
||||
return (itemType == BREAKABLE_HERB and MillingId)
|
||||
or (itemType == BREAKABLE_ORE and ProspectingId)
|
||||
or (itemType == BREAKABLE_DE and DisenchantId)
|
||||
@ -680,11 +1027,23 @@ 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
|
||||
end
|
||||
|
||||
if not canBreakSomething() then
|
||||
return
|
||||
end
|
||||
|
||||
if self.bCombat then
|
||||
self.bPendingUpdate = true
|
||||
return
|
||||
@ -726,8 +1085,8 @@ function Breakables:FindBreakables(bag)
|
||||
numBreakableStacks[j] = 0
|
||||
end
|
||||
|
||||
if foundBreakables[i][IDX_BREAKABLETYPE] == self.buttonFrame[j].type and numBreakableStacks[j] < self.settings.maxBreakablesToShow then
|
||||
local isDisenchantable = self:BreakableIsDisenchantable(foundBreakables[i][IDX_TYPE], foundBreakables[i][IDX_LEVEL], foundBreakables[i][IDX_RARITY])
|
||||
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], 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
|
||||
@ -747,9 +1106,9 @@ function Breakables:FindBreakables(bag)
|
||||
btn:SetWidth(buttonSize)
|
||||
btn:SetHeight(buttonSize)
|
||||
btn:EnableMouse(true)
|
||||
btn:RegisterForClicks("AnyUp")
|
||||
btn:RegisterForClicks("LeftButtonUp", "LeftButtonDown")
|
||||
|
||||
btn:SetAttribute("type", "spell")
|
||||
btn:SetAttribute("type1", "spell")
|
||||
|
||||
if not btn.text then
|
||||
btn.text = btn:CreateFontString()
|
||||
@ -757,11 +1116,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
|
||||
@ -784,7 +1147,11 @@ function Breakables:FindBreakables(bag)
|
||||
if not isDisenchantable then
|
||||
local appendText = ""
|
||||
if not isLockedItem then
|
||||
appendText = " ("..(floor(foundBreakables[i][IDX_COUNT]/5))..")"
|
||||
local breakStackSize = 5
|
||||
if foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_COMBINE then
|
||||
breakStackSize = 10
|
||||
end
|
||||
appendText = " ("..(floor(foundBreakables[i][IDX_COUNT]/breakStackSize))..")"
|
||||
end
|
||||
|
||||
btn.text:SetText(foundBreakables[i][IDX_COUNT] .. appendText)
|
||||
@ -795,16 +1162,15 @@ function Breakables:FindBreakables(bag)
|
||||
--or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_ORE and ProspectingId)
|
||||
--or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_DE and DisenchantId)
|
||||
--or PickLockId)
|
||||
btn:SetAttribute("spell", BreakableAbilityName)
|
||||
if BreakableAbilityName then
|
||||
btn:SetAttribute("type1", "spell")
|
||||
btn:SetAttribute("spell", BreakableAbilityName)
|
||||
|
||||
if isLockedItem then
|
||||
btn:SetAttribute("target-item")
|
||||
btn:SetAttribute("target-bag", foundBreakables[i][IDX_BAG])
|
||||
btn:SetAttribute("target-slot", foundBreakables[i][IDX_SLOT])
|
||||
else
|
||||
btn:SetAttribute("target-item", foundBreakables[i][IDX_NAME])
|
||||
btn:SetAttribute("target-bag")
|
||||
btn:SetAttribute("target-slot")
|
||||
btn:SetAttribute("type1", "item")
|
||||
btn:SetAttribute("item", "item:" .. self:GetItemIdFromLink(foundBreakables[i][IDX_LINK]))
|
||||
end
|
||||
|
||||
if lbfGroup then
|
||||
@ -854,15 +1220,22 @@ function Breakables:FindBreakables(bag)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if showingTooltip ~= nil then
|
||||
self:OnEnterBreakableButton(showingTooltip)
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnEnterProfessionButton(btn)
|
||||
GameTooltip:SetOwner(btn, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetSpellByID(self:GetSpellIdFromProfessionButton(btn.type))
|
||||
local spellId = self:GetSpellIdFromProfessionButton(btn.type)
|
||||
if spellId and self.settings.showTooltipForProfession then
|
||||
GameTooltip:SetOwner(btn, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetSpellByID(spellId)
|
||||
|
||||
GameTooltip:AddLine(" ")
|
||||
GameTooltip:AddLine(L["Hold shift and left-click to drag the Breakables bar around."], 1, 1, 1, 1)
|
||||
GameTooltip:Show()
|
||||
GameTooltip:AddLine(" ")
|
||||
GameTooltip:AddLine(L["Hold shift and left-click to drag the Breakables bar around."], 1, 1, 1, 1)
|
||||
GameTooltip:Show()
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnLeaveProfessionButton()
|
||||
@ -870,20 +1243,31 @@ function Breakables:OnLeaveProfessionButton()
|
||||
end
|
||||
|
||||
function Breakables:OnEnterBreakableButton(this)
|
||||
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetBagItem(this.bag, this.slot)
|
||||
if self.settings.showTooltipForBreakables then
|
||||
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetBagItem(this.bag, this.slot)
|
||||
|
||||
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:Show()
|
||||
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
|
||||
end
|
||||
|
||||
function Breakables:OnLeaveBreakableButton()
|
||||
GameTooltip:Hide()
|
||||
if showingTooltip then
|
||||
GameTooltip:Hide()
|
||||
showingTooltip = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:PostClickedBreakableButton(this)
|
||||
if this.type == BREAKABLE_HERB or this.type == BREAKABLE_ORE or this.type == BREAKABLE_DE then
|
||||
self.justClickedBag = this.bag
|
||||
self.justClickedSlot = this.slot
|
||||
|
||||
if this.type == BREAKABLE_HERB or this.type == BREAKABLE_ORE or this.type == BREAKABLE_DE or this.type == BREAKABLE_COMBINE then
|
||||
self.justClicked = true
|
||||
end
|
||||
end
|
||||
@ -896,12 +1280,17 @@ function Breakables:FindBreakablesInBag(bagId)
|
||||
for slotId=1,GetContainerNumSlots(bagId) do
|
||||
local found = self:FindBreakablesInSlot(bagId, slotId)
|
||||
if found then
|
||||
local addedToExisting = self:MergeBreakables(found, foundBreakables)
|
||||
if bagId ~= self.justPickedBag or slotId ~= self.justPickedSlot then
|
||||
local addedToExisting = self:MergeBreakables(found, foundBreakables)
|
||||
|
||||
if not addedToExisting then
|
||||
foundBreakables[i] = found
|
||||
i = i + 1
|
||||
if not addedToExisting then
|
||||
foundBreakables[i] = found
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
elseif bagId == self.justPickedBag and slotId == self.justPickedSlot then
|
||||
self.justPickedBag = -1
|
||||
self.justPickedSlot = -1
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -918,12 +1307,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
|
||||
@ -938,7 +1332,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
|
||||
@ -947,7 +1341,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}
|
||||
@ -971,7 +1365,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
|
||||
@ -980,20 +1373,45 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
||||
end
|
||||
end
|
||||
|
||||
if CanProspect and prospectable then
|
||||
for i=1,#UnProspectableItems do
|
||||
if UnProspectableItems[i] == itemId then
|
||||
prospectable = false
|
||||
if CanProspect then
|
||||
if not prospectable then
|
||||
for i=1,#AdditionalProspectableItems do
|
||||
if AdditionalProspectableItems[i] == itemId then
|
||||
prospectable = true
|
||||
end
|
||||
end
|
||||
end
|
||||
if prospectable then
|
||||
for i=1,#UnProspectableItems do
|
||||
if UnProspectableItems[i] == itemId then
|
||||
prospectable = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if CanMill --[[and (itemSubType == MillingItemSubType or itemSubType == MillingItemSecondarySubType)]] and millable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_HERB, false, itemName, itemRarity}
|
||||
if CanMill --[[and (itemSubType == MillingItemSubType or itemSubType == MillingItemSecondarySubType)]] then
|
||||
if millable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_HERB, false, itemName, itemRarity}
|
||||
else
|
||||
for i=1,#HerbCombineItems do
|
||||
if HerbCombineItems[i] == itemId then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_COMBINE, false, itemName, itemRarity}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if CanProspect --[[and itemSubType == ProspectingItemSubType]] and prospectable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_ORE, false, itemName, itemRarity}
|
||||
if CanProspect --[[and itemSubType == ProspectingItemSubType]] then
|
||||
if prospectable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_ORE, false, itemName, itemRarity}
|
||||
else
|
||||
for i=1,#OreCombineItems do
|
||||
if OreCombineItems[i] == itemId then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_COMBINE, false, itemName, itemRarity}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if CanPickLock and self:ItemIsPickable(itemId) and self:ItemIsLocked(bagId, slotId) then
|
||||
@ -1048,13 +1466,26 @@ do
|
||||
end
|
||||
|
||||
function Breakables:IsInEquipmentSet(itemId)
|
||||
for setIdx=1, GetNumEquipmentSets() do
|
||||
local set = GetEquipmentSetInfo(setIdx)
|
||||
local itemArray = GetEquipmentSetItemIDs(set)
|
||||
if UseNonNativeEqManagerChecks and GetNumEquipmentSets 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
|
||||
elseif C_EquipmentSet then
|
||||
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
|
||||
@ -1068,10 +1499,13 @@ 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]
|
||||
breakableList[n][IDX_SLOT] = foundBreakable[IDX_SLOT]
|
||||
end
|
||||
breakableList[n][IDX_COUNT] = breakableList[n][IDX_COUNT] + foundBreakable[IDX_COUNT]
|
||||
return true
|
||||
end
|
||||
@ -1094,9 +1528,30 @@ 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
|
||||
-- bfa+ no longer has skill level requirements for disenchanting
|
||||
if IgnoreEnchantingSkillLevelForDisenchant then
|
||||
return true
|
||||
end
|
||||
|
||||
if self.settings.ignoreEnchantingSkillLevel then
|
||||
return true
|
||||
end
|
||||
|
||||
-- if we couldn't figure out the player's enchanting skill level, err on the side of showing stuff
|
||||
if self.EnchantingLevel == 0 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)
|
||||
or (itemRarity == RARITY_EPIC and itemLevel >= 640) then
|
||||
return true
|
||||
end
|
||||
|
||||
-- this is awful. is there an easier way? taken from www.wowpedia.org/Disenchanting
|
||||
if itemRarity == RARITY_UNCOMMON then
|
||||
if itemLevel <= 20 then
|
||||
@ -1185,5 +1640,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
|
||||
|
@ -1,12 +1,23 @@
|
||||
## Interface: 70000
|
||||
## Interface: 100000
|
||||
## Interface-Retail: 100000
|
||||
## Interface-Classic: 11403
|
||||
## Interface-BCC: 20504
|
||||
## Interface-Wrath: 30400
|
||||
## Author: Parnic
|
||||
## Name: Breakables
|
||||
## Title: Breakables |cff7fff7f-Ace3-|r
|
||||
## Notes: Tracks herbs/ore/items that can be broken into component pieces
|
||||
## Version: @project-version@ (Revision: @project-revision@)
|
||||
#@debug@
|
||||
## Version: development
|
||||
#@end-debug@
|
||||
#@non-debug@
|
||||
# ## Version: @project-version@
|
||||
#@end-non-debug@
|
||||
## SavedVariables: BreakablesDB
|
||||
## OptionalDeps: Ace3, LibBabble-Inventory-3.0, Masque
|
||||
## X-Compatible-With: 60200
|
||||
## X-Curse-Project-ID: 16629
|
||||
## X-WoWI-ID: 17929
|
||||
## X-Wago-ID: rkGrlA6y
|
||||
|
||||
#@no-lib-strip@
|
||||
embeds.xml
|
||||
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 parnic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
224
changelog.txt
Normal file
224
changelog.txt
Normal file
@ -0,0 +1,224 @@
|
||||
v1.9.0:
|
||||
|
||||
- Handle gaining and losing a Breakable skill without requiring a UI reload
|
||||
- Update TOC, fix button clicking bug for 10.0
|
||||
|
||||
v1.8.7:
|
||||
|
||||
- Improve reliability of UI updates after picking lockboxes. There's no good game event for "locked item opened", so this uses some best-guess heuristics to make it function as expected in most cases.
|
||||
|
||||
v1.8.6:
|
||||
|
||||
- Improve enchanting level detection for Wrath Classic
|
||||
- Add option to ignore enchanting skill level for showing disenchantable items
|
||||
|
||||
v1.8.5:
|
||||
|
||||
- Wrath Classic compatibility
|
||||
- Updated TOCs
|
||||
|
||||
v1.8.4:
|
||||
|
||||
- Updated TOCs
|
||||
|
||||
v1.8.3:
|
||||
- Updated TOCs, added 9.1 and 9.2 herbs, ore, and lockboxes
|
||||
|
||||
v1.8.2:
|
||||
- Updated TOCs for 9.1.5, Classic, and BCC
|
||||
|
||||
v1.8.1:
|
||||
- Updated TOC for 9.1
|
||||
|
||||
v1.8.0:
|
||||
- Classic-BC support
|
||||
- Added option to hide during pet battles, by request.
|
||||
|
||||
v1.7.4:
|
||||
- Fix an issue when IsArtifactRelicItem is not defined
|
||||
|
||||
v1.7.3:
|
||||
- Add option to suppress tooltips by request
|
||||
- Updated Classic TOC to 1.13.6
|
||||
|
||||
v1.7.2:
|
||||
- Updated TOC for 9.0.5
|
||||
|
||||
v1.7.1:
|
||||
- Updated TOC to latest
|
||||
|
||||
v1.7.0:
|
||||
- Added Shadowlands herbs, ore, and lockboxes
|
||||
- Updated TOC for 9.0
|
||||
|
||||
v1.6.4:
|
||||
- Updated TOC for 8.3
|
||||
|
||||
v1.6.3:
|
||||
- (Classic) Made all items display as disenchantable whether you have the skill for it or not. I have not yet found the correct way to access the player's Enchanting profession level to check against item level for disenchant validity.
|
||||
|
||||
v1.6.2:
|
||||
- Added 8.2's lockboxes
|
||||
|
||||
v1.6.1:
|
||||
- Added patch 8.2's new herb and ore
|
||||
|
||||
v1.6:
|
||||
- Updated TOC for 8.2
|
||||
|
||||
v1.5.1:
|
||||
- Updated TOC for 8.1
|
||||
- Added Highmountain Armor as a disenchantable item
|
||||
|
||||
v1.5:
|
||||
- Updated TOC for 8.0
|
||||
- Added BfA herbs and ore
|
||||
- Fixed separate items sometimes showing up as one breakable
|
||||
- Added Leystone Lockbox
|
||||
|
||||
v1.4.9.1:
|
||||
- Added 7.3 herbs and ore
|
||||
|
||||
v1.4.9:
|
||||
- Updated TOC for 7.3
|
||||
|
||||
v1.4.8:
|
||||
- Fixed error in ignored items when the ignored item had not been loaded by the server since the last restart.
|
||||
- Updated TOC for 7.2
|
||||
|
||||
v1.4.7:
|
||||
- Fixed up milling herbs that the player knows Mass Milling for. Since Mass Mill is a profession ability and not a player ability/"spell", the addon can't currently automatically cast Mass Milling.
|
||||
|
||||
v1.4.6:
|
||||
- Added MoP Sparkling Shard as a combinable object.
|
||||
- Added support for registering artifact relics as disenchantable.
|
||||
- Added an ignore feature so certain items can be set to never show up as breakable.
|
||||
|
||||
v1.4.5:
|
||||
- Updated TOC for 7.1
|
||||
|
||||
v1.4.4:
|
||||
- Cap the disenchantable item rarity for Legion items at Epic (so we don't show the player's artifact weapon as disenchantable).
|
||||
- Automatically update the tooltip when the breakable list is updated while the player is hovering over a breakable item button.
|
||||
- Update the tooltip when the player presses Shift so that disenchantable items show what the player currently has equipped to compare against quickly.
|
||||
|
||||
v1.4.3:
|
||||
- Fixed up Mass Milling support.
|
||||
- Fixed the mod accidentally trying to break the wrong stack of something if, for example, you had a smaller stack placed in front of a larger stack in your bags.
|
||||
- Fixed the mod sometimes failing to break something if you had 2 similarly-named items in your bags in a specific order (Whiptail Stems in front of Whiptails, for example).
|
||||
- Added better support for disenchanting items in WoD and higher where Enchanting skill level is not a factor in whether you can disenchant an item or not.
|
||||
- Made the breakable bar respond to changes much faster so it's less frustrating to work with.
|
||||
- Added support for combining items that then result in more breakables ("broken"/"stem" versions of herbs which can be combined into their proper breakable types) so it can all be done from the Breakables bar.
|
||||
|
||||
v1.4.2:
|
||||
- Added support for Legion ore since the ore items don't match previous expansions.
|
||||
|
||||
v1.4.1:
|
||||
- Added support for Mass Milling. Mass Milling of a particular herb type will be automatically chosen when clicking on an herb type if that herb is eligible for mass milling and the player knows that mass milling spell.
|
||||
- Added support for Legion herbs
|
||||
|
||||
v1.4:
|
||||
- Updated TOC for patch 7.0
|
||||
|
||||
v1.3.21:
|
||||
- Updated TOC for patch 6.2
|
||||
- Cleared the tooltip after successfully breaking an item so that we don't keep stale tooltips around.
|
||||
|
||||
v1.3.20:
|
||||
- Updated TOC for patch 6.1
|
||||
|
||||
v1.3.19:
|
||||
- Stopped True Iron Ore from showing up as prospectable.
|
||||
|
||||
v1.3.18:
|
||||
- Changed garrison follower armor items to not show up as disenchantable.
|
||||
|
||||
v1.3.17:
|
||||
- Revised WoD herb fix such that it doesn't cause the game to flag false positives on herbs that are not millable.
|
||||
|
||||
v1.3.16:
|
||||
- Made WoD herbs show up as millable. They weren't showing up before because they don't contain the "millable" text in the tooltip like every other herb in the game does.
|
||||
|
||||
v1.3.15:
|
||||
- Switched from LibButtonFacade to Masque (ticket #20).
|
||||
|
||||
v1.3.14:
|
||||
- Added WoD lockboxes/junkboxes. Oops.
|
||||
|
||||
v1.3.13:
|
||||
- Updated TOC for patch 6.0
|
||||
|
||||
v1.3.12:
|
||||
- Updated TOC for patch 5.4
|
||||
- Make sure to update the breakables list whenever a tracked tradeskill is updated in case we can then break down new items (right now, that's only enchanting).
|
||||
- Added option to hide tabards from the list of breakables. (ticket #16)
|
||||
- Only display items the player is capable of disenchanting.
|
||||
- Suppress account-bound and bnet-account-bound items when "show soulbound items" is unchecked.
|
||||
|
||||
v1.3.11:
|
||||
- fixed soulbound items not being ignored sometimes despite the option being checked
|
||||
- added lockboxes to the pickable items list
|
||||
|
||||
v1.3.10:
|
||||
- updated TOC for patch 5.3
|
||||
|
||||
v1.3.9:
|
||||
- updated TOC for patch 5.2
|
||||
|
||||
v1.3.8:
|
||||
- updated TOC for patch 5.1
|
||||
|
||||
v1.3.7:
|
||||
- fixed recognition of MoP junkboxes, herbs, and ore
|
||||
|
||||
v1.3.6:
|
||||
- updated TOC for patch 5.0.4
|
||||
|
||||
v1.3.5:
|
||||
- updated TOC for patch 4.3
|
||||
|
||||
v1.3.4:
|
||||
- updated TOC for patch 4.2
|
||||
|
||||
v1.3.3:
|
||||
- updated TOC for patch 4.1
|
||||
- ticket #10: look through the first 5 lines of the tooltip to find "millable" or "prospectable" instead of requiring it to be on line 2
|
||||
- moved LibButtonFacade's Group:Skin call from :OnInitialize() to :OnEnable(). apparently OnInitialize is too soon and causes the custom skin to get overwritten. (ticket #9)
|
||||
- added tracking for rogue junkboxes (obtained via 'pick pocket'). clicking the junkbox will automatically unlock it
|
||||
- shortened the delay for processing items after a BAG_UPDATE to 1 second (from 1.5)
|
||||
|
||||
v1.3.2:
|
||||
- properly parented the Breakables frame to UIParent so that it will go away when the user presses alt-z (thanks slayman). note that this change makes the Breakables frame use the UI Scale specified in video settings so it may initially not be in the same location you last set it to and could be a different size.
|
||||
|
||||
v1.3.1:
|
||||
- fixed a bug where the tooltip could be completely wrong or empty sometimes
|
||||
|
||||
v1.3:
|
||||
- fixed an error about AceGUI and AceConfigDialog that were showing up on load in certain situations
|
||||
- minor garbage/performance fixes
|
||||
- added spell tooltip to profession button
|
||||
- added ButtonFacade support (ticket #7)
|
||||
- added option to specify which direction the buttons grow toward (by Slayman's request)
|
||||
- enabled new target-item/spell attributes for secure buttons instead of hacking together a macro
|
||||
- don't show heirloom items as disenchantable
|
||||
|
||||
v1.2.2:
|
||||
- fixed bar position not being saved/restored properly when moved out of the upper left section of the screen
|
||||
|
||||
v1.2.1:
|
||||
- fixed reported error message
|
||||
|
||||
v1.2:
|
||||
- created one bar per profession for the case where someone has some combination of inscription, enchanting, and jewelcrafting
|
||||
- set bar to update immediately after clicking an item to break it instead of waiting the 1.5 seconds. it was making life harder for mass breaking
|
||||
- added button scale and font size options
|
||||
- added localization support
|
||||
- optimized a little bit of the code that finds breakables in your bags by delaying checks on BAG_UPDATE until 1.5 seconds after the last update request has come in
|
||||
- set the button font for item counts to use NumberFont_Outline_Med so that any font overrides (like tekticles) work automagically
|
||||
- added LibDataBroker support
|
||||
- added option to hide the bar entirely (ticket 5) and option to hide the bar when in combat
|
||||
- added short description to the config page explaining the functionality in the mod and how to get support/request features
|
||||
- made all slash commands print something back to the user so they know what they changed
|
||||
|
||||
v1.1:
|
||||
- added ability to hide soulbound disenchantable items that are part of an equipment manager set (since some quest rewards and such are soulbound but the player doesn't actually use them)
|
@ -1,4 +1,5 @@
|
||||
<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
|
||||
<!--@non-debug@
|
||||
<Script file="libs\LibStub\LibStub.lua"/>
|
||||
<Script file="libs\CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
|
||||
<Include file="libs\AceAddon-3.0\AceAddon-3.0.xml"/>
|
||||
@ -10,4 +11,5 @@
|
||||
<Include file="libs\AceEvent-3.0\AceEvent-3.0.xml"/>
|
||||
<Include file="libs\AceLocale-3.0\AceLocale-3.0.xml"/>
|
||||
<Include file="libs\LibBabble-Inventory-3.0\lib.xml"/>
|
||||
</Ui>
|
||||
@end-non-debug@-->
|
||||
</Ui>
|
||||
|
19
readme.md
Normal file
19
readme.md
Normal file
@ -0,0 +1,19 @@
|
||||
### **Description**
|
||||
|
||||
Displays a bar on screen that allows quick access to enchanting, jewelcrafting, and inscription professions by presenting a Disenchant/Prospect/Mill button and all of the breakable items you have for that profession next to it. Also displays a bar for any locked junkboxes in your inventory if you're a Rogue. This allows one-click access for breaking down items instead of finding the item in your bag, clicking the appropriate profession/skill button, and clicking the item for each and every item you want to break. For prospecting and milling, you will see the number of items you have alongside the number of times you can break it. In the prospecting screenshot on the right, the player has 169 total Saronite Ore in his bags which will allow for 33 total prospects.
|
||||
|
||||
### **Usage**
|
||||
|
||||
By default, if you have the appropriate profession and items in your inventory, a bar will appear with the profession ability followed by any items that are eligible for breaking. You can hold shift to drag the bar around if you want to move it. Clicking the profession button will activate that ability (disenchant/prospect/mill) and clicking an item will break it. You don't have to click the profession button first as simply clicking the item will automatically break it down.
|
||||
|
||||
### **Configuration**
|
||||
|
||||
Typing */brk* will open the configuration settings (or you can get to it from Blizzard's Interface options) which consist of:
|
||||
|
||||
* **Hide if no breakables**: this will control whether you see the profession button or not when nothing breakable is detected
|
||||
* **Max number to display**: this controls the highest number of items that you will see next to your profession button. If this is 5 but you have 10 breakable items in your bags, you will only see 5 at a time.
|
||||
* **Show soulbound items**: aimed at enchanters, this controls whether or not you will see items that are soulbound as breakable items or not.
|
||||
|
||||
### **Known issues**
|
||||
|
||||
* If you have more than 5 of a breakable item but split into stacks all smaller than 5, the game will say you do not have enough items to break. The default UI now has a built-in button to compress stacks that should solve this issue.
|
Reference in New Issue
Block a user