Compare commits

...

60 Commits
1.3.1 ... 1.4.6

Author SHA1 Message Date
575f2843aa Added ignore feature
Breakables can now be right-clicked to add them to an ignore list which prevents them from ever showing up as a breakable item. Ignored items may be viewed and cleared from the options screen.
2016-11-23 01:32:33 -06:00
2e4b7e413c Added artifact relics as disenchantable 2016-11-13 20:35:25 -06:00
db9fb7627b Added MoP Sparkling Shard as a combinable object 2016-11-13 20:35:04 -06:00
fbb4e090b6 Updated changelog 2016-10-25 14:44:56 -05:00
8116c0a843 Updated TOC for 7.1 2016-10-25 14:41:44 -05:00
1d0ad0f0ed Updated changelog 2016-10-11 17:20:58 -05:00
09d8e16e07 Update tooltip when pressing Shift
When the tooltip is showing a breakable item and the player presses/releases Shift, update the tooltip. This is so that disenchantable items can more easily show what the player currently has equipped.
2016-10-11 17:17:29 -05:00
1b3533e9f6 Automatically update the tooltip
When the player is hovering over a breakable button and something causes the breakable list to be regenerated, make sure we update the tooltip so they aren't looking at a stale tooltip.
2016-10-11 16:59:27 -05:00
6dbd396b87 Don't show legendary Legion items as disenchantable 2016-10-11 14:27:37 -05:00
9a4714e599 Ignore readme when packaging
Setup manual changelog instead of auto-generated one
2016-10-08 10:08:03 -05:00
4b31136512 Added WoD combinables 2016-10-06 00:20:10 -05:00
f6641909ed Added support for combining smaller items into larger ones
Certain types of herbs and ore can be looted that aren't millable/prospectable themselves, but can be used to combine (or unbreak, if you will...) them into an item that can be milled/prospected. It's convenient if the addon offers support for those situations so you can combine the combinables, then break the breakables.
2016-10-04 14:13:10 -05:00
466f952018 Fixed the breakable button not working all the time
We need to explicitly set the type of the button to spell in addition to specifying the spell name, target bag, and target slot.
2016-10-04 14:13:10 -05:00
798fc314a3 Update more frequently
I had set a bag check delay to ensure when the player looted masses of items at once that we didn't bog down the game. 1 second is way more than that case needs, so let's reduce it to 0.1 simply to prevent the "check 8 times when looting 8 items" performance problem but retain a responsive Breakables UI.
2016-10-04 14:13:10 -05:00
5ff9be70da Added handling for disenchanting WoD/Legion items with a low Enchanting level 2016-10-03 16:14:20 -05:00
f9b0d201ea Added readme 2016-10-03 15:52:17 -05:00
9aba362e1b Fixed sometimes choosing small stacks over large ones
This is an ancient problem in Breakables where the merging mechanism was always combining the same breakable into a single entry in its internal array and disregarding what bag and slot each stack was in. If we retain the position of the largest stack, then Breakables can always pick the proper larger stack to break no matter what order they appear in bags. This won't help the case where a single stack is spread into stacks where no single stack is large enough to break, but the WoW client has built-in bag compression now, so that should be less of a concern.
2016-09-22 13:34:31 -05:00
6624d74b2a Fixed sometimes choosing invalid items to break
When the player had items where one was a substring of the other ("Whiptail" vs "Whiptail Stem", for example), the game client would sometimes pick the wrong one to break. In the Whiptail case, this meant the game could attempt to cast Mill on a Whiptail Stem if it appeared first in the player's bags, which doesn't work. All we can do with the target-item attribute is supply a name, so it's not really our fault that the game makes this decision, but we can work around it by using target-bag and target-slot instead of target-item where we can be explicit about what we're trying to break.
2016-09-22 13:34:31 -05:00
619e0f7479 Different method of determining if a Mass Mill spell is known 2016-09-21 08:30:51 -05:00
80bf120abf Added explicit support for Legion ore 2016-09-19 13:56:27 -05:00
d902f864db Only select mass milling if the player knows the mass mill ability for that item 2016-09-05 23:07:09 -05:00
9a4c7ddf82 Added support for mass milling 2016-09-05 22:44:48 -05:00
8bd14cd525 Explicitly added Legion herbs 2016-09-05 22:02:27 -05:00
b086d499b8 Updated TOC to 7.0 2016-07-18 12:03:29 -05:00
66b0de8074 Added mailmap to unify author info 2016-05-30 11:24:49 -05:00
62a949cd10 Updated Compatible-With to 7.0 2016-05-30 01:44:52 -05:00
8f50b7f75f - TOC bump for 6.2 2015-06-27 22:11:54 -05:00
3f0637641a - Clear the tooltip when we receive a new item and we recently clicked a breakables button. This isn't ideal since we could be clearing out a tooltip that should stay or clearing out a tooltip not related to our mod, but it's probably better than keeping a stale tooltip around for something like a disenchant when the user hasn't moved the mouse away from the button since breaking something. 2015-06-27 22:11:20 -05:00
6d5d518a8b - Moved compatible-with to 5.x from 4.x 2015-02-25 22:49:45 -06:00
d2895bed6a - TOC bump for 6.1 2015-02-24 17:18:02 -06:00
d2154a350a - Actually fixed True Iron Ore showing up as prospectable. 2014-12-29 17:16:02 -06:00
a41810c663 - Hide garrison follower armor items by hiding any item that doesn't come back with an equip slot. Hopefully doesn't produce any false positives. 2014-12-26 15:22:52 -06:00
da5e9500f8 - Block True Iron Ore from showing up as millable. 2014-12-18 10:40:58 -06:00
53704888fa Disabled global "herb"-type item acceptance since it, as expected, flags false positives. Instead we're whitelisting WoD herbs by item id. 2014-11-22 02:37:20 -06:00
db1819c49f Now considering all items with sub-type "Herb" to be millable. Again. I'm sure it won't cause any problems. Nope. 2014-11-16 15:34:28 -06:00
fb83c4db4a - Added check for the "Herb" keyword on a tooltip line for millable items since apparently WoD herbs don't say "Millable". Cool. 2014-11-14 16:22:13 -06:00
33e52dc2f6 - Switched from LibButtonFacade to Masque. (ticket #20) 2014-11-08 01:07:57 -06:00
74e54e9537 - Added MoP lockbox/junkbox that I apparently missed before now. 2014-10-14 12:56:51 -05:00
abea50f496 Updated TOC to patch 6.0 2014-10-13 01:41:47 -05:00
2a8bbfcda6 - TOC update for 5.4 2013-09-10 14:50:26 +00:00
b970542bfe - 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). 2013-07-30 01:45:37 +00:00
8edeeed9e1 - Removed debug print added in last commit.
- Added option to hide tabards from the list of breakables. (ticket #16)
2013-07-27 17:43:06 +00:00
7c19e414e7 - Only display items the player is capable of disenchanting. 2013-07-27 16:39:18 +00:00
4e65efadff - Suppress account-bound and bnet-account-bound items when "show soulbound items" is unchecked. 2013-07-26 05:40:43 +00:00
fea232d8ae - Fixed GetEnchantingLevel() to work without requiring the user to open his/her professions window first. This isn't used yet; committing the fixed function to work on later. 2013-07-18 21:29:35 +00:00
993b99e7be - Search the first 15 lines instead of the first 5 lines for the "Soulbound" descriptor since apparently item cards have gotten stupidly long these days. 2013-05-30 21:49:45 +00:00
0442d560d5 - Added lockboxes to the pickable items list. (ticket #17) 2013-05-30 21:24:38 +00:00
e5968d9441 - Updated TOC for 5.3 2013-05-23 19:49:27 +00:00
814e0ca54f - 5.2 TOC update 2013-03-06 18:08:31 +00:00
610f1559fe - TOC increased for 5.1 2012-11-28 01:41:03 +00:00
140502e508 - Added MoP junkboxes.
- Removed optimization that was trivially excluding items whose type/sub-type didn't match expected since MoP ore/herbs aren't categorized properly.
2012-11-11 19:46:58 +00:00
302478f872 - Added X-Compatible-With 40300. 2012-08-27 19:06:10 +00:00
a1263947f0 - Updated TOC for 5.0. 2012-08-27 17:52:08 +00:00
1e45bfe622 - 4.3 toc update 2011-11-29 19:39:09 +00:00
26d83c425b - 4.2 toc update 2011-06-28 15:08:37 +00:00
8e6867ed44 - toc update 2011-04-27 00:49:05 +00:00
a9f1b24563 - drycoded fix to 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 2011-01-31 21:13:56 +00:00
a20c5fe54f - 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) 2011-01-03 05:47:44 +00:00
e22f4ef334 - 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)
- fixed herbs, ore, and disenchanting to update breakable item counts immediately upon the next BAG_UPDATE instead of throttling
2011-01-02 07:07:52 +00:00
c20dabea47 - 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. 2010-12-15 04:19:56 +00:00
7 changed files with 733 additions and 73 deletions

