Repository navigation
Administration
Players with stall.admin (operators by default) can manage every shop:
- Sneak and right-click any shop with empty hands to edit its offers.
- Break any shop, or look at it and run
/stall remove. Its token goes back to its owner. -
/stall list <player>lists a player's shops. -
/stall admin give <player> [amount]hands out tokens.
A plain right-click still opens someone else's shop as a buyer, so operators don't reach a shop's stock by accident.
Shop limits are permission tiers, stall.limit.0 to stall.limit.100, plus stall.limit.unlimited. The default is 3. See Commands and permissions for LuckPerms examples.
Removing a shop gives its token back:
| How the shop was removed | Where the token goes |
|---|---|
| Its owner broke the container | Dropped where it was broken, with the container's contents. |
| Removed by the owner or an operator, owner online | Into the owner's inventory. If someone else removed the shop, the owner is told. |
| Removed by an operator, owner offline | Saved for the owner. They're told when they join and collect it with /stall reclaim. |
| Its container disappeared or carries another shop's marker | Saved for /stall reclaim, whether the owner is online or offline. |
| The shop was made in creative mode | No token, because none was used. |
Tokens waiting for /stall reclaim are kept in <world>/stall/returns.json.
When a shop is made, its container is marked with the shop's id; a double chest carries the mark on the half at the shop's location. A shop only trades while the container at its spot carries that mark. If it doesn't, for example because the container was replaced by another plugin, a world edit or a command, the shop pauses instead of selling whatever is in the new one:
- Buyers are told the shop is paused, and the container stays shut to them.
- Hoppers are still kept out.
- Its owner, or an operator, sneaks and right-clicks it with empty hands to start it again. This goes through claim protection, so a player who has lost access to the spot can't restart a shop there.
If a loaded shop's container is gone, or its marker belongs to a different shop, Stall removes the old record and queues its consumed token for /stall reclaim. This runs on chunk load, interaction and a sweep every ten seconds. Unloaded chunks and missing worlds are left alone. An unmarked replacement container stays paused and can still be reactivated, even if it's a different kind: a barrel shop replaced by a chest becomes a chest shop.
<world>/stall/
shops/<shop id>.json one file per shop: its owner, location and offers
shops/_broken/ files that couldn't be loaded, moved aside instead of deleted
shops/_orphaned/ removed shop records kept for recovery
returns.json tokens waiting for /stall reclaim
-
returns.jsonalso remembers which orphaned shop IDs were refunded, even after their tokens were claimed. This prevents a leftover shop file from generating a second refund after a crash. - Files are written in the background, and each write replaces the old file in one step, so a crash mid-save never leaves a half-written shop.
- A file Stall can't read is moved to
shops/_broken/and logged, instead of being deleted. The shop is skipped until the file is fixed and moved back. - A file written by a newer version of Stall is left alone, neither loaded nor overwritten, so downgrading doesn't destroy anything.
- An offer whose items can't be loaded, for example an item from a mod that was removed, is kept in the file rather than dropped. The rest of the shop loads normally.
Back up the world and you've backed up its shops. Restoring a backup restores the shops and their containers together.
A large barrel's 27 extra slots are saved on the barrel itself, as block data written with the chunk, not in a Stall file. A world backup or rollback includes both the barrel's own contents and its extra slots. Spigot/Paper writes owner-menu changes back within a tick, and also on trades, view close and chunk unload. A crash still follows the server's normal save timing; Stall does not make player inventories and world saves one durable transaction.
Vanilla doesn't know about them, which has some consequences:
- Hoppers and comparators only see the barrel's own 27 slots.
-
/stall removerefuses a large barrel whose extra slots hold anything, because an ordinary barrel can't keep them. Empty them first, or break the barrel, which drops them like the rest of its contents. - Replacing the barrel with a command or a world editor deletes its extra slots, just as it deletes the barrel's own items.
- Empty large barrels' extra slots before removing Stall from a server, or moving the world between Fabric and Spigot/Paper. Without Stall, nothing can open them; Spigot and Paper keep them if Stall comes back, but Fabric and Spigot/Paper each store block data their own way, so a move between them loses them.
Spigot, Paper and Fabric use the same shop files, and items are saved in the same format on all three, so a world's shops and offers carry across. Item data from older Minecraft versions is upgraded on load.
Spigot, Paper, Purpur and Folia share their container marks. Moving between those servers preserves the marks. Fabric uses its own marks, so a move between Fabric and any of those servers drops the other's marks. After a move, every shop loads paused. Each owner, or an operator, sneaks and right-clicks each shop with empty hands to start it again.
Getting started
Players
Reference
Admin