Skip to content

Crates ​


Crates live in crates.yml. Each top-level key is one crate's id (used in commands and the menu).

Crate options ​

yaml
my_crate:                         # <- the crate id (no spaces)
  name: "&a&lMy Crate"            # display name (supports & colours)
  enabled: true                   # false = shown in the menu but not openable ("coming soon")
  icon: CHEST                     # icon item in the crate list (fallback)
  display-item: CHEST             # item shown in the center
  icon-slot: -1                   # -1 = auto layout
  cost: { type: TOKEN, amount: 5 }
  pity: { enabled: true, rarity: LEGENDARY, threshold: 50 }
  rewards:
    - { name: "...", material: ..., amount: 1, rarity: COMMON }
FieldMeaning
nameThe crate's display name (with & colours).
enabledtrue = openable. false = visible but locked (good for "coming soon").
icon / display-itemItems shown for the crate. With ItemsAdder you can use namespace:id.
costWhat a player pays per open — see below.
pityOptional guarantee — see below.
rewardsThe list of possible rewards.

Per-crate banner & button (optional) ​

Each crate can override the center banner and its select button in the crate list. Every field is optional — omit it to fall back to the global default (config.yml > showcase and theme.crate-list). When a player selects the crate, the banner switches to that crate's.

yaml
my_crate:
  # center banner just for this crate (overrides config.yml > showcase)
  banner:
    item: "nexo:my_banner"     # an ItemDisplay banner …
    # glyph: my_banner_glyph   # … OR a single glyph instead
    x: 0.3
    y: 0.15
    scale: 1.5
  # crate-select button just for this crate (overrides theme.crate-list)
  button:
    item: "nexo:my_icon"           # enabled icon …
    item-disabled: "nexo:my_off"   # … shown when enabled:false
    selected-item: "nexo:my_sel"   # … shown when this crate is selected
    # glyph: g_crate_1             # OR use glyphs: glyph / glyph-disabled / selected-glyph
    # text: "My Crate"             # OR plain text: enabled-color / disabled-color
    x: -1.9
    y: 0.82
    scale: 0.52
    hitbox: { w: 0.8, h: 0.22 }

Priority for the button visual: selected-* (when selected) → item/glyph/text (per state) → the theme.crate-list default.

Cost types ​

yaml
cost: { type: NONE }                            # free
cost: { type: ITEM, item: DIAMOND, amount: 1 }  # consumes items from the inventory
cost: { type: MONEY, amount: 100 }              # Vault economy
cost: { type: TOKEN, amount: 5 }                # built-in token currency
  • ITEM accepts vanilla materials or custom items (nexo:, oraxen:, itemsadder: ids).
  • MONEY requires Vault + an economy plugin.
  • TOKEN is built in; grant with /gacha token give ….
  • On a 10-pull the total is amount × 10. The plugin only charges for the cards it can afford (Open All opens as many as the player can pay for).

Rewards ​

Each reward can give an item, run commands, or both.

yaml
rewards:
  # item only
  - { name: "Diamonds", material: DIAMOND, amount: 5, rarity: COMMON }

  # custom item (ItemsAdder)
  - { name: "Dragon Jade Sword", material: "dragon_jade:dragon_jade_sword", amount: 1, rarity: RARE }

  # command only (no item given) — use a separate "icon" to show on the card
  - name: "VIP Rank (7 days)"
    icon: GOLD_INGOT
    rarity: LEGENDARY
    commands:
      - "[console] lp user <player> parent addtemp vip 7d"
      - "[player] say I just won VIP!"

  # item AND commands (a bundle)
  - name: "Treasure Bundle"
    material: DIAMOND
    amount: 10
    rarity: EPIC
    commands:
      - "[console] eco give <player> 1000"
FieldMeaning
nameReward display name.
materialThe item actually given. Omit for a command-only reward.
iconThe item shown on the card (defaults to material; falls back to PAPER).
amountItem amount.
rarityOne of your rarities (COMMON/RARE/EPIC/LEGENDARY).
commandsConsole/player commands run on claim. <player> is replaced with the winner's name.
duplicatefalse = never converted to Spark (always delivered / commands always re-run). See below.

Command prefixes:

  • [console] … — run from the server console (default if no prefix).
  • [player] … — run as the player.
  • <player> — replaced with the player's name.

Every reward must have a material or at least one command, otherwise it is skipped with a warning in the console.

Duplicate & Spark Exchange ​

Duplicate → Spark: an already-collected reward pays Spark instead of giving it again.

yaml
duplicate:
  enabled: true
  give-spark: 5                                   # fallback for all rarities
  by-rarity: { COMMON: 2, RARE: 5, EPIC: 12, LEGENDARY: 30 }
  include-commands: true                          # ALSO track command-only rewards: a duplicate pays
                                                  # Spark INSTEAD of re-running its commands
                                                  # (default false = only item rewards can be duplicates)
  • By default only item rewards can be duplicates (command rewards always re-run their commands). Set include-commands: true so command-only rewards convert to Spark on a duplicate too.
  • Opt out per reward with duplicate: false — that reward is always delivered / re-run, never converted (e.g. a money payout that should pay every time):
