mirror of
https://github.com/parnic/breakables.git
synced 2025-06-17 01:41:51 -05:00
Compare commits
41 Commits
Author | SHA1 | Date | |
---|---|---|---|
80bf120abf | |||
d902f864db | |||
9a4c7ddf82 | |||
8bd14cd525 | |||
b086d499b8 | |||
66b0de8074 | |||
62a949cd10 | |||
8f50b7f75f | |||
3f0637641a | |||
6d5d518a8b | |||
d2895bed6a | |||
d2154a350a | |||
a41810c663 | |||
da5e9500f8 | |||
53704888fa | |||
db1819c49f | |||
fb83c4db4a | |||
33e52dc2f6 | |||
74e54e9537 | |||
abea50f496 | |||
2a8bbfcda6 | |||
b970542bfe | |||
8edeeed9e1 | |||
7c19e414e7 | |||
4e65efadff | |||
fea232d8ae | |||
993b99e7be | |||
0442d560d5 | |||
e5968d9441 | |||
814e0ca54f | |||
610f1559fe | |||
140502e508 | |||
302478f872 | |||
a1263947f0 | |||
1e45bfe622 | |||
26d83c425b | |||
8e6867ed44 | |||
a9f1b24563 | |||
a20c5fe54f | |||
e22f4ef334 | |||
c20dabea47 |
3
.mailmap
Normal file
3
.mailmap
Normal 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>
|
1
.pkgmeta
1
.pkgmeta
@ -34,4 +34,3 @@ 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
|
||||
|
459
Breakables.lua
459
Breakables.lua
@ -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,6 +10,52 @@ 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 UnProspectableItems = {
|
||||
109119, -- WoD True Iron Ore
|
||||
}
|
||||
|
||||
local ProspectingId = 31252
|
||||
local ProspectingItemSubType = babbleInv["Metal & Stone"]
|
||||
local CanProspect = false
|
||||
@ -17,9 +63,42 @@ local CanProspect = false
|
||||
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,24 +112,26 @@ 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 BagUpdateCheckDelay = 1.5
|
||||
local BagUpdateCheckDelay = 1.0
|
||||
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
|
||||
|
||||
Breakables.optionsFrame = {}
|
||||
@ -68,7 +149,7 @@ function Breakables:OnInitialize()
|
||||
hide = false,
|
||||
hideInCombat = false,
|
||||
buttonScale = 1,
|
||||
fontSize = 7,
|
||||
fontSize = 11,
|
||||
growDirection = 2,
|
||||
}
|
||||
}
|
||||
@ -91,21 +172,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 +209,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 +236,10 @@ function Breakables:OnEnable()
|
||||
end
|
||||
if CanDisenchant then
|
||||
numEligibleProfessions = numEligibleProfessions + 1
|
||||
self:GetEnchantingLevel()
|
||||
end
|
||||
if CanPickLock then
|
||||
numEligibleProfessions = numEligibleProfessions + 1
|
||||
end
|
||||
|
||||
self:CreateButtonFrame()
|
||||
@ -199,6 +284,10 @@ function Breakables:RegisterEvents()
|
||||
if CanDisenchant then
|
||||
self:RegisterEvent("TRADE_SKILL_UPDATE", "OnTradeSkillUpdate")
|
||||
end
|
||||
|
||||
if CanPickLock then
|
||||
self:RegisterEvent("CHAT_MSG_OPENING", "OnBagItemLockPicked")
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:OnDisable()
|
||||
@ -214,6 +303,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,14 +343,31 @@ 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
|
||||
|
||||
@ -436,6 +543,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 +566,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 +586,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 +610,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 +637,28 @@ 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 IsSpellKnown(MassMilling[itemId]) then
|
||||
return MassMilling[itemId]
|
||||
end
|
||||
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
|
||||
@ -603,8 +733,10 @@ function Breakables:FindBreakables(bag)
|
||||
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
|
||||
local isDisenchantable = self:BreakableIsDisenchantable(foundBreakables[i][IDX_TYPE], foundBreakables[i][IDX_LEVEL], foundBreakables[i][IDX_RARITY])
|
||||
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,8 +750,8 @@ 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")
|
||||
|
||||
@ -656,12 +788,31 @@ 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
|
||||
appendText = " ("..(floor(foundBreakables[i][IDX_COUNT]/5))..")"
|
||||
end
|
||||
|
||||
btn.text:SetText(foundBreakables[i][IDX_COUNT] .. appendText)
|
||||
end
|
||||
|
||||
local BreakableAbilityName = GetSpellInfo((foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_HERB and MillingId) or (foundBreakables[i][IDX_BREAKABLETYPE] == BREAKABLE_ORE and ProspectingId) or DisenchantId)
|
||||
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)
|
||||
btn:SetAttribute("spell", BreakableAbilityName)
|
||||
btn:SetAttribute("target-item", foundBreakables[i][IDX_NAME])
|
||||
|
||||
if isLockedItem then
|
||||
btn:SetAttribute("target-item")
|
||||
btn:SetAttribute("target-bag", foundBreakables[i][IDX_BAG])
|
||||
btn:SetAttribute("target-slot", foundBreakables[i][IDX_SLOT])
|
||||
else
|
||||
btn:SetAttribute("target-item", foundBreakables[i][IDX_NAME])
|
||||
btn:SetAttribute("target-bag")
|
||||
btn:SetAttribute("target-slot")
|
||||
end
|
||||
|
||||
if lbfGroup then
|
||||
btn.icon:SetTexture(foundBreakables[i][IDX_TEXTURE])
|
||||
else
|
||||
@ -676,9 +827,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
|
||||
@ -709,7 +864,7 @@ end
|
||||
|
||||
function Breakables:OnEnterProfessionButton(btn)
|
||||
GameTooltip:SetOwner(btn, "ANCHOR_BOTTOMLEFT")
|
||||
GameTooltip:SetSpellByID(self:GetSpellIdFromProfessionButton(btn))
|
||||
GameTooltip:SetSpellByID(self:GetSpellIdFromProfessionButton(btn.type))
|
||||
|
||||
GameTooltip:AddLine(" ")
|
||||
GameTooltip:AddLine(L["Hold shift and left-click to drag the Breakables bar around."], 1, 1, 1, 1)
|
||||
@ -733,6 +888,12 @@ function Breakables:OnLeaveBreakableButton()
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
|
||||
function Breakables:PostClickedBreakableButton(this)
|
||||
if this.type == BREAKABLE_HERB or this.type == BREAKABLE_ORE or this.type == BREAKABLE_DE then
|
||||
self.justClicked = true
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:FindBreakablesInBag(bagId)
|
||||
local foundBreakables = {}
|
||||
local i=1
|
||||
@ -763,18 +924,21 @@ 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)
|
||||
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) 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 +946,122 @@ 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 == ""
|
||||
|
||||
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)]] and millable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_HERB, false, itemName, itemRarity}
|
||||
end
|
||||
|
||||
if CanProspect --[[and itemSubType == ProspectingItemSubType]] and prospectable then
|
||||
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_ORE, false, itemName, itemRarity}
|
||||
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)
|
||||
@ -852,11 +1109,93 @@ function Breakables:SortBreakables(foundBreakables)
|
||||
end
|
||||
end
|
||||
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel)
|
||||
function Breakables:BreakableIsDisenchantable(itemType, itemLevel, itemRarity)
|
||||
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
|
||||
-- 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
|
||||
|
@ -1,11 +1,12 @@
|
||||
## Interface: 40000
|
||||
## Interface: 70000
|
||||
## 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
|
||||
|
@ -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>
|
Reference in New Issue
Block a user