Skip to content

Seasons

Season definitions are stored as individual JSON files in configs/kyuubisoft_seasonpass/seasons/. Each file defines one season with its tiers, challenges, shop items and XP configuration.

seasons/
├── season_1.json # First season
├── season_2.json # Second season (add as needed)
└── ...

The plugin automatically discovers all .json files in the seasons/ folder.

FieldTypeDefaultDescription
idstringUnique season ID (matches filename without .json)
namestringDisplay name (e.g., “Season 1: Explorer”)
descriptionstringSeason description
iconItemstringItem ID for the season icon
themeColorstring"#ffd700"Theme color (hex)
FieldTypeDefaultDescription
startDatestringStart date (set automatically by /spadmin start)
endDatestringEnd date (calculated from startDate + durationDays)
durationDaysint30Season duration in days

:::info Manual Season Control Seasons don’t start/end automatically based on dates. Use /spadmin start <id> and /spadmin end to control the season lifecycle. The durationDays field is used for display and the auto-end check. :::

FieldTypeDefaultDescription
tiersarrayList of 30 standard tier definitions
bonusTiersarrayList of 10 bonus tier definitions
baseXpPerTierint1000Base XP required for tier 1
tierXpScalingdouble1.08Exponential scaling factor

The XP required for each tier follows an exponential curve:

XP for Tier N = baseXpPerTier * (tierXpScaling ^ (N - 1))

Example with defaults (base: 1000, scaling: 1.08):

TierXP RequiredCumulative XP
11,0001,000
51,3605,867
101,99914,487
152,93727,152
204,31645,762
256,34173,106
309,317113,283

Each tier in the tiers and bonusTiers arrays:

FieldTypeDescription
tierintTier number (1-30 for standard, 31-40 for bonus)
iconItemstringItem ID for the tier icon
freeRewardsarrayRewards available to all players
premiumRewardsarrayRewards for premium pass holders only

Each reward in freeRewards and premiumRewards supports an optional rarity field:

ValueDescription
"common"Default rarity (no special highlighting)
"uncommon"Green-tinted card
"rare"Blue-tinted card
"epic"Purple-tinted card
"legendary"Gold-tinted card

The rarity field defaults to "common" if omitted, making it fully backward-compatible.

See Rewards for reward type details.

The xpSources object defines how much XP each gameplay action grants:

FieldDefaultDescription
blockBroken1XP per block broken
blockPlaced1XP per block placed
mobKill10XP per mob killed
pvpKill25XP per player killed
playtimePerMinute5XP per minute played
zoneDiscovered50XP per zone discovered
blockHarvested2XP per crop harvested
flowerPicked3XP per flower picked
questCompleted100XP per quest completed
achievementUnlocked50XP per achievement unlocked
dailyLogin25XP for daily login
loginStreakPerDay10Bonus XP per login streak day
loginStreakMaxDays30Maximum streak days counted

:::tip Disabling XP Sources Set any XP source to 0 to disable it. For example, set pvpKill to 0 on PvE-only servers. :::

FieldTypeDefaultDescription
dailyXpCapint0Hard daily XP limit (0 = unlimited)
dailyXpSoftCapint0XP threshold for reduced earning (0 = disabled)
softCapMultiplierdouble0.25XP multiplier after soft cap (0.25 = 75% reduction)

With dailyXpSoftCap: 5000 and softCapMultiplier: 0.25:

  • First 5,000 XP earned at full rate
  • After 5,000 XP: every 100 XP earned only grants 25 XP
  • Prevents no-life grinding while still rewarding continued play
FieldTypeDefaultDescription
premiumEnabledbooleantrueEnable the premium track
premiumCostint1000Cost in server currency
premiumCurrencyIdstring"gold"Currency ID (via Core ShopService)
premiumXpBoostdouble1.5XP multiplier for premium holders
premiumCommandOnlybooleanfalsePremium only via admin command (no /sp buy)
premiumHintTextstringnullCustom hint text for non-premium lock boxes

:::note Disabling Premium Set premiumEnabled to false to completely hide the premium track, purchase button, and lock overlays. All tiers become free-track only. :::

FieldTypeDefaultDescription
seasonTokenXpRatioint100XP per token earned (100 XP = 1 token)
firstLoginBonusXpint25XP bonus on first login of the season
firstLoginBonusTokensint5Token bonus on first login of the season

Each season can configure its own currency model. This replaces the hardcoded token system with a flexible adapter.

