Compare commits

...

10 Commits
1.3 ... 1.3.6

Author SHA1 Message Date
302478f872 - Added X-Compatible-With 40300. 2012-08-27 19:06:10 +00:00
a1263947f0 - Updated TOC for 5.0. 2012-08-27 17:52:08 +00:00
1e45bfe622 - 4.3 toc update 2011-11-29 19:39:09 +00:00
26d83c425b - 4.2 toc update 2011-06-28 15:08:37 +00:00
8e6867ed44 - toc update 2011-04-27 00:49:05 +00:00
a9f1b24563 - drycoded fix to ticket #10: look through the first 5 lines of the tooltip to find "millable" or "prospectable" instead of requiring it to be on line 2 2011-01-31 21:13:56 +00:00
a20c5fe54f - moved LibButtonFacade's Group:Skin call from :OnInitialize() to :OnEnable(). apparently OnInitialize is too soon and causes the custom skin to get overwritten. (ticket #9) 2011-01-03 05:47:44 +00:00
e22f4ef334 - added tracking for rogue junkboxes (obtained via 'pick pocket'). clicking the junkbox will automatically unlock it
- shortened the delay for processing items after a BAG_UPDATE to 1 second (from 1.5)
- fixed herbs, ore, and disenchanting to update breakable item counts immediately upon the next BAG_UPDATE instead of throttling
2011-01-02 07:07:52 +00:00
c20dabea47 - properly parented the Breakables frame to UIParent so that it will go away when the user presses alt-z (thanks slayman). note that this change makes the Breakables frame use the UI Scale specified in video settings so it may initially not be in the same location you last set it to and could be a different size. 2010-12-15 04:19:56 +00:00
fa59e6137d - fixed a bug where the tooltip could be completely wrong or empty sometimes 2010-12-14 06:22:16 +00:00
2 changed files with 161 additions and 42 deletions

View File

@ -18,6 +18,18 @@ local DisenchantId = 13262
local DisenchantTypes = {babbleInv["Armor"], babbleInv["Weapon"]}
local CanDisenchant = false
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
}
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_HEIRLOOM = 7
@ -37,20 +49,21 @@ local IDX_NAME = 11
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 +81,7 @@ function Breakables:OnInitialize()
hide = false,
hideInCombat = false,
buttonScale = 1,
fontSize = 7,
fontSize = 11,
growDirection = 2,
}
}
@ -91,18 +104,6 @@ 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)
@ -140,13 +141,26 @@ function Breakables:OnEnable()
CanMill = IsUsableSpell(GetSpellInfo(MillingId))
CanProspect = IsUsableSpell(GetSpellInfo(ProspectingId))
CanDisenchant = IsUsableSpell(GetSpellInfo(DisenchantId))
CanPickLock = IsUsableSpell(GetSpellInfo(PickLockId))
LibStub("AceConfig-3.0"):RegisterOptionsTable("Breakables", self:GetOptions(), "breakables")
self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("Breakables")
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
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
@ -156,6 +170,9 @@ function Breakables:OnEnable()
if CanDisenchant then
numEligibleProfessions = numEligibleProfessions + 1
end
if CanPickLock then
numEligibleProfessions = numEligibleProfessions + 1
end
self:CreateButtonFrame()
if self.settings.hide then
@ -199,6 +216,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()
@ -255,6 +276,10 @@ function Breakables:OnTradeSkillUpdate()
self:GetEnchantingLevel()
end
function Breakables:OnBagItemLockPicked()
nextCheck[1] = GetTime() + BagUpdateCheckDelay
end
function Breakables:GetEnchantingLevel()
local skillName, skillType, numAvailable, isExpanded = GetTradeSkillInfo(1)
@ -443,8 +468,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 +488,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")
@ -512,23 +540,21 @@ function Breakables:CreateButtonFrame()
end
function Breakables:GetSpellIdFromProfessionButton(btn)
return (btn.type == BREAKABLE_HERB and MillingId) or (btn.type == BREAKABLE_ORE and ProspectingId) or DisenchantId
return (btn.type == BREAKABLE_HERB and MillingId)
or (btn.type == BREAKABLE_ORE and ProspectingId)
or (btn.type == 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
@ -604,7 +630,9 @@ function Breakables:FindBreakables(bag)
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 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 +646,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,27 +684,51 @@ 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((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
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, foundBreakables[i]) end
btn.OnEnterFunc = function(this) self:OnEnterBreakableButton(this) end
end
if not btn.OnLeaveFunc then
btn.OnLeaveFunc = function() self:OnLeaveBreakableButton(foundBreakables[i]) end
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
@ -718,19 +770,25 @@ function Breakables:OnLeaveProfessionButton()
GameTooltip:Hide()
end
function Breakables:OnEnterBreakableButton(this, breakable)
function Breakables:OnEnterBreakableButton(this)
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
GameTooltip:SetBagItem(breakable[IDX_BAG], breakable[IDX_SLOT])
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(breakable)
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
@ -789,20 +847,80 @@ function Breakables:FindBreakablesInSlot(bagId, slotId)
end
end
local extraInfo = BreakablesTooltipTextLeft2:GetText()
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 CanMill and (itemSubType == MillingItemSubType or itemSubType == MillingItemSecondarySubType) and extraInfo == ITEM_MILLABLE then
if CanMill and (itemSubType == MillingItemSubType or itemSubType == MillingItemSecondarySubType) and millable then
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_HERB, false, itemName}
end
if CanProspect and itemSubType == ProspectingItemSubType and extraInfo == ITEM_PROSPECTABLE then
if CanProspect and itemSubType == ProspectingItemSubType and prospectable then
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_ORE, false, itemName}
end
if CanPickLock and self:ItemIsPickable(self:GetItemIdFromLink(itemLink)) and self:ItemIsLocked(bagId, slotId) then
return {itemLink, itemCount, itemType, itemTexture, bagId, slotId, itemSubType, itemLevel, BREAKABLE_PICK, false, itemName}
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)

View File

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