fix(seller): stop price override items from bypassing every filter - #35
Merged
Merged
Conversation
InitializeBins() is where the bind, class, level, quality, disabled item and whitelist filters are applied, and it feeds the per-quality bins. The price override map is loaded separately by LoadPriceOverrides() with no filtering at all, and GetItemsToSell() builds its two priority blocks straight from that map. Sell() then only checks the per-item count cap, that a prototype exists and that the quality is in range - so any item holding a row in mod_auctionhousebot_priceOverride got listed no matter what the filters said. That is how bind on pickup gear (Twin Blades of Azzinoth) reached the auction house while AuctionHouseBot.Bind_When_Picked_Up was 0, and it also meant rows added to mod_auctionhousebot_disabled_items had no effect on any item that had a price override. InitializeBins() now records every item that passed its tests in SellableItems, and the two priority blocks skip anything that is not in it. A price override is a price, not a permission to sell. The bin-sourced blocks were always filtered and are unchanged.
This was referenced Aug 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reported: Twin Blades of Azzinoth (bind on pickup) showed up in the auction house. No BoP item should ever be listed.
Root cause
The seller has two independent sources of items, and only one of them is filtered.
AHBConfig::InitializeBins()applies every filter — bind type, class, level, req level/skill, vendor/loot/other, conjured/gems/keys/lootable,mod_auctionhousebot_disabled_items,SellerWhiteList— and puts the survivors into the per-quality bins.AHBConfig::LoadPriceOverrides()loadsmod_auctionhousebot_priceOverrideraw, with no filtering whatsoever.GetItemsToSell()builds its two priority blocks by iteratingconfig->itemPriceOverridesdirectly, so those items never went through the bins.Sell()the only gates on such a pick are the per-item count cap, "does a prototype exist", andQuality > AHB_MAX_QUALITY. No bind check. No disabled-items check. No whitelist check.Net effect: a row in the price override table was an unconditional licence to list the item. With ~11.5k override rows, that is a wide hole.
Two consequences worth calling out:
AuctionHouseBot.Bind_When_Picked_Up = 0was silently ignored for every override item — the reported BoP weapon.mod_auctionhousebot_disabled_itemsdid nothing for any item that also has a price override, so blacklisting alone could not fix it.Fix
InitializeBins()now records every item that passed its tests in a newSellableItemsset (the union of the bins — one insert at the point an item is accepted), and both priority blocks skip anything that is not in it:A price override is a price, not a permission to sell. Blocks 3 and 4 are bin-sourced and were always filtered — unchanged. Every filter now applies uniformly, and the disabled-items blacklist becomes effective on the override path too.
Verification
itemPriceOverrides(GetPriceOverrideForItem()is pricing only).Bind_*overrides, so LIVE runs the.distdefaultBind_When_Picked_Up = 0— BoP was supposed to be excluded already.core-buildworkflow on this PR.To see the scale of what was leaking on the realm:
Everything that query returns is what the bot could previously list and can no longer list.
Cleanup after merge
Auctions already listed are unaffected by this change — they stay until they expire or sell.
.ahbotoptions ahexpire <ahMapID>clears the bot's existing auctions if you want the BoP gear gone immediately rather than in up to 24 hours.