PrismCrates
A crate opening happens in the world, not inside a menu. It is drawn with display entities — real items, blocks and text — so everyone nearby watches it, not just the player who clicked.

What sets it apart
/crates place, and that block is the crate. It stays exactly the block it was.Why in the world and not in a menu
Most crate plugins open an inventory and spin some icons. Only the person who clicked sees anything, and when it closes nothing is left. Here a rare drop at spawn gathers a crowd, which is the whole point of a crate on a public server.
Installation
- Copy PrismCrates.jar into the
pluginsfolderWorks on Spigot, Paper and Folia, 1.21 upwards. Java 21. - Restart the serverIt boots up working. There is no key to activate and nothing to register. It creates
config.yml,crates.ymland thelang/folder, with two example crates ready to use. - Put a crate in the worldLook at whatever block you want and type
/crates place vote. That block is now a crate and it is still the same block. - Hand someone a key and try it
/crates give YourName vote 1and right click the block. Left click shows the reward table without spending anything.
config.yml. language: en for English, or es, fr, zh. All four files ship complete and you can rewrite any line: an update only adds the lines that are missing and never touches what you changed.Updating
- Replace the jar and restart. That is all.
config.ymland the language files fill themselves in with the new keys, keeping your changes and your comments.crates.ymlis never touched. Your crates are yours.
Any block is a crate
There is no block: setting to fill in, because there is nothing to decide. The plugin reads the full block data of whatever you are looking at and remembers it: a barrel, a lodestone, a player head, an ItemsAdder or Oraxen block, a chest with a custom model. The crate takes its identity from your build instead of forcing a chest into it.

- It survives. If the block goes missing — a rollback, a bad WorldEdit paste, a griefer — it is restored exactly as it was, data intact.
- It follows redecoration. Swap the block for another and the crate learns the new one instead of fighting you.
- SHATTER uses it. The fragments that fly outward are made of your block, so a deepslate crate shatters into deepslate.
/crates remove takes the crate off and leaves your block standing. Positions live in locations.yml, block data included, and are checked as each chunk loads.Defining a crate
Everything lives in crates.yml. Edit it by hand or do all of it from the editor: it writes normal YAML with the comments intact, so both ways coexist.
crates:
vote:
display-name: "&b&lVote Crate"
animation: ORBIT
animation-seconds: 5
# Without it, they cannot even see it.
permission: "prismcrates.crate.arcane"
# Charged per opening. Needs Vault.
open-cost: 2500
# One opening per hour, per player. Survives restarts.
cooldown-seconds: 3600
# How many keys at once with /crates massopen. 0 turns it off.
mass-open-max: 32| Setting | What it does |
|---|---|
display-name | The crate name. Used in the hologram, in messages and in the preview menu. |
animation | Which of the 16. See the animations section. |
animation-seconds | How long it runs. RITUAL and CONSTELLATION are paced slowly on purpose: give them 8. |
permission | Without it the player cannot open it at all. |
open-cost | Money per opening. Needs Vault; without it the crate cannot be opened rather than opening for free. |
cooldown-seconds | Wait between openings, per player. Saved to disk. |
mass-open-max | Cap for /crates massopen. 0 turns it off for that crate. |
Hologram and key
hologram:
- "{crate}"
- "&7You have &f{keys}&7 key(s)"
- "&7Right click to open"
- "&8Left click to preview"
key:
item: TRIPWIRE_HOOK
name: "&b&lVote Key"
lore:
- "&7Right click a &bVote Crate"
glow: trueLines with
{keys}, {keys_physical}, {keys_virtual} or {opened} are personal: every player sees their own number. That costs one entity per viewer, so keep them to one or two and see holograms.personal-range in config.yml.How a reward is defined
display is what is shown — in the animation, in the preview and in chat. give is what is handed over. With no give, the display item itself is given, which is the usual case.
legendary_kit:
display:
item: NETHERITE_INGOT
name: "&6&lLegendary Kit"
glow: true
# Several things at once: items, a command and money.
give:
items:
"1": { item: NETHERITE_INGOT, amount: 4 }
commands:
- "give {player} experience_bottle 32"
money: 25000
# WEIGHT, not a percentage. See below.
chance: 1
rarity: legendary
# Ten on the whole server, one per player.
limit:
global: 10
per-player: 1chance is a weight, not a percentage
40, 30 and 1, the last one comes up once in 71. Adding a reward does not force you to recalculate the others — which is exactly the work a percentage system hands you every time you touch the table.The preview (preview.show-chances) converts the weights into real percentages for the player, so you think in weights and they read odds.
Limits and permissions
| Field | What it does |
|---|---|
limit.global | How many will ever exist on the server. Once gone, the reward leaves the table on its own. |
limit.per-player | How many one player can win. |
permission | Only players with that permission can win it. |
permission-inverted | The other way round: it stops being offered to anyone who already has the permission. Ideal for a rank — handed out once, then gone from that player's table. |
broadcast | A message of its own for that reward, different from its rarity's. |
/crates resetlimits <crate> makes that crate's limited rewards available again. Use it thoughtfully: if you promised only three would ever exist, resetting breaks that promise.Items from other plugins
# Generated when won, with their real stats and lore.
item: "mmoitems:SWORD:CUTLASS"
item: "elementalarms:flame_blade"
item: "itemsadder:suite:ruby"
item: "oraxen:my_item"
item: "nexo:my_item"
# Adds your lore UNDER theirs instead of replacing it.
append-lore: true/crates items to look identifiers up without leaving the game. A reward pointing at an id that does not exist shows as a barrier and says so in the console, instead of breaking the opening.Rarities
Defined once in config.yml and referenced by id from every crate, so the whole server speaks one visual language.
rarities:
legendary:
display: "&6&lLegendary"
# The glow of the animation and of the firework.
colour: "#FFAA00"
# Tell the whole server when someone wins one.
broadcast: true
firework: true
sound: "UI_TOAST_CHALLENGE_COMPLETE"The 16 animations
Fourteen are drawn in the world with display entities. ROULETTE is the familiar spinning GUI and INSTANT skips straight to the reward. Set per crate, and previewable from the editor before you commit.

