Astral Realms Documentation Help

Configuration

AstralFarmPass reads its configuration from plugins/AstralFarmPass/ on enable and again on /pass reload.

File layout

plugins/AstralFarmPass/ ├── config.yml ├── messages.yml ├── rewards.yml ├── blueprints/ │ ├── daily/*.yml │ └── weekly/*.yml └── menus/ ├── main.yml └── pass-weekly_quest.yml

File

Purpose

config.yml

Time zone, generation seed, target rounding, premium permission and the quest categories.

messages.yml

Every string the plugin sends directly (FarmPassMessages).

rewards.yml

The reward ladder — see Rewards.

blueprints/**.yml

One file per possible quest — see Quests & Goals.

menus/*.yml

AstralCore menu blueprints. farmpass-main and pass-weekly_quest are bundled in the JAR as reference copies but are not written out automatically — put them in place yourself.

config.yml

# Timezone used for every quest period boundary. # MUST be identical on every server, otherwise days/weeks won't line up. time-zone: "Europe/Paris" # Salt mixed into the generation seed. Changing it re-rolls every month. # MUST be identical on every server. seed-salt: "astral-farmpass" # Permission granting the premium reward track. Leave empty to give it to everyone. premium-permission: "farmpass.premium" # Quest targets are rounded down to a multiple of this (1 = no rounding). value-step: 8 categories: DAILY: reward: 250 regeneration: interval: "1d" lifetime: "1d" amount: 3 WEEKLY: reward: 3000 regeneration: interval: "7d" lifetime: "season" amount: 3

Key

Type

Description

time-zone

String (ZoneId)

Zone every period boundary is computed in — the start of a month, of a daily batch, of a weekly batch. Must be identical on every server.

seed-salt

String

Mixed into every derived seed and quest id. Changing it re-rolls the current month for everybody. Must be identical on every server.

premium-permission

String

Permission required to claim the premium track. Leave it empty/absent to open the premium track to everyone.

value-step

int

Rolled quest targets are rounded down to a multiple of this, to keep big numbers readable. 1 disables rounding; see the rounding rule.

categories

Map<QuestType, Category>

One entry per quest type (DAILY, WEEKLY). A type with no entry is never generated — blueprints declaring it log a warning at startup and are ignored.

categories.<TYPE>

Key

Type

Description

reward

int

Points credited when a quest of this type is completed.

regeneration.interval

Duration (<n>d)

Days between two batches, counted from the 1st of the month. 1d = a batch a day, 7d = a batch a week.

regeneration.lifetime

<n>d or season

How long a batch stays available. season keeps it until the month ends; <n>d expires it that many days after it unlocked (never past the end of the month).

regeneration.amount

int

Quests dealt per batch.

interval and lifetime accept whole days only — the pattern is (\d+)\s*d and the value must be at least 1. Anything else (12h, 0d, 1w) throws at load time with the offending value in the message. lifetime: "season" is the only non-day form accepted.

See Seasons & Generation for how these values turn into a month's schedule.

messages.yml

Backed by the FarmPassMessages enum; every value is a MiniMessage string.

Key

Placeholders

Sent when

quest-completed

%name%, %points%

A quest reaches its target — %name% is the blueprint's display name, %points% the type's reward.

reward-already-claimed

—

[claim-farmpass-reward] targets a track the player already claimed.

reward-not-unlocked

%points%

The player is short of the tier's required-points; %points% is how many are missing.

reward-premium-only

—

The premium track was claimed without premium-permission.

season-started

—

A month rollover happened while the player was online; their pass has just been reset.

points-balance

%target%, %points%

/pass points <player>, to the sender.

points-updated

%target%, %points%

A points give|take|set|reset subcommand succeeded, to the sender.

points-changed

%points%

Same, to the targeted player.

no-active-season

—

Declared in the enum but never sent — generation always produces a season for the current month.

# Quests quest-completed: "<success>Vous avez terminé la quête : <#26d971>%name% <#80ed99>et gagné <#26d971>%points% <#80ed99>points." # Rewards reward-already-claimed: "<warning>Vous avez déjà récupéré votre récompense pour cette quête." reward-not-unlocked: "<warning>Il vous manque encore <#26d971>%points% <warning>points pour débloquer ce palier." reward-premium-only: "<warning>Ce palier est réservé à la version Classique du Farm Pass." # Saison no-active-season: "<error>Il n’y a actuellement aucune saison en cours. Veuillez revenir plus tard." season-started: "<success>Une nouvelle saison du Farm Pass a commencé : vos quêtes et vos points ont été réinitialisés." # Points points-balance: "<success><#26d971>%target% <#80ed99>possède <#26d971>%points% <#80ed99>points." points-updated: "<success>Points de <#26d971>%target% <#80ed99>: <#26d971>%points%<#80ed99>." points-changed: "<success>Vos points de Farm Pass sont désormais de <#26d971>%points%<#80ed99>."

blueprints/

BlueprintService.load() resolves plugins/AstralFarmPass/blueprints/, and — only if that folder does not exist yet — writes out every blueprints/ entry bundled in the JAR, preserving the daily/ and weekly/ sub-folders. Once the folder exists nothing is ever copied again, so edited or deleted quests stay edited or deleted.

The folder is then walked recursively: every .yml/.yaml file below it is one QuestBlueprint, keyed by its id field. The README.md shipped alongside them is ignored. A file that fails to deserialize logs an error and is skipped — the others still load. Two blueprints sharing an id are a configuration error: the second one seen is skipped with a Duplicate quest blueprint ID found warning, and which of the two that is is not defined (files come back unordered), so ids must be unique.

See Quests & Goals for the file format.

rewards.yml and menus/

rewards.yml is loaded into RewardsConfiguration — see Rewards.

menus/ is an ordinary AstralCore MenuContainer — it loads every menu blueprint it finds under plugins/AstralFarmPass/menus/ and registers it globally. Unlike blueprints/, nothing is copied out of the JAR: the bundled main.yml (farmpass-main) and pass-weekly_quest.yml (pass-weekly_quest) are reference copies you have to place yourself, and an empty folder logs No menu blueprint was loaded from … and leaves /pass with nothing to open.

Both read the plugin's placeholders through layout providers: farmpass-main draws three reward rows off %farmpass_rewards% plus the daily and weekly quest rows, and pass-weekly_quest lists the month's weekly quests — locked ones included — off %farmpass_all_WEEKLY%.

Reloading

/pass reload calls AstralFarmPass.loadConfiguration(), which re-reads config.yml, rewards.yml and messages.yml, re-loads the blueprint folder and the menus. The quest service is not restarted: its rollover task survives, and re-generating the current month from unchanged inputs produces the same quests, so a reload never wipes anybody's progress.

Editing anything that feeds generation — the salt, the categories, a blueprint's goal-value, type or availability window — changes the fingerprint and re-rolls the running month. Check the Loaded N quest blueprints (fingerprint: …) line on every server after such a change.

Last modified: 25 September 2026