InfiniteBags | Backpack with Shop 1.5.1

Unlimited per-item storage with a built-in shop hook to sell straight from your bag.

Hold Shift and click to select a range

Latest
Compatible with Minecraft 1.21 - 26.3
InfiniteBags v1.5.1
One jar now runs on 1.21.x through 26.3, on Spigot, Paper and Purpur.

🆕 Minecraft 26.x

InfiniteBags now runs on 26.1, 26.2 and 26.3, with the same jar you use on 1.21.x.

26.x servers need Java 25. That is a Minecraft requirement, not one of ours.


🔊 Sound Names

Sound settings in config.yml now take namespaced keys like minecraft:block.chest.open as well as the classic BLOCK_CHEST_OPEN names. Your existing sounds keep working as they are.


🔧 Quieter Console

On 1.21.1 to 1.21.3 the console no longer warns about PALE_OAK_LOG on every start and reload. Items in shopworth.yml your version doesn't have are now summed up in one info line instead.


📦 Upgrading

Replace the jar and restart. No new config keys and no database changes. The developer API is unchanged from 1.5.0.


Need help or found a bug? Join the Discord.
Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.5.0
The bag item now opens and fills with a click, keeps its own slot, and puts you back wherever you opened it from.

🖱 Opening and Filling the Bag With a Click

  • Right-click the bag item on any inventory screen and the screen closes and the bag opens. Your own inventory, a chest, a furnace, anywhere your inventory is showing. Left-click still picks it up in movable mode
  • Drop a stack onto the bag item to send it in. Left-click sends the whole stack, right-click sends one, exactly like placing into a normal slot. A full bag leaves the stack on your cursor with the usual full-bag line, and an open bag GUI updates its quantity on the spot

↩️ Closing Puts You Back Where You Were

Right-click the bag item inside a chest, close the bag, and you are back in that chest. The same goes for double chests, barrels, shulker boxes, hoppers, furnaces, ender chests, chest minecarts and chest boats, and it survives a trip through the Settings menu. Opening the bag from your own inventory now simply closes on Esc, with no four-row copy of your inventory in the way.

Only real storage comes back. Other plugins' menus, crafting tables, anvils and the like close with the bag, because reopening a menu that has already closed is a well-known way to duplicate items.


📍 The Bag Remembers Its Slot

Move the bag anywhere in your hotbar or inventory and that slot is saved. Joining, dying, /clear, or trying to drop it all bring it back to the same place, and dropping is now blocked at the click itself rather than bouncing the bag to the configured slot.

If something else is sitting in that slot when the bag returns, nothing is pushed out or dropped. Your item stays where it is, the bag takes a free slot for the moment, and it moves itself back as soon as its own slot is empty, checked each time you close your inventory. A completely full inventory waits the same way.


🔒 Dupe Pass

  • The bag cannot go inside itself. Shift-clicking it into an open bag answers with a message, and any bag already stored inside another one is removed when its owner joins, with a single console line
  • Reopened containers are looked up live, never restored from an old copy, so a chest broken while your bag was open does not come back
  • Two more holes closed: a number key could swap the bag item into a chest, and /clear while carrying the bag on the cursor handed out a second one

🎨 Making the Item Your Own

The bag item no longer has to be a head. Use bag-item.material for any vanilla item, bag-item.custom-model-data for your own pack, or bag-item.itemsadder for an ItemsAdder id in namespace:id form. ItemsAdder is optional, and if it is missing or the id is unknown the item falls back to the material and logs one line. Name and lore sit on top of whichever you pick, and leaving the name empty keeps the ItemsAdder name.


🙅 Players Can Opt Out

/bag item off removes the item and remembers the choice, so joins, respawns and /clear stop handing it back. /bag item on returns it, but only into free space: the configured slot in locked mode, any free slot in movable mode, and a clear message if there is no room. /bag item on its own flips it.

Each behaviour has its own switch under bag-item, open-on-click, deposit-on-click, return-to-inventory and player-toggle, all on by default.


📦 Install

Replace the old jar in plugins/ with InfiniteBags-1.5.0.jar and restart. The new bag-item.remember-slot key is written into your config.yml on boot and the database adds its own new column, so there is nothing to paste in by hand.

The bag item ships off. Everything in this update sits under bag-item.enabled: true.


📋 Version Breakdown

