Skip to content

Releases: Cupjok/DynamicShop3

3.122.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 01:34

One jar for Minecraft 1.21 – 26.2

DynamicShop runs again on every Minecraft version from 1.21 to 26.2, on Paper, Purpur and Folia. It is the same jar for all of them. Releases 3.22.0 – 3.121.1 only loaded on 26.2.

  • Built for Java 21 against the 1.21 API (api-version: 1.21). On 1.21.x servers Java 21 is enough; 26.x servers keep needing Java 25.
  • Code that behaves differently between versions now works on both sides (sound lookup, global-thread check).

Tested on real servers

Each version was started with this jar and a Vault economy. The console created a shop, added items, enabled the shop and reloaded the plugin. Then a bot joined, opened the shop and the trade view, bought, sold, used /sell all and opened the start page:

Platform Versions Result
Paper 1.21, 1.21.1, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1.1, 26.1.2, 26.2
Purpur 1.21.1, 1.21.11, 26.1.2
Folia 1.21.4, 1.21.11, 26.1.2, 26.2

Fixed

  • Folia: buy and sell messages (with translated item names) and /sell threw Dispatching command async, and the per-shop buy/sell commands (Options.command) did not run. Messages are now sent directly, and console commands run on the global thread.
  • /ds createshop help showed /ds create, which does nothing.

Updating

Replace the jar and restart. No data files change, and nothing needs to be edited.

Full Changelog: 3.121.1...3.122.0

3.121.1

Choose a tag to compare

@github-actions github-actions released this 13 Sep 00:31

Fixed

  • /sell all, /sell hand, /sell handall and quick sell no longer take items for nothing. Before, an item whose sell payout rounded down to 0 was removed from the inventory and the player was paid 0. This happened when:

    • the sell price was set to 0 (it is raised to valueMin, 0.0001, so the shop still "bought" the item),
    • the delivery charge was larger than the price,
    • an Exp or PlayerPoints shop paid less than 1.

    These sales are now refused and the items stay in the inventory, with the message "The sale price is too low to be paid out". When several shops accept the item, a shop that pays nothing after the delivery charge is skipped, so a shop that pays is used instead.

Updating

Replace the jar and restart. No data files change.

Behaviour change: an item whose sell payout is effectively 0 is no longer taken by quick sell. To stop a shop buying an item, set it to buy-only in the item settings.

Full Changelog: 3.121.0...3.121.1

3.121.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 20:38

DynamicShop3 3.121.0

Update: replace the jar and restart. Nothing to delete or regenerate. Your shops, settings and texts are kept.

Version number: this release jumps from 3.25.0 to 3.121.0. The original DynamicShop's last Spigot release is 3.120.2, and an earlier fork dropped a digit (3.20.2), which made this fork look older than it is. From now on this fork's versions are always higher than the original's.

⌨️ New: command items

A shop item can now run commands when bought, instead of giving the item it shows. Use it for ranks, kits, keys, perks and similar.

  1. In a shop, Shift + right-click the item → item settings → click Item type (slot 51). The item has to be saved to the shop first.
  2. The command item editor opens:
    • Add command: type it in chat, with or without /. It is saved, not run. Placeholders: {player}, {uuid}, {shop}. Left-click a command to edit it, right-click to delete it.
    • Rename / Change lore: the name and lore shown in the shop. Every colour format works: &a, &#FF5555, <#FF5555>, <gradient:…>, <bold>, … In lore, \n starts a new line.
  3. When bought, the commands run from the console once per unit bought. The shown item is not given.

Command items cannot be sold to the shop, including with quick sell. A command item with no commands cannot be bought, so nobody pays for nothing. Price, stock, discounts and trade limits work as usual. It works with Vault, Exp, Jobs points, PlayerPoints and MultiCurrency.

🔒 Safer data files

  • A shop file with a YAML typo is no longer wiped. Before, a broken file loaded as empty and the next auto-save overwrote the shop. Now the file is left untouched, a .broken-<time> copy is made, and the console names the file. Fix it, then /ds reload.
  • All data files are saved atomically, so a crash or power loss during a save cannot leave a half-written shop file.

