Skip to content
OrePlugins

MarketStalls

A shop is a barrel with your name on it.

Product pagev1.0.01.21 through 1.26 · Java 21+

Installation

  1. 1Install Vault and an economy plugin first — EssentialsX Economy, CMI and most others register one. MarketStalls refuses to enable without them and says which is missing.
  2. 2Drop the jar into plugins/ and restart. Paper fetches sqlite-jdbc itself on first boot. A server with no outbound network that day will see MarketStalls refuse to enable with an instruction rather than a stack trace: without the record of who owns which shop, every shop on the server would be an ordinary unprotected container.
  3. 3Give your players nothing. marketstalls.use, marketstalls.trade and marketstalls.market already default to everyone, because a shop plugin whose shops nobody may use is not a shop plugin. Staff get marketstalls.staff.

Opening a shop, in three steps

Place a barrel. Hold the item you want to sell. Look at the barrel and run /stall.

It offers to sell what you are holding, then asks for a price — a text box inside a form on Bedrock, the chat line on Java. Put some of the item in the barrel and you are open.

That is the whole thing. There is no sign to format and no syntax to remember, which is deliberate: the players most likely to run a shop are the ones least able to type [Shop] on line one of a sign from a phone.

Why barrels, and what happens if you allow chests

A chest is two blocks. Chests pair when a second one is placed beside them and the two halves share one inventory, so on a plugin that protects "the block the shop is on", anybody who can place a chest next to your shop can open their own half and take everything out of it. No protected block is touched. Nothing is broken. Every protection check on the server sees a player opening a chest they just placed, because that is what happened.

A barrel has no second half, which is why it is the only stall block by default.

Adding CHEST to stall-blocks is supported and closes the hole three ways: a double chest cannot become a stall, a chest cannot be placed against a stall chest by anybody including its owner, and internally a stall chest only ever trades out of its own half. All three explain themselves when they refuse.

Buying, selling and lots

A stall has two prices and either can be off: what customers pay to take a lot out of the box, and what you pay them to put a lot in. Set both and you have a buy-and-sell counter.

A lot is the batch size — one item by default, up to a full stack — and prices are per lot. Changing the lot size therefore changes what the money buys, and MarketStalls says so when you change it, because the alternative is quietly selling four times as much for the same price.

A stall offers a Buy button only when there is a lot on the shelf, and a Sell button only when the box has room. Whether you can afford it is not part of that: hiding a price from somebody who is short today tells them nothing, and being told "you can’t afford that" does. Stock is a fact about the shop; money is a fact about the shopper.

Who can open the box

The owner right-clicks their stall and the box opens, exactly as a barrel does. Restocking a shop should not involve a menu.

Everybody else gets the shop front, and the container never opens for them under any circumstances. The block is the shop front; /stall is the back office, and that is where an administrator manages somebody else’s stall.

Nobody but the owner can break one either, and an owner who breaks their own barrel simply stops having a stall — the contents drop the way breaking a barrel always has.

Protection

A hopper cannot move anything into or out of a stall. Both directions matter and only one is obvious: draining the box is theft, and a hopper feeding items in fills it — and a full box is a stall that can no longer buy anything, a denial of service on somebody’s shop that costs the attacker a stack of cobblestone.

Explosions have stall blocks removed from the blast rather than the blast being cancelled, so a creeper hole still looks like a creeper hole with the shops standing in it. Pistons cannot move a stall: a moved one would be simultaneously nowhere, because its recorded block is now air, and unprotected, because the box with the stock in it is one block over. Fire cannot burn one.

All four are switches in config.yml, because some servers already have a region plugin doing the same job and two plugins cancelling the same event is wasteful rather than safer. None of them is a good idea to turn off, and the config says so at the switch.

Server stalls

/stall admin makes the stall you are looking at a server stall: infinite stock, bottomless funds, what it sells is created and what it buys is destroyed.

That makes it a faucet and a sink for your economy rather than a transfer between two players, which is a decision about the economy rather than about a shop.

So it has its own permission, marketstalls.adminstall, and is deliberately left out of the marketstalls.staff bundle that you hand a moderator.

Commands

MarketStalls commands and permissions
CommandWhat it doesPermission
/stallAt a container: make it a shop, manage yours, or shop at somebody else’s.marketstalls.use (everyone)
/stall list · /stall logYour shops with prices, stock and coordinates; and what has been bought and sold at them.marketstalls.use
/stall removeStop it being a shop. The box and everything in it is untouched.marketstalls.use
/stall adminMake it a server stall: infinite stock, bottomless funds, a faucet and a sink.marketstalls.adminstall
/market [item] · /market buying [item]Who is selling it and where to walk — or who will pay you for it.marketstalls.market (everyone)
/marketstalls pruneForget stalls whose container is gone. Manual on purpose.marketstalls.manage
/marketstalls commandsWhich command names this plugin actually owns on your server.marketstalls.manage

Still stuck?

Post in Discord with your server version and the relevant part of the log. That is almost always enough to get a straight answer the same day.

Get help