333 lines
14 KiB
Lua
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 $")
|