Economy and Marketplaces - BeestoXd/UltimateDonutSMP-V2 GitHub Wiki
Two currencies: money (sell / shop / AH / orders) and shards (shard shop only). Balances live in the database, not a YAML file.
| File | Use it for |
|---|---|
| worth.yml | What items sell for |
| shop.yml | Quick Buy + shard shop |
| auction-house.yml |
/ah rules |
| orders.yml | Buy-order board |
| filter.yml | Browse categories (not chat) |
| config.yml | Starting money, shard zones |
Money balances live in the plugin's own database. During startup the plugin registers
VaultEconomyHook as a Vault Economy provider at ServicePriority.Highest, so once Vault is
installed every other plugin that asks Vault for a balance is reading and writing this plugin's money.
The provider reports two fractional digits, formats amounts through the plugin's own currency
formatter, and declares no bank support.
Only money is published through Vault. Shards are internal: no Vault service exposes them, so an external plugin cannot read or change a shard balance. If you need shard values elsewhere, use the PlaceholderAPI expansions described in Placeholders & Integrations.
| Command | Purpose |
|---|---|
/balance [player] (/bal, /money) |
Check a money balance |
/pay <player> <amount> |
Transfer money to another player |
/addmoney <player> <amount> |
Add money (ultimatedonutsmp2.admin.addmoney) |
/removemoney <player> <amount> |
Remove money (ultimatedonutsmp2.admin.removemoney) |
/setmoney <player> <amount> |
Set a balance outright (ultimatedonutsmp2.admin.setmoney) |
/logs |
Browse a player's logged shop, auction and admin activity (ultimatedonutsmp2.admin.logs) |
/leaderboard [type] (/baltop, /top) |
Open the leaderboard menus, including balance |
New accounts start on SETTINGS.MONEY-PER-DEFAULT in config.yml.
Shards are configured under SHARDS in config.yml and have four sources:
-
Shard zones. Each entry under
SHARDS.CUBOIDS.REGIONS.<region>binds a cuboid (or a radius around a point) that paysAMOUNTshards everyINTERVALseconds while a player stands in it. The bundledspawnregion ships withENABLED: false, so nothing pays out until you configure one. Each region has its own AFK handling (AFK-TIME,TELEPORT-ON-AFK), a movement requirement (MIN-MOVEMENT-BLOCKSwithinRECENT-MOVEMENT-WINDOW) and anEXCLUDED-WORLDSlist. TheSHARDS.EVERY/AMOUNT/COUNTDOWNkeys above the regions are only a fallback for installs with no region defined at all. -
Shards Everywhere.
SHARDS.EVERYWHEREpays shards anywhere on the server to players holdingultimatedonutsmp2.shards.everywhere, which isfalseby default so it behaves as a rank perk. -
Player kills.
SETTINGS.SHARDS-PER-KILLpays on a kill, withSETTINGS.SHARDS-KILL-COOLDOWN-SECONDSblocking repeat rewards against the same victim so two players cannot trade kills for shards. -
Crates. A crate reward with a
SHARDSgrant type pays directly into the balance. See Crates & Spawners.
SHARDS.BOOSTER-MULTIPLIER multiplies zone and Everywhere payouts while a booster is running, and
BOOSTER-APPLIES-TO-KILLS decides whether kill rewards are boosted too.
| Command | Purpose |
|---|---|
/shards [player] |
Check a shard balance |
/shards everywhere <status|debug> [player] |
Inspect Shards Everywhere eligibility (ultimatedonutsmp2.admin.shards) |
/shardpay <player> <amount> |
Transfer shards to another player |
/addshards, /removeshards, /setshards
|
Administrative shard adjustments (ultimatedonutsmp2.admin.shards) |
/shardpay is disabled by default through COMMANDS.SHARDPAY: false in config.yml; enable it if
you want players trading shards between themselves.
Dialog-based economy UIs (/pay, /ah browser, /worth pickers, and most hub menus) are
Java Edition only. Bedrock cannot render them through Geyser.
/shop (Quick Buy) is partly chest-based: the pinned grid works on Bedrock. Pinning a new
item uses the Java Choose Item dialog unless Floodgate is installed โ then Bedrock players get
the paged form under QUICK-BUY.BEDROCK in shop.yml. Geyser without Floodgate falls back to the
chest catalogue. Operator checklist and feature table:
Dialog API & older clients โ Bedrock.
/shop opens the DonutSMP-style Quick Buy grid, configured under QUICK-BUY in shop.yml. Players
pin items into the grid themselves rather than browsing a fixed catalogue: an empty slot opens the
Choose Item screen, which by default lists every material the server version has
(QUICK-BUY.CHOOSE-ITEM.MODE: VANILLA, capped by MAX-ITEMS and narrowed by BLACKLIST). That
blacklist is Quick Buy only, so an entry there does not disappear from /orders. Setting MODE to
CUSTOM restricts the picker to items priced in worth.yml.
Bedrock clients freeze on that screen, because Geyser has to turn one dialog button per material
into a single form. Floodgate players get a paged list with a search box instead, 20 items a page,
under QUICK-BUY.BEDROCK in shop.yml. Submitting that search stays on the form. If Floodgate is
not installed the same slot opens the chest catalogue (45 items a page) and does not continue into
the enchant dialog. Search from that chest, and Search on the Quick Buy grid, asks in chat instead
of opening a sign or a Java dialog.
Most quick buy prices are still not typed into shop.yml. QUICK-BUY.PRICING decides where each
one comes from.
A material under QUICK-BUY.PRICING.FIXED-ITEMS sells at that price per item, even when the auction
house has none. Enchantment worth from worth.yml is added on top, so a plain stick stays at the
price you wrote and a sharpness sword costs more than the plain sword. With USE-AUCTION-HOUSE on,
a matching listing cheaper than that total sets the unit price instead. A more expensive listing is
ignored. Quick Buy still does not purchase the listing. The seller keeps it.
QUICK-BUY.PRICING.FIXED-ITEMS is keyed by material only. You set one positive price per
Bukkit material (STICK, DIAMOND_SWORD, or a quoted namespaced id such as "minecraft:stick").
There is no separate YAML key per enchant combination โ enchant levels are not listed under
FIXED-ITEMS.
When a player pins an enchantable item in /shop, the Choose Item flow can open Choose
Enchantments (the same picker layout as buying an item with enchants). Which enchant levels appear
there comes from enchantments.yml. The pin stores the material, stack
size, and the enchant map the player confirmed.
Quick Buy then prices that pin like this:
| Piece | Where it is set | What it does |
|---|---|---|
| Base unit price |
FIXED-ITEMS.<MATERIAL> in shop.yml
|
Always charged for that material when the key exists and the value is greater than zero. |
| Per-enchant surcharge |
worth.yml under TYPE.BOOK
|
Each enchant on the pinned item adds the worth of ENCHANTED_BOOK:<ENCHANT>:<LEVEL> (for example ENCHANTED_BOOK:SHARPNESS:5). Plain items add nothing here. |
| Auction House cap | QUICK-BUY.PRICING.USE-AUCTION-HOUSE |
With true, a listing that matches the same material and the same required enchant levels and is priced at or below base + surcharges sets the unit price instead. A more expensive listing is ignored. Quick Buy still does not buy the listing. |
Unit price = base (from FIXED-ITEMS) + sum of enchant surcharges (from worth.yml). The slot
lore and purchase total multiply that unit price by the pinned amount.
Example: DIAMOND_SWORD: 100.0 under FIXED-ITEMS, and ENCHANTED_BOOK:SHARPNESS:5 is 1500.0 in
worth.yml. A pin of one sword with Sharpness V costs 1600 per purchase click. A pin of 64
stacks costs 102400 total. A plain sword with no enchants stays at 100 per item.
To change how much enchants cost on fixed items, edit the matching ENCHANTED_BOOK:โฆ lines in
worth.yml, not shop.yml. After either file changes, run /ultimatedonutsmp2 reload (or restart).
Paste this under QUICK-BUY.PRICING in shop.yml (uncomment and adjust numbers):
FIXED-ITEMS:
STICK: 1.0
DIAMOND_SWORD: 100.0Enchanted books use stored enchantments for matching, pricing, and delivery โ the same rules as the Auction House when a listing must match required enchants.
Everything left off that list follows this order, unless QUICK-BUY.PRICING.UNLISTED is
AUCTION-ONLY. The default is WORTH.
- With
USE-AUCTION-HOUSE: true, the lowest active Auction House listing that matches the pinned item and is priced at or aboveworth.ymlsets the price of one item. Quick Buy does not purchase that listing. The seller keeps it. - If no listing matches, the
worth.ymlprice is used, multiplied byWORTH-MULTIPLIER, and never sold below worth. The quote is also raised to at least what that player would earn selling one of the item right now (base worth times their sell-category multiplier), so buying and reselling cannot print money. - If the item has no
worth.ymlentry either andAUTO-BALANCE-MISSINGis on, a price is derived automatically and multiplied byAUTO-BALANCE-MULTIPLIER.
AUCTION-ONLY skips steps 2 and 3. An item missing from FIXED-ITEMS stays out of stock until a
matching listing exists, and a listing below worth is still ignored.
Each of those is a price for one item. The slot multiplies it by the amount the player pinned, and that total is what the lore shows and what the click withdraws. A pin of 64 costs 64 times a pin of 1 of the same item. If a slot has no price from any of those, it shows as out of stock instead of selling at zero.
SHOP-GUI holds the shared item lore (SHOP-GUI.ITEM.LORE, with {shop_price} and {auction_line}
placeholders), the favourites toggle, and SHOP-GUI.WEB-SERVER, which controls the embedded sell
analytics HTTP server. /shop reload reloads shop.yml, menus.yml and sounds.yml and requires
ultimatedonutsmp2.admin.shop.
/shop legacy opens the older category-based shop menu, which reads a CATEGORIES section from
shop.yml. That section is not shipped, so the legacy menu is empty until you add one.
/shardshop is a separate menu with its own layout under SHARD-MENU in shop.yml, and everything
in it is paid for in shards (CURRENCY: SHARD). Each entry sets its own SLOT, PRICE-PER-UNIT,
MATERIAL, ENCHANTMENTS, DISPLAY-NAME and LORE, and quantity limits through MIN-QUANTITY,
MAX-QUANTITY, DEFAULT-QUANTITY and HIDE-QUANTITY-BUTTONS. An entry can hand out an ordinary item
(GIVE-ITEM), run a console command (COMMAND), or grant a timed amethyst tool through
AMETHYST-TOOL and AMETHYST-DURATION โ the bundled shard pickaxes and axes use the last of those,
which is why their lore mentions a self-destruct timer.
A button in /shardshop is only a menu icon. Putting MATERIAL: SPAWNER on it hands the player a
vanilla spawner block, which this plugin does not track, stack or fill with drops. A managed spawner
has to be created by the spawner system. The shop does that when COMMAND is exactly this shape:
spawner give {player} <type> {amount}
{username} works in place of {player}. A leading / is accepted. <type> is the key under
TYPES in spawners.yml, in any case. {amount} is the quantity the player
just bought, so it has to stay as the placeholder.
These have to be true at the same time, or the purchase refunds the shards and the console logs
failed to deliver shop reward:
| Piece | Where | What to set |
|---|---|---|
| Spawner system on |
spawners.yml SETTINGS.ENABLED
|
true (the default). FEATURES.SPAWNERS in config.yml is on when that key is absent. |
| A real type |
TYPES in spawners.yml
|
The section key, not ENTITY_TYPE. PIGLIN is the key; its entity is ZOMBIFIED_PIGLIN. |
| A shop entry | Directly under SHARD-MENU in shop.yml
|
Its own key, for example PIG-SPAWNER-ITEM. An entry with no MATERIAL is ignored. ENABLED: false hides one. |
| The command | COMMAND |
The five-word line above. Anything else is dispatched as a normal console command. |
| No vanilla item | GIVE-ITEM: false |
A matching command already gives the managed spawner and skips the icon. GIVE-ITEM: true with any other command also gives a plain spawner block. |
| A shard price | PRICE-PER-UNIT |
Cost of one spawner. The menu CURRENCY: SHARD already applies, so the entry can omit CURRENCY. |
| A free slot | SLOT |
Shipped items occupy 0โ20. Balance is 49, Ranks is 50, and those two are drawn on top of an item you put there. Open slots in the 54-slot chest are 21โ48 and 51โ53. |
| How many per click |
MIN-QUANTITY, MAX-QUANTITY, DEFAULT-QUANTITY
|
{amount} follows this. HIDE-QUANTITY-BUTTONS: false shows the amount buttons. |
| Button text |
DISPLAY-NAME, LORE
|
Menu text only. The item in the inventory uses DISPLAY_NAME from spawners.yml. Write the shard price into the lore; the menu does not add it. |
The item the player receives is a spawner named from that type (&ePig Spawner and the rest) with
the line Place to create or stack this spawner. Placing it creates or stacks a managed spawner.
Quick Buy will not sell these. QUICK-BUY.CHOOSE-ITEM.BLACKLIST includes SPAWNER, and that menu
prices vanilla items from the Auction House and worth.yml.
Shipped types, in menu order:
TYPES key |
DISPLAY_NAME |
|---|---|
PIG |
&ePig Spawner |
COW |
&eCow Spawner |
ZOMBIE |
&eZombie Spawner |
SPIDER |
&eSpider Spawner |
SKELETON |
&eSkeleton Spawner |
CREEPER |
&eCreeper Spawner |
PIGLIN |
&ePiglin Spawner |
BLAZE |
&eBlaze Spawner |
IRON_GOLEM |
&eIron Golem Spawner |
Paste the block below inside SHARD-MENU, at the same indent as BOW-ITEM. The prices are
examples; change PRICE-PER-UNIT and the matching lore line, then save.
PIG-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&ePig Spawner"
SLOT: 21
PRICE-PER-UNIT: 500
LORE:
- "&#A303F9500 Shards"
COMMAND: "spawner give {player} pig {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
COW-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eCow Spawner"
SLOT: 22
PRICE-PER-UNIT: 500
LORE:
- "&#A303F9500 Shards"
COMMAND: "spawner give {player} cow {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
ZOMBIE-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eZombie Spawner"
SLOT: 23
PRICE-PER-UNIT: 400
LORE:
- "&#A303F9400 Shards"
COMMAND: "spawner give {player} zombie {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
SPIDER-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eSpider Spawner"
SLOT: 24
PRICE-PER-UNIT: 400
LORE:
- "&#A303F9400 Shards"
COMMAND: "spawner give {player} spider {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
SKELETON-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eSkeleton Spawner"
SLOT: 25
PRICE-PER-UNIT: 450
LORE:
- "&#A303F9450 Shards"
COMMAND: "spawner give {player} skeleton {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
CREEPER-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eCreeper Spawner"
SLOT: 26
PRICE-PER-UNIT: 600
LORE:
- "&#A303F9600 Shards"
COMMAND: "spawner give {player} creeper {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
PIGLIN-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&ePiglin Spawner"
SLOT: 27
PRICE-PER-UNIT: 750
LORE:
- "&#A303F9750 Shards"
COMMAND: "spawner give {player} piglin {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
BLAZE-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eBlaze Spawner"
SLOT: 28
PRICE-PER-UNIT: 800
LORE:
- "&#A303F9800 Shards"
COMMAND: "spawner give {player} blaze {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: false
IRON-GOLEM-SPAWNER-ITEM:
MATERIAL: SPAWNER
DISPLAY-NAME: "&eIron Golem Spawner"
SLOT: 29
PRICE-PER-UNIT: 1200
LORE:
- "&#A303F91.2K Shards"
COMMAND: "spawner give {player} iron_golem {amount}"
GIVE-ITEM: false
MIN-QUANTITY: 1
MAX-QUANTITY: 64
DEFAULT-QUANTITY: 1
HIDE-QUANTITY-BUTTONS: falseA type you added yourself uses the same entry. Create the TYPES section in spawners.yml, run
/spawner reload, then point COMMAND at that key, for example
spawner give {player} my_type {amount}.
/shop reload (ultimatedonutsmp2.admin.shop) reloads shop.yml. /spawner reload
(ultimatedonutsmp2.admin.spawner) reloads spawners.yml. Entries you add under SHARD-MENU stay
on disk across plugin updates: config merging leaves shop.yml alone except SHOP-GUI.
Sell prices come from worth.yml, never from shop.yml. Prices are grouped by
category under TYPE.<CATEGORY>.<MATERIAL>, and SETTINGS.WORTH-DEFAULT-VALUE in config.yml covers
anything unpriced.
| Command | Purpose |
|---|---|
/sell |
Open the sell container; items placed inside are sold when it closes |
/sellhand [amount] |
Sell the item in the main hand |
/sellall |
Sell every sellable item in the inventory |
/sellmulti [category], /sellmultiplier [category]
|
Open the sell multiplier menu |
/sellprogress [category] |
Open the multiplier progress menu |
/sellhistory |
Review recent sales |
/worth [hand] (/prices) |
Open the price browser, or price the held item |
/topsell [gui|items|volume|sellers|export] (/sellstats) |
Admin sell analytics (ultimatedonutsmp2.admin.sellstats) |
/meta (/farmingmeta) |
Show the current farming meta item |
Selling is not a flat rate. Each sale accumulates progress in that item's sell category, and the
category's current multiplier is applied to the payout, which is what /sellprogress and
/sellmulti display. The same multiplier path is used when a spawner's stored loot is sold, so a
player cannot dodge progression by farming through a spawner. To disable multipliers server-wide
and pin every payout to base worth (1.0x), set PROGRESS-MENU.ENABLED: false in menus.yml. While
disabled, payouts never scale, sales pause progress recording, and /sellmulti informs players the
system is off.
CONTAINER in worth.yml decides how shulker boxes and other containers are priced:
INCLUDE-CONTAINER-BASE-PRICE adds the container itself on top of its contents, and
ALLOW-NESTED-CONTAINERS with MAX-CONTAINER-DEPTH limits how far the plugin looks inside. The
BROWSER section controls the /worth menu โ its title, size, page length, default sort and the
CATEGORY-SORT order. DISPLAY.FORMAT and WORTH-LORE in config.yml control the worth line the
plugin draws on items.
META in worth.yml makes one item at a time worth more than its listed price. The item is taken in
turn from META.ITEMS, its price is multiplied by META.MULTIPLIER, and the rotation advances every
META.INTERVAL_DAYS plus META.INTERVAL_HOURS. META.ENABLED ships as false, so updating the
plugin never moves prices on its own. The boost applies wherever a price is shown or paid โ /worth,
the item worth line, the sell menus and spawner loot sales โ and the countdown is persisted to
farming-meta-data.yml so a restart does not reset it. META.ANNOUNCE_ON_ROTATE broadcasts each
change.
/auctionhouse (/ah) is the player-to-player marketplace: a seller sets a fixed price and the first
buyer takes the item. The browser uses native Dialog API screens, so Java clients older than 1.21.6
cannot open it โ see Dialog API & older clients. It is configured in
auction-house.yml and is the
price source Quick Buy reads from, so its health directly affects what /shop costs.
| Command | Purpose |
|---|---|
/ah |
Open the browser |
/ah search <item> |
Open the browser filtered to that item |
/ah sell <price> |
List the held item |
/ah my |
View your own listings |
/ah claims |
Collect sale proceeds and expired items |
/ah cancel |
Cancel a listing |
/ah limit |
Show your current listing limit |
/ah fastbuy, /ah fastsell
|
Skip the confirmation steps (ultimatedonutsmp2.auctionhouse.fastbuy / .fastsell) |
/ah reload |
Reload auction settings (ultimatedonutsmp2.admin.auctionhouse) |
/ah neth boot prot 4 is that search without the word search. Each word has to show up inside the item name, so neth matches netherite and boot matches boots. An enchant abbreviation followed by a number, such as prot 4 or prot iv, keeps items with that enchant at that level or higher. /ah search uses the same rules.
The ultimatedonutsmp2.auctionhouse.* nodes gate individual actions and default to true; the
donutauction.* family mirrors them as legacy aliases.
Listing limits are permission-tiered. SETTINGS.MAX_ACTIVE_LISTINGS_DEFAULT is the baseline, and
SETTINGS.MAX_ACTIVE_LISTINGS_BY_PERMISSION maps explicit permission nodes to totals. On top of that,
any node of the form ultimatedonutsmp2.auctionhouse.limit.<N> grants N listings without needing a
config entry, so ultimatedonutsmp2.auctionhouse.limit.25 is enough to give a rank 25 slots. Each
value is a total rather than a bonus, the highest value the player holds wins, and a negative value in
the config means unlimited. A wildcard permission does not grant a limit โ the node has to be set on
the player or their group, otherwise * would silently hand everybody the largest tier.
The rest of the file covers SETTINGS.LISTING_DURATION_HOURS and EXPIRE_CHECK_SECONDS; PRICING
with MIN_PRICE, MAX_PRICE, an upfront LISTING_FEE and a TAX_PERCENT cut of each sale;
RESTRICTIONS.BLOCKED_MATERIALS and RESTRICTIONS.BLOCKED_IF_HAS_LORE_CONTAINS for keeping items off
the market; CLAIMS; SORTING with the default and allowed sort orders; and the GUI layouts.
BOTS in auction-house.yml generates synthetic listings so a new or quiet server still has
something to buy. When BOTS.ENABLED is on, a background task posts listings under the names in
BOT_NAMES, drawn from the BOTS.ITEMS table where each entry defines a material, an amount range, a
price range and optional enchantments. MIN_CHECK_INTERVAL_SECONDS, MAX_CHECK_INTERVAL_SECONDS and
CHANCE control how often that happens, MAX_ACTIVE_BOT_LISTINGS caps how many exist at once, and
MIN_DURATION_HOURS/MAX_DURATION_HOURS set how long they last. It ships disabled, and it is worth
leaving disabled once real players are listing: Quick Buy prices follow the lowest active listing, so
bot listings set the price players pay.
/orders is the mirror image of the Auction House. Instead of sellers advertising items, buyers post
what they want and how much they will pay per item, and anyone can deliver against a posted order.
It is configured in orders.yml.
| Command | Purpose |
|---|---|
/orders |
Open the board |
/orders my |
Manage your own orders |
/orders collect |
Collect items delivered to your orders |
/orders reload |
Reload order settings (ultimatedonutsmp2.admin.orders) |
/orders collect opens a chest. Drop page throws the item claims on the page you are looking at onto the ground at your feet. Drop all does that for every pending claim in the menu, including claims on later pages. Money refunds in that batch still go to your balance. On Bedrock, Drop Item Claims already drops the whole queue.
SETTINGS covers ORDER_DURATION_HOURS, MAX_ACTIVE_ORDERS_DEFAULT,
MAX_ACTIVE_ORDERS_BY_PERMISSION and MAX_QUANTITY_PER_ORDER. PRICING bounds what a buyer may
offer with MIN_PRICE_EACH, MAX_PRICE_EACH and MAX_TOTAL_BUDGET, plus an optional
ORDER_CREATION_FEE. DELIVERY.MODE chooses between DEPOSIT_GUI, where the supplier drops items
into a deposit window, and DIRECT; MAX_DELIVER_PER_CLICK and MAX_DELIVER_PER_TRANSACTION cap a
single delivery. MATCHING.BLOCKED_MATERIALS keeps materials off the board entirely. The Choose Item
blacklist in shop.yml does not; put an order block in orders.yml if that is what you want.
Category buttons come from filter.yml. The item catalogue behind the browse and order-creation
menus is built from the categories in filter.yml โ Blocks, Tools, Food,
Combat, Potions, Books, Ingredients and Utilities โ which is the same list the rest of the
plugin uses for item categorisation. CATEGORY_FILTERS in orders.yml is only consulted if
filter.yml produces nothing usable, and a single hardcoded BLOCKS category is the last resort. If
you want to change what the category buttons show, edit filter.yml.
Bedrock players are handled separately. With BEDROCK.ENABLED on and Floodgate installed, the plugin
detects Bedrock clients and sends them native Bedrock forms instead of chest menus, because the sign
inputs the Java flow uses for search, amount and price prompts do not work on Bedrock. Those prompts
are configured in SEARCH_SIGN, AMOUNT_SIGN and PRICE_SIGN.
NETWORK.ENABLED with NETWORK.REDIS_CHANNEL publishes order events to other servers, which requires
Redis to be enabled in database.yml. BOTS works the same way as the auction
bots, posting synthetic buy orders from BOT_NAMES and BOTS.ITEMS; it also ships disabled.
enchantments.yml defines a paged GUI that lets a player specify which
enchantments an item must have. It has no command of its own. It opens from the Orders flow: when a
player selects an enchantable material for a new order, the picker appears so they can say which
enchantments and levels they want delivered, and then the normal order menu follows. The file's gui
section sets the title, row count and the slots for the item, cancel, confirm and page buttons, and
each per-material section maps an enchantment and level to a slot and page.
/billford is declared in plugin.yml and holds the permission
ultimatedonutsmp2.command.billford, but the feature does not exist in this build. No Java class
registers or handles it, there is no billford.yml anywhere in the plugin, and nothing reads a
Billford config key. What remains is dead weight from a removed or planned feature: an unused
BILLFORD_REWARD enum constant, orphaned BILLFORD sound keys in sounds.yml, and stale
MENUS.BILLFORD-MENU and MESSAGES.BILLFORD strings in the language files. Running the command does
nothing, and any older documentation describing rotating Billford NPC trades is describing a feature
that is not present. Either remove the command from plugin.yml or leave it as a no-op; there is
nothing to configure.
| File | What it drives |
|---|---|
| config.yml |
SETTINGS economy defaults, SHARDS, WORTH-LORE, MONEY-NAMETAGS, feature toggles |
| shop.yml |
QUICK-BUY, SHARD-MENU, SHOP-GUI, the listing and transaction menus |
| worth.yml | Sell prices, the /worth browser, container pricing, farming meta |
| auction-house.yml | Listing limits, pricing and tax, restrictions, sorting, bots |
| orders.yml | Order limits, pricing, delivery mode, Bedrock forms, Redis sync, bots |
| filter.yml | The item categories the Orders catalogue is built from |
| enchantments.yml | The enchantment picker opened from Orders |
| menus.yml | Shared menu titles and lore for economy menus |
| sounds.yml | Shop, auction and order sound effects |
| database.yml | Where balances, listings, orders and sell history are stored |
For the full command and permission inventory see Commands & Permissions.