mirror of
https://github.com/parnic/breakables.git
synced 2025-06-17 01:41:51 -05:00
Compare commits
61 Commits
Author | SHA1 | Date | |
---|---|---|---|
d69da1a7d5
|
|||
55c73b3505
|
|||
fcd5d6d1f9
|
|||
c39996022e
|
|||
6c3f3e93e6
|
|||
e84b834139
|
|||
a6d396e88d
|
|||
89dd251093
|
|||
1d6883b1f5
|
|||
cb0cd8749d
|
|||
a98b02e7cb
|
|||
d299ed3d3f
|
|||
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
|
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
|
3
.pkgmeta
3
.pkgmeta
@ -37,5 +37,8 @@ externals:
|
||||
|
||||
ignore:
|
||||
- readme.md
|
||||
- FUNDING.yml
|
||||
|
||||
manual-changelog: changelog.txt
|
||||
|
||||
enable-nolib-creation: yes
|
||||
|
735
Breakables.lua
735
Breakables.lua
@ -5,7 +5,67 @@ local LBF = LibStub("Masque", true)
|
||||
|
||||
local lbfGroup
|
||||
|
||||
local IsArtifactRelicItem, GetBagName, GetContainerNumSlots, GetContainerItemInfo, GetContainerItemLink =
|
||||
IsArtifactRelicItem, GetBagName, GetContainerNumSlots, GetContainerItemInfo, GetContainerItemLink
|
||||
if not IsArtifactRelicItem then
|
||||
IsArtifactRelicItem = function()
|
||||
return false
|
||||
end
|
||||
end
|
||||
if C_Container then
|
||||
if C_Container.GetBagName then
|
||||
GetBagName = C_Container.GetBagName
|
||||
end
|
||||
if C_Container.GetContainerNumSlots then
|
||||
GetContainerNumSlots = C_Container.GetContainerNumSlots
|
||||
end
|
||||
if C_Container.GetContainerItemInfo then
|
||||
GetContainerItemInfo = function(bagId, slotId)
|
||||
local info = C_Container.GetContainerItemInfo(bagId, slotId)
|
||||
if not info then
|
||||
return nil
|
||||
end
|
||||
|
||||
return info.iconFileID, info.stackCount
|
||||
end
|
||||
end
|
||||
if C_Container.GetContainerItemLink then
|
||||
GetContainerItemLink = C_Container.GetContainerItemLink
|
||||
end
|
||||
end
|
||||
|
||||
local EQUIPPED_LAST = EQUIPPED_LAST
|
||||
if not EQUIPPED_LAST then
|
||||
EQUIPPED_LAST = INVSLOT_LAST_EQUIPPED
|
||||
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"]
|
||||
@ -37,6 +97,15 @@ local AdditionalMillableItems = {
|
||||
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 = {
|
||||
@ -48,6 +117,15 @@ local AdditionalProspectableItems = {
|
||||
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 = {
|
||||
@ -67,6 +145,14 @@ local MassMilling = {
|
||||
[124106] = 209664,
|
||||
[128304] = 210116,
|
||||
[151565] = 247861,
|
||||
-- shadowlands
|
||||
[168586] = 311417,
|
||||
[168589] = 311416,
|
||||
[170554] = 311414,
|
||||
[168583] = 311415,
|
||||
[169701] = 311413,
|
||||
[171315] = 311418,
|
||||
[187699] = 359490,
|
||||
}
|
||||
|
||||
local HerbCombineItems = {
|
||||
@ -84,6 +170,13 @@ local HerbCombineItems = {
|
||||
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 = {
|
||||
@ -109,6 +202,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
|
||||
@ -137,6 +234,13 @@ local PickableItems = {
|
||||
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
|
||||
|
||||
@ -166,6 +270,7 @@ local BREAKABLE_PICK = 4
|
||||
local BREAKABLE_COMBINE = 5
|
||||
|
||||
local BagUpdateCheckDelay = 0.1
|
||||
local PickLockFinishedDelay = 1
|
||||
local nextCheck = {}
|
||||
for i=0,NUM_BAG_SLOTS do
|
||||
nextCheck[i] = -1
|
||||
@ -184,6 +289,10 @@ 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 = {
|
||||
@ -196,10 +305,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)
|
||||
@ -254,12 +366,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")
|
||||
@ -276,7 +404,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
|
||||
@ -302,7 +439,7 @@ function Breakables:OnEnable()
|
||||
end
|
||||
self.frame:SetScript("OnUpdate", self.frame.OnUpdateFunc)
|
||||
else
|
||||
self:UnregisterAllEvents()
|
||||
self:CreateButtonFrame()
|
||||
end
|
||||
end
|
||||
|
||||
@ -331,13 +468,17 @@ function Breakables:RegisterEvents()
|
||||
self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnLeaveCombat")
|
||||
|
||||
self:RegisterEvent("MODIFIER_STATE_CHANGED", "FindBreakables")
|
||||
self:RegisterEvent("SPELLS_CHANGED", "OnSpellsChanged")
|
||||
|
||||
if CanDisenchant and WowVer < 80000 then
|
||||
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
|
||||
|
||||
@ -399,12 +540,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)
|
||||
@ -415,15 +578,25 @@ 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
|
||||
@ -463,181 +636,239 @@ function Breakables:GetOptions()
|
||||
name = L["Welcome"],
|
||||
order = 0,
|
||||
},
|
||||
hideAlways = {
|
||||
type = "toggle",
|
||||
name = L["Hide bar"],
|
||||
desc = L["This will completely hide the breakables bar whether you have anything to break down or not. Note that you can toggle this in a macro using the /breakables command as well."],
|
||||
get = function(info)
|
||||
return self.settings.hide
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hide = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78maxBreakables|r to " .. tostring(self.settings.hide))
|
||||
end
|
||||
self:ToggleButtonFrameVisibility(not v)
|
||||
if not v then
|
||||
self:FindBreakables()
|
||||
end
|
||||
end,
|
||||
order = 1
|
||||
mainSettings = {
|
||||
name = L["Settings"],
|
||||
type = "group",
|
||||
order = 1,
|
||||
args = {
|
||||
hideAlways = {
|
||||
type = "toggle",
|
||||
name = L["Hide bar"],
|
||||
desc = L["This will completely hide the breakables bar whether you have anything to break down or not. Note that you can toggle this in a macro using the /breakables command as well."],
|
||||
get = function(info)
|
||||
return self.settings.hide
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hide = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78maxBreakables|r to " .. tostring(self.settings.hide))
|
||||
end
|
||||
self:ToggleButtonFrameVisibility(not v)
|
||||
if not v then
|
||||
self:FindBreakables()
|
||||
end
|
||||
end,
|
||||
order = 1
|
||||
},
|
||||
hideNoBreakables = {
|
||||
type = "toggle",
|
||||
name = L["Hide if no breakables"],
|
||||
desc = L["Whether or not to hide the action bar if no breakables are present in your bags"],
|
||||
get = function(info)
|
||||
return self.settings.hideIfNoBreakables
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hideIfNoBreakables = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78hideIfNoBreakables|r to " .. tostring(self.settings.hideIfNoBreakables))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
order = 2,
|
||||
},
|
||||
hideInCombat = {
|
||||
type = "toggle",
|
||||
name = L["Hide during combat"],
|
||||
desc = L["Whether or not to hide the breakables bar when you enter combat and show it again when leaving combat."],
|
||||
get = function(info)
|
||||
return self.settings.hideInCombat
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hideInCombat = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78hideInCombat|r to " .. tostring(self.settings.hideInCombat))
|
||||
end
|
||||
end,
|
||||
order = 3,
|
||||
},
|
||||
maxBreakables = {
|
||||
type = 'range',
|
||||
name = L["Max number to display"],
|
||||
desc = L["How many breakable buttons to display next to the profession button at maximum"],
|
||||
min = 1,
|
||||
max = 50,
|
||||
step = 1,
|
||||
get = function(info)
|
||||
return self.settings.maxBreakablesToShow
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.maxBreakablesToShow = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78maxBreakables|r to " .. tostring(self.settings.maxBreakablesToShow))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
order = 4,
|
||||
},
|
||||
buttonScale = {
|
||||
type = 'range',
|
||||
name = L["Button scale"],
|
||||
desc = L["This will scale the size of each button up or down."],
|
||||
min = 0.1,
|
||||
max = 2,
|
||||
step = 0.01,
|
||||
get = function(info)
|
||||
return self.settings.buttonScale
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.buttonScale = v
|
||||
Breakables:ApplyScale()
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78buttonScale|r to " .. tostring(self.settings.buttonScale))
|
||||
end
|
||||
end,
|
||||
order = 5,
|
||||
},
|
||||
fontSize = {
|
||||
type = 'range',
|
||||
name = L["Font size"],
|
||||
desc = L["This sets the size of the text that shows how many items you have to break."],
|
||||
min = 4,
|
||||
max = 90,
|
||||
step = 1,
|
||||
get = function(info)
|
||||
return self.settings.fontSize
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.fontSize = v
|
||||
Breakables:ApplyScale()
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78fontSize|r to " .. tostring(self.settings.fontSize))
|
||||
end
|
||||
end,
|
||||
order = 6,
|
||||
},
|
||||
growDirection = {
|
||||
type = 'select',
|
||||
name = L["Button grow direction"],
|
||||
desc = L["This controls which direction the breakable buttons grow toward."],
|
||||
values = validGrowDirections,
|
||||
get = function()
|
||||
return self.settings.growDirection
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.growDirection = v
|
||||
self:FindBreakables()
|
||||
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,
|
||||
},
|
||||
},
|
||||
},
|
||||
hideNoBreakables = {
|
||||
type = "toggle",
|
||||
name = L["Hide if no breakables"],
|
||||
desc = L["Whether or not to hide the action bar if no breakables are present in your bags"],
|
||||
get = function(info)
|
||||
return self.settings.hideIfNoBreakables
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hideIfNoBreakables = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78hideIfNoBreakables|r to " .. tostring(self.settings.hideIfNoBreakables))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
reset = {
|
||||
name = L["Reset"],
|
||||
type = "group",
|
||||
order = 2,
|
||||
},
|
||||
hideInCombat = {
|
||||
type = "toggle",
|
||||
name = L["Hide during combat"],
|
||||
desc = L["Whether or not to hide the breakables bar when you enter combat and show it again when leaving combat."],
|
||||
get = function(info)
|
||||
return self.settings.hideInCombat
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.hideInCombat = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78hideInCombat|r to " .. tostring(self.settings.hideInCombat))
|
||||
end
|
||||
end,
|
||||
order = 3,
|
||||
},
|
||||
maxBreakables = {
|
||||
type = 'range',
|
||||
name = L["Max number to display"],
|
||||
desc = L["How many breakable buttons to display next to the profession button at maximum"],
|
||||
min = 1,
|
||||
max = 50,
|
||||
step = 1,
|
||||
get = function(info)
|
||||
return self.settings.maxBreakablesToShow
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.maxBreakablesToShow = v
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78maxBreakables|r to " .. tostring(self.settings.maxBreakablesToShow))
|
||||
end
|
||||
self:FindBreakables()
|
||||
end,
|
||||
order = 4,
|
||||
},
|
||||
buttonScale = {
|
||||
type = 'range',
|
||||
name = L["Button scale"],
|
||||
desc = L["This will scale the size of each button up or down."],
|
||||
min = 0.1,
|
||||
max = 2,
|
||||
step = 0.01,
|
||||
get = function(info)
|
||||
return self.settings.buttonScale
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.buttonScale = v
|
||||
Breakables:ApplyScale()
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78buttonScale|r to " .. tostring(self.settings.buttonScale))
|
||||
end
|
||||
end,
|
||||
order = 5,
|
||||
},
|
||||
fontSize = {
|
||||
type = 'range',
|
||||
name = L["Font size"],
|
||||
desc = L["This sets the size of the text that shows how many items you have to break."],
|
||||
min = 4,
|
||||
max = 90,
|
||||
step = 1,
|
||||
get = function(info)
|
||||
return self.settings.fontSize
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.fontSize = v
|
||||
Breakables:ApplyScale()
|
||||
if info.uiType == "cmd" then
|
||||
print("|cff33ff99Breakables|r: set |cffffff78fontSize|r to " .. tostring(self.settings.fontSize))
|
||||
end
|
||||
end,
|
||||
order = 6,
|
||||
},
|
||||
growDirection = {
|
||||
type = 'select',
|
||||
name = L["Button grow direction"],
|
||||
desc = L["This controls which direction the breakable buttons grow toward."],
|
||||
values = validGrowDirections,
|
||||
get = function()
|
||||
return self.settings.growDirection
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.settings.growDirection = v
|
||||
self:FindBreakables()
|
||||
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,
|
||||
args = {
|
||||
resetPlacement = {
|
||||
type = "execute",
|
||||
name = L["Reset placement"],
|
||||
desc = L["Resets where the buttons are placed on the screen to the default location."],
|
||||
func = function()
|
||||
self.settings.buttonFrameLeft = self.defaults.profile.buttonFrameLeft
|
||||
self.settings.buttonFrameTop = self.defaults.profile.buttonFrameTop
|
||||
self:CreateButtonFrame()
|
||||
end,
|
||||
order = 30,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
opts.args.hideEqManagerItems = {
|
||||
if GetNumEquipmentSets or C_EquipmentSet then
|
||||
opts.args.mainSettings.args.hideEqManagerItems = {
|
||||
type = "toggle",
|
||||
name = L["Hide Eq. Mgr items"],
|
||||
desc = L["Whether or not to hide items that are part of an equipment set in the game's equipment manager."],
|
||||
@ -652,11 +883,14 @@ function Breakables:GetOptions()
|
||||
self:FindBreakables()
|
||||
end,
|
||||
hidden = function()
|
||||
return not self.settings.showSoulbound
|
||||
return not CanDisenchant and not self.settings.showSoulbound
|
||||
end,
|
||||
order = 21,
|
||||
}
|
||||
opts.args.hideTabards = {
|
||||
end
|
||||
|
||||
if ShouldShowTabardControls then
|
||||
opts.args.mainSettings.args.hideTabards = {
|
||||
type = "toggle",
|
||||
name = L["Hide Tabards"],
|
||||
desc = L["Whether or not to hide tabards from the disenchantable items list."],
|
||||
@ -674,6 +908,43 @@ function Breakables:GetOptions()
|
||||
}
|
||||
end
|
||||
|
||||
if not IgnoreEnchantingSkillLevelForDisenchant then
|
||||
opts.args.mainSettings.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.mainSettings.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
|
||||
|
||||
@ -686,6 +957,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")
|
||||
@ -708,7 +984,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
|
||||
@ -803,8 +1079,8 @@ function Breakables:OnMouseUp(frame)
|
||||
self.settings.buttonFrameTop[frameNum] = frame:GetTop()
|
||||
end
|
||||
|
||||
local function IgnoreFunc(self, button)
|
||||
if button == "RightButton" and not InCombatLockdown() then
|
||||
local function IgnoreFunc(self, button, isDown)
|
||||
if button == "RightButton" and isDown and not InCombatLockdown() then
|
||||
Breakables.settings.ignoreList[self.itemId] = true
|
||||
Breakables:FindBreakables()
|
||||
LibStub("AceConfigRegistry-3.0"):NotifyChange("Breakables")
|
||||
@ -816,6 +1092,10 @@ function Breakables:FindBreakables(bag)
|
||||
return
|
||||
end
|
||||
|
||||
if not canBreakSomething() then
|
||||
return
|
||||
end
|
||||
|
||||
if self.bCombat then
|
||||
self.bPendingUpdate = true
|
||||
return
|
||||
@ -878,7 +1158,7 @@ function Breakables:FindBreakables(bag)
|
||||
btn:SetWidth(buttonSize)
|
||||
btn:SetHeight(buttonSize)
|
||||
btn:EnableMouse(true)
|
||||
btn:RegisterForClicks("AnyUp")
|
||||
btn:RegisterForClicks("AnyUp", "AnyDown")
|
||||
|
||||
btn:SetAttribute("type1", "spell")
|
||||
|
||||
@ -1000,7 +1280,7 @@ end
|
||||
|
||||
function Breakables:OnEnterProfessionButton(btn)
|
||||
local spellId = self:GetSpellIdFromProfessionButton(btn.type)
|
||||
if spellId then
|
||||
if spellId and self.settings.showTooltipForProfession then
|
||||
GameTooltip:SetOwner(btn, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetSpellByID(spellId)
|
||||
|
||||
@ -1015,23 +1295,30 @@ 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: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
|
||||
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()
|
||||
showingTooltip = nil
|
||||
if showingTooltip then
|
||||
GameTooltip:Hide()
|
||||
showingTooltip = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:PostClickedBreakableButton(this)
|
||||
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
|
||||
@ -1045,12 +1332,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
|
||||
@ -1064,10 +1356,11 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
||||
self.myTooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
|
||||
end
|
||||
|
||||
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bagId, slotId)
|
||||
local texture, itemCount = GetContainerItemInfo(bagId, slotId)
|
||||
if texture then
|
||||
local itemLink = GetContainerItemLink(bagId, slotId)
|
||||
if self.settings.ignoreList[self:GetItemIdFromLink(itemLink)] then
|
||||
local itemId = self:GetItemIdFromLink(itemLink)
|
||||
if self.settings.ignoreList[itemId] then
|
||||
return nil
|
||||
end
|
||||
|
||||
@ -1076,7 +1369,7 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
|
||||
self.myTooltip:SetBagItem(bagId, slotId)
|
||||
|
||||
if CanDisenchant and itemRarity and itemRarity >= RARITY_UNCOMMON and itemRarity < RARITY_HEIRLOOM
|
||||
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink) then
|
||||
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId) then
|
||||
local i = 1
|
||||
local soulbound = false
|
||||
for i=1,15 do
|
||||
@ -1091,7 +1384,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
|
||||
@ -1124,7 +1417,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
|
||||
@ -1226,7 +1518,7 @@ do
|
||||
end
|
||||
|
||||
function Breakables:IsInEquipmentSet(itemId)
|
||||
if WowVer < 80000 then
|
||||
if UseNonNativeEqManagerChecks and GetNumEquipmentSets then
|
||||
for setIdx=1, GetNumEquipmentSets() do
|
||||
local set = GetEquipmentSetInfo(setIdx)
|
||||
local itemArray = GetEquipmentSetItemIDs(set)
|
||||
@ -1237,7 +1529,7 @@ function Breakables:IsInEquipmentSet(itemId)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
elseif C_EquipmentSet then
|
||||
local sets = C_EquipmentSet.GetEquipmentSetIDs()
|
||||
for k, v in ipairs(sets) do
|
||||
local itemArray = C_EquipmentSet.GetItemIDs(v)
|
||||
@ -1288,11 +1580,20 @@ function Breakables:SortBreakables(foundBreakables)
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink)
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId)
|
||||
for i=1,#DisenchantTypes do
|
||||
if DisenchantTypes[i] == itemType or IsArtifactRelicItem(itemLink) then
|
||||
-- temp hack for bfa until disenchant item level scales are identified
|
||||
if WowVer >= 80000 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
|
||||
|
||||
@ -1391,5 +1692,11 @@ function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, i
|
||||
end
|
||||
end
|
||||
|
||||
for i=1,#AdditionalDisenchantableItems do
|
||||
if AdditionalDisenchantableItems[i] == itemId then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
@ -1,12 +1,23 @@
|
||||
## Interface: 80000
|
||||
## Interface: 100002
|
||||
## Interface-Retail: 100002
|
||||
## 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: 70300
|
||||
## X-Curse-Project-ID: 16629
|
||||
## X-WoWI-ID: 17929
|
||||
## X-Wago-ID: rkGrlA6y
|
||||
|
||||
#@no-lib-strip@
|
||||
embeds.xml
|
||||
|
3
FUNDING.yml
Normal file
3
FUNDING.yml
Normal file
@ -0,0 +1,3 @@
|
||||
github: parnic
|
||||
ko_fi: parnic
|
||||
custom: "https://www.paypal.me/parnic"
|
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.
|
@ -1,3 +1,102 @@
|
||||
v1.9.6:
|
||||
|
||||
- Fix lockboxes in 10.0.2
|
||||
|
||||
v1.9.5:
|
||||
|
||||
- Fix another error from 10.0.2
|
||||
|
||||
v1.9.4:
|
||||
|
||||
- Update TOC for 10.0.2
|
||||
|
||||
v1.9.3:
|
||||
|
||||
- Fix error on 10.0.0
|
||||
|
||||
v1.9.2:
|
||||
|
||||
- Dragonflight/10.0.2 compatibility
|
||||
- Add ability to reset placement of the bar in case it gets lost somehow.
|
||||
- Shuffled settings into their own categories to make accidental resets unlikely.
|
||||
- Fix items being added to the ignore list both on press and release. This would frequently mean that two items would get ignored instead of just the one you wanted to click on.
|
||||
|
||||
v1.9.1:
|
||||
|
||||
- Fix right-click ignore functionality after the upgrade to 10.0.
|
||||
|
||||
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
|
||||
|
@ -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>
|
||||
|
@ -14,7 +14,6 @@ Typing */brk* will open the configuration settings (or you can get to it from Bl
|
||||
* **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.
|
||||
* If you know Mass Milling for a specific type of herb, the current alpha will try to use this ability and fail. I am in the process of leveling a scribe up high enough to debug this problem.
|
||||
|
Reference in New Issue
Block a user