Crate Format
Crate Format
Each crate is defined in its own .yml file inside the plugins/CrateForge/crates/ folder. This page covers every field in detail.
Full Example: crates/legendary.yml
# crates/legendary.yml
# ─────────────────────────────────────────────────
# Unique identifier for this crate — used in commands like /cf set legendary
id: legendary
# Display name shown in GUIs and holograms — supports MiniMessage color format
display-name: "<gradient:gold:yellow>Legendary Crate</gradient>"
# The key ID required to open this crate (must match a file in keys/)
key-id: legendary_key
# Animation to play when this crate is opened
# Options: CSGO | ROULETTE | WHEEL | QUAD | SLOT | COSMIC
# WAR | FIREWORKS | CASCADE | AUCTION | MYSTERY
animation: CSGO
# ─────────────────────────────────────────────────
# PRIZES — list of possible rewards
# ─────────────────────────────────────────────────
prizes:
# Prize entry — Legendary sword
- id: diamond_sword # Unique prize ID (used in history logs)
display-name: "<aqua>Godly Sword" # Shown in preview GUI
material: DIAMOND_SWORD # Bukkit material name
weight: 5 # Relative weight — lower = rarer
rarity: LEGENDARY # COMMON | UNCOMMON | RARE | EPIC | LEGENDARY
rewards:
- type: ITEM # Give the item itself
- type: COMMAND # Also run a command
command: "broadcast {player} won a Godly Sword!"
run-as-console: true # true = run as console, false = run as player
# Prize entry — Money reward
- id: money_1000
display-name: "<green>$1,000"
material: SUNFLOWER # Display item in preview GUI
weight: 20
rarity: RARE
rewards:
- type: MONEY
amount: 1000.0 # Requires Vault
# Prize entry — XP reward
- id: xp_levels_10
display-name: "<yellow>10 XP Levels"
material: EXPERIENCE_BOTTLE
weight: 40
rarity: UNCOMMON
rewards:
- type: XP
levels: 10 # XP levels to give
# Prize entry — Token reward
- id: premium_tokens_50
display-name: "<light_purple>50 Premium Tokens"
material: AMETHYST_SHARD
weight: 15
rarity: RARE
rewards:
- type: TOKEN
token-type: premium # Must match a token type defined in config.yml
amount: 50
# Prize entry — Command only (no item)
- id: rank_vip
display-name: "<gold>VIP Rank"
material: NETHER_STAR # Display item in preview GUI
weight: 1
rarity: LEGENDARY
rewards:
- type: COMMAND
command: "lp user {player} parent set vip"
run-as-console: true
# ─────────────────────────────────────────────────
# PITY SYSTEM
# ─────────────────────────────────────────────────
pity:
enabled: true
threshold: 50 # After this many opens, guarantee a min-rarity prize
guaranteed-min-rarity: RARE # Minimum rarity of the guaranteed prize
Field Reference
Top-Level Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
String | Yes | Unique crate identifier, used in commands |
display-name |
String | Yes | MiniMessage formatted name |
key-id |
String | Yes | Must match a key file in keys/ |
animation |
String | Yes | Animation type (see Animations) |
prizes |
List | Yes | List of prize entries |
pity |
Object | No | Pity system configuration |
Prize Entry Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
String | Yes | Unique prize ID within this crate |
display-name |
String | Yes | MiniMessage name shown in preview |
material |
String | Yes | Bukkit material — shown in GUI and given for ITEM type |
weight |
Integer | Yes | Relative weight (higher = more common) |
rarity |
String | Yes | COMMON, UNCOMMON, RARE, EPIC, or LEGENDARY |
rewards |
List | Yes | List of reward actions |
Reward Types
| Type | Required Fields | Description |
|---|---|---|
ITEM |
(none extra) | Give the prize's material as an item |
MONEY |
amount: <double> |
Give money via Vault (Vault required) |
XP |
levels: <int> |
Give XP levels |
TOKEN |
token-type: <str>, amount: <int> |
Give tokens of a specific type |
COMMAND |
command: <str>, run-as-console: <bool> |
Run a command; {player} replaced with player name |
Pity Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled |
Boolean | false |
Enable or disable the pity system |
threshold |
Integer | — | Number of opens before guaranteed prize |
guaranteed-min-rarity |
String | — | Minimum rarity of the pity prize |
Weight System Explained
Prizes are selected by weighted random. Higher weight = more likely to be selected.
prizes:
- id: common_prize
weight: 100 # Very common
- id: rare_prize
weight: 10 # 10x less likely than common_prize
- id: legendary_prize
weight: 1 # 100x less likely than common_prize
Total weight = 111. Chance of each: - Common: 100/111 = ~90.1% - Rare: 10/111 = ~9.0% - Legendary: 1/111 = ~0.9%
MiniMessage Format
Display names support full MiniMessage formatting:
display-name: "<gradient:gold:yellow>Legendary Crate</gradient>"
display-name: "<red><bold>Epic Prize</bold></red>"
display-name: "<rainbow>Rainbow Prize</rainbow>"
display-name: "<aqua>Normal Prize</aqua>"
Placeholder Substitution (v1.0.0 fix)
CrateForge interpolates {name} style placeholders inside messages.yml and per-prize command: strings. A v1.0.0 release fix corrected a regression where these brace placeholders were being passed through unreplaced (the renderer used a non-matching key syntax internally). Every templated message and command now substitutes correctly:
# messages.yml — brace placeholders now resolve correctly
key-given: "Gave {amount}x {key} to {player}."
key-received: "You received {amount}x {key}!"
# crate prize commands — {player} still resolves as before
rewards:
- type: COMMAND
command: "lp user {player} parent set vip"
run-as-console: true
If you customized messages.yml and noticed literal {player} / {crate} / {prize} text appearing in chat on an earlier build, this fix makes them render properly without any config change on your part.
Navigation
Home | Key Format | Animations | Pity System