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.
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
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 all shopable materials
- 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
Enchantment Selectionโ
- If the selected material is enchantable, opens a second chest GUI showing applicable enchantments as books
- Click convention mirrors the core plugin's own
EnchantmentSelectionGUI: left-click increases level, right-click decreases, shift-click removes - Enchanted book icon (glowing) for set enchantments, plain book for unset
Price Inputโ
- After enchantment selection (or directly for non-enchantable items), the GUI closes and the player is prompted in chat
- A persistent title/subtitle overlay (
&6Enter Price/Max price you wish to buy {item} for) stays on screen until the player types their answer, so the instruction doesn't scroll away in chat - Leave blank to set no price limit; type
cancelto abort
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
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
See Alsoโ
- Overview - Feature overview
- Commands - Command and permission reference
- Configuration - Configuration reference