From 6a8e224040714ff0da80fd0997981c3d768ecb6d Mon Sep 17 00:00:00 2001 From: Manuel Simon Hirsig Date: Sun, 1 Nov 2015 18:29:47 +0100 Subject: [PATCH] some finishing touches for the full new ui release --- Aux-AddOn.toc | 2 +- completion.lua | 2 - core.lua | 48 +++--- core.xml | 8 +- filter_search_frame.lua | 178 +++++++++++--------- filter_search_frame.xml | 14 +- info.lua | 221 +++++++++++++----------- item_search_frame.lua | 238 ++++++++++++++------------ item_search_frame.xml | 16 +- list.lua | 10 +- manage_frame.lua | 360 ++++++++++++++++++++++++++++++---------- manage_frame.xml | 93 ++--------- post.lua | 13 +- post_frame.lua | 166 ++++++++---------- scan.lua | 20 ++- scan_frame.lua | 7 +- stack.lua | 116 ++++++------- 17 files changed, 841 insertions(+), 671 deletions(-) diff --git a/Aux-AddOn.toc b/Aux-AddOn.toc index 1d4be85..1951725 100644 --- a/Aux-AddOn.toc +++ b/Aux-AddOn.toc @@ -2,7 +2,7 @@ ## Title: Aux ## Notes: A lightweight addon designed to help manage auctions ## SavedVariablesPerCharacter: AUX_SELL_SHORTCUT, AUX_BUY_SHORTCUT, AUX_OPEN_SELL, AUX_OPEN_BUY, AUX_INSTANT_BUYOUT, AUX_AUCTION_DURATION -## SavedVariables: aux_database, aux_auctionable_items +## SavedVariables: aux_database, aux_recently_searched, aux_auctionable_items core.xml control.xml diff --git a/completion.lua b/completion.lua index f2437a5..571b818 100644 --- a/completion.lua +++ b/completion.lua @@ -239,7 +239,6 @@ function Aux.completion.selector(edit_box) if getn(suggestions) > 0 then index = math.mod(index, getn(suggestions)) + 1 update_highlighting() - Aux.item_search_frame.set_item(suggestions[index].value) end end @@ -248,7 +247,6 @@ function Aux.completion.selector(edit_box) if getn(suggestions) > 0 then index = index > 1 and index - 1 or getn(suggestions) update_highlighting() - Aux.item_search_frame.set_item(suggestions[index].value) end end diff --git a/core.lua b/core.lua index bf95925..2bf887e 100644 --- a/core.lua +++ b/core.lua @@ -1,4 +1,4 @@ -AuxVersion = "2.0.0" +AuxVersion = "2.1.0" AuxAuthors = "shirsig; Zerf; Zirco (Auctionator); Nimeral (Auctionator backport)" local lastRightClickAction = GetTime() @@ -226,25 +226,19 @@ end function Aux_ContainerFrameItemButton_OnClick(button) local bag, slot = this:GetParent():GetID(), this:GetID() - local container_item = Aux.info.container_item(bag, slot) + local container_item_info = Aux.info.container_item(bag, slot) --- if AuctionFrame:IsVisible() and button == "LeftButton" and container_item then --- --- if IsShiftKeyDown() --- and not ChatFrameEditBox:IsVisible() --- and AuxBuyFrame:IsVisible() --- then --- AuxBuyNameInputBox.completor.set_quietly(container_item.name) --- return --- elseif AUX_BUY_SHORTCUT and IsAltKeyDown() then --- if not AuxBuyFrame:IsVisible() then --- Aux.on_tab_click(1) --- end --- AuxBuyNameInputBox.completor.set_quietly(container_item.name) --- Aux.filter_search_frame.start_search() --- return --- end --- end + if AuxFrame:IsVisible() and button == "LeftButton" and container_item_info then + if IsAltKeyDown() then + if not AuxItemSearchFrame:IsVisible() then + Aux.on_tab_click(1) + end + AuxItemSearchFrameItemItemInputBox:Hide() + Aux.item_search_frame.set_item(container_item_info.item_id) + return + end + end + return Aux.orig.ContainerFrameItemButton_OnClick(button) end @@ -266,4 +260,20 @@ end function Aux.auction_signature(hyperlink, stack_size, amount) return hyperlink .. (stack_size or '0') .. '_' .. (amount or '0') +end + +function Aux.item_class_index(item_class) + for i, class in ipairs({ GetAuctionItemClasses() }) do + if class == item_class then + return i + end + end +end + +function Aux.item_subclass_index(class_index, item_subclass) + for i, subclass in ipairs({ GetAuctionItemSubClasses(class_index) }) do + if subclass == item_subclass then + return i + end + end end \ No newline at end of file diff --git a/core.xml b/core.xml index d989b40..6037c02 100644 --- a/core.xml +++ b/core.xml @@ -322,12 +322,12 @@ - if this.tooltip then - Aux.info.set_game_tooltip(this, this.tooltip, 'ANCHOR_LEFT', this.EnhTooltip_info) + if this.itemstring then + Aux.info.set_tooltip(this.itemstring, this.EnhTooltip_info, this, 'ANCHOR_LEFT') end - if this.tooltip then + if this.itemstring then AuxTooltip:Hide() end @@ -384,7 +384,7 @@ - - - - - @@ -140,11 +76,11 @@ local config = Aux.manage_frame.auction_listing_config local sort_order = Aux.util.map(config.sort_order, function(column_order) return { column = config.columns[column_order.column], sort_ascending = column_order.order == 'ascending' } end) - this.sheet = Aux.sheet.create(this, config.columns, sort_order, config.row_setter, config.on_row_click, config.on_row_enter, config.on_row_leave) + this.sheet = Aux.sheet.create(this, config.columns, sort_order, config.row_setter, config.on_row_click, config.on_row_enter, config.on_row_leave, config.on_row_update) - + @@ -154,14 +90,21 @@ - - + + + + + + + + + - + @@ -171,7 +114,7 @@ - + SmallMoneyFrame_OnLoad() @@ -188,19 +131,19 @@ diff --git a/post.lua b/post.lua index b24df92..9431ab6 100644 --- a/post.lua +++ b/post.lua @@ -1,6 +1,5 @@ -Aux.post = { - orig = {} -} +local private, public = {}, {} +Aux.post = public local controller = (function() local controller @@ -20,7 +19,7 @@ function process() local stack_slot Aux.stack.start( - state.name, + state.item_key, state.stack_size, function(slot) stacking_complete = true @@ -43,7 +42,7 @@ function process() end end -function Aux.post.stop(k) +function public.stop(k) Aux.control.on_next_update(function() stop() @@ -78,7 +77,7 @@ function post_auction(slot, k) controller().wait(function() return not GetContainerItemInfo(slot.bag, slot.bag_slot) end, k) end -function Aux.post.start(name, stack_size, duration, bid, buyout, count, callback) +function public.start(item_key, stack_size, duration, bid, buyout, count, callback) Aux.control.on_next_update(function() stop() @@ -87,7 +86,7 @@ function Aux.post.start(name, stack_size, duration, bid, buyout, count, callback ClearCursor() state = { - name = name, + item_key = item_key, stack_size = stack_size, duration = duration, bid = bid, diff --git a/post_frame.lua b/post_frame.lua index ac51339..920893d 100644 --- a/post_frame.lua +++ b/post_frame.lua @@ -1,6 +1,7 @@ -Aux.sell = {} +local private, public = {}, {} +Aux.sell = public -local auxSellEntries = {} +local existing_auctions = {} local inventory_data @@ -40,7 +41,7 @@ Aux.sell.inventory_listing_config = { columns = { { title = 'Qty', - width = 23, + width = 25, comparator = function(datum1, datum2) return Aux.util.compare(datum1.aux_quantity, datum2.aux_quantity, Aux.util.LT) end, cell_initializer = Aux.sheet.default_cell_initializer('RIGHT'), cell_setter = function(cell, datum) @@ -100,13 +101,13 @@ Aux.sell.auction_listing_config = { on_cell_leave = function (sheet, row_index, column_index) local data_index = row_index + FauxScrollFrame_GetOffset(sheet.scroll_frame) local datum = sheet.data[data_index] - if not (datum and current_auction and Aux.util.safe_index{auxSellEntries, current_auction.name, 'selected', 'key'} == datum.key) then + if not (datum and current_auction and Aux.util.safe_index{existing_auctions, current_auction.key, 'selected', 'key'} == datum.key) then sheet.rows[row_index].highlight:SetAlpha(0) end end, row_setter = function(row, datum) - if datum and current_auction and Aux.util.safe_index{auxSellEntries, current_auction.name, 'selected', 'key'} == datum.key then + if datum and current_auction and Aux.util.safe_index{existing_auctions, current_auction.key, 'selected', 'key'} == datum.key then row.highlight:SetAlpha(.5) else row.highlight:SetAlpha(0) @@ -153,11 +154,11 @@ Aux.sell.auction_listing_config = { }, { title = 'Qty', - width = 23, + width = 25, comparator = function(row1, row2) return Aux.util.compare(row1.stack_size, row2.stack_size, Aux.util.LT) end, cell_initializer = Aux.sheet.default_cell_initializer('RIGHT'), cell_setter = function(cell, row) - cell.text:SetText(row.stack_size) + cell.text:SetText(row.stack_size == get_stack_size_slider_value() and GREEN_FONT_COLOR_CODE..row.stack_size..FONT_COLOR_CODE_CLOSE or row.stack_size) end, }, { @@ -178,11 +179,12 @@ function update_inventory_listing() end function update_auction_listing() - Aux.list.populate(AuxSellAuctionsListing.sheet, current_auction and auxSellEntries[current_auction.name] or {}) + Aux.list.populate(AuxSellAuctionsListing.sheet, current_auction and existing_auctions[current_auction.key] or {}) end function Aux.sell.on_open() MoneyFrame_Update('AuxSellParametersDepositMoneyFrame', 0) + AuxSellInventory:SetWidth(AuxSellInventoryListing:GetWidth() + 40) AuxSellAuctions:SetWidth(AuxSellAuctionsListing:GetWidth() + 40) AuxFrame:SetWidth(AuxSellInventory:GetWidth() + AuxSellParameters:GetWidth() + AuxSellAuctions:GetWidth() + 15) @@ -247,7 +249,7 @@ end function Aux.sell.post_auctions() if current_auction then - local name, hyperlink, stack_size, buyout_price, stack_count = current_auction.name, current_auction.hyperlink, get_stack_size_slider_value(), MoneyInputFrame_GetCopper(AuxSellParametersBuyoutPrice), AuxSellStackCountSlider:GetValue() + local key, hyperlink, stack_size, buyout_price, stack_count = current_auction.key, current_auction.hyperlink, get_stack_size_slider_value(), MoneyInputFrame_GetCopper(AuxSellParametersBuyoutPrice), AuxSellStackCountSlider:GetValue() local duration if AuctionFrameAuctions.duration == 120 then duration = 2 @@ -258,7 +260,7 @@ function Aux.sell.post_auctions() end Aux.post.start( - name, + key, stack_size, AuctionFrameAuctions.duration, MoneyInputFrame_GetCopper(AuxSellParametersStartPrice), @@ -266,12 +268,12 @@ function Aux.sell.post_auctions() stack_count, function(posted) for i = 1, posted do - record_auction(name, stack_size, buyout_price, duration, UnitName("player")) + record_auction(key, stack_size, buyout_price, duration, UnitName("player")) end - if auxSellEntries[name] then - for _, entry in ipairs(auxSellEntries[name]) do + if existing_auctions[key] then + for _, entry in ipairs(existing_auctions[key]) do if entry.buyout_price == buyout_price and entry.stack_size == stack_size then - auxSellEntries[name].selected = entry + existing_auctions[key].selected = entry end end end @@ -285,13 +287,13 @@ function Aux.sell.post_auctions() end function select_entry() - if current_auction and auxSellEntries[current_auction.name] and not auxSellEntries[current_auction.name].selected then + if current_auction and existing_auctions[current_auction.key] and not existing_auctions[current_auction.key].selected then local bestPrice = {} -- a table with one entry per stack_size that is the cheapest auction for that particular stack_size local absoluteBest -- the overall cheapest auction ----- find the best price per stacksize and overall ----- - for _, auction_datum in ipairs(auxSellEntries[current_auction.name]) do + for _, auction_datum in ipairs(existing_auctions[current_auction.key]) do if not bestPrice[auction_datum.stack_size] or bestPrice[auction_datum.stack_size].unit_buyout_price >= auction_datum.unit_buyout_price then bestPrice[auction_datum.stack_size] = auction_datum end @@ -301,10 +303,10 @@ function select_entry() end end - auxSellEntries[current_auction.name].selected = absoluteBest + existing_auctions[current_auction.key].selected = absoluteBest if bestPrice[get_stack_size_slider_value()] then - auxSellEntries[current_auction.name].selected = bestPrice[get_stack_size_slider_value()] + existing_auctions[current_auction.key].selected = bestPrice[get_stack_size_slider_value()] bestPriceOurStackSize = bestPrice[get_stack_size_slider_value()] end end @@ -374,21 +376,21 @@ function update_recommendation() -- TODO neutral AH deposit formula MoneyFrame_Update('AuxSellParametersDepositMoneyFrame', floor(current_auction.unit_vendor_price * 0.05 * (current_auction.charges and 1 or get_stack_size_slider_value())) * AuxSellStackCountSlider:GetValue() * AuctionFrameAuctions.duration / 120) - if auxSellEntries[current_auction.name] and auxSellEntries[current_auction.name].selected then - if not auxSellEntries[current_auction.name].created or GetTime() - auxSellEntries[current_auction.name].created > 1800 then + if existing_auctions[current_auction.key] and existing_auctions[current_auction.key].selected then + if not existing_auctions[current_auction.key].created or GetTime() - existing_auctions[current_auction.key].created > 1800 then AuxSellParametersStrategyDropDownStaleWarning:SetText('Stale data!') -- data older than half an hour marked as stale end - local new_buyout_price = auxSellEntries[current_auction.name].selected.unit_buyout_price * get_stack_size_slider_value() + local new_buyout_price = existing_auctions[current_auction.key].selected.unit_buyout_price * get_stack_size_slider_value() - if auxSellEntries[current_auction.name].selected.yours == 0 then + if existing_auctions[current_auction.key].selected.yours == 0 then new_buyout_price = undercut(new_buyout_price) end local new_start_price = new_buyout_price * 0.95 - - MoneyInputFrame_SetCopper(AuxSellParametersBuyoutPrice, Aux_Round(new_buyout_price)) - MoneyInputFrame_SetCopper(AuxSellParametersStartPrice, Aux_Round(new_start_price)) + + MoneyInputFrame_SetCopper(AuxSellParametersStartPrice, max(1, Aux_Round(new_start_price))) + MoneyInputFrame_SetCopper(AuxSellParametersBuyoutPrice, max(1, Aux_Round(new_buyout_price))) -- elseif UIDropDownMenu_GetSelectedValue(AuxSellParametersStrategyDropDown) == HISTORICAL then -- local market_price = Aux.history.get_price_suggestion(current_auction.key, current_auction.aux_quantity) -- MoneyInputFrame_SetCopper(AuxSellParametersBuyoutPrice, Aux_Round(market_price * 0.95)) @@ -406,18 +408,15 @@ function Aux.sell.quantity_update() end select_entry() update_recommendation() + update_auction_listing() end ------------------------------------------ - function Aux.sell.clear_auction() current_auction = nil select_entry() update_recommendation() end ------------------------------------------ - function set_auction(auction_candidate) PlaySound("igMainMenuOptionCheckBoxOn") @@ -436,7 +435,7 @@ function set_auction(auction_candidate) Aux.sell.quantity_update() AuxSellStackCountSlider:SetValue(current_auction.aux_quantity) -- reduced to max possible - if not auxSellEntries[current_auction.name] then + if not existing_auctions[current_auction.key] then refresh_entries() end @@ -495,11 +494,15 @@ function update_inventory_data() end) if auction_sell_item then - if not auction_candidate_map[item_info.item_signature] then + if not auction_candidate_map[item_info.item_key] then - auction_candidate_map[item_info.item_signature] = { - key = item_info.item_signature, + auction_candidate_map[item_info.item_key] = { + item_id = item_info.item_id, + suffix_id = item_info.suffix_id, + + key = item_info.item_key, hyperlink = item_info.hyperlink, + name = item_info.name, texture = item_info.texture, quality = item_info.quality, @@ -512,7 +515,7 @@ function update_inventory_data() availability = { [charge_class]=item_info.count }, } else - local candidate = auction_candidate_map[item_info.item_signature] + local candidate = auction_candidate_map[item_info.item_key] candidate.availability[charge_class] = (candidate.availability[charge_class] or 0) + item_info.count candidate.aux_quantity = candidate.aux_quantity + (item_info.charges or item_info.count) end @@ -537,43 +540,50 @@ end function refresh_entries() if current_auction then - local name, class, subclass = current_auction.name, current_auction.class, current_auction.subclass - - auxSellEntries[name] = nil - - class, subclass = GetItemInfo(name) + local item_id, suffix_id = current_auction.item_id, current_auction.suffix_id + local item_key = item_id..':'..suffix_id + local item_info = Aux.info.item(item_id, suffix_id) - -- local class_index = item_class_index(current_auction.class) - -- local subclass_index = item_subclass_index(class_index, current_auction.subclass) + existing_auctions[item_key] = nil + + + local class_index = Aux.item_class_index(item_info.class) + local subclass_index = Aux.item_subclass_index(class_index, item_info.subclass) + + local search_query = { + name = Aux.info.item(item_id).name, -- blizzard doesn't support queries with name suffixes + min_level = item_info.level, + min_level = item_info.level, + slot = item_info.slot, + class = class_index, + subclass = subclass_index, + quality = item_info.quality, + usable = item_info.usable, + } Aux.log('Scanning auctions ...') Aux.scan.start{ - query = { - name = name, - class = class_index, - subclass = subclass_index, - }, + query = search_query, page = 0, on_page_loaded = function(page, total_pages) Aux.log('Scanning page '..(page + 1)..' out of '..total_pages..' ...') end, - on_read_auction = function(i) - local auction_item = Aux.info.auction_item(i) - if auction_item and auction_item.name == name then - local aux_quantity = auction_item.charges or auction_item.count - record_auction(auction_item.name, aux_quantity, auction_item.buyout_price, auction_item.duration, auction_item.owner) + on_read_auction = function(auction_info) + if auction_info.name == item_info.name then + local aux_quantity = auction_info.charges or auction_info.count + record_auction(auction_info.item_key, aux_quantity, auction_info.buyout_price, auction_info.duration, auction_info.owner) end end, on_abort = function() - auxSellEntries[name] = nil + existing_auctions[item_key] = nil Aux.log('Scan aborted.') end, on_complete = function() - auxSellEntries[name] = auxSellEntries[name] or { created = GetTime() } + existing_auctions[item_key] = existing_auctions[item_key] or { created = GetTime() } select_entry() update_recommendation() update_auction_listing() - Aux.log('Scan complete: '..getn(auxSellEntries[name])..' '..Aux_PluralizeIf('auction', getn(auxSellEntries[name]))..' of '..current_auction.hyperlink..' found.') + Aux.log('Scan complete: '..getn(existing_auctions[item_key])..' '..Aux_PluralizeIf('auction', getn(existing_auctions[item_key]))..' of '..current_auction.hyperlink..' found.') end, next_page = function(page, total_pages) local last_page = max(total_pages - 1, 0) @@ -587,7 +597,7 @@ end function AuxSellEntry_OnClick(entry) - auxSellEntries[current_auction.name].selected = entry + existing_auctions[current_auction.key].selected = entry update_auction_listing() update_recommendation() @@ -604,21 +614,11 @@ function AuxSellParametersRefreshButton_OnClick() end) end ------------------------------------------ - -function AuxMoneyFrame_OnLoad() - this.small = 1 - SmallMoneyFrame_OnLoad() - MoneyFrame_SetType("AUCTION") -end - ------------------------------------------ - -function record_auction(name, aux_quantity, buyout_price, duration, owner) +function record_auction(key, aux_quantity, buyout_price, duration, owner) if buyout_price > 0 then - auxSellEntries[name] = auxSellEntries[name] or { created = GetTime() } + existing_auctions[key] = existing_auctions[key] or { created = GetTime() } local entry - for _, existingEntry in ipairs(auxSellEntries[name]) do + for _, existingEntry in ipairs(existing_auctions[key]) do if existingEntry.buyout_price == buyout_price and existingEntry.stack_size == aux_quantity then entry = existingEntry end @@ -638,45 +638,23 @@ function record_auction(name, aux_quantity, buyout_price, duration, owner) count = 1, yours = owner == UnitName("player") and 1 or 0, } - tinsert(auxSellEntries[name], entry) - table.sort(auxSellEntries[name], function(a,b) return a.unit_buyout_price < b.unit_buyout_price end) + tinsert(existing_auctions[key], entry) + table.sort(existing_auctions[key], function(a,b) return a.unit_buyout_price < b.unit_buyout_price end) end end end ------------------------------------------ - function undercut(price) return math.max(0, price - 1) end ------------------------------------------ - --- function item_class_index(item_class) - -- for i, class in ipairs({ GetAuctionItemClasses() }) do - -- if class == item_class then - -- return i - -- end - -- end --- end - --- ----------------------------------------- - --- function item_subclass_index(class_index, item_subclass) - -- for i, subclass in ipairs({ GetAuctionItemSubClasses(class_index) }) do - -- if subclass == item_subclass then - -- return i - -- end - -- end --- end - -function report(hyperlink, stack_size, buyout_price, posted) +function report(hyperlink, aux_quantity, buyout_price, posted) Aux.log(string.format( '%i %s of %s x %i posted at %s.', posted, Aux_PluralizeIf('auction', posted), hyperlink, - stack_size, + aux_quantity, Aux.util.money_string(buyout_price) )) end diff --git a/scan.lua b/scan.lua index 8ecee65..2b7f553 100644 --- a/scan.lua +++ b/scan.lua @@ -1,4 +1,5 @@ -Aux.scan = {} +local private , public = {}, {} +Aux.scan = public local PAGE_SIZE = 50 @@ -70,8 +71,8 @@ function wait_for_owner_data(k) return controller().wait(function() local count, _ = GetNumAuctionItems(state.job.type) for i=1,count do - local auction_item_info = Aux.info.auction_item(i) - if auction_item_info and not auction_item_info.owner then + local auction_info = Aux.info.auction(i, state.job.type) + if auction_info and not auction_info.owner then return false end end @@ -128,15 +129,20 @@ function scan_auctions(count, k) end function scan_auctions_helper(i, n, k) - wait_for_callback{state.job.on_read_auction, i, function() - + local recurse = function() if i >= n then return k() else return scan_auctions_helper(i + 1, n, k) end - - end} + end + + local auction_info = Aux.info.auction(i, state.job.type) + if auction_info then + wait_for_callback{state.job.on_read_auction, auction_info, recurse} + else + recurse() + end end function submit_query(k) diff --git a/scan_frame.lua b/scan_frame.lua index 22c54d8..8139f4d 100644 --- a/scan_frame.lua +++ b/scan_frame.lua @@ -35,8 +35,8 @@ function Aux.history.start_scan() on_page_loaded = function(page, total_pages) Aux.log('Scanning page '..(page+1)..' out of '..total_pages..' ...') end, - on_read_auction = function(i) - process_auction(i) + on_read_auction = function(auction_info) + process_auction(auction_info) end, on_complete = function() process_scanned_auctions() @@ -82,8 +82,7 @@ function Aux.history.stop_scan() Aux.scan.abort() end -function process_auction(index) - local auction_info = Aux.info.auction_item(index) +function process_auction(auction_info) local buyout_price = Aux.util.safe_index{auction_info, 'buyout_price'} if buyout_price and buyout_price > 0 then local aux_quantity = auction_info.charges or auction_info.count diff --git a/stack.lua b/stack.lua index 39420bf..8aa0456 100644 --- a/stack.lua +++ b/stack.lua @@ -1,4 +1,5 @@ -Aux.stack = {} +local private, public = {}, {} +Aux.stack = public local controller = (function() local controller @@ -10,19 +11,18 @@ end)() local state -local item_slots, find_empty_slot, locked, same_slot, move_item, item_name, stack_size, stop, process - -function item_slots(name) +function private.item_slots(item_key) local slots = Aux.util.inventory_iterator() return function() + local slot repeat slot = slots() - until slot == nil or item_name(slot) == name + until slot == nil or private.item_key(slot) == item_key return slot end end -function find_empty_slot() +function private.find_empty_slot() for slot in Aux.util.inventory_iterator() do if not GetContainerItemInfo(slot.bag, slot.bag_slot) then return slot @@ -30,106 +30,90 @@ function find_empty_slot() end end -function find_charges_item_slot(name, charges) - for slot in item_slots(name) do - if item_charges(slot) == charges then +function private.find_charges_item_slot(item_key, charges) + for slot in private.item_slots(item_key) do + if private.item_charges(slot) == charges then return slot end end end -function locked(slot) - local _, _, locked = GetContainerItemInfo(slog.bag, slot.bag_slot) - return locked -end - -function same_slot(slot1, slot2) - return slot1.bag == slot2.bag and slot1.bag_slot == slot2.bag_slot -end - -function move_item(from_slot, to_slot, amount, k) - local size_before = stack_size(to_slot) +function private.move_item(from_slot, to_slot, amount, k) + local size_before = private.stack_size(to_slot) - amount = min(max_stack(from_slot) - stack_size(to_slot), amount) + amount = min(private.max_stack(from_slot) - private.stack_size(to_slot), amount) ClearCursor() SplitContainerItem(from_slot.bag, from_slot.bag_slot, amount) PickupContainerItem(to_slot.bag, to_slot.bag_slot) - return controller().wait(function() return stack_size(to_slot) == size_before + amount end, k) + return controller().wait(function() return private.stack_size(to_slot) == size_before + amount end, k) end -function item_name(slot) +function private.item_key(slot) local container_item_info = Aux.info.container_item(slot.bag, slot.bag_slot) - return container_item_info and container_item_info.name + return container_item_info and container_item_info.item_key end -function item_id(slot) - local hyperlink = GetContainerItemLink(slot.bag, slot.bag_slot) - if hyperlink then - local _, _, id_string = strfind(hyperlink, "^.-:(%d*).*") - return tonumber(id_string) - end +function private.stack_size(slot) + local container_item_info = Aux.info.container_item(slot.bag, slot.bag_slot) + return container_item_info and container_item_info.count or 0 end -function stack_size(slot) - local _, item_count = GetContainerItemInfo(slot.bag, slot.bag_slot) - return item_count or 0 +function private.item_charges(slot) + local container_item_info = Aux.info.container_item(slot.bag, slot.bag_slot) + return container_item_info and container_item_info.charges end -function item_charges(slot) - return Aux.info.container_item(slot.bag, slot.bag_slot).charges -end +function private.process() -function process() - - if stack_size(state.target_slot) > state.target_size then - local empty_slot = find_empty_slot() + if private.stack_size(state.target_slot) > state.target_size then + local empty_slot = private.find_empty_slot() if empty_slot then - return move_item( + return private.move_item( state.target_slot, empty_slot, - stack_size(state.target_slot) - state.target_size, + private.stack_size(state.target_slot) - state.target_size, function() - return process() + return private.process() end) else local next_slot = state.other_slots() if next_slot then - return move_item( + return private.move_item( state.target_slot, next_slot, - stack_size(state.target_slot) - state.target_size, + private.stack_size(state.target_slot) - state.target_size, function() - return process() + return private.process() end) end end - elseif stack_size(state.target_slot) < state.target_size then + elseif private.stack_size(state.target_slot) < state.target_size then local next_slot = state.other_slots() if next_slot then - return move_item( + return private.move_item( next_slot, state.target_slot, - state.target_size - stack_size(state.target_slot), + state.target_size - private.stack_size(state.target_slot), function() - return process() + return private.process() end) end end - return stop() + return private.stop() end -function max_stack(slot) - local _, _, _, _, _, _, max_stack = GetItemInfo(item_id(slot)) - return max_stack +function private.max_stack(slot) + local container_item_info = Aux.info.container_item(slot.bag, slot.bag_slot) + return container_item_info and container_item_info.max_stack end -function Aux.stack.stop(k) +function public.stop(k) Aux.control.on_next_update(function() - stop() + private.stop() if k then return k() @@ -137,11 +121,11 @@ function Aux.stack.stop(k) end) end -function stop() +function private.stop() controller().reset() if state then local slot - if state.target_slot and (stack_size(state.target_slot) == state.target_size or item_charges(state.target_slot) == state.target_size) then + if state.target_slot and (private.stack_size(state.target_slot) == state.target_size or private.item_charges(state.target_slot) == state.target_size) then slot = state.target_slot end local callback = state.callback @@ -154,11 +138,11 @@ function stop() end end -function Aux.stack.start(name, size, callback) +function public.start(item_key, size, callback) Aux.control.on_next_update(function() - stop() + private.stop() - local slots = item_slots(name) + local slots = private.item_slots(item_key) local target_slot = slots() state = { @@ -169,12 +153,12 @@ function Aux.stack.start(name, size, callback) } if not target_slot then - return stop() - elseif item_charges(target_slot) then - state.target_slot = find_charges_item_slot(name, size) - return stop() + return private.stop() + elseif private.item_charges(target_slot) then + state.target_slot = private.find_charges_item_slot(item_key, size) + return private.stop() else - return process() + return private.process() end end) end \ No newline at end of file