mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-28 02:16:02 +00:00
autovendor: all paths through C_MerchantFrame
Two-part collapse: Button-click sell path: was a 0.1s-per-item manual iteration via UseContainerItem (with processed[] tracking + a merchant-state flag + OnShow/OnUpdate/OnHide handler trio). Now calls SellJunkAndReport which fires C_MerchantFrame.SellAllJunkItems and a 0.3s deferred GetMoney delta reporter. Engine handles per-frame sell pacing. Button enable/disable check: HasGreyItems() iterated bags 0..4 with C_Item.GetItemQuality manually. Replaced with C_MerchantFrame.GetNumJunkItems() > 0 (the engine's canonical answer to the same question). The button's Update only runs from MERCHANT_SHOW / MERCHANT_UPDATE handlers so the "merchant must be open" gate on GetNumJunkItems is always satisfied. Side effect: the MERCHANT_SHOW auto-sell path NOW reports income to chat. Previously only the manual button reported it. Deleted: HasGreyItems, processed/count/gold state, GetNextGreyItem, autovendor.merchant flag, OnShow/OnUpdate/OnHide handlers, the MERCHANT_CLOSED branch. 170 → 104 lines.
This commit is contained in:
+25
-92
@@ -1,7 +1,6 @@
|
||||
pfUI:RegisterModule("autovendor", "vanilla:tbc", function ()
|
||||
local rawborder, border = GetBorderSize()
|
||||
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
|
||||
local processed = {}
|
||||
|
||||
local function RepairItems()
|
||||
local cost, possible = GetRepairAllCost()
|
||||
@@ -11,98 +10,39 @@ pfUI:RegisterModule("autovendor", "vanilla:tbc", function ()
|
||||
end
|
||||
end
|
||||
|
||||
local function HasGreyItems()
|
||||
for bag = 0, 4 do
|
||||
for slot = 1, GetContainerNumSlots(bag) do
|
||||
local quality = C_Item.GetItemQuality(ItemLocation:CreateFromBagAndSlot(bag,slot))
|
||||
if quality and quality == LE_ITEM_QUALITY_POOR then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Trigger the engine's sell-all-junk path and report the gold income to
|
||||
-- chat. C_MerchantFrame.SellAllJunkItems handles its own one-per-frame
|
||||
-- pacing to avoid CMSG_SELL_ITEM flooding, so we just wait a beat before
|
||||
-- sampling the final gold delta.
|
||||
local function SellJunkAndReport()
|
||||
if C_MerchantFrame.GetNumJunkItems() <= 0 then return end
|
||||
local startGold = GetMoney()
|
||||
C_MerchantFrame.SellAllJunkItems()
|
||||
|
||||
local function GetNextGreyItem()
|
||||
for bag = 0, 4 do
|
||||
for slot = 1, GetContainerNumSlots(bag) do
|
||||
local quality = C_Item.GetItemQuality(ItemLocation:CreateFromBagAndSlot(bag,slot))
|
||||
if quality and quality == LE_ITEM_QUALITY_POOR and not processed[bag.."x"..slot] then
|
||||
processed[bag.."x"..slot] = true
|
||||
return bag, slot
|
||||
end
|
||||
local reporter = CreateFrame("Frame")
|
||||
reporter.deadline = GetTime() + 0.3
|
||||
reporter:SetScript("OnUpdate", function()
|
||||
if GetTime() < this.deadline then return end
|
||||
this:SetScript("OnUpdate", nil)
|
||||
this:Hide()
|
||||
local income = GetMoney() - startGold
|
||||
if income > 0 then
|
||||
DEFAULT_CHAT_FRAME:AddMessage(T["Your vendor trash has been sold and you earned"] .. " " .. CreateGoldString(income))
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local autovendor = CreateFrame("Frame", "pfMoneyUpdate", nil)
|
||||
autovendor:Hide()
|
||||
|
||||
autovendor:SetScript("OnShow", function()
|
||||
processed = {}
|
||||
this.count = 0
|
||||
this.gold = GetMoney()
|
||||
end)
|
||||
|
||||
autovendor:SetScript("OnUpdate", function()
|
||||
-- throttle to to one item per .1 second
|
||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .1 end
|
||||
|
||||
-- scan for the next grey item
|
||||
local bag, slot = GetNextGreyItem()
|
||||
if not bag or not slot then
|
||||
this:Hide()
|
||||
return
|
||||
end
|
||||
|
||||
-- double check to only sell grey
|
||||
local quality = C_Item.GetItemQuality(ItemLocation:CreateFromBagAndSlot(bag,slot))
|
||||
if quality ~= LE_ITEM_QUALITY_POOR then
|
||||
return
|
||||
end
|
||||
|
||||
-- only proceed for items the engine reports as vendor-sellable
|
||||
local id = C_Container.GetContainerItemID(bag, slot)
|
||||
if (id and C_Item.GetItemSellPriceByID(id) or 0) > 0 then
|
||||
this.count = this.count + 1
|
||||
end
|
||||
|
||||
-- abort if the merchant window disappeared
|
||||
if not this.merchant then return end
|
||||
|
||||
-- clear cursor and sell the item
|
||||
ClearCursor()
|
||||
UseContainerItem(bag, slot)
|
||||
end)
|
||||
|
||||
autovendor:SetScript("OnHide", function()
|
||||
if this.count > 0 then
|
||||
local gold = this.gold
|
||||
QueueFunction(function()
|
||||
local income = GetMoney() - gold
|
||||
DEFAULT_CHAT_FRAME:AddMessage(T["Your vendor trash has been sold and you earned"] .. " " .. CreateGoldString(income))
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
autovendor:RegisterEvent("MERCHANT_SHOW")
|
||||
autovendor:RegisterEvent("MERCHANT_CLOSED")
|
||||
autovendor:RegisterEvent("MERCHANT_UPDATE")
|
||||
autovendor:SetScript("OnEvent", function()
|
||||
autovendor.button:Update()
|
||||
|
||||
if event == "MERCHANT_CLOSED" then
|
||||
autovendor.merchant = nil
|
||||
autovendor:Hide()
|
||||
elseif event == "MERCHANT_SHOW" then
|
||||
autovendor.merchant = true
|
||||
if C["global"]["autorepair"] == "1" then
|
||||
RepairItems()
|
||||
end
|
||||
if event == "MERCHANT_SHOW" then
|
||||
if C["global"]["autorepair"] == "1" then RepairItems() end
|
||||
|
||||
if C["global"]["autosell"] == "1" then
|
||||
if C_MerchantFrame.GetNumJunkItems() > 0 then
|
||||
C_MerchantFrame.SellAllJunkItems()
|
||||
else
|
||||
autovendor:Show()
|
||||
end
|
||||
SellJunkAndReport()
|
||||
autovendor.button:Hide()
|
||||
else
|
||||
autovendor.button:Show()
|
||||
@@ -136,19 +76,12 @@ pfUI:RegisterModule("autovendor", "vanilla:tbc", function ()
|
||||
end)
|
||||
SkinButton(autovendor.button, nil, nil, nil, autovendor.button.icon)
|
||||
|
||||
autovendor.button:SetScript("OnClick", function()
|
||||
autovendor:Show()
|
||||
end)
|
||||
autovendor.button:SetScript("OnClick", SellJunkAndReport)
|
||||
|
||||
autovendor.button.Update = function()
|
||||
if not autovendor:IsVisible() then
|
||||
if HasGreyItems() then
|
||||
autovendor.button:Enable()
|
||||
autovendor.button.icon:SetDesaturated(false)
|
||||
else
|
||||
autovendor.button:Disable()
|
||||
autovendor.button.icon:SetDesaturated(true)
|
||||
end
|
||||
if C_MerchantFrame.GetNumJunkItems() > 0 then
|
||||
autovendor.button:Enable()
|
||||
autovendor.button.icon:SetDesaturated(false)
|
||||
else
|
||||
autovendor.button:Disable()
|
||||
autovendor.button.icon:SetDesaturated(true)
|
||||
|
||||
Reference in New Issue
Block a user