fixes for exceptions and old migrations
- Fixed the v5.2 database migration.
- Legacy quantity <= 0 values are normalized to 1; prices and leaderboard totals remain unchanged.
- Existing transactions.pre-5.1.db backups are preserved.
- New transactions still enforce quantity > 0.
- Added migration, retry, backup, and constraint regression tests.
- Implemented the empty-price sale fix.
- SaleService.java now treats missing initial prices as “nothing sellable,” without logging an error or mutating the transaction.
- Pre-transaction event price validation remains strict.
- Added regression coverage in SaleServiceTest.java.
Multi-Currency Support, Safer Transactions
Added
Full multi-currency support for EconomyShopGUI economies.
Currency-aware transaction history, leaderboards, and PlaceholderAPI placeholders.
/sellstick status for plugin, database, dependency, cache, and update-check health.
Persistent /sellstick claim cooldowns that survive restarts.
/sellsticktop sellers|items|total [currency] with currency filtering.
Strict configuration validation with safe reload rollback.
Fully configurable command, transaction, leaderboard, status, and update messages.
Automatic transactions.log rotation and retention.
Database schema v2 with automatic legacy migration and pre-upgrade backups.
Paper 26.2 / Java 25 compatibility build profile.
Expanded automated test coverage from 10 to 18 tests.
Changed
Sale earnings are now stored separately per currency instead of combining unrelated economies.
EconomyShopGUI providers now control currency formatting.
Added EconomyShopGUI PreTransactionEvent and PostTransactionEvent integration.
Reworked transaction processing for safer validation, payment, inventory updates, and rollback.
Replaced Bukkit database tasks with a dedicated serialized persistence worker.
Leaderboard caches are now maintained independently for each currency.
/sellstick reload keeps the previous working configuration when validation fails.
Item creation and legacy-stick handling now use validated immutable settings.
Update checking now exposes detailed runtime states and prevents stale async results.
Existing placeholders continue using the configured default currency.
Fixed
Prevented different currencies from being incorrectly combined in statistics.
Improved transaction rollback when a sale fails partway through.
Prevented presentation errors such as sounds/titles from undoing successful sales.
Improved database shutdown handling and pending-write reporting.
Fixed raw PlaceholderAPI values to return stable unformatted decimal numbers.
Improved database migration safety with transactional rollback and idempotent upgrades.
Compatibility
Existing 5.0 Sell Sticks remain valid.
Valid pre-5.0 sticks continue to migrate automatically.
Existing transaction history is preserved and assigned to the configured default currency.
Existing default PlaceholderAPI placeholders remain supported.
Java 21 / Paper 1.21.11 remains the primary release baseline.
A major compatibility and reliability update for modern Paper servers.
Added
- Updated support for Paper 1.21.11+ and Java 21.
- Added secure Sell Stick usage storage using Persistent Data Container.
- Added automatic migration for legacy Sell Sticks.
- Added <USAGE> placeholder support.
- Added improved version checking with prerelease support.
- Added safer asynchronous database transactions.
Fixed
- Fixed Sell Stick uses being vulnerable to lore editing.
- Fixed expired sticks attempting to sell before being removed.
- Fixed off-hand Sell Stick removal.
- Fixed failed sales potentially leaving payments or container contents in an inconsistent state.
- Fixed Sell Stick usage being consumed before a sale fully completed.
- Fixed database failures affecting normal selling.
- Fixed update checks incorrectly comparing version numbers.
- Fixed PlaceholderAPI expansion not surviving PlaceholderAPI reloads.
- Fixed various deprecated Paper/Bukkit API usages.
Improved
- Improved transaction rollback and sale safety.
- Improved database performance and leaderboard cache refreshing.
- Improved Adventure text/component support.
- Preserved all existing commands, permissions, placeholders, pricing behavior, multiple currencies, and historical database data.
- Improved invalid configuration and sound handling.
Compatibility
- Java 21+
- Paper 1.21.11+
- PlaceholderAPI 2.12.3
- EconomyShopGUI API 1.10.1
Please consider leaving a good review for the plugin.
EconomyShopGUI API Update & Safer Container Transactions
- Updated support for EconomyShopGUI API 1.10.1.
- Reworked container selling to properly preserve custom item metadata.
- Improved compatibility with sell limits, dynamic pricing, multipliers, and multiple currencies.
- Containers are no longer modified until all required payment providers have been successfully validated.
- Failed transactions now safely restore container contents and roll back completed payments where necessary.
- Added a configurable transaction failure message.
- Configuration files now automatically receive newly introduced options when updating.
- Existing configuration values are always preserved during automatic updates.
- Legacy configuration formats remain fully supported for backwards compatibility.
Please consider leaving a good review for the plugin.
Maintenance update
Added
- Added README.md with requirements, commands, permissions, PlaceholderAPI placeholders, cache notes, and build instructions.
- Added checkForUpdates: true to config.yml.
- Added leaderboard configuration options:
- cache-seconds
- top-items-days
- limit
- Added new configurable messages:
- messages.inventory_full
- messages.target_inventory_full
- Added an asynchronous leaderboard cache for top sellers, top items, and total money.
- Added database schema support for storing player names with transactions.
- Added database indexes for transaction timestamps, player UUIDs, and item/timestamp lookups.
Changed
- Updated Maven metadata:
- groupId changed from org.example to com.lucidaps.
- Version changed from 1.0-SNAPSHOT to 4.2.
- Added project name and description.
- Marked EconomyShopGUI-API as provided in Maven.
- Changed PlaceholderAPI from a required depend to an optional softdepend in plugin.yml.
- Changed EconomyShopGUI handling so the plugin disables itself early if neither EconomyShopGUI nor EconomyShopGUI-Premium is enabled.
- Moved EconomyShopGUI dependency validation before sell listener registration.
- Reused a single TopCommand instance for the command executor and tab completer.
- /sellstick reload now restarts the leaderboard cache using the newly loaded configuration.
- /sellsticktop now uses the configurable leaderboard limit and top-item day range.
- PlaceholderAPI leaderboard placeholders now use cached leaderboard data.
- Top seller displays now use stored player names when available instead of synchronous offline-player lookups.
- Transaction logging now stores the player's name alongside their UUID.
Fixed
- Fixed potential main-thread SQLite reads from /sellsticktop.
- Fixed potential main-thread SQLite reads caused by PlaceholderAPI placeholder requests.
- Fixed potential main-thread offline-player lookups when displaying leaderboard data.
- Fixed command fallthrough where unauthorized users could enter admin subcommands and continue into normal /sellstick behavior.
- Fixed /sellstick consuming the cooldown when the player's inventory was full.
- Fixed sell stick claiming silently failing or stacking into existing sticks by requiring an empty inventory slot.
- Fixed give and customgive losing items when the target player's inventory was full. Items are now dropped at the target player's location instead.
- Fixed customgive accepting invalid usage values such as 0 or negative numbers.
- Updated plugin.yml command and permission descriptions to match current behavior.
Please consider leaving a good review for the plugin.
Discord Support
fixes improvements
Fixes
- Fixed sell stick usage increasing twice when both the display name and lore contained a usage counter like [x/y].
- Fixed the update checker URL so version checks now use the correct Spigot endpoint.
- Fixed PlaceholderAPI placeholders returning blank in non-player contexts, including placeholders such as total money.
- Fixed possible null issues involving ItemMeta during sell stick validation and item creation.
- Fixed startup flow so the plugin now disables immediately if EconomyShopGUI or EconomyShopGUI-Premium is missing.
- Fixed command registration to avoid creating multiple unnecessary TopCommand instances.
Improvements
- Reworked sell stick usage handling so usage is read once, incremented once, and written back consistently.
- Improved sell stick removal logic when the item reaches max usage.
- Improved SQLite handling to reduce locking and concurrency problems.
- Added synchronization around database access for better stability.
- Enabled SQLite WAL mode and busy timeout for more reliable database writes.
- Replaced manual SQL resource closing with try-with-resources.
- Improved command registration safety with null checks for missing commands in plugin.yml.
- Moved update checker callbacks back to the main thread before using the result.
- Removed risky async EconomyShopGUI sell limit updates and kept them on the main thread.
- Added safer ItemMeta checks when creating sell sticks from config and custom usage values.
Cleanup
- Removed unused helper methods from PlayerInteractionHandler.
- Cleaned up duplicate command object creation.
- Simplified placeholder handling for global placeholders.
- Made startup logic cleaner and easier to follow.
more options and fixes
- Added optional Sneak-to-use mode (sellstick.require-sneak) to prevent accidental selling
- Added message feedback when a container has no sellable items
- Currency symbol is now taken from config everywhere (Top command + PlaceholderAPI)
# Configuration for the Sell Stick
sellstick:
# if true, player must be sneaking to use the stick
require-sneak: false
# Configuration for the messages displayed to the user
messages:
world_blacklisted: "&cYou can’t use the Sell Stick in this world."
sneak_to_use: "&dShop &8>> &7Sneak to use the Sell Stick."
nothing_sellable: "&dShop &8>> &7No sellable items found in this container."
Please consider leaving a good review for the plugin.
Colors , Title messages and more
- Better and proper support for HEX colors and other variations for display name and more.
- Made sure the plugin doesn't break that easily with extreme customization of the sell stick.
- Added the option to customize the title-messages if they are enabled.
- Added a currency option.
Config Changes
# Configuration for the Sell Stick
sellstick:
# Display name of the Sell Stick
display-name: "&dShop &8>> &bSell Stick"
# Lore (description) lines on the Sell Stick
lore:
- "&7A special stick for &d/market"
- "&7Use it to quickly sell chests and shulkers!"
- "&7Usage: [&d0/<MAXUSAGE>&7]"
# Maximum usage limit for the Sell Stick
max-usage: 20
# Material type of the Sell Stick
material: BLAZE_ROD
# Cooldown time (in minutes) for using the Sell Stick command
cooldown-command: 5
currency-symbol: "€" # used by <CURRENCY> placeholder (optional)
# Whether to display a title message on successful sale
title-message:
enabled: true
title: "&aSold for <CURRENCY><PRICE>"
subtitle: "&7<PLAYER> sold: &d<ITEMS>"
fade-in: 10
stay: 80
fade-out: 10
# Configuration for the sounds played on successful sale
sounds:
# Whether to enable sounds globally
enabled: true
# Sound configuration for low-value sales
low_value:
# Type of sound to play
sound: BLOCK_NOTE_BLOCK_CHIME
# Volume of the sound (0.0 to 1.0)
volume: 0.8
# Pitch of the sound (0.0 to 2.0)
pitch: 0.7
# Threshold value to classify sale as low-value
threshold: 1000
# Sound configuration for medium-value sales
medium_value:
sound: ENTITY_PLAYER_LEVELUP
volume: 0.8
pitch: 1.2
threshold: 5000
# Sound configuration for high-value sales
high_value:
sound: ENTITY_FIREWORK_ROCKET_LARGE_BLAST_FAR
volume: 0.8
pitch: 1.0
threshold: 10000
# Worlds where SellStick is disabled
blacklisted-worlds:
- lobby
# Configuration for the messages displayed to the user
messages:
# Message when a player receives a Sell Stick
received_sell_stick: "&dShop &8>> &bYou have received a Sell Stick!"
# Message when the configuration is reloaded successfully
config_reloaded: "&aThe configuration has been reloaded!"
# Message when a player does not have the required permission
no_permission: "&cYou do not have permission to use this."
# Message when a player tries to sell from an empty container
container_empty: "&dShop &8>> &7The container is empty."
# Message when a player reaches the sell limit for an item
sell_limit_reached: "&dShop &8>> &7Sell limit reached for &d%s&7. Check the /market for the restock time."
# Message when a player's Sell Stick reaches maximum usage
max_usage_reached: "&cYour Sell Stick has reached maximum usage and has been removed!"
# Message when a player tries to use a stack of Sell Sticks
cannot_use_stack: "&cYou cannot use a stack of Sell Sticks. Please separate them."
# Message when a player sells items successfully
sold_successfully: "&dShop &8>> &7You sold &d<ITEMS> &7for &d<CURRENCY><PRICE>."
# Message when a player tries to use the command while it's on cooldown
command_on_cooldown: "&cPlease wait %d minutes before using this command again."
world_blacklisted: "&cYou can’t use the Sell Stick in this world."
Please consider leaving a good review for the plugin.
Discord Support
Page 1