Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
The idea
The Wheel hands everyone on your server exactly one spin. Whatever it lands on becomes your thing for the session — it survives death, logout and restarts, and only leaves when an admin clears it or starts a fresh round. Some traits are gifts you'll want to show off. Some are punishments you'll spend the night working around. Most sit in between and quietly reshape how you play: the person who can't jump, the one every monster hunts, the glass cannon everybody is scared to touch, the giant who can't fit through their own front door.
Because the trait is fixed and public, it turns into table talk. People trade them, gang up on the unlucky ones, build farms around a blessing, or beg an admin for a reroll. On an SMP it gives a week its own flavour; in an event it's a fast, readable handicap system that needs zero explaining.
How a spin feels
Type /wheel spin and a slot-machine reel scrolls across your action bar —
❮ decoy ┃ TRAIT ┃ decoy ❯ — while a "wheel" boss bar drains and the tick
sound climbs in pitch. The gaps between frames stretch out as it goes, so it
visibly decelerates and clicks to a stop on your trait instead of just
freezing. Then a title slams in with no fade, a coloured particle burst fires
off (green totem sparks for a blessing, black smoke for a curse, enchant glyphs
for mixed) and you hear a sound that matches — triumphant, cursed, or arcane.
Prefer skill to luck? Flip spin-mode to draft and the reel becomes a
three-card GUI: pick one of three candidates, or let the timer pick for you.
Don't want the show at all? animation.enabled: false resolves spins instantly.
The traits (34)
Traits are grouped into three tiers, each drawn by a configurable rarity weight (Common » Uncommon » Rare) and a per-tier multiplier. Every trait also attunes: the longer you hold it, the stronger it gets — potion traits gain amplifier levels, numeric traits scale their numbers, at the 5 / 15 / 30-minute marks (all tunable).
Blessings — 13
swift permanent Speed · stone_skin permanent Resistance · night_owl
permanent Night Vision · quick_hands permanent Haste II · lucky Luck +
Hero of the Village · ghostly mobs never target you · spiky attackers take
damage back · magnetic nearby drops drift to you · bloodhound hostile mobs
glow through walls · iron_gut hunger never drains · vampiric melee lifesteal
· adrenaline low-health Speed + Strength burst · second_wind survive one
killing blow per session
Curses — 10
molasses permanent Slowness · grounded you cannot jump · glass_bones
+50% damage taken · pacifist your melee deals zero · spotlight you glow for
everyone, always · hunted monsters home in on you · bottomless_pit hunger
drains twice as fast · brittle no natural regeneration · clumsy hits may
knock the item out of your hand · explosive_end you detonate when you die
Mixed — 11
moon_walker Jump II + no fall damage, but no sprint · berserker +50%
dealt / +25% taken · photosynthetic regen in daylight, starve in the dark ·
nocturnal strong at night, weak by day · featherweight jump higher, −2
hearts · heavyweight knockback-immune, 15% slower · giant bigger, tankier,
harder-hitting — and a bigger target · tiny small and evasive, frail and
weak · pyromaniac immune to fire, burned by water · aquatic dominant in
water, sluggish on land · glass_cannon double damage, half health
New traits are a single Kotlin object — an id, a tier, a rarity, an icon,
and whichever hooks it needs (onAssign / onTick / onRemove / onDeath,
or reactive ones like onIncomingDamage, onJump, onFoodChange).
Ways to run it
- Rounds —
/wheel startspins everyone at once behind a boss-bar countdown;/wheel start mirrorbinds the whole server to one shared trait. - Global events — Blood Moon floods the Wheel with curses (and buffs
them), Golden Hour does the same for blessings, Frenzy re-spins everyone
every 30 seconds, Reshuffle deals every trait to a different player. On a
timer, or fired with
/wheel event. - Expiry & rotation — let traits time out and re-roll per player, or re-spin the entire server on a fixed interval.
- Rerolls — spend XP levels for another go, with an optional per-session cap. Hand out Wheel Tokens as quest / vote rewards: a right-click item that spins for free.
- Swaps —
/wheel swap <player>trades traits between two consenting players. - Pity — draw three curses in a row and your next spin is pulled from the blessing pool.
- On-screen HUD — an optional action-bar or boss-bar readout of your trait, attunement stars and time remaining.
Under the hood
- Paper 26.2 API, written in Kotlin 2.4, built for JDK 25. Single jar, no external runtime dependencies; PlaceholderAPI is an optional soft hook.
- Event-driven traits. Each trait implements a small
Traitinterface; one listener fans Bukkit/Paper events (PlayerJumpEvent,EntityDamageByEntityEvent,EntityTargetLivingEntityEvent,FoodLevelChangeEvent, world-change, respawn, quit…) out to the holder's trait, and a 1-second task drives the periodic effects. - Attribute modifiers, not just potions — Giant/Tiny/Glass Cannon/
Heavyweight/Featherweight adjust
SCALE,MAX_HEALTH,ATTACK_DAMAGE,KNOCKBACK_RESISTANCEandMOVEMENT_SPEEDthrough namespacedAttributeModifiers that are cleanly added and removed, with health re-clamped on removal. - Weighted RNG. The draw combines each trait's rarity weight with per-tier and per-rarity config multipliers and any active event, then does a single weighted pick (or three distinct picks for draft mode).
- Cheap persistence. Assignments and lifetime stats are held in memory and flushed to YAML on a timer (and on shutdown) behind a dirty flag — a 30-player round is one file write, not thirty. Assignments carry a timestamp so attunement and expiry survive a restart; the old flat save format still loads.
- Adventure UI throughout — MiniMessage for every string, boss bars for the reel / countdown / events / HUD, titles and action bars for the payoff, hover tooltips on broadcasts.
- Integration. A PlaceholderAPI expansion (
%wheel_trait%,%wheel_tier%,%wheel_rarity%,%wheel_stage_stars%,%wheel_streak%,%wheel_event%,%wheel_spins%,%wheel_total_spins%, …), a smallWheelAPIfor other plugins, and a cancellable-freeTraitChangeEvent(player,previous,trait,cause) fired on every assignment. bStats metrics, opt-out via config.
Commands
/wheel (alias /thewheel)
- Anyone:
spin,reroll,swap <player>/swap accept,menu,mine,list,traits [tier],stats [player],top,history - Admin:
start [now|mirror],set <player> <trait>,token [player] [n],event <kind|stop>,clear [player],clearall,reload
Permissions
| Node | Default | |
|---|---|---|
wheel.spin |
everyone | spin, open the menu, view traits |
wheel.admin |
op | rounds, set/clear, tokens, events, reload |
wheel.exempt |
— | traits have no effect on this player |
wheel.trait.* |
everyone | per-trait access (checked only when per-trait-permissions is on) |
Config highlights
Draw weights per tier and per rarity · which traits are in the pool ·
per-trait-permissions · spin-mode (reel / draft) · animation (on / off /
particle-free) · trait-duration-minutes (expiry) · rotate (whole-server
re-spin) · attunement.stage-minutes · pity · hud.mode · events (pool,
interval, per-kind duration) · worlds whitelist/blacklist ·
combat-lock-seconds · reroll cost & cap · spin-grace-seconds · metrics.
Compatibility
Paper (or forks) on Minecraft 26.2, Java 25. Works standalone; hooks PlaceholderAPI automatically if present. Per-world trait scoping means it coexists with lobby/creative worlds out of the box.


