Seasons & Rewards
Frontier’s reward system is tied to seasons. Three types of rewards, each with a different trigger: per-win commands fire after every ranked win, milestones fire once when a player hits a threshold, and season-end rewards fire when the season closes based on final standings.
All rewards are configured in your season file at config/frontier/seasons/<name>.conf, inside a ladder binding. See Seasons for the full season config reference.
Per-Win Commands
Section titled “Per-Win Commands”Commands that run after every ranked win on a ladder. Good for small participation rewards — a diamond here, a chat announcement there.
ladders { singles { mainLadder = "singles" perWinCommands = [ "give {player} minecraft:diamond 1" "say {player} won a ranked match!" ] }}Per-win commands only run when the player is online (they just won a match, so they always are).
Milestone Rewards
Section titled “Milestone Rewards”One-time rewards granted during the season when a player first reaches a threshold. After each match win, Frontier checks all milestones for the ladder. If the player meets every condition on a milestone they haven’t earned yet, it’s granted immediately.
milestoneRewards = [ { name = "First Victory", minWins = 1, commands = ["say {player} got their first win!"] } { name = "Veteran", minWins = 10, commands = ["give {player} cobblemon:rare_candy 5"] } { name = "Great Ball Rank", minRating = 1200.0, commands = ["say {player} reached Great Ball!"] } { name = "Elite Competitor" minWins = 25 minRating = 1400.0 commands = ["give {player} cobblemon:ability_capsule 1"] }]When a milestone triggers:
- The reward commands execute.
- A sound plays (
milestoneAchievedin config.conf). - The player gets a chat notification.
- The milestone is recorded in
frontier_milestonesstorage so it can’t be earned twice.
Milestone Conditions
Section titled “Milestone Conditions”| Field | Type | Description |
|---|---|---|
minWins | Int | Player must have at least this many wins. |
maxWins | Int | Player must have at most this many wins. |
minRating | Double | Player must have at least this rating. |
maxRating | Double | Player must have at most this rating. |
When multiple conditions are specified, all must be met (AND logic). A milestone with minWins = 25 and minRating = 1400.0 only fires when the player has both 25+ wins and 1400+ rating.
Season-End Rewards
Section titled “Season-End Rewards”Rewards distributed when the season ends, based on final standings. These support everything milestones do, plus rank-based eligibility via topRank.
seasonRewards = [ { name = "Participant", minWins = 5, commands = ["give {player} minecraft:gold_ingot 10"] } { name = "Competitor" minWins = 15 minRating = 1200.0 commands = ["give {player} cobblemon:rare_candy 10"] } { name = "Top 10", topRank = 10, commands = ["give {player} cobblemon:master_ball 3"] } { name = "Champion", topRank = 1, commands = ["say {player} is the Champion!"] }]Season Reward Conditions
Section titled “Season Reward Conditions”All milestone conditions apply, plus:
| Field | Type | Description |
|---|---|---|
topRank | Int | Player must finish in the top N (e.g., 1 = first place, 10 = top 10). |
Offline Delivery
Section titled “Offline Delivery”Not every player is online when a season ends. Frontier handles this automatically:
- Online players — rewards execute immediately.
- Offline players — rewards are queued in
frontier_pending_rewardsstorage. When the player next logs in, all queued commands run.
Nothing gets lost. A player who doesn’t log in for a week after the season ends still gets their rewards on their next visit.
Command Placeholders
Section titled “Command Placeholders”Every reward command (per-win, milestone, and season-end) supports these placeholders:
| Placeholder | Resolves To |
|---|---|
| {player} | Player name. |
| {rating} | Current or final rating. |
| {tier} | Current rank tier name (e.g., “Ultra Ball”). |
| {wins} | Total wins. |
| {losses} | Total losses. |
| {rank} | Final leaderboard rank (season rewards only; 0 in other contexts). |
| {ladder} | Ladder ID. |
Example using multiple placeholders:
commands = [ "broadcast {player} finished Season 1 ranked #{rank} with {wins} wins at {rating} rating!"]Rewards GUI
Section titled “Rewards GUI”Players can browse milestones and season rewards in-game through the hub GUI:
- Run
/rankedto open the hub. - Select a ladder.
- Click the Rewards button.
The GUI shows two sections:
- Milestones — each milestone with progress toward the goal and whether it’s been claimed.
- Season Rewards — each reward tier with eligibility requirements and the player’s current standing.
Season Archives
Section titled “Season Archives”When a season ends, every player’s final stats are snapshotted into frontier_season_archives. These records are permanent and can’t be modified after archival.
| Field | Description |
|---|---|
| Season ID | Which season the record belongs to. |
| Ladder ID | Which ladder. |
| Final Rating | Rating at season end (before reset). |
| Highest Rating | Peak rating achieved during the season. |
| Wins / Losses | Total match record. |
| Rank | Final leaderboard position. |
| Tier Name | Final rank tier achieved. |
Storage Collections
Section titled “Storage Collections”Frontier uses three storage collections for the reward system:
| Collection | Content |
|---|---|
frontier_milestones | Tracks which milestones each player has claimed per season. |
frontier_pending_rewards | Queued reward commands for offline players. Cleared after delivery. |
frontier_season_archives | End-of-season snapshots of every player’s stats across all ladders. |
Putting It Together
Section titled “Putting It Together”Here’s a complete ladder binding with all three reward types:
ladders { singles { mainLadder = "singles"
perWinCommands = [ "give {player} minecraft:diamond 1" ]
milestoneRewards = [ { name = "Great Ball Rank", minRating = 1200.0, commands = ["give {player} cobblemon:great_ball 5"] } { name = "Ultra Ball Rank", minRating = 1400.0, commands = ["give {player} cobblemon:ultra_ball 3"] } { name = "Master Ball Rank", minRating = 1600.0, commands = ["give {player} cobblemon:master_ball 1"] } { name = "Beast Ball Rank", minRating = 1800.0, commands = ["give {player} cobblemon:beast_ball 1"] } ]
seasonRewards = [ { name = "Season Champion", topRank = 1, commands = ["give {player} cobblemon:master_ball 3"] } { name = "Top 10 Finish", topRank = 10, commands = ["give {player} cobblemon:ultra_ball 5"] } { name = "10 Win Milestone", minWins = 10, commands = ["give {player} cobblemon:rare_candy 3"] } ] }}