Skip to content

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.

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).

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:

  1. The reward commands execute.
  2. A sound plays (milestoneAchieved in config.conf).
  3. The player gets a chat notification.
  4. The milestone is recorded in frontier_milestones storage so it can’t be earned twice.
FieldTypeDescription
minWinsIntPlayer must have at least this many wins.
maxWinsIntPlayer must have at most this many wins.
minRatingDoublePlayer must have at least this rating.
maxRatingDoublePlayer 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.

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!"] }
]

All milestone conditions apply, plus:

FieldTypeDescription
topRankIntPlayer must finish in the top N (e.g., 1 = first place, 10 = top 10).

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_rewards storage. 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.

Every reward command (per-win, milestone, and season-end) supports these placeholders:

PlaceholderResolves 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!"
]

Players can browse milestones and season rewards in-game through the hub GUI:

  1. Run /ranked to open the hub.
  2. Select a ladder.
  3. 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.

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.

FieldDescription
Season IDWhich season the record belongs to.
Ladder IDWhich ladder.
Final RatingRating at season end (before reset).
Highest RatingPeak rating achieved during the season.
Wins / LossesTotal match record.
RankFinal leaderboard position.
Tier NameFinal rank tier achieved.

Frontier uses three storage collections for the reward system:

CollectionContent
frontier_milestonesTracks which milestones each player has claimed per season.
frontier_pending_rewardsQueued reward commands for offline players. Cleared after delivery.
frontier_season_archivesEnd-of-season snapshots of every player’s stats across all ladders.

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"] }
]
}
}