How to Make a Battlepass
A battlepass is the star of the show: one config file that defines how much XP each tier needs, how many tiers exist, and which rewards players earn on the Free and Premium tracks. This page takes you from an empty file to a working pass you can open in game.
Quick start
Open the
/plugins/EcoBattlepass/battlepasses/folder and copy_example.ymlto a new file, e.g.seasonal.yml. The file name is the pass ID.Set the
nameand thebattlepass:block:xp-formula,max-tier,command,premium-permission, and thebattlepass-start/battlepass-enddates.Under
tiers:, add a tier number and list the reward IDs it grants, each markedfreeorpremium. See How to make a reward for the reward files themselves.Run
/ecobattlepass reload.Run your pass command (e.g.
/seasonal) and confirm the GUI opens with your tiers and rewards.
Naming and IDs
The file name without .yml is the battlepass ID. You use this ID in your category configs, in effect filters, and as the command name.
The structure of a battlepass
| Part | What it controls |
|---|---|
| Settings | The XP formula, tier count, command, premium permission, and start/end dates |
| Tiers | Which rewards land on each tier, and whether they're free or premium |
| Display overrides | Optional per-tier button appearance that beats the config.yml defaults |
# === Settings: how the pass behaves ===
name: "&6Example Battlepass" # Display name shown in the GUIs
battlepass:
xp-formula: "1.5 * %level% + 5" # XP needed per tier; %level% scales it per tier
max-tier: 100 # Highest tier players can reach
command: "battlepass" # Command that opens this pass's GUI
premium-permission: "example.pass.premium" # Permission that grants the Premium track
battlepass-start: 2025-01-01 00:00 # Start date, server time; format YYYY-MM-DD HH:MM
battlepass-end: 2025-05-01 00:00 # End date, server time; format YYYY-MM-DD HH:MM
# === Tiers: what each tier awards ===
tiers:
- tier: 1 # Skip a tier entirely to give it no reward
rewards:
- id: coins_5000 # Reward ID; the file name in /rewards/
tier: free # "free" anyone can claim, "premium" needs the premium permission
- id: coins_10000
tier: premium
Settings
The battlepass: block controls how the pass runs.
battlepass:
xp-formula: "1.5 * %level% + 5" # XP for the next tier; %level% is the current tier
max-tier: 100 # Highest reachable tier
command: "battlepass" # Command that opens the GUI
premium-permission: "example.pass.premium" # Permission for the Premium track
battlepass-start: 2025-01-01 00:00 # Start date, server time
battlepass-end: 2025-05-01 00:00 # End date, server time
Tiers
Each entry under tiers: is a tier number and the rewards it grants.
tiers:
- tier: 1 # Tiers you don't list simply have no reward
rewards:
- id: diamond_block # Reward ID, defined in /rewards/
tier: free # "free" anyone, "premium" needs the premium permission
- id: money_1000
tier: premium
Display overrides
Each tier can optionally override the button appearance from config.yml for specific states. These beat the defaults, which is handy for highlighting milestone tiers.
tiers:
- tier: 1
rewards:
- id: diamond_block
tier: free
display:
# Generic override: used in combined layout, and as the fallback in split layout
# States: unlocked, locked, in-progress, claimed, unlocked-free, premium-required, hidden
unlocked:
item: diamond_block
name: "&6&lSPECIAL TIER"
lore:
- "&7Special rewards await!"
- "%free-rewards%"
- "%premium-rewards%"
# Split-layout overrides: only used when layout: split in config.yml
free-track:
unlocked:
item: emerald_block
name: "&a&lFREE TIER - SPECIAL"
premium-track:
premium-required:
item: gold_block
name: "&6&lUPGRADE NEEDED"
Override priority, highest to lowest: track-specific override, then generic override, then track-specific config.yml default, then config.yml default.
Internal placeholders
| Placeholder | Value |
|---|---|
%level% | The battlepass tier/level. Useful for XP scaling in xp-formula. |
Where to go next
Rewards: How to make a reward defines what each tier grants.
Quests: Configuring a category adds the quest system that feeds XP into the pass.
GUI appearance: Plugin config is the full annotated
config.yml.Placeholders: Internal placeholders lists everything usable in lore and names.
Defaults: the shipped configs live here.