🔁 Settings update themselves

  • When a new version changes a built-in text, language files, Layout.yml, Sound.yml and Worth_V2.yml get the new text automatically, but only where you never changed it. Your own edits are kept, and the console tells you once that a newer default exists.
  • The old "QUICKSELL UI LOGIC HAS BEEN MODIFIED" console banner is gone. The quick-sell guide text is now updated automatically. The Korean text also described the old click behaviour and is fixed.

⬆️ Coming from the original DynamicShop

Tested with real data from the original DynamicShop 3.120.1. Every shop, flag, price, discount, trade limit, shop account, custom item (name, lore, enchantments), start-page button, config value and custom text was kept, and buying worked the same. Drop this jar in place of the old one; it uses the same plugins/DynamicShop/ folder. The original jars do not load on Minecraft 26.x.

Difference from the original: in quick sell, left-click sells all items of that type, and Shift + left-click sells only the clicked stack.

Compatibility

Paper, Purpur and Folia 26.2, Java 25+. No data changes are needed.

Not verified

Migration from the very old DynamicShop 2.x file format, and from the Premium version, was not tested (the conversion code is unchanged from the original). The MultiCurrency purchase message shows the base item name instead of a command item's custom name.

3.25.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 18:18

What's new in 3.25.0

A small follow-up to 3.24.0: choose a shop's currency from a list in the shop settings, including every MultiCurrency currency. It also fixes the JobPoint and PlayerPoint buttons, which never actually worked. Nothing to migrate.

Choose any currency from the shop settings

Open a shop's settings (right-click the shop info sign in the shop, as before). The new Choose currency... button shows the shop's current currency. Clicking it opens a list of every currency the server can use:

  • Vault (your normal economy, e.g. CMI), Exp, JobPoint and PlayerPoint
  • every currency configured in MultiCurrency (Coins, Gems, Tokens, ...), with its id, symbol and decimal places

The current currency is highlighted. A currency that can't be used right now is greyed out and says why, and clicking it changes nothing. Examples are Jobs or PlayerPoints not being installed, or a MultiCurrency currency being disabled. Click any other currency to switch the shop to it. You are taken back to the shop settings afterwards.

The /ds shop <shop> currency ... command still works as before.

Fixed: the JobPoint and PlayerPoint buttons in the shop settings did nothing

Clicking JobPoint or PlayerPoint in the shop settings saved a value the plugin didn't recognise, so the shop silently kept trading in Vault money. Both buttons now really switch the shop.

If you clicked one of those buttons in the past, that shop has been trading in Vault money the whole time. Its yml file contains currency: jp or currency: pp. Those shops are left exactly as they are, so nothing changes without you noticing. Pick the currency again in the settings if you actually want JobPoint or PlayerPoint.

Compatibility

  • Server software: Paper, Purpur and Folia, Minecraft 26.2. MultiCurrency itself doesn't support Folia, so its currencies only appear on Paper/Purpur.
  • No config or shop file changes are required. Drop the new jar in and restart.

Verified / not verified

Tested on a Purpur 26.2 server with CMI (Vault), Jobs and MultiCurrency 1.0.0. A test player with shop-edit permission opened the list and switched a shop to a MultiCurrency currency, then to JobPoint, then back to Vault. Clicking PlayerPoint (not installed on that server) was refused, and the shop file was checked after every change.

Not verified in-game: the PlayerPoint currency itself, because PlayerPoints isn't installed on the test server.

Full Changelog: 3.24.0...3.25.0

3.24.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 17:41

What's new in 3.24.0

Two new features: shops can now trade in MultiCurrency currencies, and shop names in the shop menu support full hex colours and formatting. Both are opt-in. Without MultiCurrency installed and without changing your shop names, everything looks and works exactly as before, and there is nothing to migrate.

Shops can use MultiCurrency currencies (optional)

If you run the MultiCurrency plugin (Coins, Gems, Tokens, Event Points, ...), any shop can now buy and sell in one of its currencies. Your normal economy (CMI, EssentialsX, ... through Vault) is not touched. DynamicShop does not replace or re-register the Vault economy, and Vault/CMI shops keep working as they did.

How to use it

/ds shop <shop> currency multicurrency:<currency id>

For example, /ds shop GemShop currency multicurrency:gems. Tab completion lists your MultiCurrency currencies. You can also write currency: MultiCurrency:gems under Options: in the shop's yml. To switch a shop back, use /ds shop <shop> currency vault (or click the Vault button in the shop settings).

