6.3.0.0 (Orion: Rigel)
Outline
- Sign parser implementation?
- probably have to re-evaluate since it's been awhile since it has been looked at...
Major Changes
New Display Type: 3 (Display Entities)
- These displays don't require packetevents or protocollib.
- They are more performant than the previous display types.
- They are also more flexible and can be used for other purposes.
- They can be scaled using the new display-scale configuration
- They can be configured to allow intearactions in interaciton.yml, the options are:
STANDING_LEFT_CLICK_DISPLAY: NONESTANDING_RIGHT_CLICK_DISPLAY: NONESNEAKING_LEFT_CLICK_DISPLAY: NONESNEAKING_RIGHT_CLICK_DISPLAY: NONE
Config-Driven Data Component Matcher (1.21+)
This uses worker-type: 3.
Changes
- Updated matcher to store and compare DataComponentType.Valued entries.
- Resolved registry entries safely using the Paper data component registry.
- Implemented whitelist-based matching: only components explicitly enabled in matcher.components are compared.
- Merged previous meta toggles into components using uppercase group keys.
- Explicitly excluded CUSTOM_DATA from comparison to prevent ViaVersion protocol markers from causing mismatches.
Behavior
Matching now:
- Handles null safety.
- Optionally checks material.
- Optionally checks stack amount.
- Iterates only over enabled component types.
- Returns false immediately on the first mismatch.
- Returns true if all enabled components match.
Config Structure
All comparisons are configured under matcher.components. Keys can be:
- Direct DataComponentTypeKeys fields (e.g., DAMAGE, LORE, ENCHANTMENTS).
- Group keys that expand internally (e.g., BOOKS, SHULKER_BOX, FIREWORK).
Text Displays(shop.text-display)
- Added shop.text-display which is a visual display that can be customized. This is a more visually appealing version of shop.display-item-use-name.
- These support adventure lib components are are configurable through config.yml
# This spawns a separate fake entity that displays shop information.
text-display:
# Should the text display be enabled?
enabled: false
# Text Display view range
range-blocks: 3
# Height above the item
y-offset: 0.8
# Background color (32-bit ARGB)
background-color: 1073741824
line-width: 200
#The scale of the text display.
#The acceptable values are from 0.0 to 1.0.
scale:
x: 0.5
y: 0.5
z: 0.5
# <item_name> is replaced with the item name.
# <price> is replaced with the item price.
# <amount> is replaced with the item amount.
# <price_amount> is replaced with the item price per amount.
# <owner> is replaced with the shop owner's name.
# <type> is replaced with the shop type (BUYING/SELLING).
# <status> is replaced with the shop status (ACTIVE/FROZEN).
lines:
- "<green><item_name></green>"
- "<gray><owner></gray>"
- "<gray><type></gray>"
- "<gold><price_amount></gold>"
Updater System Refactor + Modrinth Support
Added
- Modrinth update source support
- Uses Modrinth API for version checks
- Detects latest & latest stable release via SemVer
- New UpdateProvider interface for extensible update sources
- New centralized UpdateManager
- 1-hour metadata cache
- Unified version comparison
- Paste output now shows the active provider
Changed
- Refactored old Nexus-only updater into a provider-based system
- UpdateWatcher now uses the generic updater manager
- Update URL now comes from the active provider
Config
#The source to check for updates on.
#Allowed values: "nexus", "modrinth"
#Nexus shows snapshots and releases, modrinth shows releases only.
updater-source: "modrinth"
This lays the groundwork for future providers (CurseForge, Hangar, GitHub, etc.) without core rewrites.
New: Shop Tagging System
A new player-driven tagging system has been introduced, allowing players to organize and track shops using custom tags.
Key Points
- Players can add custom tags to shops they are looking at.
- Tags support letters, underscores (
_), and dashes (-). - Tags are normalized and limited in length to ensure consistency and performance.
- Reserved system tags power built-in features such as:
- @fav - Favorites
- @watch - Watchlist
- @avoid - Avoided shops
- Tags are stored per-player per-shop, allowing each player to maintain their own organization system.
Commands
/qs tag <tag>- Add a tag to the shop you are looking at/qs tag remove <tag>- Remove a tag from the current shop/qs tag clear- Remove all of your tags from the current shop/qs tag shops- List all tags you have created/qs tag tagged <tag>- List shops you have tagged with a specific tag/qs tag purge <tag>- Remove a tag from all shops/qs favorite- Add the current shop to your favorites/qs watch- Add the current shop to your watchlist/qs avoid- Add the current shop to your avoid list
RenderComponent System
The render component system replaces the current sign layout system and the text-display system, combining both into a single flexible rendering system.
The layout options for signs retain the current iteration (header, trading, item, level, price), while introducing greater customization. Components are now divided into three categories:
- Full line components – occupy an entire sign line.
- Inline components – replace only themselves and can be combined with surrounding text.
- Conditional components – behave like inline components but automatically change their output based on the current shop state.
Full Line Components
header– shop owner/availability headeritem– formatted item displaylevel– item level/duration lineprice– complete price line with stacking shop supporttrading– trading/stock status line
Inline Components
<amount>– item amount<item_name>– item display name<item_level>– enchantment level, potion duration, or similar item metadata<owner>– shop owner name<price_alone>– formatted price only<price_amount>– formatted price text with stacking shop support<status>– current shop state/status<stock>– remaining stock display<type>– shop type (Buy/Sell/etc.)
Conditional Components
Conditional components dynamically determine their output based on the current shop state.
<amount_auto>– Displays:- Out of Stock when the shop has no remaining stock.
- Unlimited when the shop has unlimited stock.
- The remaining stock amount when the shop has available stock.
Minor Changes
- Replaced startup parameter "playerDBFindUUIDTask" with config option "uuid-lookup.allow-playerdb-uuid"
- Replaced startup parameter "playerDBFindNameTask" with config option "uuid-lookup.allow-playerdb-name"
- Replaced startup parameter "databaseFindUUIDTask" with config option "uuid-lookup.allow-db-uuid"
- Replaced startup parameter "databaseFindNameTask" with config option "uuid-lookup.allow-db-name"
- Replaced startup parameter "disableDatabaseCacheWrite" with config option "database.disable-username-cache"
- Replaced startup parameter "bakeuuids" with config option "database.bake-uuids"
- Replaced startup parameter "forceBungeecord" with config option "proxy.force-bungeecord"
- Replaced startup parameter "parallelism" with config option "database.loader-threads"
- Replaced startup parameter "betaForceReplaceFillerProcessor" with config option "lang-processor.replace-filller-post-process"
- Replaced startup parameter "usePAPIPostProcess" with config option "lang-processor.papi-post-process"
- Replaced startup parameter "fixClientItemTextRenderAlwaysItalic" with config option "lang-processor.fix-item-always-italic"
- Replaced startup parameter "skipConfirmation" with config option "skip-command-confirmation"
- Replaced startup parameter "generateDatabaseFullReport" with config option "database.generate-full-report"
- Replaced startup parameter "unlimitedWait" with config option "database.unlimited-save-wait"
- Replaced startup parameter "shoppableChecks" with config option "shop.shoppable-check"
- Replaced startup parameter "flushTransactionDelay" with config option "shop.join-flush-delay"
- Replaced startup parameter "ignoreCancelledInteractEvent" with config option "shop.ignore-cancelled-interact-event"
- Replaced startup parameter "allowOffline" with config option "shop.allow-offline-benefit"
- Replaced startup parameter "updateShopSignOnLoad" with config option "shop.update-sign-on-load"
- Replaced startup parameter "essentialsXFindUUIDTask" with config option "uuid-lookup.allow-essentialsx-uuid"
- Replaced startup parameter "essentialsXFindNameTask" with config option "uuid-lookup.allow-essentialsx-name"
- Replaced startup parameter "bukkitFindNameTask" with config option "uuid-lookup.allow-bukkit-name"
- Replaced startup parameter "bukkitFindUUIDTask" with config option "uuid-lookup.allow-bukkit-uuid"
- Replaced startup parameter "skipDatabaseVersionCheck" with config option "database.skip-version-check"
- Bumped config version to 1037
- started including tax amount in shop failure message "you-cant-afford-to-buy"
- Update configuration file comments and standardize formatting(thanks to YuanYuanOwO)
- Split metrics into separate files and added FastStats metric tracking.
- Added toggle display icon to GUI.
- renamed price to price_solo for text-display configurations.
- Added support for displaying the name of the song on a music disc using shop.use-song-for-disc-item in config.yml
- Added enchantments to enchanted book views for shop UIs
- Added support for translating remaining untranslatable UI messages.
- Added level as an option for shop.layout.
- This allows the sign to display the potion duration or enchantment level.
- Expanded the shop.display-item-use-name config.
- This now displays more potion information when enabled. It'll include the potion type, duration, level and if splash or lingering.
- Modified fish_bucket custom matcher component to include the following components:
- "AXOLOTL/VARIANT",
- "SALMON/SIZE",
- "TROPICAL_FISH/PATTERN",
- "TROPICAL_FISH/BASE_COLOR",
- "TROPICAL_FISH/BASE_COLOR"
- Added protect.oxidation config.
- This allows protecting copper chests from oxidizing
- Added close-after to quantity-buttons node in gui.yml to allow server owners the ability to let the gui stay open for repeated clicking.
- Added shop.use-roman-numeral-for-enchantments to specify if shop.use-enchantment-for-enchanted-book should use a normal number or roman numeral for the enchantment level.
- Added shadow, text-opacity, and see-through for text-display configs
- Added rotation config for display-type: 3
- Added DisplayManager to api, which is now the base class for all display type managers.
- Added getDisplayManager() to QuickShopAPI.
- Added DisplayManagerPutEvent and DisplayManagerRemoveEvent, which are now fired when a display is added or removed from a DisplayManager.
- Added /qs benefitall to add/remove a player's benefit from all shops.
- Added disable-buy-transfer which allows servers to disable the ability to transfer buy shops.
- Added support for adventure v5(thanks YuanYuanOwO)
- Hide enchantment level for enchants with max level of 1 (thanks Warriorrrr)
- Use item_name component if present when force-use-item-original-name is on(thanks Warriorrrr)
- Added disable option to shop staff menu icon.
Addons
Bolt Addon(new)
- Prevents shops from being created on Bolt protected blocks.
DiscordSRV Addon
- Fox shop-side tax not reflecting in the purchase notifications for discordsrv addon(thanks to wling-art)
DyeSigns Addon(new)
- This also allows players to change the glow status of their signs using glowing ink sacs
- They can reset the dye and glow status by right clicking the sign with a sign.
EcoEnchants Addon
- Fix EcoEnchants compat for EcoEnchants 13.x(thanks to wling-art)
Pl3xMap Addon
- add icon-custom, when using that option the icon file needs to be in your qsaddon-pl3xmap folder, and the icon-file-location needs to have the file extension
- This allows for easier icon customization since pl3xmap doesn't have a straight forward way to do it.
GriefPrevention Addon
- Overrode GriefPrevention's getChunks() method, because they load chunks synchronously, which causes issues with the plugin for large claims.
Towny Addon
- Improved shop purging logic efficiency of Towny addon.(thanks Warriorrrr)
Internals
- Deprecated FrozenType in favor of a new ShopState system.
- Added new ShopState system to handle shop state changes.
- Added new ShopPrice interface that accepts a generic type, which is an object for the shop's price.
- This new interface also contains methods for comparison purposes, such as price comparison for sorting in UIs.
- Added a format method to the ShopPrice interface to format the price for display.
- Added bukkitLocation() to the Locatable interface, which returns a BukkitLocation object.
- Replaced internal calls to shop.getLocation with shop.bukkitLocation
- Split the Shop interface into different sub interfaces to improve readability and maintainability.
- The per-player-shop-sign option no longer requires ProtocolLib. (Warrior)
- Allow players to still use shop functions when muted on LiteBans(thanks to Warrior)
- Swap database thread pool to use virtual threads(thanks to Warrior)
- Avoid creating empty yaml config instances for every shop, this helps reduce RAM usage(thanks to Warrior)
- Added async options for sign updates, and improved locateInventory method to be more optimized
- In certain server environments this showed a ~23% performance improvement.
- Adjusted trade ui to use a stock variable instead of the cache, this should fix issues where stock information was sometimes inaccurate while not sacrificing performance.
- A very minor improvement in the find subcommand, skips doing a sqrt and playerAuthorize test for shops that are outside of the max distance.(Thanks to Warriorrrr)
- Started assigning PDC to shop chests which should allow faster checks in the future.
- Replaced the internal extra system with a new concurrenthashmap based system.
- This is a major internal change that should improve performance and reduce memory usage.
- This also allows for more flexibility in the future.
- This also changes the way we store extra data in the database as it's now stored as a JSON string instead of a yaml configuration string.
- Some minor performance improvements to hopper and dropper protection methods.
- Moved rollbar reporting to a more restrictive executor.
- Keep inventory count cache loaded in memory per shop, this should improve response times for various parts of the plugin drastically(thanks to Warriorrrr)
- Added flexible ShopQuery system for developers to use in order to get shops based on filters. Example:
final List<Shop> shops = ShopQuery.create().filterBy(Filters.OWNER_QUSER, qUser).filterBy(Filters.TYPE, plugin.getShopManager().shopTypeOrDefault("selling")).execute();
- Material Filter, filter by material
- Owner Filter, filter by Owner UUID
- QUser Owner Filter, filter by QUser Owner
- Type Filter, Filter by shop type
- State Filter, filter by shop state
- World UUID filter, filter by world UUID
Deprecation Removals
The following internals have been deprecated and will be removed in release 6.4.0.0.
- Removed ShopType enum and methods
- Removed deprecated tax methods.
- Class SimpleShopExtra
Deprecations
- Deprecated IShopLayoutProvider#renderHeaderSnapshot
- Deprecated IShopLayoutProvider#renderTradingSnapshot
- Deprecated IShopLayoutProvider#renderPriceSnapshot
- Deprecated IShopLayoutProvider#renderHeader
- Deprecated IShopLayoutProvider#renderTrading
- Deprecated IShopLayoutProvider#renderItem
- Deprecated IShopLayoutProvider#renderPrice
- Deprecated IShopLayoutProvider#renderLevels
Fixes
- Fix issue where disabling tax for unlimited shops wasn't properly working.
- Fix issue where FAWE on 2.11.2 and lower wasn't working correctly.
- Fix issue where FAWE would remove shops outside of selection zone.
- Fix issue where limits configs were not working properly(thanks to YuanYuanOwO)
- Fix Folia thread violations in /qs info stock stats(thanks to GoodrichDev)
- Fix Towny Compat not working in Folia(thanks to GoodrichDev)
- Remove blocking in AbstractShopManager#registerShop to fix deadlock on Folia. (Warrior)
- Fix AbstractShopManager#getShops returning null while marked as not-null (thanks to Warrior)
- Fixed issue where reloaded would cause the module count to continue to rise(thanks to Warrior)
- Fixed issue where the shop stock notification sent to staff was in the shop owner's locale(thanks to Warrior)
- Fixed issue where player tab completions didn't respect vanishing
- Fix calendar watcher spamming warnings during long shutdowns(thanks to Warrior)
- Corrected UI not showing correct items for potions and books
- Fixed issue where display-type 3 wasn't showing on rejoin
- Fixed issue with lower MC versions not being compatible with 6.3.0.0
- Fixed issue iwth lower versions of MC and protocollib not working.
- Fixed an issue where a warning was thrown during the first database initialization.(Thanks to YuanYuanOwO)
- Fix shop preview locales being sticky(Thanks to Warriorrrr)
- Fix ShopBenefitAddEvent not showing the cancel message(thanks to Warriorrrr)
- Made displays for display-type 3 rotate based on chest direction.
- This change requires manually changing the display-rotation.y config to 1.0 and display-rotation.z to 0.0
- Fixed issue where display wasn't updated when the shop type or state was changed.
- Fixed issue where menu titles couldn't be override in gui.yml
- Fixed issue where quantity icons couldn't be translated
- Fixed issue where shop search wasn't completed in qs create
- Fixed issue with pl3xmap addon where display-by-default wasn't being used correctly
- Fixed issue where glowing and dye color wasn't being applied to sign for per-player signs
- Fixed issue with text-display background color and viewrange on display-type 3
- Fixed issue where the item-left and item-right overrides were ignored when rendering sign layout snapshots.
- Fixed issue where toggling threw an error for the new display manager api class
- Fixed issue where partial items were being overrode in removal operation(thanks Warriorrrr)
- Fix a bug with versioning for TNIL breaking 26.2 support with recent 26.2 changes.
- Fix issue with text displays not working with protocollib.
- Fix tax not being accounted for in buy/sell all affordability checks.(thanks to wling-art)
- Invalid cache item preview GUI when shop item changes(thanks to wling-art)
- Fix issue with recovery when using prefix
- Minor performance improvements
- Update TNML to use wling-art's changes which prevent users from sending items into the GUI and losing them.
- Fix price restriction formatting, this now uses additional messages depending on if prices are restricted by max,min or both
- Fixed a bug where /qs recovery wasn't finding the schema files in the zip.
- Fixed an issue where buying bulk quantities through the UI wasn't working properly.
- Fix the issue where switching shop mode causes the number of shop display item to increase indefinitely by one each time.(thanks to YuanYuanOwO)
- Fixed issue with Squaremap addon where chests showed on all worlds.
- Fixed issue where loading old player data files in filter would cause an error.
- Fixes issue with reforges addon being outdated.
- Fixes issue where import and export command were not synced with naming scheme.
- Fixes issue where display-type 3 would not display when changing from server to server on velocity
- Fixes issue where sign checks were performed twice(thanks to wling-art)
- Fixes performance issue with shop staff menu, moved it to a new threaded lookup approach that caches player profiles.