Features
Detailed documentation of the QuickBuy Addon's feature set.
Real-Time Auction Purchasingโ
The addon never uses a static price list. When a player clicks a configured slot, the addon:
- Calls
AuctionManager.getActiveListings()for a live snapshot - Filters to listings matching the slot's material, currency, price cap, and enchantment requirements
- Sorts by price-per-unit (cheapest first), excluding the buyer's own listings
- Attempts
AuctionManager.buy()on the cheapest candidate โ the same code path as a normal auction purchase - If the targeted listing was just bought by someone else between the snapshot and the buy attempt, silently falls through to the next candidate instead of surfacing an error
This fallback chain means a busy auction house with concurrent buyers produces transparent, reliable results rather than failed clicks.
Dialog-Based Item Picker (1.21.6+ Java clients)โ
Configuring a slot on a modern Java client opens the Minecraft Dialog API โ a native, client-rendered UI surface introduced in 1.21.6, accessible via Paper's API from 1.21.7+.
Single-Screen Search + Scrollโ
The results screen embeds a search text box and the full material list on one screen:
- All shopable materials (1 000+) load at once in a single scrollable 3-column grid โ the client scrolls natively, so the server never re-pushes the dialog and the cursor never recentres between pages
- Typing in the search box and pressing Search filters the list server-side and re-renders the dialog with the filtered subset
Vanilla Sprite Iconsโ
Real item textures render inside each button label via Adventure's sprite object components (Component.object(ObjectContents.sprite(...))). The atlas is resolved against icons/valid-icon-sprites.txt, extracted directly from the 1.21.11 client jar โ so only textures that actually exist are requested (no missing-texture boxes). Items with no flat sprite (slabs, stairs, fences, doors โ anything rendered from a 3D block model) fall back to text-only.
No resource pack is required.
Sprite icons are an Adventure "object" component, which only exists from 1.21.9. The addon shows them only when the client's real protocol is 773 (1.21.9) or higher, the server is 1.21.9 or higher, and the server's Adventure has the class. The client version is read through ViaVersion when it is installed, so an old client joining a new server through ViaBackwards is recognised correctly. A 1.21.6โ1.21.8 client still gets the Dialog picker, with plain text labels instead of icons.
Enchantment Requirement Pickerโ
For enchantable materials, the picker advances to an enchantment requirement dialog with one SingleOption dropdown per applicable enchantment:
- Options: None, I, II, III, ... (up to the enchantment's max level)
- Defaults to None (no requirement) โ players only configure the enchantments they care about
- Selecting at least one level means purchased items must carry that enchantment at or above the chosen level
Delete with Confirmationโ
When reconfiguring an existing slot, a "Delete Slot" button appears in the material picker. Clicking it opens a separate confirmation dialog before removing the slot's configuration.
Automatic Client Fallbackโ
The addon detects clients that cannot render Dialogs and automatically routes them to the chest-GUI fallback picker โ no manual command or player choice involved.
Detection logic:
- If Floodgate is installed and the player is a Bedrock client (
FloodgateApi.isFloodgatePlayer(uuid)), use fallback - If ViaVersion is installed, read the real client protocol via
ViaAPI.getPlayerVersion(uuid). If below 771 (pre-1.21.6), use fallback - If ViaVersion is not installed, read the Bukkit-reported protocol. Note: with ViaBackwards, this may report the server's own protocol rather than the client's real version โ installing ViaVersion is recommended for accurate detection
- Anything that cannot be determined is treated as "too old", which safely selects the chest picker
Chest-GUI Fallback Pickerโ
The fallback picker is a fully independent implementation โ it shares no code with the Dialog flow.
Material Selectionโ
- Paginated chest GUI (36 slots per page) showing every item the auction accepts (not spawn eggs, command blocks, barriers or anything else on the auction blacklist)
- Each item rendered as its real Minecraft icon with an
&eformatted display name - Search button closes the GUI, prompts in chat (type a name,
allto clear,cancelto abort), then reopens the filtered list. A search with no results says so in chat - Only plain clicks are needed anywhere, so Bedrock touch and controller players can use every button
Enchantment Selectionโ
- If the selected material is enchantable, opens a second chest GUI showing applicable enchantments as books
- A plain click cycles the level: none โ I โ II โ โฆ โ max โ none, so a tap alone can raise, and finally clear, a selection (Bedrock has no right-click or shift-click)
- Java shortcuts remain: right-click lowers the level and shift-click removes it
- Enchanted book icon (glowing) for set enchantments, plain book for unset
Deleting a Slotโ
- When reconfiguring an existing slot, a delete button appears. The first click arms it (it turns red and says "Click again to delete"); a second click deletes the slot. Clicking anything else disarms it
- Shift-click still deletes in one go for Java players
Price Inputโ
- After enchantment selection (or directly for non-enchantable items), the GUI closes and the player is prompted in chat
- A title/subtitle overlay (
&6Enter Price/Max price you wish to buy {item} for) stays on screen while the player types, so the instruction doesn't scroll away in chat - Chat cannot send an empty message, so type
none(orunlimited, or-) for no price limit; typecancelto abort - Prompts give up after 60 seconds (the overlay is cleared, and the player is returned to the item list for a search or to the shop for a price) so a player is never left with their chat swallowed. Running
/quickbuyor reopening the picker also cancels a pending prompt
Edit Modeโ
Editing a configured slot used to need Shift-click, which Bedrock does not have. Edit mode does the same thing with plain clicks, for every client:
- Turn it on with the lever in the shop's last slot (shown only when that slot is locked for the player, so it never uses up a shop slot) or with
/quickbuy edit - While it is on, clicking a configured slot opens the item picker for that slot instead of buying
- Configured slots show a short "Click to edit this slot" line in place of the usual edit hint
- It is one-shot: it turns off when the shop is closed or when a slot editor is opened
Price Inputโ
The Dialog price box and the chat prompt share one parser:
| You type | Result |
|---|---|
1500, 12.5, 0.01 | That price per item |
1,500, 1,234,567 | Thousands separators are understood |
12,5 | A comma decimal is understood |
10k, 2.5m, 1b, 1t | Thousand / million / billion / trillion suffixes |
$250 | A leading $ is ignored |
empty, none, no limit, unlimited, - | No limit |
0, negatives, NaN, Infinity, 1e3, text | Rejected with the invalid-price message |
Prices above 1e15 are rejected. Earlier versions accepted NaN, saved it, and then silently dropped the slot on the next restart.
Permission-Based Slot Allotmentsโ
The number of usable slots is determined per-player based on permissions:
slot-permissions.default-slotsapplies to players with no matching overrideslot-permissions.overridesdefines a list of{permission, limit}pairs- If a player matches multiple overrides, the highest limit wins โ never the first match, never summed
- This mirrors the conflict resolution used by the core plugin's own order-limit permissions
Slots beyond the player's allotment are displayed as locked red glass panes and cannot be interacted with.
Optional Price Capโ
Each slot can be configured with or without a price cap:
- With cap: only listings priced at or below
capper item are considered - Without cap: the cheapest listing is purchased regardless of price โ shown as "No Limit" in the slot's lore
- The price is per individual item, not per listing stack โ a listing of 64 diamonds at 6400 total has a per-unit price of 100
Enchantment Requirement Matchingโ
A slot's required enchantments filter the candidate listing set:
- For regular items:
ItemStack.getEnchantments()is checked - For enchanted books:
EnchantmentStorageMeta.getStoredEnchants()is checked - The listing's actual enchantment level must be โฅ the required minimum โ higher is fine, exact match is not required
- All required enchantments must be present simultaneously; partial matches don't qualify
- The enchantment step offers every enchantment for enchanted books (vanilla's anvil accepts any of them), and lists enchantments from the enchantment registry, so custom and datapack enchantments appear too
Custom enchantments and missing enchantmentsโ
Requirements are saved with the full namespaced key (for example minecraft:sharpness or myplugin:vein_miner), so custom enchantments survive a restart. If a saved requirement cannot be found when the shop loads (its plugin was removed, for example):
- The slot is kept, not deleted, and the requirement is written back unchanged
- The slot never buys until the enchantment exists again โ dropping the requirement would make it buy unenchanted items
- Its lore shows a red "Unknown enchantment" line, and a warning is logged
Manifest-Based Version Policyโ
Like the other Sigma Orders addons, the QuickBuy Addon fetches a small JSON manifest from GitHub on every startup:
- Checks Java version, Minecraft version, and plugin version against configured rules
- A
blockrule disables the plugin (e.g. incompatible Java, a known-bad build) - A
warnrule logs a warning but lets the plugin continue - An
inforule for update availability triggers a delayed async log warning 1 second after startup so it appears after all other startup messages - The manifest is cached locally (
manifests/policy-cache.json) โ if GitHub is unreachable, the last successful manifest is used instead
Resilienceโ
- Concurrent purchase safety โ a structural re-entrancy guard (
ConcurrentHashMapprocessing set) prevents a single player's purchase from being processed twice before the first attempt finishes - Stale GUI prevention โ the shop GUI refreshes its lore immediately after every purchase attempt, so the displayed availability and price are always current
- AuctionManager reconnect โ if
SigmaOrders-Auctionreloads, the addon listens forPluginEnableEventand re-acquires a freshAuctionManagerreference automatically - Session cleanup โ all in-flight picker state (editing slot, pending material, pending enchantments, awaiting chat) is cleared on player quit so nothing accumulates for players who disconnect mid-flow
- No items lost to the GUI โ clicks are cancelled and so are drags, so a held stack can no longer be dragged into the shop or picker slots (where it used to vanish when the GUI closed)
- Inventory identity โ the shop and picker screens are identified by an inventory holder object, not by title, so an unrelated container that happens to be named "Quick Buy" or "Choose an Item" is never touched
- Safe saving โ a shop is written to a temporary file under a per-player lock and then moved into place, so two quick saves can no longer corrupt the file
- Picker only offers what can fill โ the item list is filtered through the auction's own allowed-item rules
See Alsoโ
- Overview - Feature overview
- Commands - Command and permission reference
- Configuration - Configuration reference