What players see

  • Prices, the "my balance" button and the shop balance are shown in the currency's own format (for example 💎 10).
  • Prices are rounded to the currency's decimal places. Buying rounds up and selling rounds down. For example, a sell price of 7.5 in a 0-decimal currency pays 7.
  • A purchase is only handed out after MultiCurrency confirms the payment, usually within the same second. If the player can't afford the whole amount, the purchase is refused as a whole with "Not enough balance". Unlike Vault shops, it does not buy as many items as the balance allows.
  • If a player logs out while a purchase is being paid, the items are delivered the next time they join.
  • If a sale can't be paid (for example, the player's balance would go over the currency's maximum), the items are given back.

Why it's safe

  • Every purchase gets its own ID the moment it is clicked. The ID is saved to plugins/DynamicShop/MultiCurrencyOrders.yml before any money moves, and MultiCurrency receives it as an idempotency key.
  • If the database hiccups and the result is unknown, DynamicShop asks again with the same key until it gets a definite answer. The same applies after a restart or crash. A payment is never applied twice, and a player is never told "failed" when the money might have been taken.
  • If the server stops at the exact moment items are being handed out, the order is flagged in the log for an admin instead of being guessed. It is never given twice.
  • Entries marked REVIEW in MultiCurrencyOrders.yml are the only ones that need you. The server log says what to check; delete the entry once handled.

/ds shop <shop> account transfer <player> <amount> from a MultiCurrency shop's account also pays out in that currency.

Full colour and formatting for shop names

Shop titles (Options.title in the shop yml), the start page title and the start page buttons (Startpage.yml) — both the button name (Rename) and its description (Change Lore, /ds → shift + right-click a button) — now support every colour Minecraft can show, not just the 16 legacy colours:

You write You get
&a, §a, &l, &o, &n, &m, &k, &r legacy colours and formats, as before
#FF5555Name or &#FF5555Name or &x&F&F&5&5&5&5Name hex colour (bare #FF5555 needs UI.UseHexColorCode: true, the default)
#FF5555Red #00FFAAMint #7289DABlue several colours in one name
&#FF5555&lBold hex + bold
<#FF5555>, <red>, <bold>, <italic>, <underlined>, <strikethrough> MiniMessage colour/format tags
<gradient:#FF5555:#7289DA>Fade</gradient>, <rainbow>Party</rainbow> gradients and rainbow

Legacy-style colour codes reset bold/italic/etc. just like in vanilla, so put the colour first: &#FF5555&lName, not &l&#FF5555Name.

Only visual formatting is accepted. Click, hover, command, insertion, font and similar tags are not interpreted. They are shown as plain text, so a shop name can never run a command or change the menu. A typo in a tag never breaks the menu either; it just shows as text.

Existing shops are not affected. Plain names, §-coloured names and the default start page look exactly the same as before, and ordinary text with an ampersand such as R&D Shop, A&B Shop or Shop & More stays plain text. (A lower-case code or digit written directly after a word, like Red&aGreen, is still a colour code, as in classic Minecraft formatting.)