yaml
rewards:
  - { name: "Money Bag", rarity: COMMON, commands: ["[console] eco give <player> 100"], duplicate: false }

Spark Exchange shop: spend Spark on a chosen reward. Each item is either a reference to an existing reward or a self-contained definition (like the Token Shop):

yaml
spark:
  enabled: true
  title: "&b&lSpark Exchange"
  items:
    - { reward: "Dragon Jade Spear", cost: 120 }              # reference a reward by its display name
    - { name: "Trident", item: TRIDENT, amount: 1, cost: 30 }  # inline item (no matching reward needed)
    - { name: "100 Coins", commands: ["[console] eco give <player> 100"], icon: SUNFLOWER, cost: 15 }

Inline fields: name (required), then item or commands (at least one), plus optional amount, icon, rarity (default COMMON). Reward-name matching for reward: ignores &/§ colour codes, case and extra spaces.

Custom items (ItemsAdder / Nexo / Oraxen / MMOItems) ​

There is no separate config section for these — you use a custom item anywhere an item is expected by writing its namespace:id. The matching plugin just needs to be installed (check with /gacha doctor).

ProviderFormatExample
ItemsAddernamespace:iddragon_jade:dragon_jade_sword
Nexonexo:idnexo:ruby
Oraxenoraxen:idoraxen:ruby
CraftEnginecraftengine:idcraftengine:ruby
Sertralinesertraline:idsertraline:my_sword
ExecutableItemsexecutableitems:idexecutableitems:magic_wand
MythicArmor(s)mythicarmor:idmythicarmor:mythical_dragon_armor_chest_piece
MMOItemsmmoitems:TYPE:IDmmoitems:SWORD:CUTLASS
Vanillamaterial nameDIAMOND

MMOItems uses a type + id, so its format has two parts: mmoitems:<TYPE>:<ID> (the type is the MMOItems item type, e.g. SWORD, ARMOR, MATERIAL).

CraftEngine is a free, open-source custom-item plugin. Use craftengine:<id> (namespaced ids like craftengine:mypack:ruby work too). Custom-item rewards and cost items work out of the box; for the menu images CraftEngine has no bundled CradGacha pack, so leave ui.item-provider: vanilla (the self-hosted pack) unless you've added the UI images to a CraftEngine pack yourself and pinned ui.item-provider: craftengine.

You can use these ids in any item field: a reward's material / icon, the crate icon / display-item, the cost.item, and card-back-by-rarity (in config.yml).

yaml
my_crate:
  icon: "nexo:crate_icon"            # crate-list icon from Nexo
  display-item: "oraxen:showcase"    # center item from Oraxen
  cost: { type: ITEM, item: "nexo:coin", amount: 1 }   # pay with a Nexo item
  rewards:
    - { name: "Ruby",  material: "nexo:ruby",  amount: 1, rarity: RARE }
    - { name: "Gem",   material: "oraxen:gem", amount: 1, rarity: EPIC }
    - name: "Aura Buff"              # command reward shown with a Nexo icon
      icon: "nexo:aura_token"
      rarity: LEGENDARY
      commands: [ "[console] aura give <player> fire" ]

If a custom id can't be resolved (plugin missing or wrong id), an item reward is skipped with a console warning; a missing icon falls back to PAPER. Run /gacha doctor to confirm Nexo/Oraxen are detected.

How chance / weight works ​

A reward's chance comes from its rarity's weight (set in config.yml), not from the reward itself.

  1. The plugin picks a rarity using the weights (only rarities that have rewards in this crate count).
  2. Then it picks a random reward within that rarity (each reward in a rarity is equally likely).

Example: with COMMON 60, RARE 25, EPIC 12, LEGENDARY 3, a LEGENDARY drops about 3% of opens.

The drop % per rarity is shown to players on the in-game rates screen.

Pity (guarantee) ​

yaml
pity: { enabled: true, rarity: LEGENDARY, threshold: 50 }
  • Counts opens since the player last got the rarity.
  • When the count reaches threshold, the next open is forced to that rarity.
  • The counter is per-player and per-crate, saved in data.yml.
  • Set enabled: false to turn pity off for that crate.
  • Global default: pity: in config.yml (enabled / rarity / threshold) applies to every crate. A crate's own pity: here overrides it per-key — omit a crate's pity: entirely to just use the global default.

How x1 / x10 work ​

  • x1 opens one card.
  • x10 opens ten (capped by settings.max-open). Each card is rolled independently.
  • Cost scales with the number of cards.
  • See Result Panel for what the buttons do after a pull.

Next: Cursor UI →