some more improvements
see readme_geojak for changelist compared to the main aux branch
This commit is contained in:
@@ -1,3 +1,10 @@
|
||||
1. Added auto bid feature, doubled the existing auto buy code and slighly editted
|
||||
2. Added auto pricing heuristic, these are activate when posting an item with bid price 0, the buyout price works as a minimum
|
||||
3. Added a keybind for the post button, this significantly speeds up mass posting of items
|
||||
3. Added a keybind for the post button, this significantly speeds up mass posting of items
|
||||
4. Changed the default post stack size to rand(1,max) instead of always max
|
||||
5. FIXED TWILLIGHT CULTIST SET NOT DISENCHATABLE
|
||||
6. use SHagu tweaks vendor values if aux values not avaialbe
|
||||
7. dont auto bid on own items
|
||||
8. new filter disenchant-percent and bid-disencahnt-percent
|
||||
9. enchanting created wands are not encahntabke, same with twillight stuff at 5. reworked implementation for easier addition
|
||||
10. disenchant values are calcualted from min(value,value_today), this protects users from low enchanting mat prices
|
||||
@@ -1,5 +1,6 @@
|
||||
## Interface: 11200
|
||||
## Author: shirsig
|
||||
## OptionalDeps: ShaguTweaks
|
||||
## Title: aux
|
||||
## Notes: Auction House replacement
|
||||
## SavedVariables: aux
|
||||
|
||||
@@ -33,21 +33,30 @@ local WEAPON = T.set(
|
||||
'INVTYPE_RANGEDRIGHT'
|
||||
)
|
||||
|
||||
function M.value(slot, quality, level)
|
||||
function M.value(slot, quality, level, item_id)
|
||||
local expectation
|
||||
for _, event in distribution(slot, quality, level) do
|
||||
for _, event in distribution(slot, quality, level, item_id) do
|
||||
local value = history.value(event.item_id .. ':' .. 0)
|
||||
if not value then
|
||||
if not value then
|
||||
return
|
||||
else
|
||||
local value_today = history.market_value(event.item_id .. ':' .. 0)
|
||||
if value_today then
|
||||
value=min(value,value_today)
|
||||
end
|
||||
expectation = (expectation or 0) + event.probability * (event.min_quantity + event.max_quantity) / 2 * value
|
||||
end
|
||||
end
|
||||
return expectation
|
||||
end
|
||||
|
||||
function M.distribution(slot, quality, level)
|
||||
if not ARMOR[slot] and not WEAPON[slot] or level == 0 then
|
||||
function M.distribution(slot, quality, level, item_id)
|
||||
if not ARMOR[slot] and not WEAPON[slot] or level == 0
|
||||
--twillight cultist items are not disenchantable
|
||||
or item_id==20408 or item_id==20407 or item_id==20406
|
||||
--enchanting created wands are not disenchantable
|
||||
or item_id==11288 or item_id==11290 or item_id==11287 or item_id==11289
|
||||
then
|
||||
return T.acquire()
|
||||
end
|
||||
|
||||
|
||||
+58
-23
@@ -46,14 +46,17 @@ function post_auction(slot, k)
|
||||
|
||||
local start_price = state.unit_start_price
|
||||
local buyout_price = state.unit_buyout_price
|
||||
local kz_daily = 0
|
||||
local kz_pricing = 0
|
||||
|
||||
--use autoprice heuristic if start bid 0 is set
|
||||
if start_price == 0 then
|
||||
|
||||
local kz_daily = 0
|
||||
local kz_pricing = 0
|
||||
local kz_warn = 0
|
||||
|
||||
if buyout_price > 0 then
|
||||
kz_pricing=1
|
||||
start_price = buyout_price
|
||||
end
|
||||
|
||||
if history.market_value(state.item_key) ~= nil then
|
||||
@@ -63,39 +66,71 @@ function post_auction(slot, k)
|
||||
kz_daily = 1
|
||||
end
|
||||
|
||||
if disenchant.value(item_info.slot, item_info.quality, item_info.level) ~= nil then
|
||||
buyout_price = max(buyout_price,0.85* tonumber(disenchant.value(item_info.slot, item_info.quality, item_info.level)))
|
||||
end
|
||||
|
||||
if aux.account_data.merchant_sell[item_info.item_id] ~= nil then
|
||||
if kz_daily == 0 then
|
||||
start_price = max(start_price,tonumber(aux.account_data.merchant_sell[item_info.item_id]) * (1.35+3.65*math.exp(-(1/4000)* tonumber(aux.account_data.merchant_sell[item_info.item_id] ))))
|
||||
buyout_price = max(buyout_price,start_price)
|
||||
if history.value(state.item_key) ~= nil then
|
||||
if kz_pricing == 1 and kz_daily == 1 then
|
||||
buyout_price = max(buyout_price,1.0*tonumber(history.value(state.item_key)))
|
||||
elseif kz_daily == 1 then
|
||||
start_price = max(start_price,0.91*tonumber(history.value(state.item_key)))
|
||||
else
|
||||
start_price = max(start_price,tonumber(aux.account_data.merchant_sell[item_info.item_id]) * 1.35)
|
||||
buyout_price = max(buyout_price,start_price)
|
||||
buyout_price = max(buyout_price,0.99* tonumber(history.value(state.item_key)))
|
||||
end
|
||||
else
|
||||
kz_warn = kz_warn + 1
|
||||
end
|
||||
|
||||
if disenchant.value(item_info.slot, item_info.quality, item_info.level, item_info.item_id) ~= nil then
|
||||
start_price = max(start_price,0.85* tonumber(disenchant.value(item_info.slot, item_info.quality, item_info.level, item_info.item_id)))
|
||||
end
|
||||
|
||||
if aux.account_data.merchant_buy[item_info.item_id] ~= nil then
|
||||
local tmp = tostring(aux.account_data.merchant_buy[item_info.item_id])
|
||||
tmp = strsub(tmp,1,-3)
|
||||
start_price = max(start_price,tonumber(tmp) * 1.1)
|
||||
buyout_price = max(buyout_price,tonumber(tmp) * 1.15)
|
||||
end
|
||||
|
||||
if history.value(state.item_key) ~= nil then
|
||||
if kz_pricing == 1 and kz_daily == 1 then
|
||||
buyout_price = max(buyout_price,1.0*tonumber(history.value(state.item_key)))
|
||||
elseif kz_daily == 1 then
|
||||
start_price = max(start_price,0.91*tonumber(history.value(state.item_key)))
|
||||
buyout_price = max(buyout_price,0.91*tonumber(history.value(state.item_key)))
|
||||
buyout_price = max(buyout_price,tonumber(tmp) * 1.15)
|
||||
else
|
||||
local vendor_price = 0
|
||||
if aux.account_data.merchant_sell[item_info.item_id] ~= nil then
|
||||
vendor_price = tonumber(aux.account_data.merchant_sell[item_info.item_id])
|
||||
elseif ShaguTweaks.SellValueDB[item_info.item_id] ~= nil then
|
||||
local charges = 1
|
||||
if info.max_item_charges(item_info.item_id) ~= nil then
|
||||
charges=info.max_item_charges(item_info.item_id)
|
||||
end
|
||||
vendor_price = ShaguTweaks.SellValueDB[item_info.item_id] / charges
|
||||
end
|
||||
if vendor_price > 0 then
|
||||
if kz_daily == 0 then
|
||||
start_price = max(start_price, vendor_price * (1.35+3.65*math.exp(-(1/4000)* vendor_price)))
|
||||
else
|
||||
start_price = max(start_price, vendor_price * 1.35)
|
||||
end
|
||||
else
|
||||
buyout_price = max(buyout_price,0.99* tonumber(history.value(state.item_key)))
|
||||
kz_warn = kz_warn + 1
|
||||
end
|
||||
end
|
||||
|
||||
start_price = max(start_price,0.75 * buyout_price)
|
||||
start_price = max(start_price,0.91 * buyout_price)
|
||||
buyout_price = max(start_price, buyout_price)
|
||||
|
||||
if kz_warn == 2 and kz_pricing == 0 then
|
||||
print("WARNING, insufficient data for autopricing!")
|
||||
if start_price == 0 then
|
||||
return stop()
|
||||
end
|
||||
end
|
||||
|
||||
local gold = floor(start_price / COPPER_PER_GOLD)
|
||||
local silver = floor(mod(start_price, COPPER_PER_GOLD) / COPPER_PER_SILVER)
|
||||
local copper = aux.round(mod(start_price, COPPER_PER_SILVER))
|
||||
|
||||
print("bid_price: "..gold.."g "..silver.."s "..copper.."c")
|
||||
|
||||
gold = floor(buyout_price / COPPER_PER_GOLD)
|
||||
silver = floor(mod(buyout_price, COPPER_PER_GOLD) / COPPER_PER_SILVER)
|
||||
copper = aux.round(mod(buyout_price, COPPER_PER_SILVER))
|
||||
|
||||
print("buyout_price: "..gold.."g "..silver.."s "..copper.."c")
|
||||
|
||||
end
|
||||
|
||||
StartAuction(max(1, aux.round(start_price * item_info.aux_quantity)), aux.round(buyout_price * item_info.aux_quantity), state.duration)
|
||||
|
||||
@@ -147,11 +147,11 @@ function scan_page(i)
|
||||
|
||||
history.process_auction(auction_info)
|
||||
|
||||
if (get_state().params.auto_bid_validator or pass)(auction_info) then
|
||||
if (get_state().params.auto_bid_validator or pass)(auction_info) and auction_info.owner ~= UnitName("player") then
|
||||
local send_signal, signal_received = aux.signal()
|
||||
aux.when(signal_received, scan_page, i)
|
||||
return aux.place_bid(auction_info.query_type, auction_info.index, auction_info.bid_price, send_signal)
|
||||
elseif (get_state().params.auto_buy_validator or pass)(auction_info) then
|
||||
elseif (get_state().params.auto_buy_validator or pass)(auction_info) and auction_info.owner ~= UnitName("player") then
|
||||
local send_signal, signal_received = aux.signal()
|
||||
aux.when(signal_received, scan_page, i)
|
||||
return aux.place_bid(auction_info.query_type, auction_info.index, auction_info.buyout_price, send_signal)
|
||||
|
||||
@@ -54,7 +54,7 @@ function M.extend_tooltip(tooltip, link, quantity)
|
||||
quantity = IsShiftKeyDown() and quantity or 1
|
||||
local item_info = T.temp-info.item(item_id)
|
||||
if item_info then
|
||||
local distribution = disenchant.distribution(item_info.slot, item_info.quality, item_info.level)
|
||||
local distribution = disenchant.distribution(item_info.slot, item_info.quality, item_info.level, item_id)
|
||||
if getn(distribution) > 0 then
|
||||
if settings.disenchant_distribution then
|
||||
tooltip:AddLine('Disenchants into:', aux.color.tooltip.disenchant.distribution())
|
||||
@@ -64,7 +64,7 @@ function M.extend_tooltip(tooltip, link, quantity)
|
||||
end
|
||||
end
|
||||
if settings.disenchant_value then
|
||||
local disenchant_value = disenchant.value(item_info.slot, item_info.quality, item_info.level)
|
||||
local disenchant_value = disenchant.value(item_info.slot, item_info.quality, item_info.level, item_id)
|
||||
tooltip:AddLine('Disenchant: ' .. (disenchant_value and money.to_string2(disenchant_value) or UNKNOWN), aux.color.tooltip.disenchant.value())
|
||||
end
|
||||
end
|
||||
@@ -77,6 +77,13 @@ function M.extend_tooltip(tooltip, link, quantity)
|
||||
end
|
||||
if settings.merchant_sell then
|
||||
local price = info.merchant_info(item_id)
|
||||
if price == nil and ShaguTweaks.SellValueDB[item_id] ~= nil then
|
||||
local charges = 1
|
||||
if info.max_item_charges(item_id) ~= nil then
|
||||
charges=info.max_item_charges(item_id)
|
||||
end
|
||||
price = ShaguTweaks.SellValueDB[item_id] / charges
|
||||
end
|
||||
if price ~= 0 then
|
||||
tooltip:AddLine('Vendor: ' .. (price and money.to_string2(price * quantity) or UNKNOWN), aux.color.tooltip.merchant())
|
||||
end
|
||||
|
||||
@@ -431,19 +431,23 @@ function update_item(item)
|
||||
UIDropDownMenu_SetSelectedValue(duration_dropdown, settings.duration)
|
||||
|
||||
hide_checkbox:SetChecked(settings.hidden)
|
||||
|
||||
local ii = 1
|
||||
if selected_item.max_charges then
|
||||
for i = selected_item.max_charges, 1, -1 do
|
||||
if selected_item.availability[i] > 0 then
|
||||
stack_size_slider:SetMinMaxValues(1, i)
|
||||
ii=i
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
ii = min(selected_item.max_stack, selected_item.aux_quantity)
|
||||
stack_size_slider:SetMinMaxValues(1, min(selected_item.max_stack, selected_item.aux_quantity))
|
||||
end
|
||||
|
||||
stack_size_slider:SetValue(math.random(1,ii))
|
||||
--stack_size_slider:SetValue(aux.huge)
|
||||
stack_size_slider:SetValue(1)
|
||||
--stack_size_slider:SetValue(1)
|
||||
quantity_update(true)
|
||||
|
||||
unit_start_price_input:SetText(money.to_string(settings.start_price, true, nil, nil, true))
|
||||
|
||||
@@ -323,7 +323,7 @@ function set_filter_display_offset(x_offset, y_offset)
|
||||
end
|
||||
|
||||
function initialize_filter_dropdown()
|
||||
for _, filter in ipairs(T.temp-T.list('and', 'or', 'not', 'price', 'profit', 'vendor-profit', 'disenchant-profit', 'percent', 'bid-price', 'bid-profit', 'bid-vendor-profit', 'bid-disenchant-profit', 'bid-percent', 'item', 'tooltip', 'min-level', 'max-level', 'rarity', 'left', 'utilizable', 'seller')) do
|
||||
for _, filter in ipairs(T.temp-T.list('and', 'or', 'not', 'price', 'profit', 'vendor-profit', 'disenchant-profit', 'percent', 'disenchant-percent', 'bid-price', 'bid-profit', 'bid-vendor-profit', 'bid-disenchant-profit', 'bid-percent', 'bid-disenchant-percent', 'item', 'tooltip', 'min-level', 'max-level', 'rarity', 'left', 'utilizable', 'seller')) do
|
||||
UIDropDownMenu_AddButton(T.map(
|
||||
'text', filter,
|
||||
'value', filter,
|
||||
|
||||
@@ -110,6 +110,16 @@ M.filters = {
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
['bid-disenchant-percent'] = {
|
||||
input_type = 'number',
|
||||
validator = function(pct)
|
||||
return function(auction_record)
|
||||
return disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id)
|
||||
and auction_record.unit_bid_price / disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id) * 100 <= pct
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
['percent'] = {
|
||||
input_type = 'number',
|
||||
@@ -121,6 +131,17 @@ M.filters = {
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
['disenchant-percent'] = {
|
||||
input_type = 'number',
|
||||
validator = function(pct)
|
||||
return function(auction_record)
|
||||
return auction_record.unit_buyout_price > 0
|
||||
and disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id)
|
||||
and auction_record.unit_buyout_price / disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id) * 100 <= pct
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
['bid-profit'] = {
|
||||
input_type = 'money',
|
||||
@@ -144,8 +165,8 @@ M.filters = {
|
||||
input_type = 'money',
|
||||
validator = function(amount)
|
||||
return function(auction_record)
|
||||
local disenchant_value = disenchant.value(auction_record.slot, auction_record.quality, auction_record.level)
|
||||
return disenchant_value and disenchant_value - auction_record.bid_price >= amount
|
||||
local disenchant_value = disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id)
|
||||
return disenchant_value and disenchant_value - auction_record.bid_price >= amount
|
||||
end
|
||||
end
|
||||
},
|
||||
@@ -154,8 +175,8 @@ M.filters = {
|
||||
input_type = 'money',
|
||||
validator = function(amount)
|
||||
return function(auction_record)
|
||||
local disenchant_value = disenchant.value(auction_record.slot, auction_record.quality, auction_record.level)
|
||||
return auction_record.buyout_price > 0 and disenchant_value and disenchant_value - auction_record.buyout_price >= amount
|
||||
local disenchant_value = disenchant.value(auction_record.slot, auction_record.quality, auction_record.level, auction_record.item_id)
|
||||
return auction_record.buyout_price > 0 and disenchant_value and disenchant_value - auction_record.buyout_price >= amount
|
||||
end
|
||||
end
|
||||
},
|
||||
@@ -165,6 +186,16 @@ M.filters = {
|
||||
validator = function(amount)
|
||||
return function(auction_record)
|
||||
local vendor_price = info.merchant_info(auction_record.item_id)
|
||||
if not vendor_price then
|
||||
vendor_price = ShaguTweaks.SellValueDB[auction_record.item_id]
|
||||
if vendor_price then
|
||||
local charges = 1
|
||||
if info.max_item_charges(auction_record.item_id) ~= nil then
|
||||
info.charges=info.max_item_charges(auction_record.item_id)
|
||||
end
|
||||
vendor_price= vendor_price/ charges
|
||||
end
|
||||
end
|
||||
return vendor_price and vendor_price * auction_record.aux_quantity - auction_record.bid_price >= amount
|
||||
end
|
||||
end
|
||||
@@ -175,6 +206,16 @@ M.filters = {
|
||||
validator = function(amount)
|
||||
return function(auction_record)
|
||||
local vendor_price = info.merchant_info(auction_record.item_id)
|
||||
if not vendor_price then
|
||||
vendor_price = ShaguTweaks.SellValueDB[auction_record.item_id]
|
||||
if vendor_price then
|
||||
local charges = 1
|
||||
if info.max_item_charges(auction_record.item_id) ~= nil then
|
||||
info.charges=info.max_item_charges(auction_record.item_id)
|
||||
end
|
||||
vendor_price= vendor_price/ charges
|
||||
end
|
||||
end
|
||||
return auction_record.buyout_price > 0 and vendor_price and vendor_price * auction_record.aux_quantity - auction_record.buyout_price >= amount
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user