In button descriptions, / starts a new line (the start page's LineBreak setting), so don't write closing tags like </gradient> there; every tag ends automatically at the end of its line.

Compatibility

  • Server software: Paper, Purpur and Folia (and Paper/Purpur forks), Minecraft 26.2. MultiCurrency itself does not support Folia, so the MultiCurrency feature is Paper/Purpur only; the colour feature works everywhere.
  • MultiCurrency support needs MultiCurrency 1.0.0 or newer and is optional (softdepend).
  • Economy: unchanged. Any Vault-API-compatible provider (Vault, VaultUnlocked, CMI economy, ...), or XP / PlayerPoints / Jobs Reborn points per shop.
  • No config or shop file changes are required. Drop the new jar in and restart.

Verified / not verified

Tested on a Purpur 26.2 server with CMI economy (through Vault), MultiCurrency 1.0.0 (SQLite), Jobs, LuckPerms, WorldGuard, PlaceholderAPI and others. Two test players (bots) did the following:

  • bought and sold for gems and coins, with and without enough balance, and with limited stock
  • fired five rapid purchases with only enough for two, and got exactly two
  • logged out mid-purchase
  • sat through restarts with unfinished orders, including a simulated "paid but server crashed before recording it", which resolved without charging twice and delivered once
  • received a refund for an undeliverable purchase

Vault stayed on CMIEconomy and CMI purchases kept working. The coloured shop names and button descriptions (including editing a description in-game with Change Lore) were checked in the exact form the server sends them to the client: hex, several hex colours, bold, italic, gradient, R&D Shop-style text, and deliberately broken formatting.

Not verified: a real OUTCOME_UNKNOWN from MultiCurrency's database. It can't be triggered from outside MultiCurrency, so the retry logic for it is covered by automated tests and by the restart simulation. MariaDB/MySQL storage for MultiCurrency was not re-tested here, only SQLite.

Full Changelog: 3.23.1...3.24.0

3.23.1

Choose a tag to compare

@github-actions github-actions released this 09 Sep 18:50

What's new in 3.23.1

A bugfix release. No new features, no config changes, nothing to migrate — every existing shop, price and setting keeps working exactly as before.

Fixed: the shop editor crashed when deleting an item you had not added yet

If you opened the item palette (left-click an empty slot in shop edit mode), then shift + left-clicked an item to jump straight into its settings screen, and then pressed the Remove button (the bone), the plugin threw an error and the screen stopped responding:

Could not pass event InventoryClickEvent to DynamicShop
java.lang.NullPointerException: Cannot invoke "String.getBytes()" because "mat" is null

That settings screen is opened before the item exists in the shop, so the delete code was trying to look up a shop slot that was still empty. It now recognises an empty slot and simply closes back to the shop, as you would expect.

Nothing else in the shop was affected when this happened — no data was lost, it was purely the click that failed — but the error was spammed to the console every time an admin hit that button, and the GUI had to be closed and reopened.

The same missing-data check was applied to a few other places that read a shop slot's material (item lookup and the shop rotation code), so a shop file that was hand-edited or left half-written can no longer produce the same crash there.

Fixed: a scary "Fatal error!" message the very first time the plugin starts

On a brand-new install, the console printed:

Fatal error! Config Setup Fail. File name: User

The plugin was trying to create User.yml a moment before its own plugins/DynamicShop/ folder existed. It recovered on its own and the file was created anyway, so nothing was actually broken — but the wording made it look like a serious failure on a first boot. The plugin now creates its data folder first, so the message is gone.

Compatibility

  • Server software: Paper, Purpur and Folia (and Paper/Purpur forks), Minecraft 26.2.
  • Economy: any Vault-API-compatible provider (Vault, VaultUnlocked, CMIVault/CMI economy, ...), or XP / PlayerPoints / Jobs Reborn points per shop.
  • No config or shop file changes are required. Drop the new jar in and restart.

Verified / not verified

Verified in-game on a Purpur 26.2 server with a full plugin set (CMI economy via Vault, LuckPerms, WorldGuard, PlaceholderAPI, MMOItems and others): the crash above no longer occurs, and deleting shop items normally still works and is saved correctly.

The first-run "Fatal error!" fix was verified by code inspection and a clean build only — reproducing it requires a completely fresh install, which was not re-run on a test server.

Full Changelog: 3.23.0...3.23.1

3.23.0 — Decoration items can show their own name and lore

Choose a tag to compare

@github-actions github-actions released this 09 Sep 10:15

What's new in 3.23.0

Decoration items can now show their own name and lore

Decorative (non-tradable) items placed in a shop were always forced to a blank display name, with attributes, enchantments and any additional tooltip info hidden. That is still the default, but it is no longer the only option.

How to use it: place a decoration the usual way (in shop edit mode, left-click an empty slot, then right-click an item in your own inventory), then left-click that decoration to toggle between:

  • Hidden (default) — blank name, no tooltip info. Exactly the old look.
  • Shown — the item's real display name, lore, enchantments, attributes, potion effects and other NBT tooltip info are displayed normally.

The item's admin tooltip carries a hint line telling you which click toggles it, so it is discoverable in-game without reading docs.

The setting is stored per shop slot as showMeta in the shop's yml file. It is absent by default, so every existing shop keeps its current appearance after updating — nothing to migrate.

Bug fix: decoration items lost their metadata on shop rotation

Found while building the above. When a shop rotated, decoration entries were restored from the rotation data using only their material, silently dropping the saved item metadata. Any decoration with a custom name, custom lore or a specific potion type reverted to a plain vanilla item on every rotation. Metadata is now restored correctly, and the new name/lore setting survives rotations too.

Other

  • New translation strings added to both the built-in ko-KR and en-US language tables.
  • Filling a shop slot with a new item now clears the previous occupant's decoration display setting, so it can't be inherited unexpectedly.

Compatibility

Same as 3.22.0 — Paper, Purpur and Folia on Minecraft 26.2. No config changes required; drop in the new jar and restart.

Not verified in-game: this release was built and unit-tested on JDK 25, but the toggle click and the two tooltip appearances were not exercised with a Minecraft client.


Full Changelog: 3.22.0...3.23.0

DynamicShop 3.22.0

Choose a tag to compare

@Cupjok Cupjok released this 08 Sep 08:43

Minecraft 26.2 + Folia support

  • Builds and runs against Paper 26.2 (build 121).
  • Added official Folia support (folia-supported: true) — every recurring task (shop UI refresh, shop rotations, backups/log saving, chat-input timeouts) was migrated off the legacy Bukkit scheduler onto Paper's Region/Entity/Global/Async schedulers. Behavior on Paper/Purpur is unchanged; on Folia it now dispatches correctly per region.
  • Verified the folia-supported flag is actually load-bearing: on a real Folia test server, a different plugin lacking this flag was rejected at load time by the server itself.

Broader Vault compatibility

  • The plugin used to hard-require a plugin literally named "Vault" to enable at all. It now checks for the Vault Economy service directly instead, so VaultUnlocked, CMIVault, and other Vault-API-compatible providers work too, not just the original Vault plugin.
  • Increased the Economy-provider retry window from ~6 seconds to ~30 seconds — on some busier servers (e.g. relying on CMI's built-in economy), the provider registers later than that, which previously caused the plugin to disable itself even though an economy was actually available.

Jobs Reborn points hook fixed

  • Confirmed the Jobs Reborn points integration (using Jobs points as a shop currency) was never actually removed from the code, but had a small bug: it was missing a check for whether Jobs was active before reading a player's point balance, which could throw repeated errors if Jobs was disabled/crashed while a Jobs-Point shop UI was open. Fixed.
  • Removed a stray unused duplicate of the hook's code.
  • Verified against the real Jobs plugin on a test server — works as expected.

Other bugfixes

  • Fixed a wrong translation key that showed players a raw, untranslated string when opening a PlayerPoints-currency shop with the PlayerPoints plugin not installed.
  • Fixed file-handle leaks (files never closed) when reading/writing the buy/sell CSV logs.
  • Fixed a thread-safety bug in the Stock Simulator that mutated a player's inventory directly from a background thread.
  • Fixed a thread-safety bug in the chat-input-timeout tracking that could leave stale state behind if a player disconnected mid-input.

Dependency updates

  • Bumped PlaceholderAPI, VaultAPI, LocaleLib, opencsv, and Lombok to current versions.
  • Fixed CI (GitHub Actions), which was still building on JDK 8 (broken for a long time) — now builds on JDK 25 as required by Paper 26.2, and automatically builds + publishes a GitHub Release whenever a new version tag is pushed.

Note for anyone building from source

Building this plugin now requires JDK 25 or newer (running it on a server still only needs Java 21+ — this is a build-time-only requirement, since Paper 26.2's own API jar is compiled to Java 25 bytecode).


Tested on Paper, Purpur (x2), and Folia 26.2 servers — enables cleanly with no errors, reload works.

Full Changelog: 3.21.7...3.22.0

3.21.7

Choose a tag to compare

@Cupjok Cupjok released this 06 Oct 22:48

Check Update Test

Now check the plugin version from this GitHub repo
Full Changelog: 3.21.6...3.21.7

3.21.6

Choose a tag to compare

@Cupjok Cupjok released this 06 Oct 22:37

QuickSell Change

Please update your Lang_V3_en-US.yml

QUICK_SELL:
  GUIDE_TITLE: §3§lQuick Sell Guide
  GUIDE_LORE: |-
    §aLeft-click to sell ALL items of this type in your inventory.
    §aShift left click to sell ONLY the stack you clicked.
    §aRight-click to go to the item shop.

Full Changelog: 3.21.4...3.21.6