Aurelium
Experimental Web Features The web dashboard is in active development. I am facing issues at the moment. Only local works at the moment. Expect potential bugs or instability if you enable
web.enabled. The core in-game economy, GUI markets, and auction house are stable.
A comprehensive, standalone economy plugin for Minecraft Paper.
Compatibility: Paper, Purpur, Pufferfish, Leaves
Features
Economy
- Multi-Currency - Define multiple currencies (e.g., Aurels, Dollars, Euros) with unique symbols and starting balances
- Per-Item Currency - Assign specific currencies to individual market items
- Vault Support - Fully compatible with Vault-dependent plugins (ShopGUI+, Essentials, etc.)
- Database - SQLite or MySQL storage with automatic migration
- Offline Earnings - Get paid for auction sales even when offline
Server Market
A server-owned shop with dynamic pricing and three interface modes:
- Classic - Traditional chest-based inventory GUI
- Modern - Styled chest GUI with MiniMessage gradient titles, glass-pane borders, formatted lore
- Web - Browser dashboard (see Web Dashboard)
Pricing Mechanics:
- Prices automatically rise on buys (Demand) and fall on sells (Supply)
- Anti-Exploit: Sell price can never exceed Buy price
- Price Floor: Can't drop below 20% of base (configurable)
- Price Ceiling: Can't rise above 500% of base (configurable)
- Natural Recovery: Prices passively drift toward base value every 10 minutes
Quality of Life:
- Live UI updates every 1 second while a menu is open
- Page indicator books showing current page (e.g., "Page 1 of 5")
- Compass search button to find any item
- Market Crash Alerts for bargain-priced high-value items
- Smart inventory: purchases fill partial stacks first
Performance:
- Viewer-Only Refresh: logic dormant unless a player has a menu open
- Batched Disk I/O: transaction data saved in background batches
- O(1) Data Access: local caching for near-zero CPU impact
- Massive Catalog: all building blocks + 60+ mob spawners
Auction House
A fully self-contained player-driven exchange:
- 100% GUI Driven: sell items, place bids, make private offers via in-menu buttons
- Safety Confirmations: dedicated confirmation screen before deducting funds
- Manage Offers:
/ah offersto Accept or Decline incoming deals - Live Updates: GUI refreshes instantly for all players on buys, bids, cancels; timers update every second
- Auto-Refunds: outbid? Money instantly returned
Buy Orders
A global request system for offline purchasing:
- Request any item (including 120+ enchanted books and ingots) at your price
- Other players browse and fulfill orders from their inventory
- Escrow System: money held safely, refunded on cancel
- Offline Collections: fulfilled items go to
/ah collectbin; notified on login - Buyer Notifications: real-time when filled, or on next login
Custom Item Detection
Automatically discovers custom items from popular third-party plugins:
- Auto-Scan on Startup - runs once, detects all custom items
- Supported Plugins (zero hard dependencies, all via reflection):
- ItemsAdder, Oraxen, MMOItems, MythicMobs, ExecutableItems, Nexo, SX-Item
- Discovered items written to
config.ymlunderdiscovered-items: - Persisted in
custom_itemsdatabase table (schema v2, auto-migrates) - No supported plugins installed? Scanner silently skips with zero overhead
Web Dashboard
A modern, responsive web app with(sorry guys, only local for now) nearly 100% uptime:
- Server Market - purchase items from the web, delivered instantly in-game

- Auction House - place bids and buyout items (BIN) from the browser

- Buy Orders - fulfill player buy orders from your online inventory

- Price Tracker - interactive chart with 7-day history, bezier curves, gradient fills, hover tooltips


