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.

{version}Version
1.21+Minecraft
Spigot · Paper · FoliaServer
21Java
NothingRequires
The PILLAR animation opening a crate
PILLAR. Anyone walking past sees exactly what you see.

What sets it apart

🧱
Any block is a crateLook at a block, /crates place, and that block is the crate. It stays exactly the block it was.
🎬
16 animationsFourteen are drawn in the world. Set per crate, and previewable from the editor before you commit.
🖱️
A real editorRewards, animations, particles, rarities, milestones. Adding a reward is dragging the item into the menu.
🧵
Spigot, Paper and FoliaOne jar. Generic APIs, no NMS, no per-version modules.
💬
Holograms built inVanilla text displays. No hologram plugin, with lines that show each player their own key count.
🌍
Four languagesSpanish, English, French and Chinese, all finished. Not a template with English left in the gaps.

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.

Display entities are moved by the client. The server sends a spawn and a transformation; every player interpolates it on their own machine. That is why an eight-second animation does not cost eight seconds of server time.

Installation

  1. Copy PrismCrates.jar into the plugins folderWorks on Spigot, Paper and Folia, 1.21 upwards. Java 21.
  2. Restart the serverIt boots up working. There is no key to activate and nothing to register. It creates config.yml, crates.yml and the lang/ folder, with two example crates ready to use.
  3. 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.
  4. Hand someone a key and try it/crates give YourName vote 1 and right click the block. Left click shows the reward table without spending anything.
The language is set in 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.yml and the language files fill themselves in with the new keys, keeping your changes and your comments.
  • crates.yml is 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.

Three crates on three different blocks
Three crates. Three completely different blocks. No configuration.
  • 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
SettingWhat it does
display-nameThe crate name. Used in the hologram, in messages and in the preview menu.
animationWhich of the 16. See the animations section.
animation-secondsHow long it runs. RITUAL and CONSTELLATION are paced slowly on purpose: give them 8.
permissionWithout it the player cannot open it at all.
open-costMoney per opening. Needs Vault; without it the crate cannot be opened rather than opening for free.
cooldown-secondsWait between openings, per player. Saved to disk.
mass-open-maxCap 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: true
The key is tagged internally. Renaming an item in an anvil cannot fake one, and restyling it here never breaks keys already handed out.

Lines 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: 1

chance is a weight, not a percentage

They do not have to add up to 100. Each reward competes with its weight against the total: with weights 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

FieldWhat it does
limit.globalHow many will ever exist on the server. Once gone, the reward leaves the table on its own.
limit.per-playerHow many one player can win.
permissionOnly players with that permission can win it.
permission-invertedThe 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.
broadcastA 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
Use /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.

Four different animations
PILLAR, FORGE, HELIX and METEOR.
AnimationWhat it does
ORBITThe prizes circle the crate, the ring tightens and rises, and on the last beat everything collapses inward leaving the winner alone in the air.
CAROUSELA row of prizes slides past the crate and coasts to a stop with the winner in the middle, under a marker.
PILLARA 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.
SHATTERThe crate breaks into fragments of its own block, they are thrown outward and fall away, and the prize is left hanging where it stood.
VORTEXThe prizes are dragged inward down a spiral and crushed into a single point.
CONSTELLATIONThe 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.
HOURGLASSThe 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.
FORGEAn anvil hangs over the crate and comes down three times. Sparks fly on each strike and the item grows into shape under the hammer.
RITUALA 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.
REELSThree columns spin vertically and stop one at a time, left to right. The middle column is the one that counts.
METEORThe 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.
UNWRAPThe 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.
HELIXTwo strands of prizes wind around each other as they climb, and meet at the top.
PENDULUMThe 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.
ROULETTEThe classic spinning GUI, for owners who want it.
INSTANTNo 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.

ShapeWhat it draws
RINGA flat ring around the block.
HALOA hoop suspended above it.
ATOMThree crossed orbits, like an atom.
ORBITPoints circling at different heights.
HELIXTwo helices climbing around each other.
SPIRALA spiral that rises and narrows.
BEAMA vertical column.
FOUNTAINJets that shoot up and fall.
PULSEA ring that expands and fades, like a heartbeat.
VORTEXA funnel turning inward.
WAVEWaves running around the outline.
SPARKLELoose 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: GRADIENT
The real cost is points × nearby players. A crate at density 10 on a 2-tick interval with twenty people around it is two thousand packets a second on its own. That is why particles go only to players within particles.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.

The GUI editor
From the main menu to testing an animation, without touching YAML.

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.

Dragging an item to create a reward
The item arrives with everything it had.
  • 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.yml with the comments intact. Nothing is hidden in a database you cannot read, and editing by hand still works.
The editor permission is 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: false
prefer-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.
CommandWhat 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 keysThe 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.
If the inventory fills up mid-delivery, the rest drops at the player's feet and they are told in chat. Nothing is lost silently.

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: 50000

Pity: the guaranteed prize

# Every 25 openings without one, the next is legendary. # "every: 0" turns the guarantee off. pity: every: 25 rarity: legendary
The counter is per player and survives restarts. With PlaceholderAPI you can show how far off they are: %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 discord in config.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

CommandWhat it does
/cratesThe help.
/crates listEvery crate on this server.
/crates preview <cofre>What is inside, and the real odds.
/crates keysThe keys you hold.
/crates massopen <cofre> [n]Open a whole stack at once.

For staff

CommandWhat it does
/crates place <cofre>Turns the block you are looking at into a crate.
/crates removeTakes 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 reloadReloads config, language and crates.

Permissions

PermissionWhat it grantsDefault
prismcrates.useOpen and preview crates.Everyone
prismcrates.adminPlace crates, hand out keys, reload.op
prismcrates.editorOpen the GUI editor.op
prismcrates.bypass.cooldownNo waiting between openings.op
prismcrates.bypass.costOpen 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.

PlaceholderReturns
%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.

PluginWhat it adds
VaultMoney rewards and open-cost. Without Vault a money reward is skipped and the console says so.
PlaceholderAPIThe placeholders in the previous section.
MMOItemsmmoitems:<TYPE>:<ID> as a reward.
ElementalArmselementalarms:<id>, generated with its real stats.
ItemsAdderitemsadder:<suite>:<id>, and its blocks work as crates.
Oraxen · Nexooraxen:<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.

PrismCrates / Changelog

Version history

Every release and what changed in it.

v1.0 Latest

No notes for this version.

PrismCrates / Discussion

Discussion

Comment and share your experience on each plugin version.

Log in to comment on this version.Log in

No comments on this version yet — be the first!

PrismCrates / Reviews

Player reviews

What server owners think of this plugin.

★★★★★
0 reviews
Log in to leave a review.Log in

No reviews yet.