FieldTypeDefaultDescription
currencyModestring"internal"Currency mode: internal, item, or economy
currencyItemIdstringnullItem ID for item mode
currencyNamestring"Tokens"Display name shown throughout the UI
currencyIconItemstring"Ingredient_Bar_Gold"Item ID for the currency icon
economyProviderstringnullProvider name for economy mode
"currencyMode": "internal",
"currencyItemId": null,
"currencyName": "Tokens",
"currencyIconItem": "Ingredient_Bar_Gold",
"economyProvider": null

See Configuration — Currency for details on each mode.

FieldTypeDefaultDescription
dailyChallengeSlotsint3Number of free daily challenges
weeklyChallengeSlotsint3Number of free weekly challenges
premiumDailyChallengeSlotsint2Extra daily challenges for premium
premiumWeeklyChallengeSlotsint1Extra weekly challenges for premium
FieldTypeDefaultDescription
dailyShopSlotsint4Number of free shop slots
premiumDailyShopSlotsint2Extra shop slots for premium

Login streaks reward consistent daily play:

  • Each consecutive login day grants loginStreakPerDay bonus XP
  • Streak XP = min(currentStreak, loginStreakMaxDays) * loginStreakPerDay
  • Missing a day resets the streak to 0
  • First season login grants firstLoginBonusXp + firstLoginBonusTokens
FieldTypeDescription
teaserRewardsarrayList of reward names shown in season preview

Used for marketing/preview purposes in the UI. Example:

"teaserRewards": [
"Grand Explorer Lootbag",
"Premium Tools",
"Exclusive Titles"
]
FieldTypeDefaultDescription
prestigeEnabledbooleanfalseEnable the prestige system
prestigeXpBoostPercentdouble5.0XP boost per prestige level (%)
maxPrestigeLevelint10Maximum prestige level
prestigeRewardsarray[]Rewards per prestige level

When a player reaches the maximum tier and prestigeEnabled is true, they can prestige to reset their tier progress while keeping a permanent XP boost. Each prestige level adds prestigeXpBoostPercent to the player’s XP multiplier.

:::tip Prestige Rewards Configure prestigeRewards as an array of reward objects (same format as tier rewards). Each entry corresponds to a prestige level (index 0 = prestige 1, etc.). :::

{
"id": "season_1",
"name": "Season 1: Explorer",
"description": "Explore the world, fight monsters, and earn exclusive rewards!",
"iconItem": "Deco_Map",
"themeColor": "#00bcd4",
"durationDays": 30,
"baseXpPerTier": 1000,
"tierXpScaling": 1.08,
"dailyXpCap": 0,
"dailyXpSoftCap": 0,
"softCapMultiplier": 0.25,
"premiumEnabled": true,
"premiumCost": 1000,
"premiumCurrencyId": "gold",
"premiumXpBoost": 1.5,
"premiumCommandOnly": false,
"premiumHintText": null,
"premiumDailyChallengeSlots": 2,
"premiumWeeklyChallengeSlots": 1,
"premiumDailyShopSlots": 2,
"prestigeEnabled": false,
"prestigeXpBoostPercent": 5.0,
"maxPrestigeLevel": 10,
"prestigeRewards": [],
"seasonTokenXpRatio": 100,
"firstLoginBonusXp": 25,
"firstLoginBonusTokens": 5,
"dailyChallengeSlots": 3,
"weeklyChallengeSlots": 3,
"dailyShopSlots": 4,
"xpSources": {
"blockBroken": 1,
"blockPlaced": 1,
"mobKill": 10,
"pvpKill": 25,
"playtimePerMinute": 5,
"zoneDiscovered": 50,
"blockHarvested": 2,
"flowerPicked": 3,
"questCompleted": 100,
"achievementUnlocked": 50,
"dailyLogin": 25,
"loginStreakPerDay": 10,
"loginStreakMaxDays": 30
},
"tiers": [
{
"tier": 1,
"iconItem": "Ingredient_Bar_Copper",
"freeRewards": [
{ "type": "item", "itemId": "Food_Bread", "amount": 5, "description": "5x Bread" }
],
"premiumRewards": [
{ "type": "tokens", "tokens": 10, "description": "10 Season Tokens" }
]
}
],
"bonusTiers": [
{
"tier": 31,
"iconItem": "Ingredient_Bar_Cobalt",
"freeRewards": [
{ "type": "lootbag", "lootbagId": "explorer_bonus", "description": "Bonus Lootbag" }
],
"premiumRewards": []
}
],
"dailyChallenges": [],
"weeklyChallenges": [],
"shopItems": [],
"teaserRewards": ["Grand Explorer Lootbag", "Premium Tools", "Exclusive Titles"]
}

:::tip Season Template Copy season_1.json, change the id and customize tiers, challenges and shop items. Then start it with /spadmin start <new_id>. :::