| Animation | What it does |
|---|---|
ORBIT | The prizes circle the crate, the ring tightens and rises, and on the last beat everything collapses inward leaving the winner alone in the air. |
CAROUSEL | A row of prizes slides past the crate and coasts to a stop with the winner in the middle, under a marker. |
PILLAR | A beam of light grows out of the crate, the prize climbs it turning on itself, and the beam collapses at the top. The quietest of the set: it reads from far away and costs almost no entities, so it suits a crate players walk past all day. |
SHATTER | The crate breaks into fragments of its own block, they are thrown outward and fall away, and the prize is left hanging where it stood. |
VORTEX | The prizes are dragged inward down a spiral and crushed into a single point. |
CONSTELLATION | The prizes hang as stars and a line of light is drawn from one to the next. The line reaches the last star and it ignites. The tension is sequence, not speed: you can count down to your own. |
HOURGLASS | The prizes fall one by one through a narrow waist of glass. The one still falling when the sand runs out is the winner. A countdown you can actually see. |
FORGE | An anvil hangs over the crate and comes down three times. Sparks fly on each strike and the item grows into shape under the hammer. |
RITUAL | A circle of runes turns on the ground around the crate, candles at its points light one after another, and the prize rises out of the middle as the last one catches. |
REELS | Three columns spin vertically and stop one at a time, left to right. The middle column is the one that counts. |
METEOR | The prize falls out of the sky on a burning arc from fifteen blocks up, slams into the crate, and the shockwave rolls outward across the ground. |
UNWRAP | The prize sits inside nested shells that split apart one at a time, each a rarer colour than the last. The only one where the tension is how far it goes. |
HELIX | Two strands of prizes wind around each other as they climb, and meet at the top. |
PENDULUM | The prizes hang in a row and a marker swings across them, losing height each pass. Real damped motion — a decaying cosine, fast through the middle and hanging at the extremes — not an eased curve someone drew. |
ROULETTE | The classic spinning GUI, for owners who want it. |
INSTANT | No animation. Straight to the reward. |
/crates test <crate> [animation] plays it on you, free and without spending a key. From the editor it is one click, and when it ends it puts you back in the menu you were in.RITUAL and CONSTELLATION are paced slowly on purpose: give them animation-seconds: 8. At five they trip over themselves and lose what makes them good.Twelve idle shapes
The ambience around a placed crate, before anyone touches it. Each shape has its own speed, radius, height, density and interval, and a colour list that can run as a gradient, a cycle or at random.
| Shape | What it draws |
|---|---|
RING | A flat ring around the block. |
HALO | A hoop suspended above it. |
ATOM | Three crossed orbits, like an atom. |
ORBIT | Points circling at different heights. |
HELIX | Two helices climbing around each other. |
SPIRAL | A spiral that rises and narrows. |
BEAM | A vertical column. |
FOUNTAIN | Jets that shoot up and fall. |
PULSE | A ring that expands and fades, like a heartbeat. |
VORTEX | A funnel turning inward. |
WAVE | Waves running around the outline. |
SPARKLE | Loose sparks, with no fixed shape. |
particles:
enabled: true
shape: RING
# DUST takes colour. Other particles ignore it.
particle: DUST
speed: 1.0
radius: 0.8
height: 1.1
# Points per frame. This is THE number that matters.
density: 3
interval-ticks: 10
colours: ["#5BC8FF", "#B17BFF", "#FFB545"]
# GRADIENT | CYCLE | RANDOM
colour-mode: GRADIENTparticles.view-distance, and there is a server-wide particles.max-density the editor will not let you exceed.The whole plugin is editable in game
/crates editor opens a real editor, not a viewer with three toggles. Crates, rewards, animations, particles, milestones, rarities, holograms, keys, costs and cooldowns — all of it, without opening a file.