Version Focus
1.5.0 The bag returns you to the container you opened it from, keeps its own slot across joins and deaths, cannot be placed inside itself, and closes several duplication routes.
1.4.0 Click to open and click to deposit on the bag item, a player opt-out through /bag item, and a custom material, model data or ItemsAdder id for the item.

Need help or found a bug? Join the Discord.
Read the documentation | Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.3.0
Two new API methods, so another plugin can read what a bag holds and take items back out of it.

🔌 Reading and Removing

Until now the developer API could only put items into a bag. These two methods let another plugin on your server take them back out, which is what makes a bag usable as a live source of blocks or materials rather than just storage.

long count(UUID player, ItemStack item)
int remove(UUID player, ItemStack item)
  • count returns how many of that item type the bag holds. The amount on the item you pass in is ignored. It returns a long, because a well-stocked bag can hold more of one type than an int can express
  • remove takes items of that type back out, with the amount on the item you pass in being the quantity to take. It returns how many were actually removed

✂️ Removal Is Partial, On Purpose

Unlike add, which is all or nothing, remove takes what is there. Ask for 5 against a bag holding 3 and you get 3 taken and 3 returned, so the caller can cover the shortfall itself. The return value is always between 0 and the amount you asked for, never more.

A slot drained to zero is deleted rather than left sitting empty, so it frees up for a different item type straight away.


📌 Worth Knowing

  • Same grouping as the rest of the API (material plus full NBT hash), so count(...) > 0 is exactly equivalent to contains(...). A renamed or enchanted block is a different type and is never consumed to satisfy a request for the plain one
  • Both work offline and are locked per player, like the rest of the API. They are async-safe, touching only the database and in-memory data
  • Neither runs a permission check internally. Call isEnabled(uuid) yourself if you want that gate
  • Both see items on pages or slots the player's current permissions no longer reach, the ones /bag recover exposes, so everything count reports is something remove can actually hand over
  • Null or air items, and null UUIDs, return 0. No exceptions
  • Calling the API by reflection is supported and now documented

📦 Install

Stop the server, replace the old jar in plugins/ with InfiniteBags-1.3.0.jar, and start it again. No existing method changed behaviour and the storage is untouched, so your bags carry over exactly as they are and anything already built against the API keeps working unchanged.


Need help or found a bug? Join the Discord.
Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.2.3
Localized bag item names for every player, plus new snapshot methods for the developer API.

🌐 Client-Localized Item Names

Item names in the bag and recovery menus now show in each player's own game language. An un-renamed item renders its vanilla name localized to the viewer, instead of a fixed English string. Items you've given a custom name keep that name. (The GUI search filter still matches the English material name, by design.)


🧩 Developer API: Bag Snapshots

Two new read-only methods let companion plugins (like AT-MailBox) snapshot a bag once and test items against it later, without re-reading the live bag each time.

  • String typeKey(ItemStack item) the bag's grouping key for an item (material plus full NBT, amount ignored), or null for a null/air item. Same "same type" rule that contains uses.
  • Set<String> contentKeys(UUID player) a plain-value snapshot of the grouping keys of every type currently in the player's bag. Safe to keep, persist, and compare later.

Checking whether typeKey(item) is in a saved contentKeys set answers "was this type in the bag at snapshot time?"

  • Both work offline (UUID-keyed database read) and are per-UUID locked, like the rest of the API. Async-safe, no world or entity calls.
  • No write path or existing method behavior changed, so existing integrations keep working unchanged.

Full details on the Developer API page, including the methods table and a "Snapshotting a bag" section.


📦 Install

Replace the jar in plugins/ and restart. No config changes needed.


📋 Version Breakdown

Version Focus
1.2.3 New read-only API methods (typeKey, contentKeys) so companion plugins can snapshot a bag and compare later.
1.2.2 Bag and recovery menu item names now render in each viewer's own game language.

Need help or found a bug? Join the Discord.
Read the Developer API guide | Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.2.1
Patch release, fixes a storage dupe when an auto-collector plugin is installed alongside InfiniteBags.

🔧 Fixed

Dropping an item out of the bag at a full inventory spawns a world item with no thrower, which looked identical to a real overflow drop. An external auto-collector plugin (like a mailbox) could vacuum that item back into its own storage, duping it out of the bag.

InfiniteBags now stamps every bag-withdrawal drop with a persistent marker (infinitebags:bag_drop) the instant it spawns, so cooperating plugins can tell it apart and leave it alone. The marker is set before the item enters the world, so spawn-time listeners see it.


