Files
ShaguTweaks-ClassicAPI/libs/libvendorcache.lua
T

134 lines
4.2 KiB
Lua

local _G = ShaguTweaks.GetGlobalEnv()
local API = ShaguTweaks.API
if not API then return end
local function GetVendorPriceCache()
_G.ShaguTweaks_vendor_prices = _G.ShaguTweaks_vendor_prices or {}
-- Migrate prices learned by the first Phase 2 implementation.
if _G.ShaguTweaks_cache and type(_G.ShaguTweaks_cache["vendor_prices"]) == "table" then
for itemID, price in pairs(_G.ShaguTweaks_cache["vendor_prices"]) do
if type(itemID) == "number" and type(price) == "number" and price > 0 and
not _G.ShaguTweaks_vendor_prices[itemID] then
_G.ShaguTweaks_vendor_prices[itemID] = price
end
end
_G.ShaguTweaks_cache["vendor_prices"] = nil
end
return _G.ShaguTweaks_vendor_prices
end
local function GetLiveVendorPrice(itemID)
if type(itemID) ~= "number" then return end
local citem = _G.C_Item
local getter = citem and citem.GetItemSellPriceByID
if type(getter) == "function" then
API.itemprice = true
return getter(itemID)
end
end
API.GetItemSellPriceByID = GetLiveVendorPrice
local function StoreVendorPrice(itemID, price)
if type(itemID) ~= "number" or type(price) ~= "number" or price <= 0 then return end
local learned = GetVendorPriceCache()
local legacy = ShaguTweaks.SellValueLegacyDB or ShaguTweaks.SellValueDB
local legacyPrice = legacy and legacy[itemID]
-- Only persist values that add something to the bundled static database.
if not legacyPrice or legacyPrice ~= price then
learned[itemID] = price
else
learned[itemID] = nil
end
-- Make the learned value available immediately during this session too.
if ShaguTweaks.SellValueLegacyDB and ShaguTweaks.SellValueDB then
rawset(ShaguTweaks.SellValueDB, itemID, price)
end
return price
end
API.StoreVendorPrice = StoreVendorPrice
API.RememberVendorPrice = function(itemID)
local price = GetLiveVendorPrice(itemID)
if price and price > 0 then
return StoreVendorPrice(itemID, price)
end
end
-- Always install the Vendor Values proxy, even if ClassicAPI's C_Item table is
-- not ready yet during VARIABLES_LOADED. Learned prices must still survive and
-- work after /reload; live ClassicAPI availability is checked dynamically.
API.PrepareVendorValues = function()
if not ShaguTweaks.SellValueDB or ShaguTweaks.SellValueLegacyDB then return end
local legacy = ShaguTweaks.SellValueDB
local learned = GetVendorPriceCache()
local live = {}
setmetatable(live, {
__index = function(tab, itemID)
if type(itemID) ~= "number" then
return legacy[itemID]
end
local price = GetLiveVendorPrice(itemID)
if price and price > 0 then
StoreVendorPrice(itemID, price)
rawset(tab, itemID, price)
return price
end
local remembered = learned[itemID]
if remembered and remembered > 0 then
return remembered
end
return legacy[itemID]
end
})
ShaguTweaks.SellValueLegacyDB = legacy
ShaguTweaks.SellValueDB = live
if API.vendorprice_tooltip_hooks then return end
API.vendorprice_tooltip_hooks = true
-- Vendor Values suppresses its own price while a merchant is open because the
-- default UI already displays the real sell value. Learn that native value
-- from the player's bag tooltip so new Turtle items persist afterwards.
ShaguTweaks.hooksecurefunc(GameTooltip, "SetBagItem", function(tooltip, container, slot)
if not MerchantFrame or not MerchantFrame:IsShown() then return end
local link = GetContainerItemLink(container, slot)
local itemID = link and ShaguTweaks.GetItemIDFromLink(link)
if not itemID then return end
-- Prefer the item-record value whenever ClassicAPI already knows it.
if API.RememberVendorPrice(itemID) then return end
local _, count = GetContainerItemInfo(container, slot)
count = tonumber(count) or 1
if count < 1 then count = 1 end
local tooltipName = tooltip and tooltip:GetName()
local moneyFrame = tooltipName and _G[tooltipName .. "MoneyFrame1"]
local stackPrice = moneyFrame and moneyFrame:IsShown() and tonumber(moneyFrame.staticMoney)
if not stackPrice or stackPrice <= 0 then return end
local unitPrice = floor(stackPrice / count)
if unitPrice > 0 and unitPrice * count == stackPrice then
StoreVendorPrice(itemID, unitPrice)
end
end)
end