AuctioneerSuite/Auc-Advanced/Modules/Auc-Util-PriceLevel/PriceLevel.lua
2026-04-13 17:48:13 -04:00

333 lines
14 KiB
Lua

--[[
Auctioneer - Price Level Utility module
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: PriceLevel.lua 4880 2010-09-15 20:02:11Z Nechckn $
URL: http://auctioneeraddon.com/
This is an addon for World of Warcraft that adds a price level indicator
to auctions when browsing the Auction House, so that you may readily see
which items are bargains or overpriced at a glance.
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Note:
This AddOn's source code is specifically designed to work with
World of Warcraft's interpreted AddOn system.
You have an implicit license to use this AddOn with these facilities
since that is its designated purpose as per:
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
--]]
if not AucAdvanced then return end
local libType, libName = "Util", "PriceLevel"
local lib,parent,private = AucAdvanced.NewModule(libType, libName)
if not lib then return end
local print,decode,_,_,replicate,empty,get,set,default,debugPrint,fill = AucAdvanced.GetModuleLocals()
local data
function lib.Processor(callbackType, ...)
if (callbackType == "tooltip") then
lib.ProcessTooltip(...)
elseif (callbackType == "config") then
private.SetupConfigGui(...)
elseif (callbackType == "listupdate") then
private.ListUpdate(...)
elseif (callbackType == "configchanged") then
if (AuctionFrameBrowse_Update) then
AuctionFrameBrowse_Update()
end
end
end
lib.Processors = {}
function lib.Processors.tooltip(callbackType, ...)
lib.ProcessTooltip(...)
end
function lib.Processors.config(callbackType, ...)
private.SetupConfigGui(...)
end
function lib.Processors.listupdate(callbackType, ...)
private.ListUpdate(...)
end
function lib.Processors.configchanged(callbackType, ...)
if (AuctionFrameBrowse_Update) then
AuctionFrameBrowse_Update()
end
end
function lib.ProcessTooltip(tooltip, name, hyperlink, quality, quantity, cost, additional)
-- In this function, you are afforded the opportunity to add data to the tooltip should you so
-- desire. You are passed a hyperlink, and it's up to you to determine whether or what you should
-- display in the tooltip.
if not get("util.pricelevel.single") then return end
if not additional or not additional.buyoutPrice or not additional.minBid then return end
local priceLevel, perItem, r,g,b = lib.CalcLevel(hyperlink, quantity, additional.minBid, additional.buyoutPrice)
if (not priceLevel) then return end
tooltip:AddLine(("Price Level: %d%%"):format(priceLevel), perItem, r,g,b)
end
function lib.OnLoad()
default("util.pricelevel.colorize", false)
default("util.pricelevel.single", true)
default("util.pricelevel.model", "market")
default("util.pricelevel.basis", "try")
default("util.pricelevel.blue", 0)
default("util.pricelevel.green", 50)
default("util.pricelevel.yellow", 80)
default("util.pricelevel.orange", 110)
default("util.pricelevel.red", 135)
default("util.pricelevel.opacity", 30)
default("util.pricelevel.gradient", true)
default("util.pricelevel.direction", "LEFT")
set("util.pricelevel.blue", nil) -- blue is a fake slider for display only - always 0
end
--[[ Local functions ]]--
function private.SetupConfigGui(gui)
-- The defaults for the following settings are set in the lib.OnLoad function
local id = gui:AddTab(libName, libType.." Modules")
gui:AddHelp(id, "what is pricelevel",
"What is PriceLevel?",
"PriceLevel is an Auctioneer module that analyses the current market position with regard to the calculated value of the item.\n"..
"PriceLevel is all about determining if what Auctioneer thinks is what the rest of the market currently thinks. It's also about determining if the rest of the market is selling their stuff for crazy prices.\n"..
"What it all comes down to is the color... PriceLevel breaks the current market down into 5 categories: |cff3296ffWay underpriced|r, |cff19ff19Fairly underpriced|r, |cffffff00Just underpriced|r, |cffff9619Reasonable|r, and |cffff0000Overpriced|r. It also has options for adding the calculated level to the tooltip and in the browse window of the Auction House.")
gui:AddControl(id, "Header", 0, libName.." Options")
gui:AddControl(id, "Checkbox", 0, 1, "util.pricelevel.single", "Show the PriceLevel and unit price in the tooltips")
gui:AddTip(id, "Enable this to display the PriceLevel information in the tooltip when you mouse over an item in your inventory")
gui:AddHelp(id, "what is ahcolor",
"What does changing the Auction House items' colors do?",
"This will change the background of the items at the Auction House so that you can more easily identify bargains or overpriced items as you are browsing.")
gui:AddControl(id, "Checkbox", 0, 1, "util.pricelevel.colorize", "Change the color of items in the Auction House")
gui:AddTip(id, "This option changes the color of the items lines in the Auction House so that you may more easily determine whether they are over or under priced prior to purchase")
gui:AddControl(id, "Slider", 0, 2, "util.pricelevel.opacity", 1, 100, 1, "Opacity level: %d%%")
gui:AddTip(id, "This controls the level of opacity for the colored bars in the Auction Browse window. (if enabled)")
gui:AddControl(id, "Checkbox", 0, 2, "util.pricelevel.gradient", "Use a gradient:")
gui:AddTip(id, "This causes the colored bars in the Auction Browse window to be drawn with a gradient instead of a solid color (if enabled).")
gui:AddControl(id, "Selectbox", 0, 3, {
{"LEFT", "Left"},
{"RIGHT", "Right"},
{"TOP", "Top"},
{"BOTTOM", "Bottom"},
}, "util.pricelevel.direction", "Pick the gradient direction")
gui:AddTip(id, "This determines the direction that the above gradient is drawn in for the Auction Browse window (if enabled).")
gui:AddControl(id, "Subhead", 0, "Price valuation method:")
gui:AddControl(id, "Selectbox", 0, 1, parent.selectorPriceModels, "util.pricelevel.model", "Pricing model to use for the valuation")
gui:AddTip(id, "The pricing model that is used to work out the calculated value of items at the Auction House.")
gui:AddControl(id, "Subhead", 0, "Price level basis:")
gui:AddControl(id, "Selectbox", 0, 1, {
{"cur", "Next bid price"},
{"buy", "Buyout only"},
{"try", "Buyout or bid"},
}, "util.pricelevel.basis", "Which price to use for the PriceLevel")
gui:AddTip(id, "Selects which price to base the PriceLevel calculation off of.")
gui:AddHelp(id, "what is basis",
"What is the PriceLevel basis?",
"The Auction House has both bids and buyout values to calculate from. You can select to price the item based off either exclusively the buyout or bid, or first the buyout if it exists, and then the bid")
gui:AddControl(id, "Subhead", 0, "Pricing points:")
gui:AddControl(id, "WideSlider", 0, 1, "util.pricelevel.red", 0, 500, 5, "|cffff0000Red|r price level > %d%%")
gui:AddTip(id, "This determines the minimum level for an item to be counted as a red item.")
gui:AddControl(id, "WideSlider", 0, 1, "util.pricelevel.orange", 0, 500, 5, "|cffff9619Orange|r price level > %d%%")
gui:AddTip(id, "This determines the minimum level for an item to be counted as a orange item.")
gui:AddControl(id, "WideSlider", 0, 1, "util.pricelevel.yellow", 0, 500, 5, "|cffffff00Yellow|r price level > %d%%")
gui:AddTip(id, "This determines the minimum level for an item to be counted as a yellow item.")
gui:AddControl(id, "WideSlider", 0, 1, "util.pricelevel.green", 0, 500, 5, "|cff19ff19Green|r price level > %d%%")
gui:AddTip(id, "This determines the minimum level for an item to be counted as a green item.")
gui:AddControl(id, "WideSlider", 0, 1, "util.pricelevel.blue", 0, 0, 1, "|cff3296ffBlue|r price level > %d%%")
gui:AddTip(id, "This slider does nothing and is just here for completeness to show that blue is under green.")
gui:AddHelp(id, "what is points",
"What are the pricing points for?",
"The pricing points determine the ranges for the various PriceLevel colored bands.\n"..
"As an item's price moves up through the bands, it will change to the next color.")
gui:AddHelp(id, "wtf blue stuck qq",
"Why is the blue slider stuck at zero?",
"Something has to start at zero, and blue's the one that does it. If you moved blue off zero, then what would we color stuff under blue?")
gui:AddHelp(id, "wtf blue stuck l2code",
"Ok, so why did you put the blue slider in then?",
"To appease my wife... Deal. :)")
end
function lib.ResetBars()
local tex
for i=1, NUM_BROWSE_TO_DISPLAY do
tex = _G["BrowseButton"..i.."PriceLevel"]
if (tex) then tex:Hide() end
end
end
function lib.SetBar(i, r,g,b, pct)
local tex
local button = _G["BrowseButton"..i]
local colorize = AucAdvanced.Settings.GetSetting("util.pricelevel.colorize")
if (button.AddTexture) then
tex = button.AddTexture
if (button.Value) then
if (pct) then
if pct > 999 then
button.Value:SetText(">999%")
else
button.Value:SetText(("%d%%"):format(pct))
end
if colorize then
button.Value:SetTextColor(1,1,1)
else
button.Value:SetTextColor(r,g,b)
end
else
button.Value:SetText("")
button.Value:SetTextColor(1,1,1)
end
end
if not colorize then
tex:Hide()
end
else
tex = _G["BrowseButton"..i.."PriceLevel"]
end
if not colorize then return end
if not tex then
tex = button:CreateTexture("BrowseButton"..i.."PriceLevel")
tex:SetPoint("TOPLEFT")
tex:SetPoint("BOTTOMRIGHT", 0, 5)
end
if (r and g and b) then
local opacity = AucAdvanced.Settings.GetSetting("util.pricelevel.opacity")
opacity = math.floor(tonumber(opacity) or 50) / 100
if (opacity < 0) then opacity = 0.01
elseif (opacity > 1) then opacity = 1 end
local gradient = AucAdvanced.Settings.GetSetting("util.pricelevel.gradient")
tex:SetTexture(1,1,1)
if (gradient) then
local direction = AucAdvanced.Settings.GetSetting("util.pricelevel.direction")
if (direction == "LEFT") then
tex:SetGradientAlpha("Horizontal", r,g,b, 0, r,g,b, opacity)
elseif (direction == "RIGHT") then
tex:SetGradientAlpha("Horizontal", r,g,b, opacity, r,g,b, 0)
elseif (direction == "BOTTOM") then
tex:SetGradientAlpha("Vertical", r,g,b, 0, r,g,b, opacity)
elseif (direction == "TOP") then
tex:SetGradientAlpha("Vertical", r,g,b, opacity, r,g,b, 0)
end
else
tex:SetGradientAlpha("Vertical", r,g,b, opacity, r,g,b, opacity)
end
tex:Show()
else
tex:Hide()
end
end
function private.ListUpdate()
lib.ResetBars()
local index, link, quantity, minBid, minInc, buyPrice, bidPrice, priceLevel, perItem, r,g,b, _
local numBatchAuctions, totalAuctions = GetNumAuctionItems("list");
local offset = FauxScrollFrame_GetOffset(BrowseScrollFrame)
for i=1, NUM_BROWSE_TO_DISPLAY do
index = offset + i + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page);
if (index <= numBatchAuctions + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page)) then
if AucAdvanced.Modules.Util.CompactUI
and AucAdvanced.Modules.Util.CompactUI.inUse then
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
priceLevel,_,r,g,b = AucAdvanced.Modules.Util.CompactUI.GetContents(offset+i)
lib.SetBar(i, r,g,b, priceLevel)
else
link = GetAuctionItemLink("list", offset + i)
if link then
_,_, quantity, _,_,_, minBid, minInc, buyPrice, bidPrice = GetAuctionItemInfo("list", offset + i)
if bidPrice>0 then bidPrice = bidPrice + minInc
else bidPrice = minBid end
priceLevel, perItem, r,g,b = lib.CalcLevel(link, quantity, bidPrice, buyPrice)
lib.SetBar(i, r,g,b, priceLevel)
end
end
end
end
end
function lib.CalcLevel(link, quantity, bidPrice, buyPrice, itemWorth)
if not quantity or quantity < 1 then quantity = 1 end
local priceModel = AucAdvanced.Settings.GetSetting("util.pricelevel.model")
local priceBasis = AucAdvanced.Settings.GetSetting("util.pricelevel.basis")
local stackPrice
if (priceBasis == "cur") then
stackPrice = bidPrice
elseif (priceBasis == "buy") then
if not buyPrice or buyPrice <= 0 then return end
stackPrice = buyPrice
elseif (priceBasis == "try") then
stackPrice = buyPrice or 0
if stackPrice <= 0 then
stackPrice = bidPrice
end
end
if not stackPrice then return end
if not itemWorth then
if (priceModel == "market") then
itemWorth = AucAdvanced.API.GetMarketValue(link)
else
itemWorth = AucAdvanced.API.GetAlgorithmValue(priceModel, link)
end
if not itemWorth then return end
end
local perItem = stackPrice / quantity
local priceLevel = perItem / itemWorth * 100
local r, g, b, lvl
r,g,b,lvl = 0.2,0.6,1.0, "blue"
if priceLevel > AucAdvanced.Settings.GetSetting("util.pricelevel.red") then
r,g,b,lvl = 1.0,0.0,0.0, "red"
elseif priceLevel > AucAdvanced.Settings.GetSetting("util.pricelevel.orange") then
r,g,b,lvl = 1.0,0.6,0.1, "orange"
elseif priceLevel > AucAdvanced.Settings.GetSetting("util.pricelevel.yellow") then
r,g,b,lvl = 1.0,1.0,0.0, "yellow"
elseif priceLevel > AucAdvanced.Settings.GetSetting("util.pricelevel.green") then
r,g,b,lvl = 0.1,1.0,0.1, "green"
end
return priceLevel, perItem, r,g,b, lvl, itemWorth
end
AucAdvanced.RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Auc-Util-PriceLevel/PriceLevel.lua $", "$Rev: 4880 $")