3
.mailmap Normal file
View File

@ -0,0 +1,3 @@
parnic <parnic@parnic.com> Parnic <chris@parnic.com>
parnic <parnic@parnic.com> Chris Pickett <cpickett@perniciousgames.com>
parnic <parnic@parnic.com> root <root@parnic.com>

View File

@ -34,4 +34,8 @@ externals:
libs/LibBabble-Inventory-3.0:
url: svn://svn.wowace.com/wow/libbabble-inventory-3-0/mainline/trunk
tag: latest
libs/LibButtonFacade: svn://svn.wowace.com/wow/buttonfacade/mainline/trunk/Libs/LibButtonFacade
ignore:
- readme.md
manual-changelog: changelog.txt

View File

@ -1,7 +1,7 @@
local L = LibStub("AceLocale-3.0"):GetLocale("Breakables", false)
Breakables = LibStub("AceAddon-3.0"):NewAddon("Breakables", "AceConsole-3.0", "AceEvent-3.0")
local babbleInv = LibStub("LibBabble-Inventory-3.0"):GetLookupTable()
local LBF = LibStub("LibButtonFacade", true)
local LBF = LibStub("Masque", true)
local lbfGroup
@ -10,16 +10,122 @@ local MillingItemSubType = babbleInv["Herb"]
local MillingItemSecondarySubType = babbleInv["Other"]
local CanMill = false
local AdditionalMillableItems = {
-- WoD herbs
109124,
109125,
109126,
109127,
109128,
109129,
-- Legion herbs
124101,
124102,
124103,
124104,
124105,
124106,
128304,
}
local AdditionalProspectableItems = {
-- Legion ore
123918,
123919,
}
local MassMilling = {
-- wod
[109124] = 190381,
[109125] = 190382,
[109126] = 190383,
[109127] = 190384,
[109128] = 190385,
[109129] = 190386,
-- legion
[124101] = 209658,
[124102] = 209659,
[124103] = 209660,
[124104] = 209661,
[124105] = 209662,
[124106] = 209664,
[128304] = 210116,
}
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
}
local UnProspectableItems = {
109119, -- WoD True Iron Ore
}
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 PickLockId = 1804
local PickableItems = {
16882, -- battered junkbox
16883, -- worn junkbox
16884, -- sturdy junkbox
16885, -- heavy junkbox
29569, -- strong junkbox
43575, -- reinforced junkbox
63349, -- flame-scarred junkbox
88165, -- vine-cracked junkbox
106895, -- iron-bound junkbox
4632, -- ornate bronze lockbox
4633, -- heavy bronze lockbox
4634, -- iron lockbox
4636, -- strong iron lockbox
4637, -- steel lockbox
4638, -- reinforced steel lockbox
5758, -- mithril lockbox
5759, -- throium lockbox
5760, -- eternium lockbox
31952, -- khorium lockbox
43622, -- froststeel lockbox
43624, -- titanium lockbox
45986, -- tiny titanium lockbox
68729, -- elementium lockbox
88567, -- ghost iron lockbox
116920, -- true steel lockbox
}
local CanPickLock = false
-- item rarity must meet or surpass this to be considered for disenchantability (is that a word?)
local RARITY_UNCOMMON = 2
local RARITY_RARE = 3
local RARITY_EPIC = 4
local RARITY_HEIRLOOM = 7
local IDX_LINK = 1
@ -33,26 +139,31 @@ local IDX_LEVEL = 8
local IDX_BREAKABLETYPE = 9
local IDX_SOULBOUND = 10
local IDX_NAME = 11
local IDX_RARITY = 12
local BREAKABLE_HERB = 1
local BREAKABLE_ORE = 2
local BREAKABLE_DE = 3
local BREAKABLE_PICK = 4
local BREAKABLE_COMBINE = 5
local BagUpdateCheckDelay = 1.5
local BagUpdateCheckDelay = 0.1
local nextCheck = {}
for i=0,NUM_BAG_SLOTS do
nextCheck[i] = -1
end
local buttonSize = 28
local buttonSize = 45
local _G = _G
local validGrowDirections = {L["Left"], L["Right"], L["Up"], L["Down"]}
-- can be 1 or 2
-- 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
@ -68,7 +179,7 @@ function Breakables:OnInitialize()
hide = false,
hideInCombat = false,
buttonScale = 1,
fontSize = 7,
fontSize = 11,
growDirection = 2,
}
}
@ -91,21 +202,9 @@ function Breakables:OnInitialize()
end
self:InitLDB()
if LBF then
LBF:RegisterSkinCallback("Breakables", self.ButtonFacadeCallback, self)
lbfGroup = LBF:Group("Breakables")
if lbfGroup then
lbfGroup:Skin(self.settings.SkinID,
self.settings.Gloss,
self.settings.Backdrop,
self.settings.Colors)
end
end
end
function Breakables:ButtonFacadeCallback(SkinID, Gloss, Backdrop, Group, Button, Colors)
function Breakables:ButtonFacadeCallback(Group, SkinID, Gloss, Backdrop, Colors, Disabled)
if not Group then
self.settings.SkinID = SkinID
self.settings.Gloss = Gloss
@ -140,13 +239,25 @@ function Breakables:OnEnable()
CanMill = IsUsableSpell(GetSpellInfo(MillingId))
CanProspect = IsUsableSpell(GetSpellInfo(ProspectingId))
CanDisenchant = IsUsableSpell(GetSpellInfo(DisenchantId))
CanPickLock = IsUsableSpell(GetSpellInfo(PickLockId))
self.EnchantingLevel = 0
LibStub("AceConfig-3.0"):RegisterOptionsTable("Breakables", self:GetOptions(), "breakables")
self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("Breakables")
if LBF then
LBF:Register("Breakables", self.ButtonFacadeCallback, self)
lbfGroup = LBF:Group("Breakables")
if lbfGroup then
lbfGroup:ReSkin()
end
end
self:RegisterEvents()
if CanMill or CanProspect or CanDisenchant then
if CanMill or CanProspect or CanDisenchant or CanPickLock then
if CanMill then
numEligibleProfessions = numEligibleProfessions + 1
end
@ -155,6 +266,10 @@ function Breakables:OnEnable()
end
if CanDisenchant then
numEligibleProfessions = numEligibleProfessions + 1
self:GetEnchantingLevel()
end
if CanPickLock then
numEligibleProfessions = numEligibleProfessions + 1
end
self:CreateButtonFrame()
@ -196,9 +311,21 @@ function Breakables:RegisterEvents()
self:RegisterEvent("PLAYER_REGEN_DISABLED", "OnEnterCombat")
self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnLeaveCombat")
self:RegisterEvent("MODIFIER_STATE_CHANGED", "FindBreakables")
if CanDisenchant then
self:RegisterEvent("TRADE_SKILL_UPDATE", "OnTradeSkillUpdate")
end
if CanPickLock then
self:RegisterEvent("CHAT_MSG_OPENING", "OnBagItemLockPicked")
end
end
function Breakables:OnModifierChanged()
if showingTooltip ~= nil and not self.bCombat then
self:OnEnterBreakableButton(showingTooltip)
end
end
function Breakables:OnDisable()
@ -214,6 +341,7 @@ function Breakables:OnItemReceived(event, bag)
if self.justClicked then
self:FindBreakables()
self.justClicked = false
self:OnLeaveProfessionButton()
elseif not bag or bag >= 0 then
nextCheck[bag] = GetTime() + BagUpdateCheckDelay
end
@ -253,17 +381,47 @@ end
function Breakables:OnTradeSkillUpdate()
self:GetEnchantingLevel()
self:FindBreakables()
end
function Breakables:OnBagItemLockPicked()
nextCheck[1] = GetTime() + BagUpdateCheckDelay
end
function Breakables:FindLevelOfProfessionIndex(idx)
if idx ~= nil then
local name, texture, rank, maxRank, numSpells, spelloffset, skillLine = GetProfessionInfo(idx)
return skillLine, rank
end
end
function Breakables:GetEnchantingLevel()
local skillName, skillType, numAvailable, isExpanded = GetTradeSkillInfo(1)
local prof1, prof2 = GetProfessions()
if skillName == "Enchant" then
local _, rank, maxRank = GetTradeSkillLine()
self.settings.EnchantingLevel = rank
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
end
local function GetIgnoreListOptions()
local ret = {}
if Breakables.settings.ignoreList ~= nil then
for k,v in pairs(Breakables.settings.ignoreList) do
local name, _, _, _, _, _, _, _, _, texture = GetItemInfo(k)
ret[k] = ("|T%s:0|t %s"):format(texture, name)
end
end
return ret
end
function Breakables:GetOptions()
local opts = {
name = L["Breakables"],
@ -397,6 +555,50 @@ function Breakables:GetOptions()
end,
order = 7,
},
ignoreList = {
type = 'multiselect',
name = L["Ignore list"],
desc = L["Items that have been right-clicked to exclude from the breakable list. Un-check the box to remove the item from the ignore list."],
get = function(info, key)
return true
end,
set = function(info, key)
Breakables.settings.ignoreList[key] = nil
Breakables:FindBreakables()
end,
confirm = function()
return L["Are you sure you want to remove this item from the ignore list?"]
end,
values = GetIgnoreListOptions,
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,
disabled = function()
if Breakables.settings.ignoreList == nil then
return true
end
for k,v in pairs(Breakables.settings.ignoreList) do
if v ~= nil then
return false
end
end
return true
end,
order = 31,
},
},
}
@ -436,6 +638,22 @@ function Breakables:GetOptions()
end,
order = 21,
}
opts.args.hideTabards = {
type = "toggle",
name = L["Hide Tabards"],
desc = L["Whether or not to hide tabards from the disenchantable items list."],
get = function(info)
return self.settings.hideTabards
end,
set = function(info, v)
self.settings.hideTabards = v
if info.uiType == "cmd" then
print("|cff33ff99Breakables|r: set |cffffff78hideTabards|r to " .. tostring(self.settings.hideTabards))
end
self:FindBreakables()
end,
order = 22,
}
end
return opts
@ -443,8 +661,9 @@ end
function Breakables:CreateButtonFrame()
if not self.frame then
self.frame = CreateFrame("Frame")
self.frame = CreateFrame("Frame", nil, UIParent)
end
self.frame:SetScale(self.settings.buttonScale)
if not self.buttonFrame then
self.buttonFrame = {}
end
@ -462,11 +681,13 @@ function Breakables:CreateButtonFrame()
frame.type = BREAKABLE_DE
elseif CanProspect and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_ORE) then
frame.type = BREAKABLE_ORE
elseif CanPickLock and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_PICK) then
frame.type = BREAKABLE_PICK
end
if frame.type then
frame:SetWidth(buttonSize * self.settings.buttonScale)
frame:SetHeight(buttonSize * self.settings.buttonScale)
frame:SetWidth(buttonSize)
frame:SetHeight(buttonSize)
frame:EnableMouse(true)
frame:RegisterForClicks("LeftButtonUp")
@ -484,7 +705,7 @@ function Breakables:CreateButtonFrame()
frame:SetScript("OnMouseUp", frame.OnMouseUpFunc)
frame:SetClampedToScreen(true)
local spellName, _, texture = GetSpellInfo(self:GetSpellIdFromProfessionButton(frame))
local spellName, _, texture = GetSpellInfo(self:GetSpellIdFromProfessionButton(frame.type))
frame:SetAttribute("type1", "spell")
frame:SetAttribute("spell1", spellName)
@ -511,24 +732,32 @@ function Breakables:CreateButtonFrame()
end
end
function Breakables:GetSpellIdFromProfessionButton(btn)
return (btn.type == BREAKABLE_HERB and MillingId) or (btn.type == BREAKABLE_ORE and ProspectingId) or DisenchantId
function Breakables:GetSpellIdFromProfessionButton(itemType, itemId)
if itemType == BREAKABLE_HERB and itemId ~= nil then
if MassMilling[itemId] ~= nil and IsPlayerSpell(MassMilling[itemId]) then
return MassMilling[itemId]
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)
or PickLockId
end
function Breakables:ApplyScale()
if not self.buttonFrame then
return
end
self.frame:SetScale(self.settings.buttonScale)
for i=1,numEligibleProfessions do
-- yes, setscale exists...but it was scaling buttonFrame and breakableButtons differently for some reason. this works better.
self.buttonFrame[i]:SetWidth(buttonSize * self.settings.buttonScale)
self.buttonFrame[i]:SetHeight(buttonSize * self.settings.buttonScale)
if self.breakableButtons[i] then
for j=1,#self.breakableButtons[i] do
self.breakableButtons[i][j]:SetWidth(buttonSize * self.settings.buttonScale)
self.breakableButtons[i][j]:SetHeight(buttonSize * self.settings.buttonScale)
self.breakableButtons[i][j].text:SetFont(NumberFont_Outline_Med:GetFont(), self.settings.fontSize, "OUTLINE")
end
end
@ -556,6 +785,18 @@ function Breakables:OnMouseUp(frame)
self.settings.buttonFrameTop[frameNum] = frame:GetTop()
end
local function IgnoreFunc(self, button)
if button == "RightButton" and not InCombatLockdown() then
if Breakables.settings.ignoreList == nil then
Breakables.settings.ignoreList = {}
end
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
@ -602,9 +843,11 @@ 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])
if (CanDisenchant and isDisenchantable) or foundBreakables[i][IDX_COUNT] >= 5 then
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
numBreakableStacks[j] = numBreakableStacks[j] + 1
local btnIdx = numBreakableStacks[j]
@ -618,12 +861,12 @@ function Breakables:FindBreakables(bag)
btn.icon = btn:CreateTexture(btn:GetName().."Icon", "BACKGROUND")
end
btn:SetWidth(buttonSize * self.settings.buttonScale)
btn:SetHeight(buttonSize * self.settings.buttonScale)
btn:SetWidth(buttonSize)
btn:SetHeight(buttonSize)
btn:EnableMouse(true)
btn:RegisterForClicks("AnyUp")
btn:SetAttribute("type", "spell")
btn:SetAttribute("type1", "spell")
if not btn.text then
btn.text = btn:CreateFontString()
@ -631,11 +874,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
@ -656,12 +903,34 @@ function Breakables:FindBreakables(bag)
btn:SetPoint(attachFrom, btnIdx == 1 and self.buttonFrame[j] or self.breakableButtons[j][btnIdx - 1], attachTo)
if not isDisenchantable then
btn.text:SetText(foundBreakables[i][IDX_COUNT].." ("..(floor(foundBreakables[i][IDX_COUNT]/5))..")")
local appendText = ""
if not isLockedItem then
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)
end
local BreakableAbilityName = GetSpellInfo(self:GetSpellIdFromProfessionButton(foundBreakables[i][IDX_BREAKABLETYPE], self:GetItemIdFromLink(foundBreakables[i][IDX_LINK])))
--GetSpellInfo((foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_HERB and MillingId)
--or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_ORE and ProspectingId)
--or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_DE and DisenchantId)
--or PickLockId)
if BreakableAbilityName then
btn:SetAttribute("type1", "spell")
btn:SetAttribute("spell", BreakableAbilityName)
btn:SetAttribute("target-bag", foundBreakables[i][IDX_BAG])
btn:SetAttribute("target-slot", foundBreakables[i][IDX_SLOT])
else
btn:SetAttribute("type1", "item")
btn:SetAttribute("item", "item:" .. self:GetItemIdFromLink(foundBreakables[i][IDX_LINK]))
end
local BreakableAbilityName = GetSpellInfo((foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_HERB and MillingId) or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_ORE and ProspectingId) or DisenchantId)
btn:SetAttribute("spell", BreakableAbilityName)
btn:SetAttribute("target-item", foundBreakables[i][IDX_NAME])
if lbfGroup then
btn.icon:SetTexture(foundBreakables[i][IDX_TEXTURE])
else
@ -676,9 +945,13 @@ function Breakables:FindBreakables(bag)
if not btn.OnLeaveFunc then
btn.OnLeaveFunc = function() self:OnLeaveBreakableButton() end
end
if not btn.PostClickedFunc then
btn.PostClickedFunc = function(this) self:PostClickedBreakableButton(this) end
end
btn:SetScript("OnEnter", btn.OnEnterFunc)
btn:SetScript("OnLeave", btn.OnLeaveFunc)
btn:SetScript("PostClick", btn.PostClickedFunc)
btn:Show()
end
@ -705,15 +978,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))
local spellId = self:GetSpellIdFromProfessionButton(btn.type)
if spellId 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()
@ -726,11 +1006,21 @@ function Breakables:OnEnterBreakableButton(this)
GameTooltip:AddLine(" ")
GameTooltip:AddLine(L["You can click on this button to break this item without having to click on the profession button first."], 1, 1, 1, 1)
GameTooltip:AddLine(" ")
GameTooltip:AddLine(L["You can right-click on this button to ignore this item. Items can be unignored from the options screen."], 1, 1, 1, 1)
GameTooltip:Show()
showingTooltip = this
end
function Breakables:OnLeaveBreakableButton()
GameTooltip:Hide()
showingTooltip = nil
end
function Breakables:PostClickedBreakableButton(this)
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
function Breakables:FindBreakablesInBag(bagId)
@ -763,18 +1053,25 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bagId, slotId)
if texture then
local itemLink = GetContainerItemLink(bagId, slotId)
local itemName, _, itemRarity, itemLevel, _, itemType, itemSubType, _, _, itemTexture = GetItemInfo(itemLink)
if self.settings.ignoreList and self.settings.ignoreList[self:GetItemIdFromLink(itemLink)] 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) then
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink) then
local i = 1
local soulbound = false
for i=1,5 do
if _G["BreakablesTooltipTextLeft"..i]:GetText() == ITEM_SOULBOUND then
soulbound = true
break
for i=1,15 do
if _G["BreakablesTooltipTextLeft"..i] then
local textLine = _G["BreakablesTooltipTextLeft"..i]:GetText()
if textLine == ITEM_SOULBOUND or textLine == ITEM_ACCOUNTBOUND or textLine == ITEM_BNETACCOUNTBOUND then
soulbound = true
break
end
end
end
@ -782,29 +1079,138 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
if self.settings.hideEqManagerItems then
isInEquipmentSet = self:IsInEquipmentSet(self:GetItemIdFromLink(itemLink))
end
local shouldHideThisItem = self.settings.hideEqManagerItems and isInEquipmentSet
local isTabard = false
if self.settings.hideTabards then
isTabard = equipSlot == "INVTYPE_TABARD"
end
local shouldHideThisItem = (self.settings.hideEqManagerItems and isInEquipmentSet) or (self.settings.hideTabards and isTabard)
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}
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_DE, soulbound, itemName, itemRarity}
else
return nil
end
end
local extraInfo = BreakablesTooltipTextLeft2:GetText()
if CanMill and (itemSubType == MillingItemSubType or itemSubType == MillingItemSecondarySubType) and extraInfo == ITEM_MILLABLE then
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_HERB, false, itemName}
local idx = 1
local millable = false
local prospectable = false
for idx=1,5 do
if _G["BreakablesTooltipTextLeft"..idx] then
if _G["BreakablesTooltipTextLeft"..idx]:GetText() == ITEM_MILLABLE then
millable = true
break
elseif _G["BreakablesTooltipTextLeft"..idx]:GetText() == ITEM_PROSPECTABLE then
prospectable = true
break
end
end
end
if CanProspect and itemSubType == ProspectingItemSubType and extraInfo == ITEM_PROSPECTABLE then
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_ORE, false, itemName}
local itemId = self:GetItemIdFromLink(itemLink)
if CanMill and not millable then
for i=1,#AdditionalMillableItems do
if AdditionalMillableItems[i] == itemId then
millable = true
end
end
end
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)]] 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]] 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
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_PICK, false, itemName, itemRarity}
end
end
return nil
end
function Breakables:ItemIsPickable(itemId)
for i=1,#PickableItems do
if PickableItems[i] == itemId then
return true
end
end
return nil
end
do
local regions = {}
local tooltipBuffer = CreateFrame("GameTooltip","tooltipBuffer",nil,"GameTooltipTemplate")
tooltipBuffer:SetOwner(WorldFrame, "ANCHOR_NONE")
local function makeTable(t, ...)
wipe(t)
for i = 1, select("#", ...) do
t[i] = select(i, ...)
end
end
function Breakables:ItemIsLocked(bagId, slotId)
tooltipBuffer:ClearLines()
tooltipBuffer:SetBagItem(bagId, slotId)
-- Grab all regions, stuff em into our table
makeTable(regions, tooltipBuffer:GetRegions())
-- Convert FontStrings to strings, replace anything else with ""
for i=1, #regions do
local region = regions[i]
if region:GetObjectType() == "FontString" then
if region:GetText() == LOCKED then
return true
end
end
end
return false
end
end
function Breakables:IsInEquipmentSet(itemId)
for setIdx=1, GetNumEquipmentSets() do
local set = GetEquipmentSetInfo(setIdx)
@ -830,6 +1236,11 @@ function Breakables:MergeBreakables(foundBreakable, breakableList)
for n=1,#breakableList do
local listItemId = self:GetItemIdFromLink(breakableList[n][IDX_LINK])
if foundItemId == listItemId 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
@ -852,11 +1263,100 @@ function Breakables:SortBreakables(foundBreakables)
end
end
function Breakables:BreakableIsDisenchantable(itemType, itemLevel)
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink)
for i=1,#DisenchantTypes do
if DisenchantTypes[i] == itemType then
-- todo: figure out if the iLevel works with our enchanting skill level.
-- formula (from http://www.wowwiki.com/Disenchanting): 5*ceiling(iLevel,5)-100
if DisenchantTypes[i] == itemType or IsArtifactRelicItem(itemLink) then
-- 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
return self.EnchantingLevel >= 1
elseif itemLevel <= 25 then
return self.EnchantingLevel >= 25
elseif itemLevel <= 30 then
return self.EnchantingLevel >= 50
elseif itemLevel <= 35 then
return self.EnchantingLevel >= 75
elseif itemLevel <= 40 then
return self.EnchantingLevel >= 100
elseif itemLevel <= 45 then
return self.EnchantingLevel >= 125
elseif itemLevel <= 50 then
return self.EnchantingLevel >= 150
elseif itemLevel <= 55 then
return self.EnchantingLevel >= 175
elseif itemLevel <= 60 then
return self.EnchantingLevel >= 200
elseif itemLevel <= 99 then
return self.EnchantingLevel >= 225
elseif itemLevel <= 120 then
return self.EnchantingLevel >= 275
elseif itemLevel <= 150 then
return self.EnchantingLevel >= 325
elseif itemLevel <= 182 then
return self.EnchantingLevel >= 350
elseif itemLevel <= 318 then
return self.EnchantingLevel >= 425
elseif itemLevel <= 437 then
return self.EnchantingLevel >= 475
else
return self.EnchantingLevel >= 475
end
elseif itemRarity == RARITY_RARE then
if itemLevel <= 25 then
return self.EnchantingLevel >= 25
elseif itemLevel <= 30 then
return self.EnchantingLevel >= 50
elseif itemLevel <= 35 then
return self.EnchantingLevel >= 75
elseif itemLevel <= 40 then
return self.EnchantingLevel >= 100
elseif itemLevel <= 45 then
return self.EnchantingLevel >= 125
elseif itemLevel <= 50 then
return self.EnchantingLevel >= 150
elseif itemLevel <= 55 then
return self.EnchantingLevel >= 175
elseif itemLevel <= 60 then
return self.EnchantingLevel >= 200
elseif itemLevel <= 97 then
return self.EnchantingLevel >= 225
elseif itemLevel <= 115 then
return self.EnchantingLevel >= 275
elseif itemLevel <= 200 then
return self.EnchantingLevel >= 325
elseif itemLevel <= 346 then
return self.EnchantingLevel >= 450
elseif itemLevel <= 424 then
return self.EnchantingLevel >= 525
elseif itemLevel <= 463 then
return self.EnchantingLevel >= 550
else
return self.EnchantingLevel >= 550
end
elseif itemRarity == RARITY_EPIC then
if itemLevel <= 95 then
return self.EnchantingLevel >= 225
elseif itemLevel <= 164 then
return self.EnchantingLevel >= 300
elseif itemLevel <= 277 then
return self.EnchantingLevel >= 375
elseif itemLevel <= 416 then
return self.EnchantingLevel >= 475
elseif itemLevel <= 575 then
return self.EnchantingLevel >= 575
else
return self.EnchantingLevel >= 575
end
else
return false
end
return true
end
end

View File

@ -1,11 +1,12 @@
## Interface: 40000
## Interface: 70100
## 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@)
## SavedVariables: BreakablesDB
## OptionalDeps: Ace3, LibBabble-Inventory-3.0, ButtonFacade
## OptionalDeps: Ace3, LibBabble-Inventory-3.0, Masque
## X-Compatible-With: 60200
#@no-lib-strip@
embeds.xml
@ -14,4 +15,4 @@ embeds.xml
LibDataBroker-1.1.lua
loc\loc.xml
Breakables.lua
Breakables.lua

133
changelog.txt Normal file
View File

@ -0,0 +1,133 @@
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)

View File

@ -10,5 +10,4 @@
<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"/>
<Include file="libs\LibButtonFacade\LibButtonFacade.xml"/>
</Ui>

20
readme.md Normal file
View File

@ -0,0 +1,20 @@
### **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.
* 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.