All versions
1.0.1
Release
EconomyShop by ilius 1.0.17 months ago 25
Compatibility
Minecraft: Java Edition
1.21.x
Platform
Folia
Changes
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, dashboard, 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
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:zR6c1YxT:jep9C2i5"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:zR6c1YxT:jep9C2i5"
}

