Compare commits

...

33 Commits
1.4.4 ... 1.6.4

Author SHA1 Message Date
aeaac05586 Corrected changelog 2020-01-14 20:08:51 -06:00
8553efb4a6 Updated TOC to 8.3 2020-01-14 20:07:35 -06:00
0c89d98639 Fixes for Classic
This causes all items to 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.
2019-09-09 17:10:37 -05:00
4d0b368ba6 Added 8.2's lockbox 2019-08-12 09:17:44 -05:00
ca215c2382 Added patch 8.2's new herb and ore 2019-07-21 10:39:55 -05:00
66c35b8277 Updated TOC to 8.2 2019-06-25 09:56:07 -05:00
e3d271e0ff Immediately update when a lock is picked 2019-06-25 09:55:29 -05:00
7b3cca585f Updated changelog 2019-01-12 17:25:23 -06:00
bcc53b8ed0 Updated TOC to 8.1 2019-01-12 17:24:49 -06:00
9775e3c30e Added Highmountain Armor as a disenchantable item 2019-01-12 17:24:33 -06:00
9595af7979 Fixed bugs in no-lib development mode 2018-07-19 09:57:01 -05:00
5ae7a5efb1 Updated changelog 2018-07-16 23:00:43 -05:00
bd0d8b51f8 Updated TOC for 8.0 2018-07-16 22:54:39 -05:00
0dbf1d7705 Updated for 8.0 API changes
The equipment manager has been converted to C code, so its functionality (and index basis) changed.
The ilvl squish made the "can this be disenchanted?" function completely wrong and I don't even know if there's an enchanting level restriction anymore, so for now if you're on 8.0 the ilvl check is just bypassed. This is probably going to need refining because it currently, for example, shows legendary items as disenchantable even though the game doesn't allow them to be disenchanted. I'm unsure if it works the same way on Live currently or not.
2018-07-08 11:58:54 -05:00
a94cba6c34 Added BfA herbs and ore 2018-07-07 22:54:57 -05:00
d000f77a53 Updated changelog 2018-06-11 23:15:41 -05:00
3c50d6fab5 Added Leystone Lockbox 2018-06-11 23:13:22 -05:00
b4416d6daa Fixed separate items sometimes showing up as one breakable
Items can have the same item ID but different rarities/levels, so now we compare the full item link instead of just the ID for determining duplicates. This allows herbs and ore and such to retain its old merging/stacking behavior within Breakables and fixes multiple items with different iLevels, for example, showing up as a single item.
2018-06-11 23:08:42 -05:00
e904b2c12f Updated changelog 2017-09-07 06:43:26 -05:00
5c44d9ae23 Added 7.3 herbs and ore 2017-09-07 06:43:10 -05:00
d73336f725 Updated TOC for 7.3 2017-08-31 16:16:52 -05:00
3897e6378d Updated TOC to 7.2 2017-03-28 14:28:18 -05:00
5e0cafd2c3 Fixed reported error 2017-03-09 09:07:08 -06:00
33e8bfd9b8 Update mailmap 2017-02-02 16:41:40 -06:00
fee9785107 Updated changelog 2016-11-26 01:08:39 -06:00
a339435212 Disabled Mass Milling
Didn't mean to commit this local testing change. Mass Milling can't be easily automated right now since it's a profession skill.
2016-11-25 23:34:52 -06:00
5e4bd58d92 Set default value for ignoreList array 2016-11-25 19:21:16 -06:00
129875fa02 Hide ignore list from options if not ignoring anything 2016-11-23 11:21:10 -06:00
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
5 changed files with 245 additions and 66 deletions

View File

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

View File

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

View File

@ -1,4 +1,4 @@
## Interface: 70000
## Interface: 80300
## Author: Parnic
## Name: Breakables
## Title: Breakables |cff7fff7f-Ace3-|r
@ -6,7 +6,7 @@
## Version: @project-version@ (Revision: @project-revision@)
## SavedVariables: BreakablesDB
## OptionalDeps: Ace3, LibBabble-Inventory-3.0, Masque
## X-Compatible-With: 60200
## X-Compatible-With: 80200
#@no-lib-strip@
embeds.xml

View File

@ -1,3 +1,49 @@
v1.6.4:
- Updated TOC for 8.3
v1.6.3:
- (Classic) Made all items display as disenchantable whether you have the skill for it or not. I have not yet found the correct way to access the player's Enchanting profession level to check against item level for disenchant validity.
v1.6.2:
- Added 8.2's lockboxes
v1.6.1:
- Added patch 8.2's new herb and ore
v1.6:
- Updated TOC for 8.2
v1.5.1:
- Updated TOC for 8.1
- Added Highmountain Armor as a disenchantable item
v1.5:
- Updated TOC for 8.0
- Added BfA herbs and ore
- Fixed separate items sometimes showing up as one breakable
- Added Leystone Lockbox
v1.4.9.1:
- Added 7.3 herbs and ore
v1.4.9:
- Updated TOC for 7.3
v1.4.8:
- Fixed error in ignored items when the ignored item had not been loaded by the server since the last restart.
- Updated TOC for 7.2
v1.4.7:
- Fixed up milling herbs that the player knows Mass Milling for. Since Mass Mill is a profession ability and not a player ability/"spell", the addon can't currently automatically cast Mass Milling.
v1.4.6:
- Added MoP Sparkling Shard as a combinable object.
- Added support for registering artifact relics as disenchantable.
- Added an ignore feature so certain items can be set to never show up as breakable.
v1.4.5:
- Updated TOC for 7.1
v1.4.4:
- Cap the disenchantable item rarity for Legion items at Epic (so we don't show the player's artifact weapon as disenchantable).
- Automatically update the tooltip when the breakable list is updated while the player is hovering over a breakable item button.

View File

@ -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>