1.0.0latesthShop 1.0.0 bugfixMar 28, 2026 hShop Changelog
---Bug Fixes
GUI & Inventory
Item theft via bottom inventory Clicking in the player's own inventory while a shop session was active was not fully blocked. Shift-clicking and drag events could move items in and out of the shop GUI. Both are now cancelled unconditionally when a session is active. Drag events never cancelledInventoryDragEventwas not handled at all, allowing players to drag items freely into shop GUI slots. A drag handler is now in place. Category icon clicks did nothing Main menu icon clicks were matched by comparing the item's display name string against a freshly colorized string — these could produce different§-code sequences and silently fail on every click. Icons are now registered in the session by slot at placement time, so clicks resolve by slot lookup instead. Shop item clicks did nothing Category page clicks rebuilt the available-slot index list and assumed item i was atavailable[i]. Items with an explicitslot:value broke this completely. Items are now registered in the session by their actual slot at placement time. Ghost sessions after closing confirm menu Closing a confirm menu left the session alive permanently. The next chest, crafting table, or any inventory the player opened had all its clicks intercepted and cancelled. Sessions are now cleaned up correctly on close. Confirm cancel lore passed wrong type The cancel item's lore was passed as a bareStringto aList<String>parameter, producing broken lore. Wrapped inCollections.singletonList(). Filler overwrote category and shop icons The decoration filler ran before shop items were placed, filling slots that items were then placed on top of. On certain decoration configs this caused icons to appear hidden. Decoration is now applied last and only fills slots that are genuinely empty. Filler showing when `enabled: false` Settingenabled: falseunderfillerin a decoration file had no effect — empty slots were still filled. The enabled state is now properly stored and respected. Memory leak on player disconnectPlayerListener.onQuitwas completely empty. Every disconnected player's session remained in the map permanently. Sessions are now removed on quit. ---Transactions & Economy
`hasInventorySpace` false-positive gave items on full inventory The check usedcontainsAtLeast(item, 1)which returns true if the player has any of that item — even a full 64/64 stack. Purchases succeeded when the inventory was completely full. Now uses direct stack-size calculation againstgetStorageContents(). `hshop.bypass.buy` permission did nothing The permission was defined inplugin.ymlbut was never checked inbuyItem(). It is now checked before the buy-disabled gate. Amount clamped to 0 proceeded as success If a player had exactly hit their buy limit,getRemaining()returned 0, the amount was clamped to 0, and the transaction continued — withdrawing 0 currency and giving a 0-count item, returningSUCCESS. Now returnsLIMIT_REACHEDif amount is 0 after clamping. `hshop.bypass.sell` checked but did nothing The permission block was present but empty. It now correctly skips the sell-disabled check. `shopItem.getAmount()` per-purchase quantity was never applied Items configured withamount: 5always gave 1 item per purchase. Now correctly givespurchaseAmount × shopItem.getAmount(). `removeItems()` missing `updateInventory()` Without this call the client's inventory could desync, showing ghost items until re-log. Now called after every removal. Transaction log directory never created Iftransaction-log.filepointed to a subdirectory (e.g.logs/transactions.log),FileWriterthrew anIOExceptionon every transaction.mkdirs()is now called before writing. Global sell multiplier compounded on every reload The multiplier was applied tosell.priceat load time and stored back into theShopItem. Reloading three times with a0.5multiplier effectively applied0.125×. The raw price is now stored and the multiplier is applied only at transaction time. `{sell_price}` in item lore showed raw price instead of multiplied price Players saw one price in the lore and received a different amount on sell. Lore now uses the effective sell price after applying the multiplier. ---Commands
`/hshop help` double-printed every line Called bothget("help.player")and iteratedgetStringList("help.player"), printing everything twice. `/hshopa reload` used wrong message key Referencedadmin.plugin-reloadedbut the key isgeneral.plugin-reloaded. `resetlimit` / `resetcooldown` only worked for online players UsedBukkit.getPlayer()which returns null for offline players. Now falls back toOfflinePlayer. `giveitem` silently lost items on full inventoryaddItem()leftovers were discarded. Excess items are now dropped at the player's feet. `SellHandCommand` sent "no-permission" for a disabled feature When sell-hand was disabled in config, the command sent a misleading no-permission message. Now sendssell.sellhand-disabled. `SellHandCommand` only handled `SUCCESS` and a generic else All other result codes (SHOP_DISABLED,NOT_ENOUGH_ITEMS, etc.) played a fail sound with no message. Each result code now has a proper message. `/hshopa setprice` accepted negative prices No validation was in place. Values below 0 are now rejected. Sessions not cleared on `/hshopa reload` After a reload, players with open menus held sessions pointing at oldShopCategoryandShopItemobjects from before the reload. Sessions are now cleared on reload. ---Data & Configuration
YAML key dot-corruption for cooldowns and limits If a category or item ID contained a dot,YamlConfigurationtreated it as a nested path separator when saving, silently corrupting all cooldown and limit data for those items. Dots in keys are now replaced before writing. `slot: AUTO` in category items parsed as slot 0getInt("slot", -1)returned 0 when the value was the string"AUTO". Every AUTO-slotted item landed at slot 0, overlapping decorations. Now reads the string value first and only parses as int if it is not"AUTO". Category file listing order was non-deterministicFile[]fromlistFiles()has undefined order across operating systems, causing category load order to vary between restarts. Files are now sorted alphabetically before parsing. Enchantments and flags not written back on savesaveCategory()never includedenchantmentsorflagsin its write-back loop. These keys silently disappeared from the yml after any admin command triggered a save. New items added to yml on disk erased on next savesaveCategory()calledyml.set("items", null)before writing back in-memory items. Any item added to the file manually while the server was running — without a reload — was permanently deleted the next time anything triggered a save. The save method now merges properly instead of wiping and rewriting. ---Messages & Formatting
Placeholder values not colorized before injectionget(path, placeholders)colorized the message template first, then injected raw placeholder values after — so a display name like&fɢᴇᴀʀlanded in the already-colorized string and was never processed, showing as literal&fɢᴇᴀʀin chat. Placeholder values are now colorized individually before being injected. Hex color codes not working (`&#ffffff`) Hex color codes in item names, lore, and titles were not rendering correctly. The color translation has been rewritten to manually build the correct§x§R§R§G§G§B§Bsequences, fixing support for all 6-digit hex codes in both upper and lowercase. `send()` suppressed valid messages with wrong blank-check Checked for literal''and""strings which can never match a parsed Java value aftercolorize()runs. Replaced with `i
Similar projects
Plugin →VeinMiner
Mine the whole vein on mining a single ore/block. Make the tedious mining experience to something satisfying and fun! FTB Ultimine alternative
99.3MSueta
Let Me Despawn
Improves performance by tweaking mob despawn rules. Say bye to pesky unintentional persistent mobs.
25MSueta
VeinMiner Enchantment
Veinminer Addon - Adds vineminer enchantment to enchanting tables. Only tools with the enchantment can veinmine
18MSueta
JourneyMap
Real-time map used for mapping in-game or your browser as you explore.
14.7MSueta
Emotecraft
Create your own emotes in Minecraft.
7.5MSueta
Simple Tpa
A simple tpa plugin which sends requests
5.4MSueta