some more improvements

see readme_geojak for changelist compared to the main aux branch
This commit is contained in:
geojak
2022-03-27 15:07:52 +02:00
committed by GitHub
parent 4517dae952
commit 70611ba356
9 changed files with 144 additions and 40 deletions
+8 -1
View File
@@ -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
View File
@@ -1,5 +1,6 @@
## Interface: 11200
## Author: shirsig
## OptionalDeps: ShaguTweaks
## Title: aux
## Notes: Auction House replacement
## SavedVariables: aux
+14 -5
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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)
+9 -2
View File
@@ -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
+6 -2
View File
@@ -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))
+1 -1
View File
@@ -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,
+45 -4
View File
@@ -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