Skip to main content

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: NONE
      STANDING_RIGHT_CLICK_DISPLAY: NONE
      SNEAKING_LEFT_CLICK_DISPLAY: NONE
      SNEAKING_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:

  1. Handles null safety.
  2. Optionally checks material.
  3. Optionally checks stack amount.
  4. Iterates only over enabled component types.
  5. Returns false immediately on the first mismatch.
  6. 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 header
  • item – formatted item display
  • level – item level/duration line
  • price – complete price line with stacking shop support
  • trading – 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.