|
|
|
@ -1,12 +1,61 @@
|
|
|
|
|
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("Masque", true)
|
|
|
|
|
|
|
|
|
|
local lbfGroup
|
|
|
|
|
|
|
|
|
|
local MillingId = 51005
|
|
|
|
|
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
|
|
|
|
@ -14,9 +63,43 @@ 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
|
|
|
|
|
local IDX_COUNT = 2
|
|
|
|
@ -28,22 +111,27 @@ local IDX_SUBTYPE = 7
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
-- can be 1 or 2
|
|
|
|
|
local validGrowDirections = {L["Left"], L["Right"], L["Up"], L["Down"]}
|
|
|
|
|
|
|
|
|
|
-- can be 1, 2, or 3 (in the case of a rogue with pick lock)
|
|
|
|
|
local numEligibleProfessions = 0
|
|
|
|
|
|
|
|
|
|
Breakables.optionsFrame = {}
|
|
|
|
@ -61,7 +149,8 @@ function Breakables:OnInitialize()
|
|
|
|
|
hide = false,
|
|
|
|
|
hideInCombat = false,
|
|
|
|
|
buttonScale = 1,
|
|
|
|
|
fontSize = 7,
|
|
|
|
|
fontSize = 11,
|
|
|
|
|
growDirection = 2,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
self.db = LibStub("AceDB-3.0"):New("BreakablesDB", self.defaults, true)
|
|
|
|
@ -85,6 +174,15 @@ function Breakables:OnInitialize()
|
|
|
|
|
self:InitLDB()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:ButtonFacadeCallback(Group, SkinID, Gloss, Backdrop, Colors, Disabled)
|
|
|
|
|
if not Group then
|
|
|
|
|
self.settings.SkinID = SkinID
|
|
|
|
|
self.settings.Gloss = Gloss
|
|
|
|
|
self.settings.Backdrop = Backdrop
|
|
|
|
|
self.settings.Colors = Colors
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:InitLDB()
|
|
|
|
|
local LDB = LibStub and LibStub("LibDataBroker-1.1", true)
|
|
|
|
|
|
|
|
|
@ -111,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
|
|
|
|
@ -126,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()
|
|
|
|
@ -134,7 +248,10 @@ function Breakables:OnEnable()
|
|
|
|
|
else
|
|
|
|
|
self:FindBreakables()
|
|
|
|
|
end
|
|
|
|
|
self.frame:SetScript("OnUpdate", function() self:CheckShouldFindBreakables() end)
|
|
|
|
|
if not self.frame.OnUpdateFunc then
|
|
|
|
|
self.frame.OnUpdateFunc = function() self:CheckShouldFindBreakables() end
|
|
|
|
|
end
|
|
|
|
|
self.frame:SetScript("OnUpdate", self.frame.OnUpdateFunc)
|
|
|
|
|
else
|
|
|
|
|
self:UnregisterAllEvents()
|
|
|
|
|
end
|
|
|
|
@ -167,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()
|
|
|
|
@ -182,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
|
|
|
|
@ -221,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
|
|
|
|
|
|
|
|
|
@ -351,6 +490,20 @@ function Breakables:GetOptions()
|
|
|
|
|
end,
|
|
|
|
|
order = 6,
|
|
|
|
|
},
|
|
|
|
|
growDirection = {
|
|
|
|
|
type = 'select',
|
|
|
|
|
name = L["Button grow direction"],
|
|
|
|
|
desc = L["This controls which direction the breakable buttons grow toward."],
|
|
|
|
|
values = validGrowDirections,
|
|
|
|
|
get = function()
|
|
|
|
|
return self.settings.growDirection
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
self.settings.growDirection = v
|
|
|
|
|
self:FindBreakables()
|
|
|
|
|
end,
|
|
|
|
|
order = 7,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -390,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
|
|
|
|
@ -397,69 +566,99 @@ 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
|
|
|
|
|
|
|
|
|
|
for i=1,numEligibleProfessions do
|
|
|
|
|
if not self.buttonFrame[i] then
|
|
|
|
|
self.buttonFrame[i] = CreateFrame("Button", "BreakablesButtonFrame1", self.frame, "SecureActionButtonTemplate")
|
|
|
|
|
self.buttonFrame[i] = CreateFrame("Button", "BREAKABLES_BUTTON_FRAME"..i, self.frame, "SecureActionButtonTemplate")
|
|
|
|
|
end
|
|
|
|
|
self.buttonFrame[i]:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.settings.buttonFrameLeft[i], self.settings.buttonFrameTop[i])
|
|
|
|
|
local frame = self.buttonFrame[i]
|
|
|
|
|
frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.settings.buttonFrameLeft[i], self.settings.buttonFrameTop[i])
|
|
|
|
|
|
|
|
|
|
if CanMill and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_HERB) then
|
|
|
|
|
self.buttonFrame[i].type = BREAKABLE_HERB
|
|
|
|
|
frame.type = BREAKABLE_HERB
|
|
|
|
|
elseif CanDisenchant and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_DE) then
|
|
|
|
|
self.buttonFrame[i].type = BREAKABLE_DE
|
|
|
|
|
frame.type = BREAKABLE_DE
|
|
|
|
|
elseif CanProspect and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_ORE) then
|
|
|
|
|
self.buttonFrame[i].type = BREAKABLE_ORE
|
|
|
|
|
frame.type = BREAKABLE_ORE
|
|
|
|
|
elseif CanPickLock and (i == 1 or self.buttonFrame[1].type ~= BREAKABLE_PICK) then
|
|
|
|
|
frame.type = BREAKABLE_PICK
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not self.buttonFrame[i].icon then
|
|
|
|
|
self.buttonFrame[i].icon = self.buttonFrame[i]:CreateTexture(nil, "BACKGROUND")
|
|
|
|
|
end
|
|
|
|
|
if self.buttonFrame[i].type then
|
|
|
|
|
self.buttonFrame[i]:SetWidth(buttonSize * self.settings.buttonScale)
|
|
|
|
|
self.buttonFrame[i]:SetHeight(buttonSize * self.settings.buttonScale)
|
|
|
|
|
if frame.type then
|
|
|
|
|
frame:SetWidth(buttonSize)
|
|
|
|
|
frame:SetHeight(buttonSize)
|
|
|
|
|
|
|
|
|
|
self.buttonFrame[i]:EnableMouse(true)
|
|
|
|
|
self.buttonFrame[i]:RegisterForClicks("LeftButtonUp")
|
|
|
|
|
frame:EnableMouse(true)
|
|
|
|
|
frame:RegisterForClicks("LeftButtonUp")
|
|
|
|
|
|
|
|
|
|
self.buttonFrame[i]:SetMovable(true)
|
|
|
|
|
self.buttonFrame[i]:RegisterForDrag("LeftButton")
|
|
|
|
|
self.buttonFrame[i]:SetScript("OnMouseDown", function(frame) self:OnMouseDown(frame) end)
|
|
|
|
|
self.buttonFrame[i]:SetScript("OnMouseUp", function(frame) self:OnMouseUp(frame) end)
|
|
|
|
|
self.buttonFrame[i]:SetClampedToScreen(true)
|
|
|
|
|
if not frame.OnMouseDownFunc then
|
|
|
|
|
frame.OnMouseDownFunc = function(frame) self:OnMouseDown(frame) end
|
|
|
|
|
end
|
|
|
|
|
if not frame.OnMouseUpFunc then
|
|
|
|
|
frame.OnMouseUpFunc = function(frame) self:OnMouseUp(frame) end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local spellName, _, texture = GetSpellInfo((self.buttonFrame[i].type == BREAKABLE_HERB and MillingId) or (self.buttonFrame[i].type == BREAKABLE_ORE and ProspectingId) or DisenchantId)
|
|
|
|
|
frame:SetMovable(true)
|
|
|
|
|
frame:RegisterForDrag("LeftButton")
|
|
|
|
|
frame:SetScript("OnMouseDown", frame.OnMouseDownFunc)
|
|
|
|
|
frame:SetScript("OnMouseUp", frame.OnMouseUpFunc)
|
|
|
|
|
frame:SetClampedToScreen(true)
|
|
|
|
|
|
|
|
|
|
self.buttonFrame[i]:SetAttribute("type1", "spell")
|
|
|
|
|
self.buttonFrame[i]:SetAttribute("spell1", spellName)
|
|
|
|
|
local spellName, _, texture = GetSpellInfo(self:GetSpellIdFromProfessionButton(frame.type))
|
|
|
|
|
|
|
|
|
|
self.buttonFrame[i].icon:SetTexture(texture)
|
|
|
|
|
self.buttonFrame[i].icon:SetAllPoints(self.buttonFrame[i])
|
|
|
|
|
else
|
|
|
|
|
self.buttonFrame[i]:SetTexture(nil)
|
|
|
|
|
frame:SetAttribute("type1", "spell")
|
|
|
|
|
frame:SetAttribute("spell1", spellName)
|
|
|
|
|
|
|
|
|
|
if not lbfGroup then
|
|
|
|
|
frame:SetNormalTexture(texture)
|
|
|
|
|
else
|
|
|
|
|
frame.icon = frame:CreateTexture(frame:GetName().."Icon", "BACKGROUND")
|
|
|
|
|
frame.icon:SetTexture(texture)
|
|
|
|
|
|
|
|
|
|
lbfGroup:AddButton(frame)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not frame.OnEnterFunc then
|
|
|
|
|
frame.OnEnterFunc = function(this) self:OnEnterProfessionButton(this) end
|
|
|
|
|
end
|
|
|
|
|
if not frame.OnLeaveFunc then
|
|
|
|
|
frame.OnLeaveFunc = function() self:OnLeaveProfessionButton() end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
frame:SetScript("OnEnter", frame.OnEnterFunc)
|
|
|
|
|
frame:SetScript("OnLeave", frame.OnLeaveFunc)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
@ -534,27 +733,29 @@ 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]
|
|
|
|
|
|
|
|
|
|
local btn = self.breakableButtons[j][numBreakableStacks[j]]
|
|
|
|
|
if not self.breakableButtons[j][numBreakableStacks[j]] then
|
|
|
|
|
self.breakableButtons[j][numBreakableStacks[j]] = CreateFrame("Button", nil, self.buttonFrame[j], "SecureActionButtonTemplate")
|
|
|
|
|
local btn = self.breakableButtons[j][btnIdx]
|
|
|
|
|
if not self.breakableButtons[j][btnIdx] then
|
|
|
|
|
self.breakableButtons[j][btnIdx] = CreateFrame("Button", "BREAKABLES_BUTTON"..j.."-"..btnIdx, self.buttonFrame[j], "SecureActionButtonTemplate")
|
|
|
|
|
|
|
|
|
|
btn = self.breakableButtons[j][numBreakableStacks[j]]
|
|
|
|
|
btn = self.breakableButtons[j][btnIdx]
|
|
|
|
|
|
|
|
|
|
btn:SetPoint("LEFT", numBreakableStacks[j] == 1 and self.buttonFrame[j] or self.breakableButtons[j][numBreakableStacks[j] - 1], "RIGHT")
|
|
|
|
|
btn:SetWidth(buttonSize * self.settings.buttonScale)
|
|
|
|
|
btn:SetHeight(buttonSize * self.settings.buttonScale)
|
|
|
|
|
if lbfGroup then
|
|
|
|
|
btn.icon = btn:CreateTexture(btn:GetName().."Icon", "BACKGROUND")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
btn:SetWidth(buttonSize)
|
|
|
|
|
btn:SetHeight(buttonSize)
|
|
|
|
|
btn:EnableMouse(true)
|
|
|
|
|
btn:RegisterForClicks("AnyUp")
|
|
|
|
|
|
|
|
|
|
btn:SetAttribute("type", "macro")
|
|
|
|
|
|
|
|
|
|
-- btn:SetAttribute("type1", "item")
|
|
|
|
|
-- btn:SetAttribute("bag1", foundBreakables[i][IDX_BAG])
|
|
|
|
|
-- btn:SetAttribute("slot1", foundBreakables[i][IDX_SLOT])
|
|
|
|
|
btn:SetAttribute("type", "spell")
|
|
|
|
|
|
|
|
|
|
if not btn.text then
|
|
|
|
|
btn.text = btn:CreateFontString()
|
|
|
|
@ -562,22 +763,77 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
end
|
|
|
|
|
btn.text:SetFont(NumberFont_Outline_Med:GetFont(), self.settings.fontSize, "OUTLINE")
|
|
|
|
|
|
|
|
|
|
if not btn.icon then
|
|
|
|
|
btn.icon = btn:CreateTexture(nil, "BACKGROUND")
|
|
|
|
|
if lbfGroup then
|
|
|
|
|
lbfGroup:AddButton(btn)
|
|
|
|
|
end
|
|
|
|
|
btn.icon:SetAllPoints(btn)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local attachFrom = "LEFT"
|
|
|
|
|
local attachTo = "RIGHT"
|
|
|
|
|
if self.settings.growDirection then
|
|
|
|
|
if self.settings.growDirection == 1 then -- left
|
|
|
|
|
attachFrom = "RIGHT"
|
|
|
|
|
attachTo = "LEFT"
|
|
|
|
|
--elseif self.settings.growDirection == 2 then -- right
|
|
|
|
|
elseif self.settings.growDirection == 3 then -- up
|
|
|
|
|
attachFrom = "BOTTOM"
|
|
|
|
|
attachTo = "TOP"
|
|
|
|
|
elseif self.settings.growDirection == 4 then -- down
|
|
|
|
|
attachFrom = "TOP"
|
|
|
|
|
attachTo = "BOTTOM"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
btn:ClearAllPoints()
|
|
|
|
|
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)
|
|
|
|
|
btn:SetAttribute("macrotext", "/cast "..BreakableAbilityName.."\n/use "..foundBreakables[i][IDX_BAG].." "..foundBreakables[i][IDX_SLOT].."\n/script Breakables.justClicked=true")
|
|
|
|
|
btn.icon:SetTexture(foundBreakables[i][IDX_TEXTURE])
|
|
|
|
|
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:SetScript("OnEnter", function(this) self:OnEnterBreakableButton(this, foundBreakables[i]) end)
|
|
|
|
|
btn:SetScript("OnLeave", function() self:OnLeaveBreakableButton(foundBreakables[i]) end)
|
|
|
|
|
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
|
|
|
|
|
btn:SetNormalTexture(foundBreakables[i][IDX_TEXTURE])
|
|
|
|
|
end
|
|
|
|
|
btn.bag = foundBreakables[i][IDX_BAG]
|
|
|
|
|
btn.slot = foundBreakables[i][IDX_SLOT]
|
|
|
|
|
|
|
|
|
|
if not btn.OnEnterFunc then
|
|
|
|
|
btn.OnEnterFunc = function(this) self:OnEnterBreakableButton(this) end
|
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
@ -593,7 +849,6 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
if self.breakableButtons[i] and numBreakableStacks[i] < #self.breakableButtons[i] then
|
|
|
|
|
for j=numBreakableStacks[i]+1,#self.breakableButtons[i] do
|
|
|
|
|
self.breakableButtons[i][j]:Hide()
|
|
|
|
|
self.breakableButtons[i][j].icon:SetTexture(nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -607,15 +862,38 @@ function Breakables:FindBreakables(bag)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:OnEnterBreakableButton(this, breakable)
|
|
|
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
|
|
|
|
|
GameTooltip:SetBagItem(breakable[IDX_BAG], breakable[IDX_SLOT])
|
|
|
|
|
function Breakables:OnEnterProfessionButton(btn)
|
|
|
|
|
GameTooltip:SetOwner(btn, "ANCHOR_BOTTOMLEFT")
|
|
|
|
|
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)
|
|
|
|
|
GameTooltip:Show()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:OnLeaveBreakableButton(breakable)
|
|
|
|
|
function Breakables:OnLeaveProfessionButton()
|
|
|
|
|
GameTooltip:Hide()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Breakables:OnEnterBreakableButton(this)
|
|
|
|
|
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:Show()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
@ -646,17 +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 _, _, 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 self:BreakableIsDisenchantable(itemType, itemLevel) then
|
|
|
|
|
if CanDisenchant and itemRarity and itemRarity >= RARITY_UNCOMMON and itemRarity < RARITY_HEIRLOOM
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
@ -664,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}
|
|
|
|
|
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}
|
|
|
|
|
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}
|
|
|
|
|
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)
|
|
|
|
@ -734,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
|
|
|
|
|