RouletteMachine
A real European roulette, built in your world. The wheel spins, the ball rolls and drops into a pocket, and players bet by clicking the felt. Winnings paid in real money via Vault.
A roulette that is actually built in the world
Installation
Up and running in a minute. It only needs Vault and an economy plugin.
Steps
- Make sure you have Vault and an economy plugin (EssentialsX, CMI…) installed.
- Download RouletteMachine.jar (free or premium) and drop it into plugins/.
- Restart the server (Java 21 required for 1.21+).
- Create your first table — see Create a table.
tables.yml. Language files are generated on first start in lang/, and the config updates itself on new versions, keeping your settings.Create a table
Two commands build a full table: the spinning wheel and the betting felt next to it.
- Run
/roulette create <name>, then right-click a block where you want the wheel's centre. The felt is laid out facing the way you were looking. - Run
/roulette build <name>to build the wheel and the felt out of blocks. - Done. Players right-click the table to open betting, or bet directly on the felt.
# create and build a table called casino1
/roulette create casino1 # then right-click the wheel block
/roulette build casino1 # builds wheel + feltMove or restyle it
Nudge the felt with felt.nudge-right / felt.nudge-forward in the config, or change the block colours under the build style. Then /roulette unbuild <name> and /roulette build <name> again.
Betting
Players bet by clicking the felt directly, or through a chest menu. The first bet opens a 30-second round; when it closes, the wheel spins on its own.
On the felt
| Action | What it does |
|---|---|
| Right-click a spot | Places a chip of your current value |
| Left-click a spot | Takes your own chips back off it (refunded) |
| Sneak + right-click | Switches to the next chip value |
Bet types & payouts
| Bet | Covers | Pays |
|---|---|---|
| Straight up | A single number (0–36) | 35 : 1 |
| Red / Black | 18 numbers of a colour | 1 : 1 |
| Even / Odd | 18 numbers | 1 : 1 |
| 1–18 / 19–36 | Low or high half | 1 : 1 |
| Dozen | 1–12, 13–24 or 25–36 | 2 : 1 |
| Column | One of the three columns | 2 : 1 |
Commands
Main command /roulette (aliases /rm, /ruleta).
| Command | What it does |
|---|---|
/roulette create <name> | Start creating a table (right-click the wheel block) |
/roulette build <name> | Build the wheel and felt out of blocks |
/roulette unbuild <name> | Remove the built blocks |
/roulette delete <name> | Delete a table (refunds any open bets) |
/roulette list | List all tables |
/roulette spin <name> | Force a spin now, without waiting for the window |
/roulette top PREMIUM | Leaderboard by net profit |
/roulette stats PREMIUM | Your own spins, wins and profit |
/roulette reload | Reload config and language files |
Permissions
Players only need to be able to play; admins get the build commands.
| Permission | Grants | Default |
|---|---|---|
roulettemachine.use | Play at a table and place bets | everyone |
roulettemachine.admin | Create, build, delete, spin and reload | op |
roulettemachine.limit.bypass | Ignore the per-round max bet | op |
Free vs Premium
The free version is the complete game. Premium adds the tools a bigger server wants — nothing about the roulette itself is locked.
| Feature | Free | Premium |
|---|---|---|
| Physical wheel, ball & felt betting | ✔ | ✔ |
| Every bet type & correct odds | ✔ | ✔ |
| 30-second betting window | ✔ | ✔ |
| Secure RNG & Vault payouts | ✔ | ✔ |
Stats & /roulette top leaderboard | — | ✔ |
| PlaceholderAPI | — | ✔ |
| Discord webhook for big wins | — | ✔ |
| Reward commands / items on a win | — | ✔ |
Placeholders
PREMIUM — with PlaceholderAPI installed, these work in any scoreboard, tab list or HUD plugin.
| Placeholder | Shows |
|---|---|
%roulette_wins% | The player's total wins |
%roulette_spins% | The player's total spins played |
%roulette_profit% | The player's net profit |
%roulette_tables% | How many tables exist on the server |
Configuration
One clean, commented config.yml. Everything below is editable.
Betting
betting:
chips: [ 10, 50, 100, 500, 1000 ] # chip values a player can pick
min-bet: 10 # smallest allowed bet
max-bet: 0 # max per player per round (0 = none)
window-seconds: 30 # length of the betting window
announce-nearby: true # shout to nearby players when a round opens
announce-radius: 40 # announce radius (blocks)The wheel & the spin
wheel:
radius: 6.0 # block wheel radius (min 5)
spin-seconds: 6.0 # how long a spin lasts
ball-material: SNOWBALL # the ball's item
ball-linger-ticks: 60 # how long the ball rests after landing (20 = 1s)
show-numbers: true # a floating number over each pocket
default-theme: classic # default block build styleThe felt & chips
felt:
enabled: true # build the betting felt
nudge-right: 0 # shift the felt to the right (blocks)
nudge-forward: 0 # push the felt away from the wheel
click-to-bet: true # bet by clicking the felt
protect-blocks: true # stop players breaking the table
show-chips: true # show coloured chips on the felt
max-names: 3 # names per spot before it collapses
chip-colours: [ RED, BLUE, LIME, ... ] # one colour per playerRewards & Discord PREMIUM
rewards: # [PREMIUM] on a straight-up win
on-straight-win-commands: [] # console commands. {player} {amount} {number}
discord: # [PREMIUM] big-win announcements
big-win-threshold: 0 # announce wins at/above this (0 = off)
webhook-url: "" # your Discord webhook URL/roulette reload. The build style (block colours of the wheel and felt) lives at the bottom of the file.Version history
Every release and what changed in it.
- ✨No licence key needed any more: install the jar and it works. The licence terms stay the same: one purchase covers one server (or one network under the same owner).
- 🐛/roulette unbuild and delete no longer leave holes in the floor: a build now remembers every block it replaced and puts it back, and nothing standing next to the table is touched.
- 🐛Changing wheel.radius or the felt nudges after building no longer moves the felt away from the real table. A table keeps the geometry it was built with.
- 🐛Tables in a world loaded by another plugin (Multiverse, InfiWorlds...) are no longer erased from tables.yml, and come up on their own once that world loads.
- 🐛A tables.yml that cannot be read is no longer overwritten with an empty one at shutdown. The plugin leaves it untouched and says so in the console.
- 🐛/roulette build refuses a wheel.radius that cannot fit all 37 numbers (5 and 6.5 left numbers off the wheel) and suggests one that does.
- 🐛Deleting a table during the betting countdown or a spin no longer leaves its holograms floating. The spin is stopped and the bets are refunded.
- 🐛With wheel.show-numbers: false, the felt labels no longer disappear after a restart.
- 🐛Two tables standing close together no longer wipe each other's felt labels.
- 🐛Table names with a dot are refused: those tables were lost after a restart.
- 🐛Building a table that is already built takes the old build down first, instead of leaving the old wheel orphaned.
- 🐛A table the plugin did not build no longer locks the floor in front of it, nor takes bets on a felt that is not there.
- 🐛RouletteMachine no longer switches itself off when the economy plugin loads after it.
- 🐛Pocket numbers in a neighbouring chunk come back when that chunk loads.
- 🐛Winnings are now paid before the end-of-spin effects, so an error there can never skip a payout.
- ✨/roulette cancel drops a table you are creating. A pending creation also expires after 60 seconds, and when you log out.
- 🔧/roulette reload now adds new config options and redraws the labels in view with the new display settings.
- 🔧Language files refresh themselves when an update changes their text, keeping your old file as a .old backup.
- 🔧/roulette top and /roulette stats now say they are Premium, instead of showing empty stats.
- 🔧The ball carries the roulettemachine tag too, so anti-lag plugins can be told to leave it alone.
- 🔧Lighter block-protection checks on busy servers.
- 🔧Just replace the jar. Tables built before 1.1.0 kept no record of the floor: unbuilding them removes only the table's own blocks, not what was under them.
- 🔧Your language files are refreshed on this update; the old ones are kept as lang/<code>.yml.old. Customised messages? Copy them across.
- 🐛The felt labels vanished on restart and never came back. They were only ever drawn by /roulette build, so nothing redrew them and only rebuilding the table helped.
- 🐛Labels sat in a dull grey box. A transparent background colour does not switch off the one the client draws by itself; that needed turning off explicitly.
- 🔧Labels are now lit at full brightness instead of by the block under them, so they read the same at midnight and indoors as they do at noon.
- 🔧Default view range raised from 0.6 to 1.0: the numbers were only visible from close up.
- 🔧New display options: label-background-opacity, board-background-opacity and full-brightness, if you want the old look back.
- 🔧The whole build - felt, border and wheel - is now protected on its own, without needing WorldGuard or any region plugin drawn around it.
- 🔧Staff are protected too now. Hold sneak while breaking to get through, or use /roulette unbuild <name> to take a whole table down properly.
- 🔧An explosion next to a table still blows up everything around it. Only the table's own blocks are spared, so you do not get a suspiciously tidy crater.
- 🐛Explosions, pistons, fire, endermen and flowing water could all take blocks out of a table. Only a player breaking one by hand was ever refused.
- 🐛Staff bypassed the protection entirely, so an admin testing it saw no protection at all and one stray swing put a hole in a live table.
- 🐛The table labels stacked on top of each other after a restart. The felt sits in its own chunks, and a redraw could not clear labels in a chunk that was not loaded.
- 🐛Existing tables repair themselves on start: every table is wiped and redrawn once, so a table already carrying stacked labels comes good just by updating.
- 🐛The board above the wheel was never deduplicated, only the pocket numbers, so a second one sat on top of the first drawing the same lines.
- 🔧Labels are no longer drawn while part of the felt is out of memory. The redraw waits for the last chunk instead of doing half the job twice.
- 🐛Building the table left four holes in it, at the corners of the two outside-bet rows. Those positions belong to no bet, so nothing was ever painting them.
- 🐛Betting on the layout with a block in hand no longer places that block on the table. Spamming a bet used to tile the felt with whatever you were holding.
- 🐛The off-hand could still place blocks on a table: a right-click fires once per hand, and only the main hand was being blocked.
- 🐛The border framing the felt was not protected either, only the betting areas, so a click on the trim built on the table.
- 🔧Building on a table is now blocked outright, from any route, including the block directly above the felt where it would hide a bet.
- 🔧The 'this is part of a roulette table' warning no longer floods the chat when you spam-click. Once every two seconds is enough.
- ✨/roulette delete <name> now also removes the wheel and felt the plugin built. Deleting the table and leaving the stone wheel standing was no use to anybody.
- 🐛Deleting a table used to leave its build with no way to remove it: /roulette unbuild needs a registered table to know where to sweep, and it was already gone.
- 🐛/roulette unbuild used the radius from config.yml instead of the one the table was built with. Changing wheel.radius in between left the real ring standing.
- 🔧Only blocks the plugin placed are ever swept. If an admin raised the wheel by hand, nothing is touched and you are told how to force it.
- 🔧New option tables.delete-removes-build, and /roulette delete <name> keep or build to decide per command. Both appear in tab-complete.
- 🐛Restarting the server no longer eats the bets. A stake is charged the moment the chip goes down, and bets lived only in memory: stopping the server with chips on the felt — or mid-spin — kept the mone
- 🐛One failed payout no longer costs the rest of the table. If settling a bet went wrong, every player after it went unpaid with their stake already taken. Each bet settles on its own now, and failures a
- 🐛Pulling a chip back now checks the money actually arrived. Placing a bet verified the charge but taking it back did not, so a failed refund cost the player both the chip and the money. The chip now st
No notes for this version.
Discussion
Comment and share your experience on each plugin version.
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
No comments on this version yet — be the first!
buen plugin!
Player reviews
What server owners think of this plugin.
Buen plugin