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

332 lines
12 KiB
Lua

--[[
Auctioneer - Search UI - Searcher Converter
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: SearcherConverter.lua 4840 2010-08-04 21:44:00Z Nechckn $
URL: http://auctioneeraddon.com/
This is a plugin module for the SearchUI that assists in searching by refined paramaters
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
--]]
-- Create a new instance of our lib with our parent
local lib, parent, private = AucSearchUI.NewSearcher("Converter")
if not lib then return end
--local print,decode,_,_,replicate,empty,_,_,_,debugPrint,fill = AucAdvanced.GetModuleLocals()
local get, set, default, Const, resources = parent.GetSearchLocals()
lib.tabname = "Converter"
-- Build a table to do all our work
-- findConvertable[itemID] = {conversionID, yield, checkstring}
-- Note: ItemSuggest uses a copy of this code; if you change it here, change it in ItemSuggest as well!
local findConvertable = {}
do
-- Set our constants
--Essences
local GCOSMIC = 34055
local GPLANAR = 22446
local GETERNAL = 16203
local GNETHER = 11175
local GMYSTIC = 11135
local GASTRAL = 11082
local GMAGIC = 10939
local LCOSMIC = 34056
local LPLANAR = 22447
local LETERNAL = 16202
local LNETHER = 11174
local LMYSTIC = 11134
local LASTRAL = 10998
local LMAGIC = 10938
--Motes/Primals
local PAIR = 22451
local MAIR = 22572
local PEARTH= 22452
local MEARTH = 22573
local PFIRE = 21884
local MFIRE = 22574
local PLIFE = 21886
local MLIFE = 22575
local PMANA = 22457
local MMANA = 22576
local PSHADOW = 22456
local MSHADOW = 22577
local PWATER = 21885
local MWATER = 22578
--Crystallized/Eternal
local CAIR = 37700
local EAIR = 35623
local CEARTH = 37701
local EEARTH = 35624
local CSHADOW = 37703
local ESHADOW = 35627
local CLIFE = 37704
local ELIFE = 35625
local CFIRE = 37702
local EFIRE = 36860
local CWATER = 37705
local EWATER = 35622
--Depleted items
local DCBRACER = 32676 -- Depleted Cloth Bracers
local DCBRACERTO = 32655 -- Crystalweave Bracers
local DMGAUNTLETS = 32675 -- Depleted Mail Gauntlets
local DMGAUNTLETSTO = 32656 -- Crystalhide Handwraps
local DBADGE = 32672 -- Depleted Badge
local DBADGETO = 32658 -- Badge of Tenacity
local DCLOAK = 32677 -- Depleted Cloak
local DCLOAKTO = 32665 -- Crystalweave Cape
local DDAGGER = 32673 -- Depleted Dagger
local DDAGGERTO = 32659 -- Crystal-Infused Shiv
local DMACE = 32671 -- Depleted Mace
local DMACETO = 32661 -- Apexis Crystal Mace
local DRING = 32678 -- Depleted Ring
local DRINGTO = 32664 -- Dreamcrystal Band
local DSTAFF = 32679 -- Depleted Staff
local DSTAFFTO = 32662 -- Flaming Quartz Staff
local DSWORD = 32674 -- Depleted Sword
local DSWORDTO = 32660 -- Crystalforged Sword
local DTHAXE = 32670 -- Depleted Two-Handed Axe
local DTHAXETO = 32663 -- Apexis Cleaver
-- Temporary tables to help build the working table
-- To add new conversions, edit these tables
-- TWO WAY Tables
local lesser_greater = {
[LCOSMIC] = GCOSMIC,
[LPLANAR] = GPLANAR,
[LETERNAL] = GETERNAL,
[LNETHER] = GNETHER,
[LMYSTIC] = GMYSTIC,
[LASTRAL] = GASTRAL,
[LMAGIC] = GMAGIC,
}
local crystallized_eternal = {
[CAIR] = EAIR,
[CEARTH] = EEARTH,
[CSHADOW] = ESHADOW,
[CLIFE] = ELIFE,
[CFIRE] = EFIRE,
[CWATER] = EWATER,
}
-- ONE WAY Tables
local mote2primal = {
[MAIR] = PAIR,
[MEARTH] = PEARTH,
[MFIRE] = PFIRE,
[MLIFE] = PLIFE,
[MMANA] = PMANA,
[MSHADOW] = PSHADOW,
[MWATER] = PWATER,
}
local depleted2enhanced = {
[DCBRACER] = DCBRACERTO,
[DMGAUNTLETS] = DMGAUNTLETSTO,
[DBADGE] = DBADGETO,
[DCLOAK] = DCLOAKTO,
[DDAGGER] = DDAGGERTO,
[DMACE] = DMACETO,
[DRING] = DRINGTO,
[DSTAFF] = DSTAFFTO,
[DSWORD] = DSWORDTO,
[DTHAXE] = DTHAXETO,
}
--[[ placeholder for future development - not sure how this will work yet...
-- Trade Professions need to be handled differently as yields may vary
local smelt = {
[10] = {
[PEARTH] = MEARTH,
[PFIRE] = MFIRE,
},
}
--]]
-- Build the table
-- Two-way
for idl, idg in pairs (lesser_greater) do
findConvertable[idl] = {idg, 1/3, "converter.enableEssence"}
findConvertable[idg] = {idl, 3, "converter.enableEssence"}
end
for idc, ide in pairs (crystallized_eternal) do
findConvertable[idc] = {ide, 0.1, "converter.enableCrystallized"}
findConvertable[ide] = {idc, 10, "converter.enableCrystallized"}
end
-- One-way
for id, idto in pairs (mote2primal) do
findConvertable[id] = {idto, 0.1, "converter.enableMote"}
end
for id, idto in pairs (depleted2enhanced) do
findConvertable[id] = {idto, 1, "converter.enableDepleted"}
end
end
-- export the table for other addons to reference
resources.SearcherConverterLookupTable = findConvertable
default("converter.profit.min", 1)
default("converter.profit.pct", 50)
default("converter.adjust.brokerage", true)
default("converter.adjust.deposit", true)
default("converter.adjust.deplength", 48)
default("converter.adjust.listings", 3)
default("converter.allow.bid", true)
default("converter.allow.buy", true)
default("converter.maxprice", 10000000)
default("converter.maxprice.enable", false)
--default("converter.matching.check", true)
--default("converter.buyout.check", true)
default("converter.enableEssence", true)
default("converter.enableMote", true)
default("converter.enableCrystallized", true)
default("converter.enableDepleted", false)
default("converter.model", "market")
function private.doValidation()
if not resources.isValidPriceModel(get("converter.model")) then
message("Converter Searcher Warning!\nCurrent price model setting ("..get("converter.model")..") is not valid. Select a new price model")
else
private.doValidation = nil
end
end
-- This function is automatically called from AucSearchUI.NotifyCallbacks
private.validationRequired = true
function lib.Processor(event, subevent)
if event == "selecttab" then
if subevent == lib.tabname and private.doValidation then
private.doValidation()
end
end
end
lib.Processors = {}
function lib.Processors.selecttab(event, subevent)
if subevent == lib.tabname and private.doValidation then
private.doValidation()
end
end
-- This function is automatically called when we need to create our search parameters
function lib:MakeGuiConfig(gui)
-- Get our tab and populate it with our controls
local id = gui:AddTab(lib.tabname, "Searchers")
-- Add the help
gui:AddSearcher("Converter", "Search for items which can be converted into other items for profit (essences, motes, etc)", 100)
gui:AddHelp(id, "converter searcher",
"What does this searcher do?",
"This searcher provides the ability to search for items that can be converted to another item which is worth more money.")
gui:AddControl(id, "Header", 0, "Converter search criteria")
local last = gui:GetLast(id)
gui:AddControl(id, "MoneyFramePinned", 0, 1, "converter.profit.min", 1, 99999999, "Minimum Profit")
gui:AddControl(id, "Slider", 0, 1, "converter.profit.pct", 1, 100, .5, "Min Discount: %0.01f%%")
gui:AddControl(id, "Subhead", 0, "Include in search")
gui:AddControl(id, "Checkbox", 0, 1, "converter.enableEssence", "Essence: Greater <> Lesser")
gui:AddControl(id, "Checkbox", 0, 1, "converter.enableMote", "Mote > Primal")
gui:AddControl(id, "Checkbox", 0, 1, "converter.enableCrystallized", "Crystallized <> Eternal")
gui:AddControl(id, "Checkbox", 0, 1, "converter.enableDepleted", "Depleted Items")
gui:AddTip(id, "Warning: depleted items require Apexis Shards to convert. Apexis Shards can only be obtained from certain locations in Outland.")
gui:SetLast(id, last)
gui:AddControl(id, "Checkbox", 0.42, 1, "converter.allow.bid", "Allow Bids")
gui:SetLast(id, last)
gui:AddControl(id, "Checkbox", 0.56, 1, "converter.allow.buy", "Allow Buyouts")
gui:AddControl(id, "Checkbox", 0.42, 1, "converter.maxprice.enable", "Enable individual maximum price:")
gui:AddTip(id, "Limit the maximum amount you want to spend with the Converter searcher")
gui:AddControl(id, "MoneyFramePinned", 0.42, 2, "converter.maxprice", 1, 99999999, "Maximum Price for Converter")
gui:AddControl(id, "Subhead", 0.42, "Price Valuation Method:")
gui:AddControl(id, "Selectbox", 0.42, 1, resources.selectorPriceModels, "converter.model")
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.42, "Fees Adjustment")
gui:AddControl(id, "Checkbox", 0.42, 1, "converter.adjust.brokerage", "Subtract auction fees")
gui:AddControl(id, "Checkbox", 0.42, 1, "converter.adjust.deposit", "Subtract deposit cost")
gui:AddControl(id, "Selectbox", 0.42, 1, resources.selectorAuctionLength, "converter.adjust.deplength")
gui:AddControl(id, "Slider", 0.42, 1, "converter.adjust.listings", 1, 10, .1, "Ave relistings: %0.1fx")
--gui:AddControl(id, "Subhead", 0.42, "Appraiser Value Origination")
--gui:AddControl(id, "Checkbox", 0.42, 1, "converter.matching.check", "Use Market Matched")
--gui:AddControl(id, "Checkbox", 0.42, 1, "converter.buyout.check", "Use buyout not bid")
gui:SetLast(id, last)
end
function lib.Search (item)
local convert = findConvertable[item[Const.ITEMID]]
if not convert then
return false, "Item not convertable"
end
local newID, yield, test = unpack(convert)
if not get(test) then
return false, "Category disabled"
end
local bidprice, buyprice = item[Const.PRICE], item[Const.BUYOUT]
local maxprice = get("converter.maxprice.enable") and get("converter.maxprice")
if buyprice <= 0 or not get("converter.allow.buy") or (maxprice and buyprice > maxprice) then
buyprice = nil
end
if not get("converter.allow.bid") or (maxprice and bidprice > maxprice) then
bidprice = nil
end
if not (bidprice or buyprice) then
return false, "Does not meet bid/buy requirements"
end
local market = resources.GetPrice(get("converter.model"), newID)
if not market then
return false, "No market price"
end
local count = item[Const.COUNT] * yield
market = market * count
--adjust for brokerage/deposit costs
if get("converter.adjust.brokerage") then
market = market * resources.CutAdjust
end
if get("converter.adjust.deposit") then
-- note: GetDepositCost calls GetSellValue API, which handles numerical itemIDs (prefers them actually)
local amount = GetDepositCost(newID, get("converter.adjust.deplength"), resources.faction, count)
if amount then
market = market - amount * get("converter.adjust.listings")
end
end
local value = min (market*(100-get("converter.profit.pct"))/100, market-get("converter.profit.min"))
if buyprice and buyprice <= value then
return "buy", market
elseif bidprice and bidprice <= value then
return "bid", market
end
return false, "Not enough profit"
end
AucAdvanced.RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Auc-Util-SearchUI/SearcherConverter.lua $", "$Rev: 4840 $")