mirror of
https://github.com/parnic/breakables.git
synced 2025-06-17 01:41:51 -05:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
7f53ef3d90
|
|||
4dce99e2ab
|
|||
92a4758371
|
|||
e01b0cdd78
|
|||
e764d54642
|
|||
6ab9d09140
|
|||
5a760da5ac
|
|||
592621cf4e
|
|||
82a97f4e05
|
|||
3273a5d7ce
|
|||
433a1f4660
|
|||
67c8c85978
|
|||
806666937f
|
|||
aeaac05586
|
|||
8553efb4a6
|
|||
0c89d98639
|
|||
4d0b368ba6
|
|||
ca215c2382
|
|||
66c35b8277
|
|||
e3d271e0ff
|
|||
7b3cca585f
|
|||
bcc53b8ed0
|
|||
9775e3c30e
|
|||
9595af7979
|
45
.github/workflows/release.yml
vendored
Normal file
45
.github/workflows/release.yml
vendored
Normal 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
|
2
.pkgmeta
2
.pkgmeta
@ -39,3 +39,5 @@ ignore:
|
||||
- readme.md
|
||||
|
||||
manual-changelog: changelog.txt
|
||||
|
||||
enable-nolib-creation: yes
|
||||
|
213
Breakables.lua
213
Breakables.lua
@ -6,6 +6,7 @@ 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"]
|
||||
@ -37,6 +38,14 @@ local AdditionalMillableItems = {
|
||||
152509,
|
||||
152510,
|
||||
152511,
|
||||
168487,
|
||||
-- Shadowlands herbs
|
||||
168586, -- rising glory
|
||||
168589, -- marrowroot
|
||||
170554, -- vigil's torch
|
||||
168583, -- widowbloom
|
||||
169701, -- death blossom
|
||||
171315, -- nightshade
|
||||
}
|
||||
|
||||
local AdditionalProspectableItems = {
|
||||
@ -48,6 +57,14 @@ local AdditionalProspectableItems = {
|
||||
152512,
|
||||
152513,
|
||||
152579,
|
||||
168185,
|
||||
-- Shadowlands ore
|
||||
171828, -- laestrite
|
||||
171833, -- elethium
|
||||
171829, -- solenium
|
||||
171830, -- oxxein
|
||||
171831, -- phaedrum
|
||||
171832, -- sinvyr
|
||||
}
|
||||
|
||||
local MassMilling = {
|
||||
@ -67,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 = {
|
||||
@ -84,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 = {
|
||||
@ -109,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
|
||||
@ -137,6 +172,12 @@ 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
|
||||
}
|
||||
local CanPickLock = false
|
||||
|
||||
@ -200,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)
|
||||
@ -404,7 +447,7 @@ function Breakables:OnTradeSkillUpdate()
|
||||
end
|
||||
|
||||
function Breakables:OnBagItemLockPicked()
|
||||
nextCheck[1] = GetTime() + BagUpdateCheckDelay
|
||||
self:FindBreakables()
|
||||
end
|
||||
|
||||
function Breakables:FindLevelOfProfessionIndex(idx)
|
||||
@ -415,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
|
||||
@ -584,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"],
|
||||
@ -637,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
|
||||
@ -1000,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)
|
||||
|
||||
@ -1015,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)
|
||||
@ -1067,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
|
||||
|
||||
@ -1076,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
|
||||
@ -1091,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
|
||||
@ -1124,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
|
||||
@ -1226,7 +1309,7 @@ do
|
||||
end
|
||||
|
||||
function Breakables:IsInEquipmentSet(itemId)
|
||||
if WowVer < 80000 then
|
||||
if WowVer < 80000 and GetNumEquipmentSets then
|
||||
for setIdx=1, GetNumEquipmentSets() do
|
||||
local set = GetEquipmentSetInfo(setIdx)
|
||||
local itemArray = GetEquipmentSetItemIDs(set)
|
||||
@ -1237,7 +1320,7 @@ function Breakables:IsInEquipmentSet(itemId)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
elseif C_EquipmentSet then
|
||||
local sets = C_EquipmentSet.GetEquipmentSetIDs()
|
||||
for k, v in ipairs(sets) do
|
||||
local itemArray = C_EquipmentSet.GetItemIDs(v)
|
||||
@ -1288,11 +1371,11 @@ function Breakables:SortBreakables(foundBreakables)
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink)
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity, itemLink, itemId)
|
||||
for i=1,#DisenchantTypes do
|
||||
if DisenchantTypes[i] == itemType or IsArtifactRelicItem(itemLink) then
|
||||
-- temp hack for bfa until disenchant item level scales are identified
|
||||
if WowVer >= 80000 then
|
||||
-- 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
|
||||
|
||||
@ -1391,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
|
||||
|
@ -1,12 +1,23 @@
|
||||
## Interface: 80000
|
||||
#@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: 70300
|
||||
## X-Curse-Project-ID: 16629
|
||||
## X-WoWI-ID: 17929
|
||||
|
||||
#@no-lib-strip@
|
||||
embeds.xml
|
||||
|
@ -1,3 +1,36 @@
|
||||
v1.7.3:
|
||||
- Add option to suppress tooltips by request
|
||||
- Updated Classic TOC to 1.13.6
|
||||
|
||||
v1.7.2:
|
||||
- Updated TOC for 9.0.5
|
||||
|
||||
v1.7.1:
|
||||
- Updated TOC to latest
|
||||
|
||||
v1.7.0:
|
||||
- Added Shadowlands herbs, ore, and lockboxes
|
||||
- Updated TOC for 9.0
|
||||
|
||||
v1.6.4:
|
||||
- Updated TOC for 8.3
|
||||
|
||||
v1.6.3:
|
||||
- (Classic) Made all items display as disenchantable whether you have the skill for it or not. I have not yet found the correct way to access the player's Enchanting profession level to check against item level for disenchant validity.
|
||||
|
||||
v1.6.2:
|
||||
- Added 8.2's lockboxes
|
||||
|
||||
v1.6.1:
|
||||
- Added patch 8.2's new herb and ore
|
||||
|
||||
v1.6:
|
||||
- Updated TOC for 8.2
|
||||
|
||||
v1.5.1:
|
||||
- Updated TOC for 8.1
|
||||
- Added Highmountain Armor as a disenchantable item
|
||||
|
||||
v1.5:
|
||||
- Updated TOC for 8.0
|
||||
- Added BfA herbs and ore
|
||||
|
@ -1,4 +1,5 @@
|
||||
<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
|
||||
<!--@non-debug@
|
||||
<Script file="libs\LibStub\LibStub.lua"/>
|
||||
<Script file="libs\CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
|
||||
<Include file="libs\AceAddon-3.0\AceAddon-3.0.xml"/>
|
||||
@ -10,4 +11,5 @@
|
||||
<Include file="libs\AceEvent-3.0\AceEvent-3.0.xml"/>
|
||||
<Include file="libs\AceLocale-3.0\AceLocale-3.0.xml"/>
|
||||
<Include file="libs\LibBabble-Inventory-3.0\lib.xml"/>
|
||||
</Ui>
|
||||
@end-non-debug@-->
|
||||
</Ui>
|
||||
|
@ -14,7 +14,6 @@ Typing */brk* will open the configuration settings (or you can get to it from Bl
|
||||
* **Max number to display**: this controls the highest number of items that you will see next to your profession button. If this is 5 but you have 10 breakable items in your bags, you will only see 5 at a time.
|
||||
* **Show soulbound items**: aimed at enchanters, this controls whether or not you will see items that are soulbound as breakable items or not.
|
||||
|
||||
|
||||
### **Known issues**
|
||||
|
||||
* If you have more than 5 of a breakable item but split into stacks all smaller than 5, the game will say you do not have enough items to break. The default UI now has a built-in button to compress stacks that should solve this issue.
|
||||
* If you know Mass Milling for a specific type of herb, the current alpha will try to use this ability and fail. I am in the process of leveling a scribe up high enough to debug this problem.
|
||||
|
Reference in New Issue
Block a user