🔍 Shop Search AddOn for QuickShop
Stop walking the whole map looking for a sign. Let your players search every shop on the server in one command.
/finditem opens an instant, paginated GUI showing every shop buying or selling the item your player wants, complete with price, stock, owner, location, and a one-click teleport button to get there. No walkie-talkie chat spam, no wiki page pinned in Discord, just search and go.
🚀 Try it in 60 seconds
- Drop the jar in
plugins/ - Restart your server (a
config.ymlis generated for you automatically) - Run
/finditemin game
That's the whole setup. Everything past this point is optional polish.
✨ Why your players will love it
- Instant results. Type an item name, get every matching shop on the server in a clean paginated GUI, sorted by price or stock, your choice.
- One-click teleport. Safe, configurable teleportation straight to the shop, with an optional delay and a "don't drop me in lava" landing check, or send them to the nearest warp instead.
- Nothing gets lost in search. Enchantments, potion colors and effects, custom item names and lore, and custom model data all show up correctly, not just the base item name.
- No wasted trips. Out-of-stock shops are skipped automatically, and you can cap results to a max distance so players aren't sent halfway across the map for one shop.
- Fully brandable. Every message supports hex colors, GUI buttons/titles/lore are editable, and large prices auto-shorten (
$10,210,100→$10.21M) to keep things readable. - Built for scale. Shop syncing and searches are optimized to stay fast even on servers running thousands of shops.
🖼️ See it in action
![]() |
![]() |
![]() |
|
![]() |
![]() |
📜 Command cheat sheet
| Command | What it does |
|---|---|
/finditem TO_SELL <item> |
Find shops selling this item (so you know where to buy it) |
/finditem TO_BUY <item> |
Find shops buying this item (so you know where to sell it) |
/finditem TO_SELL * / TO_BUY * |
Browse every shop on the server |
/finditem hideshop |
Hide the shop you're looking at from search results |
/finditem revealshop |
Make a hidden shop searchable again |
/finditemadmin reload |
Reload config.yml without a restart |
Aliases /searchshop, /shopsearch, and /searchitem all work out of the box too, and the TO_SELL/TO_BUY labels can be renamed in config if they read awkwardly for your players.
Full command list, every permission node, and a fully annotated
config.ymlare on the GitHub Wiki.
🔌 Plays nicely with
Auto-detected on startup, zero extra setup required:
| Plugin | What it adds |
|---|---|
| PlayerWarps | Shows the nearest warp to each shop in results |
| EssentialsX Warps | Same, using Essentials warps |
| WorldGuard | Shows which region a shop sits in |
| Residence | Shows which residence (and subzone) a shop sits in |
| BentoBox | Keeps shops on locked islands out of search results |
None of these are required. It works great with just QuickShop-Hikari and Vault installed.
⚙️ Built for real servers
- Runs on both Paper and Folia
- Fine-grained permissions for search, teleport, delay bypass, and safety-check bypass
- Shop owners can hide their own shop from search with a single command
- World and material blacklisting to keep results clean and free of exploit items
- Optional distance limit so search results stay local on huge worlds
📋 Requirements
- QuickShop-Hikari v6.3.0.0+
- Vault with a compatible economy plugin
- Paper 1.20+ (Folia supported)
📚 Links
Free and open source, GPLv3 licensed. Anonymous usage stats via bStats help prioritize what to build next, no personal data collected.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 | ||||
| 23h ago | 1 |
- Admins can now hide/reveal any player's shop**: players with
finditem.admincan use/finditem hideshopand/finditem revealshopon shops they don't own. - Much less server lag when running
/finditemon servers with many shops**: every search used to check each shop's hidden status by scanning the full list of shops, so the cost grew with the square of your shop count and landed on the main thread in a single tick. That check is now an instant lookup, and shops that don't sell the searched item are filtered out before the more expensive permission checks run. - Fixed the "last page" button opening an empty page when the number of results was an exact multiple of 45 (e.g. 90 or 450 shops).
### Changes (technical)
ShopSearchActivityStorageUtilkeeps a location index alongsideglobalShopsList;isShopHidden,getPlayerVisitCount,getShopOwnerUUID, visit tracking and hide/reveal now use O(1) lookups instead of linear scans- Search match phase now runs as one region task over all shops instead of one scheduler task, future and timeout per shop, with the match checks reordered cheapest/most selective first
- Noticeably faster searches on large servers** — the shop list sync that runs every 15 minutes (and on startup) has been rewritten to scale linearly instead of getting slower the more shops your server has. Servers with thousands of shops will see a significant drop in that sync time.
- Search results now always respect your configured sorting method** — previously, browsing all shops (
/finditem TO_BUY *) ignored yourshop-sorting-methodsetting and always sorted by a fixed method. It now behaves the same as all other searches. - Snappier GUI clicks** — shop teleportation and custom command execution on GUI click are now faster under the hood, with less redundant work per click.
- Java 25 & Paper API 26.x support** — ready for the latest server versions out of the box.
- New: limit search results by distance** ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): a new
shop-search-max-distanceconfig option lets you hide shops that are too far away from the searching player. Set it to a block radius (e.g.1000) to keep results local. Disabled by default (set to0). - Fixed
/finditemsilently doing nothing when searching enchanted books** ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110)), most noticeable with custom-enchantment plugins installed — a per-shop item check was running off the main thread and any error there was being swallowed instead of shown to the player. - Fixed shops in unloaded chunks showing 0 stock/space and dropping out of search results** ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)): with
search-loaded-shops-only: false, a matched shop whose chunk wasn't currently loaded could report as out of stock even when it wasn't, and get silently filtered out. FindItem now double-checks with a live read before discarding a shop like that. - Faster stock/space checks on servers with lots of unloaded shops**: instead of force-loading a shop's chunk just to count what's inside it, FindItem now asks QuickShop-Hikari for its own stored stock/space figure first. Chunk loading is now a last resort, used only when QuickShop has no stored figure yet. This should also resolve reports of
/finditemonly listing a handful of shops after updating QuickShop-Hikari to 6.3.x — its stock/space check changed to return0for any shop in an unloaded chunk, whichignore-empty-chests: true(the default) then silently dropped from results. - Fixed a typo in the sample
custom-commandslist inconfig.yml:{PLAYER}is not a valid placeholder,{PLAYER_NAME}is.
### Changes (technical)
- Upgraded to Paper API 26.x / Java 25
- Added
PlatformBridgeabstraction (BukkitPlatformBridge) to decouple platform-specific calls from core logic - Refactored
QSHikariAPIHandler: consolidated three duplicate shop-search methods into a singlesearchShops(Predicate, boolean, Player)method, removing ~70 lines of duplication - Optimized
syncShopsListForStoragefrom O(n²) nested loop to O(n)HashMaplookup — significant speedup on servers with large shop counts fetchAllItemsFromAllShopsnow respects the configuredshop-sorting-method(previously hardcoded to method 1)- Eliminated per-shop QS version string parse in stock/space cache lookup — replaced with boolean flag computed once at startup
- MC version regex in GUI compiled once as
static finalinstead of on every menu open - Tab-completion material list in
BuySubCmd/SellSubCmdbuilt once statically instead of per instance - Shop location string parsed once per GUI click and passed to all handlers, instead of being re-parsed by each handler independently
- Cleaned up
ShopSearchActivityStorageUtil:loadShopsFromFilenow callssyncShops()consistently; marked Reremake-eraaddShopoverload andgetShopOwneras@Deprecated - Added
shop-search-max-distanceconfig option ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): filters out shops beyond a configurable block radius from the searching player;0disables (default); cross-world shops are always included; bumped config version to 22 QSHikariAPIHandler.searchShops: merged the per-shop permission check and item-match filtering into a single scheduler hop (processShopMatchFuture) so item/meta reads always happen on the entity's region thread instead ofForkJoinPool.commonPool(); per-shop failures are now logged and skipped instead of failing the whole search ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))CmdExecutorHandler.handleShopSearch: added.exceptionallyhandling to all three search futures so an unexpected failure logs and notifies the player instead of the command silently doing nothing ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))- Fixed a thread-safety violation introduced by the #110 fix: QuickShop-Hikari's cache-backed stock/space read (
Util.ensureThread(true)) requires running off the main thread, but #110 moved the entire per-shop check — including that stock read — onto the region thread, which would throw on any QuickShop-Hikari v6+ install.QSHikariAPIHandler.processShopMatchFuturenow splits into two phases: permission/item-meta matching stays on the region thread (preserving #110's fix), while stock/space reads and list insertion (finalizeMatchedShop) move to a virtual thread so QuickShop-Hikari's threading contract is satisfied ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) - Matched shops with a cached/DB stock reading of
0are now re-verified live if their chunk isn't loaded:QSHikariAPIHandlerhops to the shop's own region (FoliaLib#runAtLocation), force-loads the chunk, re-reads stock/space, then unloads the chunk again if it was the one that loaded it ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) shopsFoundListchanged fromArrayListtoCopyOnWriteArrayListsince matched shops are now added concurrently from multiple virtual threads- Bumped QuickShop-Hikari to
6.3.0.0-SNAPSHOT-12and Paper API to26.2.build.111-stable; migrated allShop#getLocation()calls toShop#bukkitLocation()(QuickShop-Hikari madeShopgeneric, so the raw-typedgetLocation()call now erases toObjectinstead oforg.bukkit.Location) - Bumped QuickShop-Hikari to the released
6.3.0.2and migrated to its new CodeMC repository (repo.codemc.io/repository/ghost-chu/); the splitquickshop-api/quickshop-bukkit:shadedartifacts were replaced by a singlecom.ghostchu:quickshop-hikaridependency, which QuickShop now publishes there - Stock/space resolution now follows a ladder: unlimited shop → live read if the chunk is loaded → QuickShop's persisted inventory count cache (
ShopManager#queryShopInventoryCacheInDatabase) → chunk force-load as a last resort - Search stock reads use QuickShop-Hikari 6.3.0.0's
ShopInventory#getRemainingStockAsync()and are composed into the existingCompletableFuturechain, removing the per-shop 5-second blockingjoin() - Fixed a thread-safety violation: QuickShop-Hikari's
ShopManager#queryShopInventoryCacheInDatabaseasserts its caller is already off the main/region thread and throws otherwise.QSHikariAPIHandler.processShopMatchFuture's dispatch intofinalizeMatchedShopis now pinned to the virtual-thread executor so it never runs on the region thread - Removed the
Util.ensureThread(true)assertion from the stock/space cache read — QuickShop-Hikari's own getters no longer require an off-main caller as of 6.3.0.0, and the explicit virtual-thread dispatch above now guarantees it regardless - Migrated off
Shop#getPrice()(deprecated for removal in 6.3.0.0) toShopPrice#price()
- Noticeably faster searches on large servers** — the shop list sync that runs every 15 minutes (and on startup) has been rewritten to scale linearly instead of getting slower the more shops your server has. Servers with thousands of shops will see a significant drop in that sync time.
- Search results now always respect your configured sorting method** — previously, browsing all shops (
/finditem TO_BUY *) ignored yourshop-sorting-methodsetting and always sorted by a fixed method. It now behaves the same as all other searches. - Snappier GUI clicks** — shop teleportation and custom command execution on GUI click are now faster under the hood, with less redundant work per click.
- Java 25 & Paper API 26.x support** — ready for the latest server versions out of the box.
- New: limit search results by distance** ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): a new
shop-search-max-distanceconfig option lets you hide shops that are too far away from the searching player. Set it to a block radius (e.g.1000) to keep results local. Disabled by default (set to0). - Fixed
/finditemsilently doing nothing when searching enchanted books** ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110)), most noticeable with custom-enchantment plugins installed — a per-shop item check was running off the main thread and any error there was being swallowed instead of shown to the player. - Fixed shops in unloaded chunks showing 0 stock/space and dropping out of search results** ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)): with
search-loaded-shops-only: false, a matched shop whose chunk wasn't currently loaded could report as out of stock even when it wasn't, and get silently filtered out. FindItem now double-checks with a live read before discarding a shop like that. - Faster stock/space checks on servers with lots of unloaded shops**: instead of force-loading a shop's chunk just to count what's inside it, FindItem now asks QuickShop-Hikari for its own stored stock/space figure first. Chunk loading is now a last resort, used only when QuickShop has no stored figure yet. This should also resolve reports of
/finditemonly listing a handful of shops after updating QuickShop-Hikari to 6.3.x — its stock/space check changed to return0for any shop in an unloaded chunk, whichignore-empty-chests: true(the default) then silently dropped from results. - Fixed a typo in the sample
custom-commandslist inconfig.yml:{PLAYER}is not a valid placeholder,{PLAYER_NAME}is.
### Changes (technical)
- Upgraded to Paper API 26.x / Java 25
- Added
PlatformBridgeabstraction (BukkitPlatformBridge) to decouple platform-specific calls from core logic - Refactored
QSHikariAPIHandler: consolidated three duplicate shop-search methods into a singlesearchShops(Predicate, boolean, Player)method, removing ~70 lines of duplication - Optimized
syncShopsListForStoragefrom O(n²) nested loop to O(n)HashMaplookup — significant speedup on servers with large shop counts fetchAllItemsFromAllShopsnow respects the configuredshop-sorting-method(previously hardcoded to method 1)- Eliminated per-shop QS version string parse in stock/space cache lookup — replaced with boolean flag computed once at startup
- MC version regex in GUI compiled once as
static finalinstead of on every menu open - Tab-completion material list in
BuySubCmd/SellSubCmdbuilt once statically instead of per instance - Shop location string parsed once per GUI click and passed to all handlers, instead of being re-parsed by each handler independently
- Cleaned up
ShopSearchActivityStorageUtil:loadShopsFromFilenow callssyncShops()consistently; marked Reremake-eraaddShopoverload andgetShopOwneras@Deprecated - Added
shop-search-max-distanceconfig option ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): filters out shops beyond a configurable block radius from the searching player;0disables (default); cross-world shops are always included; bumped config version to 22 QSHikariAPIHandler.searchShops: merged the per-shop permission check and item-match filtering into a single scheduler hop (processShopMatchFuture) so item/meta reads always happen on the entity's region thread instead ofForkJoinPool.commonPool(); per-shop failures are now logged and skipped instead of failing the whole search ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))CmdExecutorHandler.handleShopSearch: added.exceptionallyhandling to all three search futures so an unexpected failure logs and notifies the player instead of the command silently doing nothing ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))- Fixed a thread-safety violation introduced by the #110 fix: QuickShop-Hikari's cache-backed stock/space read (
Util.ensureThread(true)) requires running off the main thread, but #110 moved the entire per-shop check — including that stock read — onto the region thread, which would throw on any QuickShop-Hikari v6+ install.QSHikariAPIHandler.processShopMatchFuturenow splits into two phases: permission/item-meta matching stays on the region thread (preserving #110's fix), while stock/space reads and list insertion (finalizeMatchedShop) move to a virtual thread so QuickShop-Hikari's threading contract is satisfied ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) - Matched shops with a cached/DB stock reading of
0are now re-verified live if their chunk isn't loaded:QSHikariAPIHandlerhops to the shop's own region (FoliaLib#runAtLocation), force-loads the chunk, re-reads stock/space, then unloads the chunk again if it was the one that loaded it ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) shopsFoundListchanged fromArrayListtoCopyOnWriteArrayListsince matched shops are now added concurrently from multiple virtual threads- Bumped QuickShop-Hikari to
6.3.0.0-SNAPSHOT-12and Paper API to26.2.build.111-stable; migrated allShop#getLocation()calls toShop#bukkitLocation()(QuickShop-Hikari madeShopgeneric, so the raw-typedgetLocation()call now erases toObjectinstead oforg.bukkit.Location) - Bumped QuickShop-Hikari to the released
6.3.0.2and migrated to its new CodeMC repository (repo.codemc.io/repository/ghost-chu/); the splitquickshop-api/quickshop-bukkit:shadedartifacts were replaced by a singlecom.ghostchu:quickshop-hikaridependency, which QuickShop now publishes there - Stock/space resolution now follows a ladder: unlimited shop → live read if the chunk is loaded → QuickShop's persisted inventory count cache (
ShopManager#queryShopInventoryCacheInDatabase) → chunk force-load as a last resort - Search stock reads use QuickShop-Hikari 6.3.0.0's
ShopInventory#getRemainingStockAsync()and are composed into the existingCompletableFuturechain, removing the per-shop 5-second blockingjoin() - Fixed a thread-safety violation: QuickShop-Hikari's
ShopManager#queryShopInventoryCacheInDatabaseasserts its caller is already off the main/region thread and throws otherwise.QSHikariAPIHandler.processShopMatchFuture's dispatch intofinalizeMatchedShopis now pinned to the virtual-thread executor so it never runs on the region thread - Removed the
Util.ensureThread(true)assertion from the stock/space cache read — QuickShop-Hikari's own getters no longer require an off-main caller as of 6.3.0.0, and the explicit virtual-thread dispatch above now guarantees it regardless - Migrated off
Shop#getPrice()(deprecated for removal in 6.3.0.0) toShopPrice#price()
- Noticeably faster searches on large servers** — the shop list sync that runs every 15 minutes (and on startup) has been rewritten to scale linearly instead of getting slower the more shops your server has. Servers with thousands of shops will see a significant drop in that sync time.
- Search results now always respect your configured sorting method** — previously, browsing all shops (
/finditem TO_BUY *) ignored yourshop-sorting-methodsetting and always sorted by a fixed method. It now behaves the same as all other searches. - Snappier GUI clicks** — shop teleportation and custom command execution on GUI click are now faster under the hood, with less redundant work per click.
- Java 25 & Paper API 26.x support** — ready for the latest server versions out of the box.
- New: limit search results by distance** ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): a new
shop-search-max-distanceconfig option lets you hide shops that are too far away from the searching player. Set it to a block radius (e.g.1000) to keep results local. Disabled by default (set to0). - Fixed
/finditemsilently doing nothing when searching enchanted books** ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110)), most noticeable with custom-enchantment plugins installed — a per-shop item check was running off the main thread and any error there was being swallowed instead of shown to the player. - Fixed shops in unloaded chunks showing 0 stock/space and dropping out of search results** ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)): with
search-loaded-shops-only: false, a matched shop whose chunk wasn't currently loaded could report as out of stock even when it wasn't, and get silently filtered out. FindItem now double-checks with a live read before discarding a shop like that.
### Changes (technical)
- Upgraded to Paper API 26.x / Java 25
- Added
PlatformBridgeabstraction (BukkitPlatformBridge) to decouple platform-specific calls from core logic - Refactored
QSHikariAPIHandler: consolidated three duplicate shop-search methods into a singlesearchShops(Predicate, boolean, Player)method, removing ~70 lines of duplication - Optimized
syncShopsListForStoragefrom O(n²) nested loop to O(n)HashMaplookup — significant speedup on servers with large shop counts fetchAllItemsFromAllShopsnow respects the configuredshop-sorting-method(previously hardcoded to method 1)- Eliminated per-shop QS version string parse in stock/space cache lookup — replaced with boolean flag computed once at startup
- MC version regex in GUI compiled once as
static finalinstead of on every menu open - Tab-completion material list in
BuySubCmd/SellSubCmdbuilt once statically instead of per instance - Shop location string parsed once per GUI click and passed to all handlers, instead of being re-parsed by each handler independently
- Cleaned up
ShopSearchActivityStorageUtil:loadShopsFromFilenow callssyncShops()consistently; marked Reremake-eraaddShopoverload andgetShopOwneras@Deprecated - Added
shop-search-max-distanceconfig option ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): filters out shops beyond a configurable block radius from the searching player;0disables (default); cross-world shops are always included; bumped config version to 22 QSHikariAPIHandler.searchShops: merged the per-shop permission check and item-match filtering into a single scheduler hop (processShopMatchFuture) so item/meta reads always happen on the entity's region thread instead ofForkJoinPool.commonPool(); per-shop failures are now logged and skipped instead of failing the whole search ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))CmdExecutorHandler.handleShopSearch: added.exceptionallyhandling to all three search futures so an unexpected failure logs and notifies the player instead of the command silently doing nothing ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))- Fixed a thread-safety violation introduced by the #110 fix: QuickShop-Hikari's cache-backed stock/space read (
Util.ensureThread(true)) requires running off the main thread, but #110 moved the entire per-shop check — including that stock read — onto the region thread, which would throw on any QuickShop-Hikari v6+ install.QSHikariAPIHandler.processShopMatchFuturenow splits into two phases: permission/item-meta matching stays on the region thread (preserving #110's fix), while stock/space reads and list insertion (finalizeMatchedShop) move to a virtual thread so QuickShop-Hikari's threading contract is satisfied ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) - Matched shops with a cached/DB stock reading of
0are now re-verified live if their chunk isn't loaded:QSHikariAPIHandlerhops to the shop's own region (FoliaLib#runAtLocation), force-loads the chunk, re-reads stock/space, then unloads the chunk again if it was the one that loaded it ([#111](https://github.com/myzticbean/QSFindItemAddOn/issues/111)) shopsFoundListchanged fromArrayListtoCopyOnWriteArrayListsince matched shops are now added concurrently from multiple virtual threads- Bumped QuickShop-Hikari to
6.3.0.0-SNAPSHOT-12and Paper API to26.2.build.111-stable; migrated allShop#getLocation()calls toShop#bukkitLocation()(QuickShop-Hikari madeShopgeneric, so the raw-typedgetLocation()call now erases toObjectinstead oforg.bukkit.Location)
- Noticeably faster searches on large servers** — the shop list sync that runs every 15 minutes (and on startup) has been rewritten to scale linearly instead of getting slower the more shops your server has. Servers with thousands of shops will see a significant drop in that sync time.
- Search results now always respect your configured sorting method** — previously, browsing all shops (
/finditem TO_BUY *) ignored yourshop-sorting-methodsetting and always sorted by a fixed method. It now behaves the same as all other searches. - Snappier GUI clicks** — shop teleportation and custom command execution on GUI click are now faster under the hood, with less redundant work per click.
- Java 25 & Paper API 26.x support** — ready for the latest server versions out of the box.
- New: limit search results by distance** ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): a new
shop-search-max-distanceconfig option lets you hide shops that are too far away from the searching player. Set it to a block radius (e.g.1000) to keep results local. Disabled by default (set to0). - Fixed
/finditemsilently doing nothing when searching enchanted books** ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110)), most noticeable with custom-enchantment plugins installed — a per-shop item check was running off the main thread and any error there was being swallowed instead of shown to the player.
### Changes (technical)
- Upgraded to Paper API 26.x / Java 25
- Added
PlatformBridgeabstraction (BukkitPlatformBridge) to decouple platform-specific calls from core logic - Refactored
QSHikariAPIHandler: consolidated three duplicate shop-search methods into a singlesearchShops(Predicate, boolean, Player)method, removing ~70 lines of duplication - Optimized
syncShopsListForStoragefrom O(n²) nested loop to O(n)HashMaplookup — significant speedup on servers with large shop counts fetchAllItemsFromAllShopsnow respects the configuredshop-sorting-method(previously hardcoded to method 1)- Eliminated per-shop QS version string parse in stock/space cache lookup — replaced with boolean flag computed once at startup
- MC version regex in GUI compiled once as
static finalinstead of on every menu open - Tab-completion material list in
BuySubCmd/SellSubCmdbuilt once statically instead of per instance - Shop location string parsed once per GUI click and passed to all handlers, instead of being re-parsed by each handler independently
- Cleaned up
ShopSearchActivityStorageUtil:loadShopsFromFilenow callssyncShops()consistently; marked Reremake-eraaddShopoverload andgetShopOwneras@Deprecated - Added
shop-search-max-distanceconfig option ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): filters out shops beyond a configurable block radius from the searching player;0disables (default); cross-world shops are always included; bumped config version to 22 QSHikariAPIHandler.searchShops: merged the per-shop permission check and item-match filtering into a single scheduler hop (processShopMatchFuture) so item/meta reads always happen on the entity's region thread instead ofForkJoinPool.commonPool(); per-shop failures are now logged and skipped instead of failing the whole search ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))CmdExecutorHandler.handleShopSearch: added.exceptionallyhandling to all three search futures so an unexpected failure logs and notifies the player instead of the command silently doing nothing ([#110](https://github.com/myzticbean/QSFindItemAddOn/issues/110))
- Java 25 & Paper API 26.x support**: ready for the latest server versions out of the box.
- Noticeably faster searches on large servers**: the shop list sync that runs every 15 minutes (and on startup) has been rewritten to scale linearly instead of getting slower the more shops your server has. Servers with thousands of shops will see a significant drop in that sync time.
- Search results now always respect your configured sorting method**: previously, browsing all shops (
/finditem TO_BUY *) ignored yourshop-sorting-methodsetting and always sorted by a fixed method. It now behaves the same as all other searches. - Snappier GUI clicks**: shop teleportation and custom command execution on GUI click are now faster under the hood, with less redundant work per click.
- New: limit search results by distance** ([#107](https://github.com/myzticbean/QSFindItemAddOn/issues/107)): a new
shop-search-max-distanceconfig option lets you hide shops that are too far away from the searching player. Set it to a block radius (e.g.1000) to keep results local. Disabled by default (set to0).
- _PS: This is a snapshot build and bugs may arise._**
- QS-Reremake support has been dropped completely
- GUI click is now async
- Added debug mode control via command:
/finditemadmin debug-mode {enable | disable} - Bumped Paper API version to
1.21.11-R0.1-SNAPSHOT - Bumped Kyori's
adventure-apito 4.26.1 - Bumped
worldguard-bukkitto 7.0.16 - Bumped
playerwarps-apito 7.10.0 - Removed Spigot API dependency
- Bumped
Quickshop-Hikarito 6.2.0.11 - Folia support by Jsinco
- Bumped
essentialsXto 2.21.2
### Bug fixes
- Fixed a bug during loadShopsFromFile if one of the loaded shops was null by adding a null check
- Bug fix for update checker, notify snapshot version availability for snapshot users only (#102)
- fix(folia): teleporting to shops on folia
_PS: Folia support is in early stages and bugs may arise._
- Folia Support
- QS-Hikari
6.2.0.11Support
_PS: Folia support is in early stages and bugs may arise._
- QS-Reremake support has been dropped completely
- GUI click is now async
- Added debug mode control via command:
/finditemadmin debug-mode {enable | disable} - Version bumps for dependencies.
- Support for
Quickshop-Hikari 6.2.0.11-RELEASE-CANDIDATE-2
NOTE: This is a snapshot version and is only compatible with
QS-Hikari v6.2.0.11-RELEASE-CANDIDATE-2. If you are using QS-Hikari v6.2.0.10, then use AddOn [v2.0.7.7-RELEASE](https://modrinth.com/plugin/shop-search/version/2.0.7.7-RELEASE).- NOTE:** This is a snapshot version and is only compatible with **QS-Hikari v6.2.0.11 snapshots**. If you are using QS-Hikari v6.2.0.10, then use AddOn [v2.0.7.7-RELEASE](https://modrinth.com/plugin/shop-search/version/2.0.7.7-RELEASE).
### Changes
- GUI click is now async
- Some performance tweaks
- Added debug mode control via command:
/finditemadmin debug-mode {enable | disable} - Internal API changes to make it compatible with QS-Hikari v6.2.0.11
- QS-Reremake support has been dropped completely
- Bumped Spigot dependency to
1.21.8-R0.1-SNAPSHOT - Bumped QS-Hikari dependency to
6.2.0.10 - Bumped Bentobox dependency to
3.7.3 - Internal refactoring that shouldn't impact gameplay
- Fixed
/finditem hideshop//finditem revealshopnot working for newly created shop - Added support for custom-model-data to the GUI filler item
- Added support for
{SHOP_WORLD}placeholder in custom commands
### Changes
- Optimized the size of the
shops.jsonfile - Updated config version to
21
- Updated dependencies to latest version
- Fixed a bug teleporting to a shop without essentials (Thanks Jaden!)
- Fix for /finditem shows only 'searching...' but no GUI [Thanks @Jsinco!]
If you would also like to contribute to the plugin updates, check out the github repository [here](https://github.com/myzticbean/QSFindItemAddOn).
- JDK version upgraded from 17 to 21
- Added check to exclude shops of
buyingshops for owners who don't have enough money. - Bentobox integration to ignore shops in locked islands
### Bug fixes
- Hideshop/revealshop should work with double chests also
- fixed item meta not showing correctly in Search GUI
- Player Warps dependency updated
- Added config option to suppress update notifications in chat
yaml
suppress-update-notifications: false
`
- Added config option to configure blacklisted materials
`yaml
blacklisted-materials:
- "BARRIER"
- "STRUCTURE_BLOCK"
- "COMMAND_BLOCK"
``- Added runnable custom commands on GUI item click. New related config options added.
- Added a new permission to bypass safety check for shop tp.
- Added runnable custom commands on GUI item click. New related config options added.
- Added a new permission to bypass safety check for shop tp (
finditem.shoptp.bypass-safetycheck).
- Residence support for fetching the residence the shop is in (including subzones) ([#45](https://github.com/myzticbean/QSFindItemAddOn/pull/45)) [Contribution by SengyEU]
- Configurable "No ... near shop" messages ([#45](https://github.com/myzticbean/QSFindItemAddOn/pull/45)) [Contribution by SengyEU]
- Spigot API updated to 1.21.
### Bug fixes
- Fixed NPE when putting AIR as a filler item ([#46](https://github.com/myzticbean/QSFindItemAddOn/pull/46)) [Contribution by SengyEU]
- Fixed bug where exception was thrown when trying to render player heads in GUI buttons (Broke in 1.21 update)
- Added stack size placeholder to shop lore ([#37](https://github.com/myzticbean/QSFindItemAddOn/issues/37))
- Added a 500 block limit for searching nearby PlayerWarp (ToDo: to be made configurable in a future version)
- Added option to show only player owned warps in GUI ([#38](https://github.com/myzticbean/QSFindItemAddOn/issues/38)) [Contribution by lukemango]
### Bug fixes
- Changed scheduled task loggers to debug-mode only ([#29](https://github.com/myzticbean/QSFindItemAddOn/issues/29))
- Critical fix** for players not getting teleported ([#30](https://github.com/myzticbean/QSFindItemAddOn/issues/30))
### Changes (Feature request [#23](https://github.com/myzticbean/QSFindItemAddOn/issues/23))
- Plugin updated for Minecraft version 1.20.5.
- Changed 15Min Scheduled Task to run in async thread (should help with lag).
- Reremake implementation will no longer be updated. Last support is for QS-Reremake v5.1.2.5.
- Changed logger statements to show Main/Async thread state.
- Structural changes in the config.yml, specifically for shop-gui related options.
- Fixed an issue with showing large numbers in currency.
- Added new feature to format currency format. For example:
$10,210,100will be shown as$10.21M. New config option to toggle it:
yaml
shop-gui:
use-shorter-currency-format: true
`
- New config option added as below to toggle if players should be allowed to warp to locked warps (Only for PlayerWarps).
`yaml
player-shop-teleportation:
nearest-warp-tp-mode:
do-not-tp-if-warp-locked: true
``- Config version is now 15.
### Bug fixes
- Fixed a bug where disabling hideshop/revealshop will not disable it for
/qs finditem([#13](https://github.com/myzticbean/QSFindItemAddOn/issues/13)) - Fixed stock/space not updating properly from QS cache ([#17](https://github.com/myzticbean/QSFindItemAddOn/issues/17))
### Bug fixes
- Fixed a bug where disabling hideshop/revealshop will not disable it for
/qs finditem([#13](https://github.com/myzticbean/QSFindItemAddOn/issues/13)) - Fixed stock/space not updating properly from QS cache ([#17](https://github.com/myzticbean/QSFindItemAddOn/issues/17))
_Note: This is a snapshot build, and not recommended for use on production servers right now._
### Bug fixes
- Fix the lag issue caused due to new QS-Hikari cache feature impl ([#12](https://github.com/myzticbean/QSFindItemAddOn/issues/12))
- Fixed a code refactoring bug where search all shops would return no shops for Quickshop Reremake
- Added a INFO level logger to log time taken for a search process
### Bug fixes
- Fixed /finditem command not working in some cases ([#9](https://github.com/myzticbean/QSFindItemAddOn/issues/9))
- Added a config option to disable the
/finditem {TO_BUY | TO_SELL} *
- Added Go to First and Last page GUI buttons ([#3](https://github.com/myzticbean/QSFindItemAddOn/issues/3))
- Added new config option to include empty chests in the search result ([#3](https://github.com/myzticbean/QSFindItemAddOn/issues/3))
- Added compatibility with QS Hikari 6.* shop stock/space fetch from cache feature. This should help prevent massive lag spikes.
- Full/out of space chests will be excluded from
/finditem TO-SELL <item_name>([#3](https://github.com/myzticbean/QSFindItemAddOn/issues/3)) - Bug fix to prevent lag when during
/finditem TO_BUY *on large servers (Only for QS Hikari) - Fix for issue [#5](https://github.com/myzticbean/QSFindItemAddOn/issues/5)




