Перейти к содержимому
Mineforgian

Donut Orders

A player-driven buy-order marketplace.

Загрузки
9K
Подписчики
5
Обновлён
18 июня 2026 г.
Лицензия
All-Rights-Reserved

Опубликован 8 апреля 2026 г.

Исходный код

logo

Orders

logo

Discord Server Nightbeam Studio YouTube Nightbeam Studio GitHub Nightbeam Studio CurseForge Nightbeam Studio Modrinth

Players post buy orders for items, other players fulfill them for instant payment. No chest shops. No admin setup. Just a clean GUI and automatic economy.


How It Works

  1. Buyer opens /orders, clicks New Order, picks an item, types the quantity and price-per-unit in chat.
  2. Funds are escrowed immediately — the buyer can't spend money they don't have.
  3. Sellers browse the public marketplace, pick an order, drop their items into the delivery GUI, and get paid on the spot.
  4. If an order only partially fills, the buyer's purchased items wait in a personal stash until they collect them.
  5. Orders expire automatically after a configurable number of days — any unspent funds are refunded and any collected items stay in the stash ready to pick up.

Features

Buyer Side

  • Post buy orders for any material on the server's allowed-materials list
  • Escrow system — funds withdrawn on order creation, never double-spent
  • Order status tracking — Active, Completed, Expired, or Cancelled
  • Virtual stash — delivered items are stored safely server-side until you collect them, even if your inventory is full
  • Overflow protection — stash items that don't fit on collection are dropped at your feet
  • Cancel & refund — cancel an active order at any time and receive the unspent balance back
  • Order detail view — see progress, price, expiry, and stash status from a single GUI

Seller Side

  • Browse all active orders in a paginated marketplace GUI
  • Delivery GUI — dedicated 45-slot input grid; only the correct material is accepted
  • Wrong-item rejection — the GUI refuses incompatible items immediately with a clear message
  • Partial fills — deliver as many or as few items as you want; payment is per-item
  • Anti-duplication lock — concurrent delivery attempts on the same order are serialized server-side
  • Excess item return — any items beyond what the order needs are automatically returned to your inventory

Economy

  • Powered by Vault — works with any Vault-compatible economy plugin (EssentialsX, CMI, etc.)
  • Optional configurable tax applied to seller payouts as an economy sink (disabled by default)
  • Refunds are always exact — no rounding errors

Admin & Configuration

  • /orders admin reload — hot-reload config.yml and messages.yml without a server restart
  • Fully configurable max orders per player
  • Configurable order expiry duration (days)
  • Configurable allowed materials list — control exactly which items can be traded
  • All player-facing strings in messages.yml — fully translatable, supports & color codes and #RRGGBB hex colors

Technical

  • Full Folia support — all scheduling uses regionised entity/global schedulers; also works on standard Paper/Spigot
  • SQLite + HikariCP — orders are persisted to a local database with WAL mode; no external database required
  • Async database I/O — DB reads and writes never block the main thread or region threads
  • Shaded & relocated dependencies — no classpath conflicts with other plugins

Commands

Command Description Permission
/orders Open your orders (aliases: /order, /market) donutorders.use
/orders admin reload Reload config and messages donutorders.admin

Permissions

Permission Default Description
donutorders.use Everyone Use /orders and all GUI features
donutorders.admin OP Access admin sub-commands

GUI Overview

Screen Purpose
Your Orders View your own buy orders, check status and stash, cancel orders
New Order Pick an item, set amount and price via chat prompts
Browse Market Paginated list of all active orders posted by any player
Deliver Items 45-slot grid to drop items into for a chosen order
Confirm Delivery Review the delivery before it is processed
Order Detail Full info on one of your own orders with cancel and collect options
Collect Stash Take all delivered items out of your virtual stash

Configuration

orders:
  max-per-player: 10        # Max simultaneous active orders per player
  default-expiry-days: 7    # Days before an unfilled order expires
  tax-percent: 0.0          # % of seller payout taken as economy sink (0 = off)

database:
  filename: donutorders.db  # SQLite file in the plugin's data folder

allowed-materials:
  - DIAMOND
  - EMERALD
  - GOLD_INGOT
  - IRON_INGOT
  - NETHERITE_INGOT
  - COAL
  - LAPIS_LAZULI
  - REDSTONE
  - QUARTZ
  - AMETHYST_SHARD
  - GLOWSTONE_DUST
  - BLAZE_ROD
  - ENDER_PEARL
  - GHAST_TEAR
  - NETHER_STAR
  - ELYTRA
  - TOTEM_OF_UNDYING
  - SHULKER_SHELL
  - HEART_OF_THE_SEA
  - TRIDENT
  - OAK_LOG
  # ... and any other Bukkit Material name

Requirements

Requirement Version
Paper / Folia 1.20+
Java 17+
Vault Any compatible release
Economy plugin EssentialsX, CMI, or any Vault economy

Installation

  1. Drop DonutOrders-1.0.0.jar into your plugins/ folder.
  2. Make sure Vault and an economy plugin are installed.
  3. Start the server — config.yml and messages.yml are generated automatically.
  4. Edit allowed-materials and other options, then run /orders admin reload.