Adding a reward is dragging it in
No holding it in your hand, no typing a command, no writing a material name and hoping you spelled the enchantment right. Drag the item into the menu and it arrives complete: name, lore, enchantments, custom model data, NBT, exactly as it sat in your inventory. From there you edit it: weight, rarity, commands, money, limits.

- Try before you save. Pick an animation and it plays on you from inside the menu. It runs, it ends, and it puts you back where you were.
- The same for particles. A live preview menu for all twelve shapes, with speed, radius, density and colours, so you tune it while looking at it.
- It writes real YAML. It saves to
crates.ymlwith the comments intact. Nothing is hidden in a database you cannot read, and editing by hand still works.
prismcrates.editor, separate from prismcrates.admin: you can let someone build the reward tables without also handing them the power to give out keys.Physical and virtual
A physical key is an item in the inventory. A virtual one is a balance on their account, which is what you want for a webstore: it takes no slot and is not lost on death.
keys:
# Spend the virtual balance first, then the inventory key.
prefer-virtual: true
# What "/crates give" hands out when you do not say which.
give-virtual-by-default: falseprefer-virtual exists for a specific reason. A player who keeps a nice physical key and also buys balance expects the balance to go first. Without this, the plugin would take the key they were saving while the balance sits unused.| Command | What it does |
|---|---|
/crates give <jugador> <cofre> [n] [physical|virtual] | Hands out keys. Recorded in the log. |
/crates take <jugador> <cofre> [n] [physical|virtual] | Takes them back. |
/crates keys | The ones you hold yourself. |
/crates massopen <cofre> [n] | Opens a stack at once. It plays no animations — that would be minutes — and prints one summary. |
Milestones
One-off prizes for reaching a total number of openings. Paid once, never again. They give a reason to keep opening to the player who already got what they wanted.
milestones:
25:
display: { item: DIAMOND_BLOCK, name: "&b25 Vote Crates!" }
give: { money: 10000 }
100:
display: { item: NETHERITE_BLOCK, name: "&6100 Vote Crates!" }
give:
commands: ["give {player} netherite_ingot 8"]
money: 50000Pity: the guaranteed prize
# Every 25 openings without one, the next is legendary.
# "every: 0" turns the guarantee off.
pity:
every: 25
rarity: legendary%prismcrates_pity_vote%. A player who sees the number left opens more than one who cannot.Alerts and logging
- Server broadcast. Decided by the rarity (
broadcast: true) or by the reward itself with its own message. - Discord webhook. Only rarities you mark as broadcast are sent. Set it up under
discordinconfig.yml. - Reward logging. A line per opening in
logs/rewards-YYYY-MM-DD.log, plus every key an admin hands out. This is what settles "the crate ate my key" without guessing.
Commands
Aliases: /crate, /crates, /prismcrates and /pcrates. Every argument tab-completes.
For everyone
| Command | What it does |
|---|---|
/crates | The help. |
/crates list | Every crate on this server. |
/crates preview <cofre> | What is inside, and the real odds. |
/crates keys | The keys you hold. |
/crates massopen <cofre> [n] | Open a whole stack at once. |
For staff
| Command | What it does |
|---|---|
/crates place <cofre> | Turns the block you are looking at into a crate. |
/crates remove | Takes the crate off and leaves the block. |
/crates editor [cofre] | Opens the editor. |
/crates give <jugador> <cofre> [n] [physical|virtual] | Hands out keys. |
/crates take <jugador> <cofre> [n] [physical|virtual] | Takes them back. |
/crates open <cofre> | Opens one without spending a key. |
/crates locations [cofre] | Where the placed crates are. |
/crates test <cofre> [animación] | Try an animation, free. |
/crates items [plugin] [tipo] | Look up ids from MMOItems, ItemsAdder, Oraxen and Nexo. |
/crates resetlimits <cofre> | Makes limited rewards available again. |
/crates reload | Reloads config, language and crates. |
Permissions
| Permission | What it grants | Default |
|---|---|---|
prismcrates.use | Open and preview crates. | Everyone |
prismcrates.admin | Place crates, hand out keys, reload. | op |
prismcrates.editor | Open the GUI editor. | op |
prismcrates.bypass.cooldown | No waiting between openings. | op |
prismcrates.bypass.cost | Open without paying. | op |
prismcrates.crate.<id> | Access to a crate that sets a permission. | — |
PlaceholderAPI
Optional. If PlaceholderAPI is installed, these work in scoreboards, the tab list, other plugins' holograms and anywhere placeholders are accepted.
| Placeholder | Returns |
|---|---|
%prismcrates_keys_<cofre>% | Keys they hold, physical + virtual. |
%prismcrates_keys_physical_<cofre>% | Only the ones in their inventory. |
%prismcrates_keys_virtual_<cofre>% | Only the webstore balance. |
%prismcrates_opened_<cofre>% | How many of that crate they have opened. |
%prismcrates_opened_total% | Across every crate. |
%prismcrates_pity_<cofre>% | Openings left until the guaranteed prize. |
%prismcrates_placed_<cofre>% | How many stand in the world. |
%prismcrates_crates% | How many crate types exist. |
None of them are required
Holograms, particles and animations are built in. No hologram plugin, no packet library, no core. Everything below is detected at startup and nothing breaks if it is absent.
| Plugin | What it adds |
|---|---|
| Vault | Money rewards and open-cost. Without Vault a money reward is skipped and the console says so. |
| PlaceholderAPI | The placeholders in the previous section. |
| MMOItems | mmoitems:<TYPE>:<ID> as a reward. |
| ElementalArms | elementalarms:<id>, generated with its real stats. |
| ItemsAdder | itemsadder:<suite>:<id>, and its blocks work as crates. |
| Oraxen · Nexo | oraxen:<id> and nexo:<id>, the same. |
Frequently asked
Do the animations lag the server?
Display entities are client-side geometry: the server sends a spawn and a transformation, and the client does the moving. Particles go only to players in range and have a density cap. If you want one on a busy spawn, PILLAR is the cheapest.
Can players see each other's openings?
Yes — that is the point. One crate can only be opened by one person at a time, so two openings never fight over the same block.
Do I have to use chests?
No. Any block, with its data preserved. See the crates section.
Can I edit the YAML by hand?
Yes. The editor writes normal commented YAML, and hand edits survive updates.
Does it really work on Folia?
Yes, and not in the "it boots" sense. Every scheduled task goes through the right regionised scheduler — region, entity, global or async — which is what a threaded server needs so it does not throw on the first opening.
Is there a licence key or an activation server?
No. Nothing calls home. The jar works offline, forever, on every server you run.
Version history
Every release and what changed in it.
No notes for this version.
Discussion
Comment and share your experience on each plugin version.
Player reviews
What server owners think of this plugin.
No reviews yet.