Tags
Creators
Details
All versions
2.0.8.2-RELEASE
Release
2.0.8.2-RELEASE2 weeks ago 126
Compatibility
Minecraft: Java Edition
26.2
Platforms
Folia
Paper
Purpur
Changes
What's new for server owners
- 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): 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), 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): 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): 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)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)- 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) - 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) 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()
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:asp13ugE:2LCffM4q"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:asp13ugE:2LCffM4q"
}

