Compare commits

...

31 Commits

Author SHA1 Message Date
7f53ef3d90 Update changelog 2021-04-09 20:55:50 -05:00
4dce99e2ab Add option to suppress tooltips by request 2021-04-09 20:53:27 -05:00
92a4758371 Update Classic TOC 2021-03-23 12:14:55 -05:00
e01b0cdd78 Update Classic TOC 2021-03-23 12:14:05 -05:00
e764d54642 Update TOC to 9.0.5 2021-03-22 21:47:08 -05:00
6ab9d09140 Update changelog 2020-11-29 11:50:15 -06:00
5a760da5ac Update TOC to latest 2020-11-29 11:49:14 -06:00
592621cf4e Enable nolib creation 2020-10-23 15:32:15 -05:00
82a97f4e05 Tweak toc for community packager 2020-10-23 15:31:08 -05:00
3273a5d7ce Add github workflow for packaging with the community packager 2020-10-13 09:16:50 -05:00
433a1f4660 Setup compatibility with the community packager 2020-10-13 09:04:41 -05:00
67c8c85978 Version bump for 9.0 2020-10-09 09:37:36 -05:00
806666937f Add Shadowlands herbs, ores, and lockboxes 2020-10-09 09:21:59 -05:00
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
7 changed files with 292 additions and 74 deletions

45
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,45 @@
# 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 }}
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@v1
# once cloned, we just run the GitHub Action for the packager project
- name: Package and release
uses: BigWigsMods/packager@master
# 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@master
with:
args: -g 1.13.6 -w 0

View File

@ -39,3 +39,5 @@ ignore:
- readme.md
manual-changelog: changelog.txt
enable-nolib-creation: yes

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"]
@ -27,6 +30,22 @@ local AdditionalMillableItems = {
124106,
128304,
151565,
-- BfA herbs
152505,
152506,
152507,
152508,
152509,
152510,
152511,
168487,
-- Shadowlands herbs
168586, -- rising glory
168589, -- marrowroot
170554, -- vigil's torch
168583, -- widowbloom
169701, -- death blossom
171315, -- nightshade
}
local AdditionalProspectableItems = {
@ -34,6 +53,18 @@ local AdditionalProspectableItems = {
123918,
123919,
151564,
-- BfA ore
152512,
152513,
152579,
168185,
-- Shadowlands ore
171828, -- laestrite
171833, -- elethium
171829, -- solenium
171830, -- oxxein
171831, -- phaedrum
171832, -- sinvyr
}
local MassMilling = {
@ -53,6 +84,13 @@ local MassMilling = {
[124106] = 209664,
[128304] = 210116,
[151565] = 247861,
-- shadowlands
[168586] = 311417,
[168589] = 311416,
[170554] = 311414,
[168583] = 311415,
[169701] = 311413,
[171315] = 311418,
}
local HerbCombineItems = {
@ -70,6 +108,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 = {
@ -95,6 +140,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
@ -122,6 +171,13 @@ local PickableItems = {
68729, -- elementium lockbox
88567, -- ghost iron lockbox
116920, -- true steel lockbox
121331, -- leystone lockbox
169475, -- barnacled lockbox
-- shadowlands
179311, -- venthyr
180532, -- maldraxxi
180533, -- kyrian
180522, -- night fae
}
local CanPickLock = false
@ -185,6 +241,8 @@ function Breakables:OnInitialize()
fontSize = 11,
growDirection = 2,
ignoreList = {},
showTooltipForBreakables = true,
showTooltipForProfession = true,
}
}
self.db = LibStub("AceDB-3.0"):New("BreakablesDB", self.defaults, true)
@ -317,7 +375,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
@ -389,7 +447,7 @@ function Breakables:OnTradeSkillUpdate()
end
function Breakables:OnBagItemLockPicked()
nextCheck[1] = GetTime() + BagUpdateCheckDelay
self:FindBreakables()
end
function Breakables:FindLevelOfProfessionIndex(idx)
@ -400,15 +458,17 @@ 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
@ -569,6 +629,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"],
@ -622,41 +712,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
@ -985,7 +1079,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)
@ -1000,20 +1094,24 @@ 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)
@ -1052,7 +1150,8 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bagId, slotId)
if texture then
local itemLink = GetContainerItemLink(bagId, slotId)
if self.settings.ignoreList[self:GetItemIdFromLink(itemLink)] then
local itemId = self:GetItemIdFromLink(itemLink)
if self.settings.ignoreList[itemId] then
return nil
end
@ -1061,7 +1160,7 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
self.myTooltip:SetBagItem(bagId, slotId)
if CanDisenchant and itemRarity and itemRarity >= RARITY_UNCOMMON and itemRarity < RARITY_HEIRLOOM
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink) then
and self:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId) then
local i = 1
local soulbound = false
for i=1,15 do
@ -1076,7 +1175,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
@ -1109,7 +1208,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
@ -1211,13 +1309,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
@ -1231,10 +1342,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]
@ -1262,9 +1371,14 @@ function Breakables:SortBreakables(foundBreakables)
end
end
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink)
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId)
for i=1,#DisenchantTypes do
if DisenchantTypes[i] == itemType or IsArtifactRelicItem(itemLink) then
-- temp hack for bfa until disenchant item level scales are identified. 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)
@ -1360,5 +1474,11 @@ function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, i
end
end
for i=1,#AdditionalDisenchantableItems do
if AdditionalDisenchantableItems[i] == itemId then
return true
end
end
return false
end

View File

@ -1,12 +1,23 @@
## Interface: 70300
#@retail@
## Interface: 90005
#@end-retail@
#@non-retail@
# ## Interface: 11306
#@end-non-retail@
## 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: 70200
## X-Curse-Project-ID: 16629
## X-WoWI-ID: 17929
#@no-lib-strip@
embeds.xml

View File

@ -1,3 +1,42 @@
v1.7.3:
- Add option to suppress tooltips by request
- Updated Classic TOC to 1.13.6
v1.7.2:
- Updated TOC for 9.0.5
v1.7.1:
- Updated TOC to latest
v1.7.0:
- Added Shadowlands herbs, ore, and lockboxes
- Updated TOC for 9.0
v1.6.4:
- Updated TOC for 8.3
v1.6.3:
- (Classic) Made all items display as disenchantable whether you have the skill for it or not. I have not yet found the correct way to access the player's Enchanting profession level to check against item level for disenchant validity.
v1.6.2:
- Added 8.2's lockboxes
v1.6.1:
- Added patch 8.2's new herb and ore
v1.6:
- Updated TOC for 8.2
v1.5.1:
- Updated TOC for 8.1
- Added Highmountain Armor as a disenchantable item
v1.5:
- Updated TOC for 8.0
- Added BfA herbs and ore
- Fixed separate items sometimes showing up as one breakable
- Added Leystone Lockbox
v1.4.9.1:
- Added 7.3 herbs and ore

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>

View File

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