Support & Source

Open an issue or pull request on the project repository.

BisectHosting partner banner

Ченджлог

1.2.1Релиз26.1.1, 26.1.2, 26.2 · 18 июня 2026 г.

Bug Fixes

  • Fixed plugin failing to enable on Folia and Folia-based servers (e.g. Canvas) with UnsupportedOperationException during async database load.
  • Async database I/O and network tasks now use Paper's AsyncScheduler on Folia instead of the deprecated Bukkit async scheduler.
1.2.0Релиз26.1, 26.1.1, 26.1.2 · 10 июня 2026 г.

New Features

  • Added Shulker Box delivery support — matching items inside shulkers count toward order fulfillment.
  • Shulker contents are scanned from shulkers placed in the delivery GUI and from shulkers anywhere in the seller's inventory.
  • Added items.yml for configuring allowed order materials separately from config.yml.
  • Added Modrinth update check on plugin startup (update-check.enabled in config.yml).
  • Added donutorders as a command alias for /orders.

Improvements

  • Allowed materials are validated server-side when creating orders (prevents GUI bypass).
  • Invalid material names in items.yml log warnings instead of crashing the plugin.
  • /orders admin reload now reloads config.yml, messages.yml, and items.yml.
1.1.0Релиз26.1, 26.1.1, 26.1.2 · 8 июня 2026 г.

New Features

  • Added permission-based order limits via donutorders.limit.<n> nodes (e.g. donutorders.limit.5, donutorders.limit.10).
  • Added support for rank-specific maximum active orders through optional rank-limits configuration.
  • Added PlaceholderAPI support: %donutorders_order_limit% returns the player's currently applied limit.
  • Added /orders limit <player> admin command (alias: /donutorders limit <player>).

Improvements

  • Added a caching system for permission-based limit lookups to avoid scanning permissions on every order creation.
  • Limit cache refreshes automatically on player join, config reload, and LuckPerms permission recalculation.
  • Order limit reached messages are now configurable via messages.yml.

Configuration

  • Added orders.default-limit as an optional config key (takes priority over legacy orders.max-per-player when set).
  • Added optional rank-limits configuration section for group-based fallback limits.
  • Added messages.order-limit-reached with %limit% and %active_orders% placeholders.

Permissions

  • donutorders.admin.limit — allows use of /orders limit <player>.
  • donutorders.limit.<n> — grants a custom maximum active order count.
1.0.3Релиз26.1, 26.1.1, 26.1.2 · 22 мая 2026 г.
  • Fixed Fill Order GUI item movement issue
  • Players can now manually move items into order fill slots
  • Improved Bedrock / Pocket Edition compatibility
  • Shift-click is no longer required to fill orders
  • Protected GUI slots still block invalid interactions
  • Kept server-side validation and anti-dupe protections intact

Critical Security Patch

  • Item Duplication Exploit Fixed: Completely resolved a critical exploit where delayed or replayed ClickSlot inventory packets could trigger order collection multiple times before the server-side database state could update.
  • WaterTight Concurrency Protections:
    • Implemented an atomic, in-memory compare-and-set claim lock (tryLockClaim / unlockClaim) to guarantee that concurrent stash claims from replayed/spam packets fail immediately.
    • Added a state-based collection lifecycle: orders now transition to PENDING upon completion/cancellation/expiration and to CLAIMED immediately when collection starts in-memory, ensuring absolute claim idempotency.
    • Implemented automatic SQLite database schema migration (claimed_by and claimed_at columns) to persist claiming information and protect against exploits across server restarts or hot reloads.
    • Added tick-based packet rate-limiting at the listener level to reject rapid click spam (max 2 clicks per tick) and click replays targeting the exact same slot in a single tick.

Improvements & Lifecycle Hardening

  • Safe Expiry Flow: Redesigned the order expiration checker to safely transition orders to PENDING (pending collection) rather than performing immediate, unsafe synchronous refunds. Players can now safely retrieve their expired order refunds from their personal stash GUI at any time.
  • Thread-Safety & Folia Compatibility: Guaranteed thread-safe SQLite operations by usingHikariCP WAL-mode queries dispatched asynchronously and synchronizing on player entity threads for Vault deposits and item insertions.

Admin & Testing Command

  • Concurrency Simulator: Registered the /orders admin simulate command (requires donutorders.admin permission). This executes a live high-latency packet replay and concurrent race simulation in SQLite, spawning 10 concurrent threads racing to collect the exact same stash at the exact same millisecond. Reports back in chat showing exactly 1 successful claim and 9 rejections.
1.0.1Релиз26.1, 26.1.1, 26.1.2 · 3 мая 2026 г.
  • Fixed a critical issue where items could duplicate when placing them in order slots
  • Resolved a bug causing items to return to the sender while still being delivered to the receiver
  • Improved inventory handling to prevent unintended item cloning
  • Fixed items being silently lost when clicking Cancel in the delivery confirmation screen
  • Fixed items being lost when pressing ESC to close the delivery confirmation screen
1.0.0Релиз1.21.11, 26.1, 26.1.1 · 8 апреля 2026 г.
  • init release

Комментарии

Загружаем…