EconomyShop v1.1.4 — Hotfix
Bug Fixes
- Fixed harmless "Duplicate column name" warning spam on every restart with MySQL
EconomyShop v1.1.3 — Hotfix
Bug Fixes
- Fixed /sell eating items without paying on Paper 26.1+ (thanks Kennardinbound)
- Silenced annoying "Failed to add stock" warning spam on every sell
v1.1.2 Changelog
New Features
- Added support for PlaceholderAPI expressions as prices — set any item's buy or sell price to a placeholder like %my_papi_value% in the admin editor and it'll be resolved per-player at purchase/sale time. Plain numeric prices still work exactly as before. Currency markers like $ and , in resolved values are stripped automatically; resolution failures fall back to the numeric price safely
Security
- Fixed a potential free-items exploit on Vault economy providers that allow zero-amount withdraws: items set to "sell only" (buy price 0) could be acquired for free via the buy menu. The shop now refuses to open the buy menu for sell-only items regardless of which economy provider is installed
v1.1.1 Changelog
Compatibility
- Restored backwards compatibility with Paper 1.21.x and Java 21
- Still loads cleanly on Paper 26.1+ with Java 25 — one build works on both
Bug Fixes
- Update checker now compares versions semantically instead of by string equality (no more "new version available" when you're already on a newer build)
- Update checker safely ignores garbage / outage responses from SpigotMC
- Fixed a build issue where plugin.yml versions could lag behind the actual release
Improvements
- config.yml now self-heals on startup — keys added in newer plugin versions are automatically merged into older configs. Fixes "admin GUI toggle doesn't save" symptoms caused by stale configs missing newer keys (e.g. modules.buyorders on configs pre-dating the Buy Orders feature)
v1.1.0 Changelog
Compatibility
- Updated to support Paper 26.1+ (Minecraft 26.1.2 and later)
- Now requires Java 25 — matches the new Paper server runtime
Note
- Stay on the previous version if you're running Paper 1.21.x or Java 21
EconomyShop v1.0.5.2 — Hotfix
Bug Fixes
Custom datapack item lore not showing in the shop
- Items with custom lore (magic swords, datapack tools, MMOItems-style gear) now keep their lore in every shop GUI
- Original lore appears at the top, shop info (buy/sell/stock) below a divider
- Affects the category browser, buy/sell confirmation screens, and the /shop sell GUI
Colored item names rendered as plain white
- Custom display names with color codes (e.g. <gold>Excalibur</gold>) now keep their colors instead of being flattened to plain text
- Italic is still suppressed so renamed items don't look weird in the GUI
/shop sell showed plain materials instead of custom items
- Sell-to-Shop GUI now uses the saved shop item's appearance (custom model data, components, etc.) instead of constructing a fresh icon from the base material
EconomyShop v1.0.5.1 — Hotfix
New
- seed-default-shop config option — set to false before first install for an empty shop you configure yourself. Defaults true. No effect on existing servers.
Bug Fixes
- "Exclude from Sell All" is now persistent — exclusions survive GUI close and logouts until you re-include. Thanks to Talvkes for the report.
- Fixed wrong prices when the same material exists in multiple categories — sell paths now consistently use the highest sell price across matches.
Changes
- Default shop seeder no longer includes end-game items — removed 17 items admins typically customize (netherite, totems, beacons, elytra, etc.). Still seeds ~190 everyday items. Removed items remain available via /shop admin edit.
## EconomyShop v1.0.5 — Persistent item settings + sell-to-shop fix
### Features
**Item settings now persist when you delete and re-add**
- Items removed via the admin GUI are soft-removed instead of permanently erased
- Re-adding the same material to the same category restores its previous price, stock mode, dynamic-pricing flags, and every per-item setting exactly as you left them
- A new "Restored" chat message confirms when this happens (distinct from the regular "Added")
- Old soft-deletes auto-purge after 90 days alongside the existing transaction-purge dashboard action
- Database migrates automatically on first boot — no config changes needed
### Bug Fixes
**Sell-To-Shop "Exclude from Sell All" visual not updating**
- Right-clicking an item in `/shop sell` to exclude it from Sell All correctly toggled the exclusion, but the red ✘ "Excluded" lore line and missing glow never appeared
- Now the lore and glow update on every right-click as expected
- The exclusion itself was always working — Sell All did skip excluded items — only the visual feedback was broken
- Caused by Paper changing inventory item access to return a snapshot rather than a live reference
**Crash-window dupe vector in `/shop sell hand` and `/shop sell all`**
- Both commands deposited money before removing items, opposite of the canonical sell order
- A server crash mid-transaction could have left a player with both items and money
- Now items removed first, money deposited last
- The GUI sell paths (`/shop sell` button, sell-confirmation GUI) were already correct — this brings the command paths in line
EconomyShop v1.0.4.1 — Hotfix
Bug Fixes
Creative Mode Config Not Respected
- The security.block-creative config option was being ignored inside shop GUIs
- Setting it to false now correctly allows creative mode players to buy and sell
- Previously, the command let creative players through but every GUI click was silently blocked
Database Errors on Bulk Price Adjustment
- Running /shop admin prices increase/decrease could cause database lock errors and fail to update many items
- Bulk operations are now atomic — all items update together, or none do on failure
EconomyShop v1.0.4 — Changelog
New Features:
Bulk Price Adjustment Command
- New admin command: /shop admin prices <increase|decrease> <buy|sell> <percent>
- Adjusts all shop item prices at once by a percentage
- Increase capped at 1000%, decrease capped at 99% (prevents zero/negative prices)
- Clamped to your configured min/max price bounds
- Full tab completion through all argument positions
Discord Webhook Alerts for Repeated Transactions
- New webhooks section in config.yml
- Sends a Discord embed when a player performs many buy/sell transactions of the same item within a configurable time window
- Tracks both buys and sells of the same material in a single counter (catches buy/resell exploits)
- Tracked per-player and per-material to avoid false positives from normal shopping
- Configurable threshold and sliding time window
- Disabled by default — paste your Discord webhook URL and toggle on
- Fully async, errors are swallowed so a bad webhook URL never breaks the plugin
Bug Fixes:
Restock Interval Editor
- Restock interval slot in the admin item editor now uses left/right click increments instead of typing on a sign
- Left-click: +1 hour
- Right-click: -1 hour
- Shift+Left: +1 minute
- Shift+Right: -1 minute
- Lore now clearly shows all click instructions
- Hint added when value is 0 (uses server default)
Full Inventory Buy Block
- Buying items with a full inventory is now blocked entirely instead of dropping overflow on the ground
- Prevents money laundering exploits (buy + drop for alt to grab)
- Prevents lost items from chunk unloads
- Prevents item drop spam griefing
- Counts both empty slots AND partial stacks of the same item as available space
- Money and stock are not deducted on a blocked purchase
- Clear error message tells the player to make space
EconomyShop v1.0.3.4 — Patch Notes
Critical Bug Fixes
Selling Air / Invalid Items
- Players could sell AIR or null-material items for money. Added isAir() and null checks in handleQuickSell, executeSell, and the material browser. Inventory counting now skips air stacks. Blacklisted materials are also now blocked when adding items via the material browser.
Sell Multiplier Creating Free Money
- All config values that feed into price math are now clamped to safe bounds — sell-price-multiplier locked to [0.01, 1.0], buy-sell-spread to [0.01, 1.0], all stock settings floored at 1. Prevents misconfiguration from generating money.
- Fixed NaN and Infinity multipliers caused by division-by-zero when stock reached 0. getEffectiveSellPrice and getEffectiveBuyPrice now treat NaN/Infinity as 1.0. DynamicPricingEngine uses Math.max(1, ...) on every stock divisor.
- getEffectiveSellPrice now returns 0 instead of null when an item has no sell price set.
Money Duplication via Transaction Order
- Reversed sell operation order: items are now removed from inventory before depositing money. Previously, a crash between deposit and item removal would give money without taking items.
- Added dupe detection: item count is verified before and after removal. If the delta doesn't match the expected quantity, the transaction aborts, items are returned, and a [DUPE DETECTION] warning is logged.
Other Changes
- Sell confirmation GUI now driven by sell-confirmation.yml layout instead of hardcoded slots
- Sell-to-shop GUI: left-click quick-sells all of that item, shift+left-click opens quantity selector, right-click excludes items from "Sell All"
- InventoryDragEvent now also sets Result.DENY (not just setCancelled)
- DynamicPricingEngine.getOrCreateState uses ConcurrentHashMap.computeIfAbsent (atomic, replaces check-then-put)
EconomyShop v1.0.3.3 — Patch Notes
Bug Fixes
- Fixed item loss on large purchases — overflow items are now split into valid stack sizes before dropping
- Fixed WorldGuard region checks not working — hook was never activated after registration
- Fixed 5 Folia-incompatible scheduler calls in chest shop listeners
Configuration
- sell-price-multiplier now applies to static sell prices (default 0.5 = players get 50% of configured price)
- All price min/max configs now enforce max >= min
- HikariCP connection timeout default fixed to match config.yml
Security
- Refund deposits now checked and logged on failure
- Stock add operations verified before updating cache
- InventoryDragEvent fully denied in all GUIs
v1.0.3.2 Changelog
Bug Fixes
- Fixed "stmt pointer is closed" SQLException that could appear under load — SQLite was sharing a single connection across async threads, which the JDBC driver doesn't support
- Fixed missing SchedulerUtil.runSyncLater() method that was breaking chunk load verification
- Fixed database error on server shutdown when async tasks were still running
EconomyShop v1.0.3 Changelog
- Added /sell command — sell the item in your hand without opening a GUI
- Added /sell [amount] — sell a specific amount of the held item
- Added /sell all — sell everything sellable in your inventory at once
- Added sell commands toggle (modules.sell-commands) — servers can disable command selling and keep GUI-only
- Added item reordering in admin category editor — Shift+Left-click two items to swap their positions
- Added sell quantity selector — Shift+Left-click an item in the sell GUI to choose how many to sell
- Added item exclude from Sell All — Right-click items in the sell GUI to skip them
- Added sell confirmation GUI with configurable YAML layout (matches buy confirmation)
- Added update checker on startup
- Fixed shop GUI showing "Left-click to sell" instead of "Right-click to sell"
- Fixed /sell with empty hand showing raw message key
New Features
- Ships with a fully stocked default shop on first install — 9 categories, 200+ items with balanced prices ready to go
- Categories: Ores & Minerals, Building Blocks, Wood & Nature, Food & Farming, Mob Drops, Redstone, Potions & Brewing, Miscellaneous, Dyes & Decoration
- All items default to infinite stock and static pricing — works out of the box with zero config
- Prices based on community-verified economy guides with a 50% buy/sell spread
- Includes high-value items: Spawner, Elytra, Totem of Undying, Trident, Beacon, Conduit, Nether Star, Dragon Egg
- Includes all 16 dye colors plus common decoration blocks
- Default shop only seeds on fresh install — existing servers are not affected
Bug Fixes
- Fixed CAST AS INTEGER SQL syntax that breaks on MySQL/MariaDB — now uses database-specific casting
- Fixed HikariCP idle timeout being hardcoded instead of reading from config
- Fixed missing serverTimezone=UTC in MySQL JDBC URL — prevents timezone errors on MySQL 5.7+
- Fixed price_history table using DOUBLE instead of DECIMAL(15,2) — prices now stored with exact financial precision
- Fixed ChestShop quantity input accepting negative or oversized values — now rejects anything outside 1-2304
- Fixed admin stock edit blocking the main thread with a synchronous database call — now runs async
- Fixed SQLite connection thread safety — added volatile field and synchronized reconnection
- Fixed GUI click rate limiting race condition on Folia — replaced with atomic put-and-check
- Fixed silent exception swallowing in database schema migration — unexpected errors are now logged
- Fixed missing economyshop.admin.bypass permission in plugin.yml — was checked in code but undocumented
v1.0.1 Changelog
Bug Fixes
- Fixed sell transaction order — items are now removed before money is deposited, preventing a potential item duplication exploit on server crash
- Fixed a TOCTOU race condition in buy transactions — removed separate balance check before withdrawal, now uses a single atomic withdraw call
- Fixed chest shop buy order — owner now receives payment before items are delivered to buyer, preventing unrecoverable state if deposit fails
- Fixed stock cache/DB ordering inconsistency — addStock() now writes to database first and updates cache on success, matching the deductStock() pattern
- Fixed GUI click rate limiting race condition on Folia servers — replaced get-then-put with atomic put-and-check
- Fixed quantity input accepting negative or oversized values in chest shop transaction GUI — now rejects anything outside 1-2304
- Fixed admin stock edit blocking the main thread with a synchronous database call — now runs async
- Fixed icon picker losing its mode when searching — browsing materials after a search no longer adds items to the shop instead of picking an icon
- Fixed missing placeholder values in buy failure messages — "You need {price} to buy {qty}x {item}" now shows actual values instead of blanks
- Fixed missing {item} placeholder in admin price set messages
- Fixed missing {category} placeholder in admin item removed messages
- Fixed missing {stock} placeholder in out-of-stock error message
MySQL / MariaDB
- Fixed CAST AS INTEGER syntax that fails on MySQL — now uses database-specific casting (CAST AS SIGNED on MySQL, CAST AS INTEGER on SQLite)
- Fixed HikariCP idle timeout being hardcoded instead of reading from config
- Fixed missing serverTimezone=UTC parameter in JDBC URL — prevents timezone errors on MySQL 5.7+
- Fixed price_history table using DOUBLE instead of DECIMAL(15,2) — prices now stored with exact precision
- Fixed dead config getter (keepalive-time) replaced with working idle-timeout getter
Security
- Added transaction locks to admin shop buy and sell operations — prevents concurrent purchases overselling finite stock
- Creative mode is now always blocked for all shop transactions — no longer configurable
- Fixed SQLite connection field not being volatile — prevents stale reads on multi-threaded servers
- Added synchronized access to SQLite connection reconnection — prevents race condition on concurrent access
- Fixed silent exception swallowing in database schema migration — unexpected errors are now logged instead of ignored
- Added missing economyshop.admin.bypass permission to plugin.yml — was checked in code but undocumented
GUI Improvements
- All admin shop and player shop item layouts now use a centered, responsive algorithm — items arrange cleanly based on count instead of packing left-to-right
- Chest shop Edit GUI buttons now center dynamically based on available features instead of leaving gaps
- Added configurable divider lines between item info and click actions in all GUI lore
- Renamed "Right-click to quick sell" to "Right-click to sell"
- Removed bold formatting from price history titles — long item names no longer overflow the screen
- Long item names in price history titles are truncated with "..." if they exceed 32 characters
- Custom datapack items now display proper names everywhere instead of raw translation keys
Customizability
- Every admin GUI string is now configurable via lang/en_US.yml — item editor, category config, material browser
- All 20 sign input prompts (buy price, sell price, search, permission, etc.) are now configurable
- Chest shop sign text ([Shop], Buy:, Sell:, Buy Only) is now configurable
- Market stats and purge result messages are now configurable
- Currency symbol is now configurable via economy.currency-format in config.yml — supports any format like $, G, coins
- Help command format now matches AuctionHouse style
- Added granular admin permissions — economyshop.admin.edit and economyshop.admin.reload are now checked separately
- Removed dead config options that did nothing
- Removed unused economyshop.admin.import permission
- Config reload now re-applies currency format without requiring a restart
- Added 10 missing chest shop GUI message keys that were showing raw key names to players
Compatibility
- Moved Vault from softdepend to depend — plugin already required it, now declared honestly
- Fixed Folia entity scheduler passing null as retired callback — now uses a safe no-op
- Fixed tab completion returning null which leaked all online player names — now returns empty list
- Added base permission check to tab completion — players without economyshop.use no longer see subcommands
- Fixed WorldGuard hook silently swallowing all exceptions — unexpected errors are now logged
EconomyShop v1.0.1.1 (patch)
- Switched from MySQL Connector (GPL) to MariaDB Connector (LGPL) — works with both MySQL and MariaDB
- Fixed character encoding to utf8mb4 for special characters
- Replaced sign-based text input with chat-based input — no external dependencies
-Fixed a few chat messages showing raw values