Web Features:
- Live Sync: in-game changes reflect instantly on the web and vice-versa
- Prices recorded every 10 minutes, stored for 7 days
- Cloud Mode: optional cloud hosting via Render
- Multi-Currency UI: custom currency symbols synced from
config.yml - Icon Fallbacks: seamless fallback for older MC versions
- Secure Sessions:
/webin-game generates a time-limited link (rolling 1-hour timeout) - Tab Sleep Mode: no network/CPU when tab is inactive; instant wake on return
- RAM Optimized: per-server memory under 1MB via raw JSON string caching
- Activation Queue: fair waitlist when cloud server hits its 500MB limit
Commands
Player Commands
| Command | Description | Permission |
|---|---|---|
/bal [player] [currency] |
Check your own or another player's balance | aureleconomy.bal |
/pay <player> <amount> [currency] |
Pay another player | aureleconomy.pay |
/market |
Open the in-game server market | aureleconomy.market |
/sell |
Sell items from your inventory | aureleconomy.sell |
/stocks |
View market trends | aureleconomy.stocks |
/web |
Generate a secure link to the browser dashboard | aureleconomy.web |
/ah |
Open the Auction House | aureleconomy.ah |
/ah sell <price> [duration] [currency] |
List held item as BIN. Duration: e.g. 1h, 7d |
aureleconomy.ah |
/ah bid <price> [duration] |
List held item for auction. Duration: e.g. 1h, 7d |
aureleconomy.ah |
/ah offer <id> <qty> |
Send a private offer for an auction item | aureleconomy.ah |
/ah offers |
Manage incoming private offers | aureleconomy.ah |
/ah collect |
Collect expired/purchased items | aureleconomy.ah |
/ah search <query> |
Open a filtered Auction House view | aureleconomy.ah |
/orders |
Open the Buy Orders GUI | aureleconomy.orders |
/orders create <item> <amount> <price> [currency] |
Place a buy order | aureleconomy.orders |
/orders fill <id> [amount] |
Fulfill an order from your inventory | aureleconomy.orders |
/orders cancel <id> |
Cancel your order and get a refund | aureleconomy.orders |
/orders my |
List your active buy orders | aureleconomy.orders |
/orders search <query> |
Search active orders by item name | aureleconomy.orders |
Admin Commands
| Command | Description | Permission |
|---|---|---|
/eco <give\|take\|set> <player> <amount> [currency] |
Modify player balances | aureleconomy.admin |
/customitems scan |
Force rescan all supported custom item plugins | aureleconomy.admin |
/customitems list |
View all discovered custom items | aureleconomy.admin |
/customitems info <id> |
Show details for a specific custom item | aureleconomy.admin |
/customitems reload |
Reload config overrides from disk | aureleconomy.admin |
/customitems toggle <id> |
Enable or disable a discovered item in the market | aureleconomy.admin |
/customitems price <id> <buy> [sell] |
Set buy/sell prices for a discovered item | aureleconomy.admin |
Permissions
| Permission | Description | Default |
|---|---|---|
aureleconomy.bal |
Check balance | Everyone |
aureleconomy.pay |
Pay players | Everyone |
aureleconomy.market |
Use the market | Everyone |
aureleconomy.sell |
Use /sell | Everyone |
aureleconomy.ah |
Use the auction house | Everyone |
aureleconomy.orders |
Use buy orders | Everyone |
aureleconomy.stocks |
View market trends | Everyone |
aureleconomy.web |
Use /web | Everyone |
aureleconomy.admin |
Admin commands (eco, customitems) | OP only |
Setup
- Download the latest
Aurelium.jar - Place it in your server's
plugins/folder - Restart the server
- If Vault is not detected, Aurelium automatically extracts and installs it on first run
Configuration
Database
database:
type: sqlite # sqlite or mysql
file: "database.db" # SQLite only
mysql: # MySQL only
host: "localhost"
port: 3306
database: "aurelium"
username: "root"
password: "password"
Economy
economy:
default-currency: "Aurels"
currencies:
Aurels:
symbol: "₳"
starting-balance: 100.0
max-balance: -1 # -1 = unlimited
min-pay-amount: 0.01
Market Items
Control every price directly:
market-items:
DIAMOND:
buy: 5000.0 # Cost to buy from server
sell: 0.0 # 0.0 = selling disabled
DIRT:
buy: 1.0
sell: 0.5 # Players can sell for 0.5
BEDROCK:
buy: -1.0 # -1.0 = buying disabled
Market Settings
market:
enabled: true
gui-mode: modern # "classic" or "modern"
dynamic-pricing: true
price-increase-per-buy: 0.001 # +0.1% per buy
price-decrease-per-sell: 0.001 # -0.1% per sell
default-sell-ratio: 0.5
price-floor: 0.2 # Can't drop below 20% of base
price-ceiling: 5.0 # Can't rise above 500% of base
price-recovery:
enabled: true
rate: 0.01 # 1% of gap per cycle
interval-minutes: 10
Auction House
auction-house:
enabled: true
default-duration: 86400 # 24 hours (seconds)
max-duration: 604800 # 7 days max
listing-fee-percent: 2.0
sales-tax-percent: 5.0
max-listings-per-player: -1 # -1 = unlimited
min-listing-price: 1.0
Buy Orders
buy-orders:
enabled: true
max-active-orders-per-player: 10
min-price-per-piece: 0.1
max-order-value: -1 # -1 = unlimited
creation-fee-percent: 2.0
sales-tax-percent: 5.0
Web Dashboard
web:
enabled: true
port: 8585
# Session timeout: rolling 1 hour of inactivity (hardcoded)
Network Syncing (MySQL Required)
Aurelium supports cross-server synchronization for BungeeCord and Velocity networks.
MySQL is required for synchronization. SQLite does not support cross-server data sharing. Point all backend servers to the same MySQL database:
- Global Balances - player balances refreshed on join across the network
- Global Auction House - active auctions and collection bin shared across all linked servers
- Per-Server Markets - dynamic prices stored in each server's local
config.yml, allowing different economies per server while players keep the same wallet
Language
A messages.yml file is generated on startup.
- Translate: Change any message to your language
- Color Codes: Use MiniMessage formatting (e.g.,
<green>) or legacy&codes
FAQ
"Unknown Command" - If /market or /eco says "Unknown command", the plugin failed to load.
- Check server console/logs for errors
- Ensure you have
Aurelium.jarinplugins/ - Ensure you are running Paper (or compatible forks: Purpur, Pufferfish, Leaves)
"No Permission" - You need OP (/op <player>) or the aureleconomy.admin permission node. Standard player commands are enabled for everyone by default.
Still not working? - Open an issue on GitHub with your server version, error logs, and steps to reproduce.
All Versions
+ Add Version### What's New
- Paper 26.2 support** — works with the latest Paper alpha builds
- Web dashboard is now persistent** — your market data, auctions, and player sessions survive server restarts (powered by Astra DB)
- All sensitive data is encrypted** — API keys, player UUIDs, balances, and session tokens are encrypted with AES-256 before being stored in the database. Even if someone gets access to the database, they can't read your players' data
- Auction quantity selector (web)** — when buying a BIN auction with stacked items (like 64x Diamonds), you can now choose how many you want instead of being forced to buy the whole stack
- Auction category sidebar (web)** — the auction page now has the same sidebar as the market, with filters for All Listings, BIN Listings, and BID Listings
- Per-item pricing (web)** — auctions and market items now show the price per item, not just the total
### Bug Fixes
- Sessions survive restarts** — player web sessions no longer break after the server restarts
- No more silent data loss** — if the database write fails, you get an error instead of the server pretending everything worked fine
- Better input validation (web)** — the website now properly rejects invalid amounts and IDs instead of silently accepting them
- Network errors handled (web)** — temporary database connection issues no longer crash the website
- Auction empty states (web)** — filtering by category now shows "No auctions in this category" instead of showing all auctions
- Smooth modal animations (web)** — closing bid/purchase popups now animates smoothly instead of vanishing instantly
- Quantity button states (web)** — the + button grays out when you hit the max, the - button grays out at 1
- Correct BIN label (web)** — buy-now listings show "Price (per item)" instead of "Your Bid (per item)"
- Better item icons (web)** — fallback chain tries multiple Minecraft versions before showing a generic box icon
### What's New
- Paper 26.2 support** — works with the latest Paper alpha builds
- Web dashboard is now persistent** — your market data, auctions, and player sessions survive server restarts (powered by Astra DB)
- All sensitive data is encrypted** — API keys, player UUIDs, balances, and session tokens are encrypted with AES-256 before being stored in the database. Even if someone gets access to the database, they can't read your players' data
- Auction quantity selector (web)** — when buying a BIN auction with stacked items (like 64x Diamonds), you can now choose how many you want instead of being forced to buy the whole stack
- Auction category sidebar (web)** — the auction page now has the same sidebar as the market, with filters for All Listings, BIN Listings, and BID Listings
- Per-item pricing (web)** — auctions and market items now show the price per item, not just the total
### Bug Fixes
- Sessions survive restarts** — player web sessions no longer break after the server restarts
- No more silent data loss** — if the database write fails, you get an error instead of the server pretending everything worked fine
- Better input validation (web)** — the website now properly rejects invalid amounts and IDs instead of silently accepting them
- Network errors handled (web)** — temporary database connection issues no longer crash the website
- Auction empty states (web)** — filtering by category now shows "No auctions in this category" instead of showing all auctions
- Smooth modal animations (web)** — closing bid/purchase popups now animates smoothly instead of vanishing instantly
- Quantity button states (web)** — the + button grays out when you hit the max, the - button grays out at 1
- Correct BIN label (web)** — buy-now listings show "Price (per item)" instead of "Your Bid (per item)"
- Better item icons (web)** — fallback chain tries multiple Minecraft versions before showing a generic box icon
### What's New
- Paper 26.2 support** — works with the latest Paper alpha builds
- Web dashboard is now persistent** — your market data, auctions, and player sessions survive server restarts (powered by Astra DB)
- All sensitive data is encrypted** — API keys, player UUIDs, balances, and session tokens are encrypted with AES-256 before being stored in the database. Even if someone gets access to the database, they can't read your players' data
- Auction quantity selector (web)** — when buying a BIN auction with stacked items (like 64x Diamonds), you can now choose how many you want instead of being forced to buy the whole stack
- Auction category sidebar (web)** — the auction page now has the same sidebar as the market, with filters for All Listings, BIN Listings, and BID Listings
- Per-item pricing (web)** — auctions and market items now show the price per item, not just the total
### Bug Fixes
- Sessions survive restarts** — player web sessions no longer break after the server restarts
- No more silent data loss** — if the database write fails, you get an error instead of the server pretending everything worked fine
- Better input validation (web)** — the website now properly rejects invalid amounts and IDs instead of silently accepting them
- Network errors handled (web)** — temporary database connection issues no longer crash the website
- Auction empty states (web)** — filtering by category now shows "No auctions in this category" instead of showing all auctions
- Smooth modal animations (web)** — closing bid/purchase popups now animates smoothly instead of vanishing instantly
- Quantity button states (web)** — the + button grays out when you hit the max, the - button grays out at 1
- Correct BIN label (web)** — buy-now listings show "Price (per item)" instead of "Your Bid (per item)"
- Better item icons (web)** — fallback chain tries multiple Minecraft versions before showing a generic box icon
- Market Custom Item Display Names**: Discovered custom items now show their configured display name in the market (alerts, GUI, price lookups) instead of falling back to raw material name. Previously,
MarketManager.addCustomMarketItem()createdMarketEntrywith only material and price, discarding the display name — auction messages already worked correctly, but market-side name resolution did not.
- Market Custom Item Display Names**: Discovered custom items now show their configured display name in the market (alerts, GUI, price lookups) instead of falling back to raw material name. Previously,
MarketManager.addCustomMarketItem()createdMarketEntrywith only material and price, discarding the display name — auction messages already worked correctly, but market-side name resolution did not.
- Fixed cloud dashboard sometimes not registering
- Aurelium now automatically discovers custom items from popular third-party plugins and integrates them seamlessly into your server market—no manual configuration required.**
### New - Auto Custom Item Detection (Scanner)
- UnifiedItemScanner**: Automatically detects custom items from installed third-party plugins on server startup and via
/customitems scan - Supported plugins (via reflection, zero hard dependencies): ItemsAdder, Oraxen, MMOItems, MythicMobs, ExecutableItems, Nexo, SX-Item
- Each plugin API is accessed via reflection only—no compile-time dependencies required
- Cross-Plugin Deduplication**: If the same item is registered by multiple plugins (e.g., ItemsAdder ruby_sword and MMOItems SWORD:RUBY_BLADE), it is deduplicated by canonical ID and stored as a single entry in
custom_items - Config Override Sync**: Discovered items are written to
config.ymlunderdiscovered-items:with source plugin, display name, material type, and default buy/sell prices - Server owners can edit prices/flags in config, and changes persist across restarts
- Database schema v2**: Added
custom_itemstable for persistent custom item tracking with automatic v1-to-v2 migration - Thread-Safe Scanning**: All scan operations run async with proper locking to avoid race conditions during startup
- Custom items appear in the market with proper display names and configurable pricing
### New - /customitems Command
- Full management commands** for discovered custom items:
/customitems scan— Force rescan of all supported plugins/customitems list— View all discovered custom items/customitems info <id>— Show details for a specific item/customitems reload— Reload config overrides from disk/customitems toggle <id>— Enable or disable a discovered item in the market/customitems price <id> <buy> [sell]— Set buy/sell prices for a discovered item
### Fixes
- DatabaseManager DDL Propagation**:
createTables()now re-throwsSQLExceptionifcustom_itemstable creation fails, preventing schema version mismatch on fresh MySQL installs - Cloud Dashboard Retry Logic**: HTTP 4xx/5xx errors stop retrying immediately (permanent errors); only transient errors (network, DNS) retry with backoff
- CustomItemRegistry Concurrency**: Fixed race conditions in
register(),upsert(), andclear()— all write operations now use proper read-write locking - MarketItems Price Clamping**: Fixed inverted floor/ceiling clamping when
buyPricewas unset (-1 sentinel), preventing price recovery drift toward -1 - Auction Display Names**: Auction messages now show custom display names instead of raw material types (uses
PlainTextComponentSerializerfor safe Component handling) - MySQL 8.0.20+ Compatibility**: Replaced deprecated
VALUES(col)syntax with modernAS newalias syntax in all upsert queries
### Testing
- Expanded MySQL CI test suite: scanner integration, dedup accuracy, schema migration, custom_items persistence
- Mineflayer in-game tests: 96/96 pass covering economy commands, auction lifecycle, and customitems subcommands
- All CI jobs pass: build, smoke-test, ingame-test, mysql-test, scanner-mysql, custom-item-detection, custom-items-persistence
### Platform
- Targets **Paper 26.1+** (Java 25, api-version: '26.1')
- Uses Paper's
RegistryAccess/RegistryKeyAPI for enchantment lookups - CI tested against Paper 26.1.2
- This is an **APLHA** version so it can have critical bugs
- Fix Async
- Version Update -> 26.1.x
- This update is mandatory for all servers using the web dashboard.**
- Session tokens for the web dashboard now use cryptographically secure
SecureRandom(256-bit entropy) instead ofUUID.randomUUID()(122-bit), preventing potential token prediction attacks - Added explanatory comments to
CloudSyncManagerfor exceptions that are safely ignored
### Performance
- Cloud dashboard registration retries no longer block a
ForkJoinPoolthread for 15 seconds between attempts, replacedThread.sleep(15_000)with Bukkit's non-blockingrunTaskLaterAsynchronouslyscheduler - Offline earnings cleanup now uses a single bulk
DELETESQL query instead of N+1 individual queries when a player joins, significantly reducing database load on servers with many offline earnings records
### Fixes
- Added proper exception logging to previously empty
catchblocks inShopGUIandCloudSyncManager, making debugging much easier - Fixed a bug in
ShopGUIwheretargetwas used instead ofclickerfor certain player interactions - BungeeCord/Velocity Sync**: Fixed a major bug where player balances could stay "stale" when switching servers due to permanent RAM caching. Player data is now refreshed from MySQL immediately upon joining a new server instance.
### Internal
- Bumped version in
pom.xmlto1.4.2to ensure consistent builds across Maven and Gradle. - Updated
README.mdto clarify that MySQL is mandatory for cross-server synchronization and that Market Prices remain per-server for regional economy support.
## v1.4.1 - Web Stability Hotfix
### Fixes
- Cloud sync now automatically reconnects to the web dashboard if the render server restarts (Fixes 403 Invalid server ID error)
## v1.4.0 - Security, Enchantments & Cleanup
### New
- Enchantment books now have individual prices based on rarity and level (Mending = 35k, Sharpness V = 60k, etc.)
- Added 1.21.11 enchantments: Breach, Density, Wind Burst
- Web dashboard balance updates instantly after buying/selling in-game
/balnow suggests currencies and online players in tab- Auto database backups when the plugin updates
- Auto schema migrations on startup
### Fixes
/balwas checking the wrong permission — non-op players couldn't use it- SellGUI sometimes showed a different total than what you actually got paid
- Market GUI prices now update right after a transaction instead of lagging behind
- AH cancellation visual flicker on shift-click
- Collection bin no longer drops items on the ground if your inventory is full
- "All Items" button was showing items outside the configured categories
- NullPointerException when browsing "All Items"
- Cloud sync no longer spams HTML in console when the server is waking up
### Security
- Economy, market, and auction transactions are now atomic (no more duping from race conditions)
- Auction bids use price-checked SQL to prevent out-of-order bid corruption
- Web purchases are deduplicated to prevent double-spending
- All GUIs lock down shift-click and drag to prevent inventory exploits
- SellGUI locks the price at review time so it can't change mid-transaction
- CORS is now a configurable whitelist instead of wildcard
### Internal
- All money math uses BigDecimal now (no more floating point drift)
- Market item prices stored under
market-itemsin config (moved frommarket.items) - Moved Beacon, Respawn Anchor, End Crystal back to Mob Drops & Magic
- Web dashboard scroll performance improved with lazy rendering
- Better error messages for network issues during cloud sync
> **⚠️ EXPERIMENTAL WEB FEATURES ⚠️**
>
> *The newly added Web Dashboard features are currently in active development. Please expect potential bugs or instability if you enable
web.enabled in your configuration. The core in-game economy, GUI markets, and auction house are stable.*## Version 1.3.2 — Web Dashboard Polish & Security (Minecraft 1.21.11)
### 🌐 Cloud Dashboard Improvements
- Fix**: **Stock Change % Fix** — Resolved a bug where item base prices (like Diamonds) were being overwritten, causing 0% change to show on the web.
- Fix**: **Auction Display Fix** — Fixed a bug where auction prices would show as
undefinedinstead of the correct currency symbol. - New**: **Icons** — Replaced all legacy emojis with a premium SVG icon system for better clarity and aesthetics.
- Security**: **Self-Trade Protection** — Players can no longer bid on their own auctions or fill their own buy orders via the web.
- Buy buttons are now explicitly labeled "Your Auction/Order" and disabled for owned items.
- Added backend validation to reject self-trading attempts.
- New**: Added
sellerUuidandbuyerUuidto sync payloads for improved identity tracking on the frontend.
### 🎮 In-Game Fixes
- Fix**: **GUI De-duplication** — Removed redundant item entries in the
/stocksGUI that appeared if an item was in multiple categories.
- Updated**: Increased the web dashboard API rate limit to **330 requests per minute**.
- New**: Added an automatic rate-limit bypass for authenticated Minecraft servers.
> **⚠️ EXPERIMENTAL WEB FEATURES ⚠️**
>
> *The newly added Web Dashboard features are currently in active development. Please expect potential bugs or instability if you enable
web.enabled in your configuration. The core in-game economy, GUI markets, and auction house are stable.*## Version 1.3.0 — Cloud Dashboard Expansion (Minecraft 1.21.11)
### 🌐 Cloud Dashboard — New Pages
- New**: Added **Navigation Bar** to the web dashboard with tabs for Market, Auction, Orders, and Stocks.
- New**: **Auction House** page — view all active auctions with item icons, BIN/BID tags, countdown timers, seller names, and search.
- New**: **Buy Orders** page — view all active buy orders with progress bars (filled/requested), price per piece, buyer name, and status badges.
- New**: **Stocks / Price Tracker** page — view all items with buy price, sell price, and change % (green ↑ / red ↓). Sortable by name, price, or change.
- New**: **Interactive Stock Charts** — click any item on the Stocks page to open a Modrinth-inspired chart modal with:
- Smooth bezier curve lines with gradient fill (green for positive trend, red for negative)
- Y-axis price labels and X-axis date labels
- Hover tooltips showing exact date, buy price, and sell price
- New**: **Price History Recording** — item prices are recorded every 10 minutes and stored for 7 days.
- New**:
price_historydatabase table for persistent price tracking. - New**: **Multi-Version Icon Fallback:** The dashboard will gracefully fallback to older version icons (1.20, 1.19, 1.18) if a 1.21.11 icon is missing from the API, preventing broken images.
- The Web Dashboard is now fully interactive!** Players can now purchase items from the Server Market, place bids on the Auction House, buyout BIN auctions, and fulfill Buy Orders straight from their browser.
- Note: To fulfill orders or buy/bid on auctions from the web, players must have the required funds/items currently in their online inventory.*
- New**: Web Dashboard sessions now use a **rolling 1-hour timeout**. The timer resets every time you interact with the dashboard, so active users are never kicked out. Sessions only expire after 1 full hour of inactivity.
- New**: A styled **🔒 Session Required** error screen now appears when visiting the dashboard without a valid session, guiding users to issue
/webin-game. - New**: Added **Tab Sleep Mode** using the browser's Page Visibility API. If a player switches to another tab or minimizes the browser, the 20-second background data sync pauses to save data and RAM. It instantly fetches fresh data the moment they return to the dashboard.
### 🎮 GUI Improvements
- New**: Added **Page Indicator Books** to the center of the navigation bar in both
MarketGUIandShopGUI. - Fix**: Fixed a bug where pagination was infinite; players can no longer navigate into empty pages.
- New**: **Command Separation** —
/marketnow strictly opens the in-game GUI (Classic or Modern). The browser dashboard is now exclusively accessed via the/webcommand.
### 🖥️ Cloud Sync Improvements
- New**: Cross-server dashboard activation queue. To prevent crashes, the global Node.js backend (
render-server) now monitors memory usage (>= 500MB). If a server tries to activate its dashboard when memory is maxed out, it will be placed in a fair waitlist queue. - Optimization**: Auction, Order, Stock, and Price History data are now stored as raw JSON strings instead of parsed JavaScript objects, drastically reducing RAM usage per server.
- Improved timeout handling for Render server cold starts (60s connect timeout, per-request timeouts).
- Added retry logic for server registration (5 attempts, 15 seconds apart).
- Sync payload now includes auction, order, stock, and price history data.
- Increased server JSON request limit to 5MB for larger sync payloads.
### 🛡️ Web Security Hardening
- Fixed XSS vulnerability** — the frontend HTML escaping function now properly sanitizes
<,>, and&characters, preventing malicious script injection via crafted item or player names. - CORS locked down** — API now only accepts requests from
https://webaureliummc.onrender.com, blocking malicious third-party websites. - Rate limiting** — API endpoints now enforce 60 requests per minute per IP to prevent spam and DDoS.
- Token moved to Authorization header** — session tokens are no longer visible in URLs, preventing leaks via browser history, server logs, or screenshots.
- Security headers (Helmet)** — added
X-Frame-Options,X-Content-Type-Options, and other standard HTTP security headers to prevent clickjacking and MIME sniffing. - IDOR fix** — purchase status endpoint now verifies that the requesting player owns the purchase, preventing information leakage.
- Stale purchase cleanup** — pending purchases abandoned for 10+ minutes are now automatically cleaned up.
- Queue cap** — registration queue capped at 50 entries to prevent abuse.
### 🔒 Security & Exploits
- CRITICAL**: Fixed a major bug that allowed players to bypass transaction costs and duplicate items by interacting with their personal bottom-inventory slots while
MarketGUI,AuctionGUI,BidGUI,OffersGUI, orConfirmPurchaseGUIwere open. - CRITICAL**: Fixed a race-condition in
AuctionGUI's collection bin that would occasionally grant an item twice if clicked extremely fast via macros or due to server lag. - Fixed an issue allowing players to drag and lose personal items into empty
GUIHolderslots.
### 💱 Multi-Currency System
- New**: Server owners can now define multiple currencies in
config.yml(e.g., Aurels, Dollars, Euros) with unique symbols and starting balances. - New**: Each market item can be assigned a specific currency via
market.items.<ITEM>.currency. - New**:
/bal,/pay, and/ecocommands now accept an optional[currency]argument. - New**:
/ah selland/orders createaccept an optional currency argument — buyers pay in the seller's specified currency. - New**:
player_balancesdatabase table stores per-player, per-currency balances with automatic migration from legacy single-balance data. - Fix**: The web dashboard now correctly displays the *exact currency symbol* (e.g.
₳or$) sent by the plugin, instead of hardcoded text. - Vault integration defaults to
economy.default-currencyfor backward compatibility.
### 🖥️ GUI Mode Selector
- New**: Added
market.gui-modeconfig option — server owners choose between three market interfaces: classic— Original chest-basedMarketGUI.modern— NewShopGUIwith MiniMessage gradient titles, glass-pane borders, and styled lore.web— Opens a browser-based dashboard (see below).
### 🌐 Web Dashboard
- New**: Embedded Modrinth-inspired web dashboard served by the plugin's built-in HTTP server (zero external dependencies).
- New**:
/webcommand generates a secure, time-limited clickable link that opens the market in the player's browser. - Dark-themed UI with category sidebar, item card grid, real-time search, buy modal with amount selector, and toast notifications.
- Session tokens use a rolling 1-hour timeout (hardcoded for security).
- All purchases are executed on the main server thread for thread-safety.
- Configuration:
web:
enabled: false
port: 8585
`
- Session timeout: rolling 1 hour of inactivity (hardcoded)
### 📚 Enchanted Books
- Fix**: **CRITICAL** bug where purchasing an Enchanted Book from the MarketGUI or ShopGUI would give the player a completely blank, unenchanted book. The plugin now perfectly parses internal names (like "Protection IV") into actual Bukkit
EnchantmentStorageMeta` drops!## v1.2.2 (Database Update)
### 🚀 Core Updates
- MySQL Support**: Implemented an optional dual-backend database toggle. Server owners can now switch from SQLite to MySQL directly in the
config.ymlfor massively improved I/O speeds during high-volume trading on larger networks.
## v1.2.1 (Minecraft 1.21.11 Update)
### 🚀 Core Updates
- Minecraft 1.21.11 Support**: Updated the
paper-apidependency andpaperweightversions to compile natively against Paper 1.21.11. - API Parity Fix**: Replaced the removed
Material.CHAINconstant with a dynamic lookup and updated its market fallback material fromIRON_BLOCKto a more cost-effectiveIRON_NUGGET.
### 🛒 Market Updates
- Search Bug Fixed**: The
/market searchfunction previously iterated through the internalCategory.ALL_ITEMSlist (a backend survival-items master list for the global order system), causing hundreds of un-buyable items to falsely appear in market search results. This category is now explicitly excluded from market searches. - Pale Garden Update Items**: Added all newly introduced Pale Oak crafts to the Market (
Category.WOOD), including logs, stripped variants, plaques, doors, trapdoors, signs, boats, and pale moss blocks/carpets. - Copper Update Items**: Added new Copper variants to the Market (
Category.COPPER), including Chests, Lanterns, Torches, Chains, and Bars (including all waxed/oxidized stages). - Extra Nature Items**: Added Firefly Bushes, Leaf Litter, Cactus Flowers, Wildflowers, and Short/Tall Dry Grass to
Category.NATURE. - GUI Price Display Fixes**: Items possessing no intrinsic market base price (like Smelted Ores) previously defaulted to an inaccurate
1.0Aurel display value within the/stocksmenu and/orders createGUI. They now intelligently retrieve and display their exactLast Sold Pricedirectly from recent player trading history. Additionally, all 120+ Enchanted Books were incorrectly bundled under a single query; they now properly isolate their prices based on their specific enchantment and level. - Stocks GUI Sorting**: The
/stocksmenu has been heavily upgraded to feature dynamic live-sorting. Items are now beautifully organized: true dynamic-market items are prioritized at the top of the menu, followed sequentially by pure-trading (Order/Auction) items. Both sections are then sub-sorted by **Absolute Percentage Change**, ensuring the most volatile and active items (crashing or skyrocketing) are always displayed on the very first page! - Note:* To prevent compilation or runtime errors on servers running without experimental Winter Drop flags, all new 1.21.11 items are integrated via dynamic string matching rather than strict enum constants.
### 🪲 Bug Fixes
- Fixed a visual bug in
/marketwhere the "Previous Page" paper icon mysteriously stopped rendering after navigating to the second page. - Fixed a severe bug where purchasing multiple items (e.g. 64x) simultaneously evaluated dynamic market volatility as a simple 1x transaction. Large bulk purchases now apply mathematically sound compound inflation models.
- Fixed a bug where recently added Server items (like Pale/Copper) were locked at
1.0base prices because older server configuration data was mistakenly permanently overriding their new values.
## v1.2.0 (Official Release)
### 🛒 Buy Orders System (New Feature)
- Global Buy Orders (
/orders)**: Players can now create global requests to purchase specific items at custom prices. - Full Command Support**: Create, fill, cancel, search, and list orders entirely via commands —
/orders create <item> <amount> <price>,/orders fill <id>,/orders cancel <id>,/orders search <query>,/orders my. - Automated Fulfillment**: Sellers can browse active buy orders and instantly sell items directly from their inventory to fulfill requests.
- Escrow & Refund System**: When creating an order, the exact amount of Aurels is held in escrow. Canceling an order via the "My Orders" menu instantly refunds any unspent currency.
- Offline Reliability**: Items sold to a player's buy order while they are offline are safely deposited into their existing Auction House Collection Bin for easy retrieval via
/ah collect. - Intelligent Searching**: The
/ordersmenu integrates with the native Chat Prompt Manager. Players can use the new Compass icon to search/filter the entire Minecraft catalog for any obtainable item, or use the Oak Sign icon inside any specific category to filter just that category. - Expanded Item Options**: Players can now place Buy Orders for **all 120+ Enchanted Books** (including maximum levels like Sharpness V and Fortune III) and **Smelted Ores** (Ingots and Netherite) safely from the
/ordersmenu. - Highly Configurable**: Server Owners can now use
config.ymlto completely disable the Buy Orders system, set a maximum number of active orders per player, configure minimum price limits, and impose a configurable percent-based Creation Fee to act as an economic sink. - Buyer Notifications**: Buyers are instantly notified in chat when their order is fulfilled. If the buyer is offline, they receive the notification when they next log in.
### � Market Stabilization (New Feature)
- Price Floor**: Item prices can never drop below a configurable percentage of their original base value (default: 20%). Auto-farms can no longer crash items to zero.
- Price Ceiling**: Item prices can never inflate above a configurable percentage of their base value (default: 500%).
- Natural Price Recovery**: All prices passively drift back toward their original base price every 10 minutes (configurable). Even if nobody buys an item, its value slowly recovers on its own.
- All stabilization settings are fully configurable in
config.ymlundermarket.price-floor,market.price-ceiling, andmarket.price-recovery.
### ⚙️ Expanded Server Configuration
- Master Toggles**: Server owners can now independently enable/disable the **Market** (
market.enabled) and **Auction House** (auction-house.enabled) systems. - Economy Limits**: New
max-balance(cap player wealth) andmin-pay-amount(prevent micro-payments) settings. - Market Tuning**: New
default-sell-ratiosetting controls what fraction of the buy price is used as the default sell price for new items. - Auction House Limits**: New
max-duration,max-listings-per-player, andmin-listing-pricesettings for full control. - Buy Order Limits**: New
max-order-valuesetting to cap the total value of a single order. - Custom Messages**: All economy messages (
balance,paid,received,insufficient-funds, admin messages) are now fully customizable with MiniMessage formatting inconfig.yml.
### �🔧 Bug Fixes
- Fixed
java.sql.SQLException: stmt pointer is closedcaused by shared database connections being prematurely closed. - Fixed
UnsupportedOperationExceptionwhen cancelling an order from the "My Orders" menu. - Fixed potential
NullPointerExceptioninEconomyManagerwhen saving balances for players whose names haven't been cached.
### ⚡ Internal Optimizations
- Switched all data maps across
OrderManager,MarketManager, andEconomyManagertoConcurrentHashMapfor improved thread safety with async database tasks. - Enabled **SQLite WAL (Write-Ahead Logging)** mode for significantly reduced lock contention during concurrent reads and writes.
- Cached frequently-read config values (dynamic pricing toggle, alert thresholds) in
MarketManagerat initialization instead of parsing YAML on every transaction. - Replaced all raw
e.printStackTrace()calls acrossAuctionManager,EconomyManager, andJoinListenerwith Paper's structuredgetComponentLogger().error()for cleaner, leveled logging. - Cleaned up unused imports across GUI classes.
## v1.1.0 (Official Release)
### 📦 Inventory & Shop Logic Updates
- Live UI Updates**: The
/marketand/stocksmenus automatically refresh every **1 second** natively while open. - Performance Optimized**:
- Viewer-Only Refresh**: Logic remains completely dormant unless a player has a menu open.
- Batched Disk I/O**: Transaction data is saved in backgrounds batches, preventing server "hiccups" during high-volume trading.
- O(1) Data Access**: Market prices use ultra-fast local caching for near-zero CPU impact.
- Smart Inventory Logistics**: Purchasing items securely fills your existing partial stacks instead of strictly demanding empty inventory slots.
- Transactions are properly blocked if you try to buy more than your combined available space can hold, preventing lost items.
- Auction House GUI Integration (No more commands)**:
- Overhauled the
/ahGUI so thatsell,bid, andoffersno longer require you to type complex commands. - Added a new **"Sell Item"** button inside the main
/ahmenu. Clicking it will simply ask you to type the price in chat while holding the item. - Clicking **"Custom Bid"** or **"Make Offer"** on an item inside the GUI now triggers an interactive chat prompt. The GUI seamlessly waits for you to type a number in chat and then processes the bid/offer automatically.
- New Safety Confirmation Menus**: When choosing to "Buy It Now" or finalize a standard Bid inside the AH, you will be instantly taken to a beautiful new Confirmation Screen to prevent completely accidental purchases.
- Global GUI Search Feature**:
- Clicking search allows you to type a keyword in chat (e.g., "Diamond") to instantly filter the menu.
- The Market search is **Global**, meaning it scans all categories simultaneously to find your item instantly.
- New Command:
/ah search <query>**: - Jump directly into a filtered Auction House view without clicking any buttons.
- Supports multi-word searches like
/ah search Enchanted Book. - User Experience Note**:
- Every common action (Searching, Bidding, Making Offers, and Selling) can be done either via the traditional commands listed above **OR** by simply clicking the corresponding buttons directly inside the GUIs for a more modern experience.
### 🧹 Code Optimization & Cleanup
- Removed unused or "dead code" (e.g. tracking variables, unused data imports) across multiple GUI and Server systems.
- Smart Configuration Auto-Merge**:
- The plugin now automatically detects and adds new configuration keys (like Alerts or Pricing Rates) to your existing
config.ymlon startup. - This ensures a seamless upgrade path where your custom values are preserved while new features are enabled automatically.
- Updated project versioning to **1.1.0** across all configuration and build files.
### 🐛 Bug Fixes
- Auction House Logic Loop Fix**:
- Fixed a critical rendering bug where the entire Auction House menu would appear empty due to a missing logic block bracket during the button injection phase.
- Stocks GUI (-100% Spawner Bug)**:
- Fixed an issue where all spawners in the
/stocksmenu displayed a worth of 0% or -100%. - The menu now accurately reads the custom spawner name instead of just reading "Spawner", correctly linking the specific mob type (e.g., Zombie Spawner) to its base market price.
- Spawners now correctly visually render their specific mob type directly within the GUI.
- Auto-Complete Command Spam (Player Names)**:
- Fixed an overarching issue where commands like
/ah,/market,/sell, and/stockswere incorrectly suggesting the names of all online server players. /ahnow correctly suggests its exact sub-commands (sell,bid,offers,offer,collect,cancel) instead of names.- The other commands explicitly block player name suggestions, keeping the chat interface clean and distraction-free.
### 📈 Market Economy Adjustments
- Dynamic Sell Pricing Engine**:
- Overhauled how the market calculates the money a player receives when selling bulk items.
- The sell value now accurately and transparently scales proportionally with the
/stocksfluctuations in real-time. If the buy price inflates by 20%, the sell reward inflates by precisely 20%. - Selling bulk items in the
/sellGUI now correctly triggers the dynamic price crash logic (onTransaction), guaranteeing the market value goes down as players dump mass supplies. - Auto-Updating Market & Stocks GUIs**:
- Both
/marketand/stocksnow feature an ultra-fast live **1-second (20-tick)** auto-refresh engine. If you have the menu open, prices will physically update completely live in front of you every single second as other players buy/sell items or as the server economy ticks forward. - Live Auction House Timers**: This ultra-fast refresh has also been applied to the
/ahmenu, ensuring that item expiration timers count down smoothly in real-time while a player is viewing the menu. - Improved Price Stability**:
- Recalibrated the default dynamic price adjustment from 1% down to **0.1% (0.001)** per transaction.
- This ensures a much more stable and realistic economy, preventing extreme price spikes during high-volume trading while still maintaining a responsive market.
- Market Crash Alerts**:
- The plugin now monitors "High Value" items (items with a base price > 200).
- When an item's price crashes by 50% or more (due to player selling), a server-wide broadcast encourages players to grab the bargain.
- Zero-Idle Engine**: GUI refresh logic remains dormant when no players are viewing economy menus, ensuring zero CPU overhead during idle periods.
- Batched Persistence**: Market price changes are persisted to disk in 5-minute intervals and on shutdown, significantly reducing disk I/O compared to per-transaction saving.
- High-Speed Caching**: Implementation of $O(1)$
MarketEntrylookups to eliminate search overhead during high-frequency GUI refreshes. - Lightweight Rendering**: Refactored
StocksGUIto minimize object allocation and sorting logic during its 1-second refresh cycle.
- (Release stabilized at v1.1.0)*
- Aurelium** is a comprehensive, standalone economy plugin for Minecraft Paper 1.21, but is compatible with 1.21.x. It features a custom currency (**Aurels**), a flexible Admin Market, a player-driven Auction House, and seamless Vault integration.
## ✨ Key Features
### 1. 💰 Core Economy
- Currency**: "Aurels" (₳) - Customizable name and symbol.
- Vault Support**: Fully compatible with Vault-dependent plugins (ShopGUI+, Essentials, etc.).
- Database**: Robust SQLite storage (no setup required).
- Offline Earnings**: Get paid for auction sales even when you're offline.
### 2. 🏪 Customizable Admin Market (
/market)A server-owned shop that functions like a **Stock Market**:
- Demand/Supply Logic**: Prices automatically rise when people buy (Demand) and fall when they sell (Supply).
- Massive Catalog**: Includes **ALL Building Blocks** (Stones, Deepslate, Wood, Glass, Nature, etc.).
- Spawner Market**: Over **60+ Mob Spawners** available for purchase.
- Balanced Economy**: Hand-crafted prices based on crafting complexity.
- Volatility Visualization**: View real-time market trends in
/stocks.
### 3. ⚖️ Auction House (
/ah)A player-driven exchange with advanced trading tools:
- Easy Bidding**: dedicated **Bid Menu** with quick-increment buttons (+10%, +50%, +100%).
- Auction IDs**: Every listing now displays a unique **ID** (e.g.,
#123) in the item lore to help with commands. - Private Offers**: Don't like the price? **Right-Click** an item to send a private offer to the seller using its ID.
- Manage Offers**: Sellers can view all incoming deals in
/ah offersand instantly **Accept (✔)** or **Decline (✖)**. - Live Updates**: The GUI **instantly refreshes** for all players when an item is bought, bidded on, or cancelled.
- Cancellation**: Sellers can cancel their own auctions with **Shift+Right-Click**. A partial fee refund is given based on remaining time.
- Auto-Refunds**: Placed a bid and got outbid? Your money is **instantly returned** to your balance.
- Collection Bin**: Expired items or won auctions are held in a secure
/ah collectbin if your inventory is full.
### 4. 📈 Stocks & Market Trends (
/stocks)- Real-time Tracking**: View the current value of every item in the market.
- Trends**:
- Green (▲ +%)**: Demand is peaking.
- Red (▼ -%)**: Market is oversaturated.
- Precision**: Data points updated per-transaction for maximum accuracy.
## Commands
### Player Commands
| Command | Description | Permission |
| :--- | :--- | :--- |
|
/bal [player] | Check balance. | aureleconomy.bal ||
/pay <player> <amount> | Pay another player. | aureleconomy.pay ||
/market | Open the server market. | aureleconomy.market ||
/stocks | View market trends. | aureleconomy.stocks ||
/ah | Open the Auction House. | aureleconomy.ah ||
/ah sell <price> | List item for BIN (Buy It Now). | aureleconomy.ah ||
/ah bid <price> | List item for Auction. | aureleconomy.ah ||
/ah offer <id> <qty> | Send a private offer for an item. | aureleconomy.ah ||
/ah offers | Manage incoming private offers. | aureleconomy.ah ||
/ah collect | Collect expired/purchased items. | aureleconomy.ah |### Admin Commands
| Command | Description | Permission |
| :--- | :--- | :--- |
|
/eco <give/take/set> <player> <amount> | Modify player balances. | aureleconomy.admin |## ⚙️ Installation
1. Download
Aurelium-1.0.0-SNAPSHOT.jar.2. Place it in your server's
plugins/ folder.3. **Restart** the server. (Vault will auto-install if missing).
## 🔧 Configuration (
config.yml)### Market Items
Control every price directly in the config:
``
yaml
market:
items:
DIAMOND:
buy: 5000.0 # Cost to buy from server
sell: 0.0 # 0.0 = Selling DISABLED
DIRT:
buy: 1.0
sell: 0.5 # Players can sell dirt for 0.5
BEDROCK:
buy: -1.0 # -1.0 = Buying DISABLED
`
### Global Settings
Control the plugin's behavior in config.yml:
`yaml
market:
# 📈 Dynamic Pricing
# If true, prices rise when items are bought and fall when sold.
# Set to 'false' for static prices.
dynamic-pricing: true
# Price adjustment percentage per transaction (0.01 = 1%)
price-increase-per-buy: 0.01
price-decrease-per-sell: 0.01
# Items that cannot be bought or sold
blacklist:
- BEDROCK
- BARRIER
auction-house:
# ⏱️ Duration (seconds)
default-duration: 86400 # 24 Hours
# 💸 Taxes
# Fee to list an item (Percentage of asking price)
listing-fee-percent: 2.0
# Tax taken from the seller when an item sells
sales-tax-percent: 5.0
### 🌍 Localization
A messages.yml file is generated on startup.
- Translate**: Change any message to your language.
- Color Codes**: Use MiniMessage formatting (e.g.,
<green>) or legacy & codes.
## ❓ Troubleshooting
- "Unknown Command"**: If
/market or /eco says "Unknown command", the plugin failed to load.Check your server console/logs for errors. Ensure you have Aurelium-1.0.0-SNAPSHOT.jar in plugins/.Ensure you are running **Paper 1.21.x**. "No Permission"**: Ensure you are **OP** ( /op <player>) or have the permission node aureleconomy.admin`.