🧩 Compatibility

Spigot, Paper, and Purpur on Minecraft 1.21.x. A drop-in upgrade with no config changes, and the v1.2.0 developer API is unchanged.


📦 Install

Just replace your old jar with the new one and restart. No config changes needed.


Need help or found a bug? Join the Discord.
Read the documentation | Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.2.0
An optional developer API so other plugins can read and write a player's bag.

✨ What's New

This release adds an optional developer API so other plugins can read and write a player's bag at runtime. No hard dependency and no extra jar to install, it's soft-depend friendly and ships inside the normal plugin jar.


🖥 For Server Owners

  • Nothing to configure. A drop-in upgrade from 1.1.x, with no config or language changes.
  • Better integrations. Other plugins you install (mail systems, reward systems, custom shops) can now deposit items straight into a player's bag, even while they're offline.

🧩 For Developers

A new InfiniteBagAPI (in cc.arrowtan.infiniteBags.api) with four methods:

  • isEnabled(UUID) can the player use their bag
  • accepts(ItemStack) would the bag store this item type
  • contains(UUID, ItemStack) does the bag already hold this exact type
  • add(UUID, ItemStack) store an item, returns the amount that did not fit

Also:

  • Static accessor InfiniteBag.getApi() (null-checked, soft-depend safe)
  • Works offline (UUID-keyed database access) and is async-safe (per-UUID locked, touches only database and bag data)
  • Strict item grouping: matches full material plus NBT (name, enchants, damage, custom model data), not just material

📦 Install

Replace the jar in plugins/ and restart. No config or language changes needed.


Full guide on the new Developer API page in the docs.
Read the Developer API guide | Join the Discord

Enjoying the plugin? A ⭐ review goes a long way!
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.1.1
Bag item survives /clear

Fixed

The bag item used to vanish when an inventory was wiped by command, since /clear edits inventories directly and skips the events the plugin listens to. It now restores one tick after the wipe.

Survives:

  • Vanilla /clear
  • EssentialsX /clearinventory, /ci, /clean, /clearinvent
  • Namespaced forms (minecraft:clear, essentials:ci, etc.)
  • Player-typed, console, and command-block execution

Config

New keys under bag-item (auto-added on upgrade):

  • restore-on-clear - toggle (default true)
  • clear-commands - which command names trigger a restore. Case-insensitive, namespace-insensitive, first-word match.

Questions or issues? Join the Discord.
If InfiniteBags has been useful, a review goes a long way.
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11
InfiniteBags v1.1.0
CustomModelData pricing for custom items

What's New

  • CustomModelData pricing in shopworth.yml. New cmd-prices: section using the format MATERIAL:CMD: price.
  • Lookup order: CMD match first, then NBT match, then simple material match.
  • Works with ItemsAdder, Nexo, Oraxen, MMOItems, and plain resource-pack items. Zero soft-depends added.

Example Config

cmd-prices:
  DIAMOND_SWORD:1001: 500.0
  PAPER:2050: 25.0
  STICK:9999: 10000.0

Upgrade Notes

  • Fresh installs: the new cmd-prices: section appears automatically with commented examples.
  • Existing installs: shopworth.yml uses plain Bukkit YAML, so the section will not auto-insert. Either hand-paste the new section into your file, or delete shopworth.yml to let it regenerate.
  • This only affects the local provider. To use CMD pricing through UltimateShop, ShopGUI+, EconomyShopGUI, or EssentialsX, you will need a separate per-provider hook (planned for a future update).

How to Find a CustomModelData

Hold the item in your main hand and run:

/data get entity @s SelectedItem

Look for CustomModel1234 in the output. That number is your CMD value.


Made with ❤ by zArrowTan
Download 0
No ratings yet
Purchase required

Compatible with Minecraft 1.21 - 1.21.11

latest

Download 0
No ratings yet
Purchase required
Product Info
Statistics
139

Views

0

Purchases

0

Downloads

243.13 KB

File size

10.06.2026

Published

11.10.2026

Updated

Info
Supported software
Supported Versions
1.21 - 26.3
Share & Earn

Share and earn part of the profits, an estimated €1.0 per product sale.

Log in to get your link
Product Image
InfiniteBags | Backpack with Shop
InfiniteBags | Backpack with Shop