mirror of
https://github.com/parnic/breakables.git
synced 2025-06-17 01:41:51 -05:00
Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
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
|
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
|
||||
|
347
Breakables.lua
347
Breakables.lua
@ -5,7 +5,40 @@ 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"]
|
||||
@ -38,6 +71,14 @@ local AdditionalMillableItems = {
|
||||
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 = {
|
||||
@ -50,6 +91,14 @@ local AdditionalProspectableItems = {
|
||||
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 = {
|
||||
@ -69,6 +118,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 = {
|
||||
@ -86,6 +143,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 = {
|
||||
@ -143,6 +207,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
|
||||
|
||||
@ -172,6 +243,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
|
||||
@ -190,6 +262,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 = {
|
||||
@ -202,10 +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)
|
||||
@ -260,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")
|
||||
@ -282,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
|
||||
@ -308,7 +412,7 @@ function Breakables:OnEnable()
|
||||
end
|
||||
self.frame:SetScript("OnUpdate", self.frame.OnUpdateFunc)
|
||||
else
|
||||
self:UnregisterAllEvents()
|
||||
self:CreateButtonFrame()
|
||||
end
|
||||
end
|
||||
|
||||
@ -337,13 +441,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
|
||||
|
||||
@ -405,12 +513,34 @@ function Breakables:OnLeaveCombat()
|
||||
end
|
||||
|
||||
function Breakables:OnTradeSkillUpdate()
|
||||
if not CanDisenchant then
|
||||
return
|
||||
end
|
||||
|
||||
self:GetEnchantingLevel()
|
||||
self:FindBreakables()
|
||||
end
|
||||
|
||||
function Breakables:OnBagItemLockPicked()
|
||||
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)
|
||||
@ -421,15 +551,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
|
||||
@ -590,6 +730,36 @@ 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"],
|
||||
@ -623,26 +793,29 @@ function Breakables:GetOptions()
|
||||
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"],
|
||||
@ -658,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"],
|
||||
@ -680,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
|
||||
|
||||
@ -692,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")
|
||||
@ -714,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
|
||||
@ -822,6 +1040,10 @@ function Breakables:FindBreakables(bag)
|
||||
return
|
||||
end
|
||||
|
||||
if not canBreakSomething() then
|
||||
return
|
||||
end
|
||||
|
||||
if self.bCombat then
|
||||
self.bPendingUpdate = true
|
||||
return
|
||||
@ -884,7 +1106,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")
|
||||
|
||||
@ -1006,7 +1228,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)
|
||||
|
||||
@ -1021,23 +1243,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
|
||||
@ -1051,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
|
||||
@ -1232,7 +1466,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)
|
||||
@ -1243,7 +1477,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)
|
||||
@ -1297,8 +1531,17 @@ end
|
||||
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
|
||||
|
||||
|
@ -1,12 +1,23 @@
|
||||
## Interface: 80200
|
||||
## 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: 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,69 @@
|
||||
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
|
||||
|
||||
|
@ -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