Astral Realms Documentation Help

Configuration

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

File layout

plugins/AstralFarmPass/ ├── config.yml ├── messages.yml ├── database.properties ├── categories.yml ├── rewards.yml ├── quests/ │ └── simple.yml └── menus/ └── main.yml

File

Purpose

config.yml

Node role — is this instance the season/quest master?

messages.yml

The three player-facing messages the plugin sends directly.

database.properties

HikariCP/JDBC connection to the MySQL/MariaDB seasons and quests tables.

categories.yml

The daily/weekly quest categories and their regeneration rules — see Seasons & Categories.

rewards.yml

Point-threshold rewards granted via /pass — see Rewards.

quests/*.yml

Blueprint folder — every YAML file here is scanned for quest blueprints — see Quests & Goals.

menus/main.yml

The farmpass-main menu opened by /pass.

config.yml

master: false

Field

Type

Description

master

boolean

Whether this node is the master for seasons and quest generation.

Unlike every other file in this list, AstralFarmPass does not ship a bundled default config.yml — there is no such resource in the plugin JAR. configurationManager().load("config.yml", ...) still tries to copy one in if the file is missing from the data folder, so on a genuinely first-time install (no pre-existing config.yml) it throws Default configuration resource not found: config.yml and the plugin fails to enable. You must create config.yml with a master key yourself before starting the server the first time.

Only one node in the network should run with master: true. The master is the node responsible for creating and rotating seasons and generating their quests: SeasonRotationService only calls createNewSeason() (or re-rolls one via /pass reroll) when configuration().master() is true — every other node just waits and logs that it is "waiting for master to create/rotate" the season.

Non-master nodes stay in sync by listening for the FarmpassUpdatedPacket broadcast the master sends over messaging after every season creation or reroll: SeasonService re-reads the current season from the database and updates its local cache whenever that packet arrives (and ignores it entirely if it is itself the master, to avoid a redundant reload).

messages.yml

Backed by the FarmPassMessages enum — three keys, each a MiniMessage string.

Key

Placeholders

Sent when

no-active-season

A player runs /pass while SeasonService.cachedCurrentSeason() is null.

quest-completed

%name%, %points%

A quest goal is finished; %name% is the quest's display name and %points% the points awarded.

reward-already-claimed

[claim-farmpass-reward] runs against a reward the player already claimed.

# Season no-active-season: "There is currently no active season. Please check back later." # Quests quest-completed: "Congratulations! You have completed the quest: %name% and earned %points% points." # Rewards reward-already-claimed: "You have already claimed your reward for this quest."

database.properties

A standard HikariCP properties file — AstralFarmPass reuses AstralCore's DatabaseService connection model. It is copied to disk on first enable via copyResource and read from the plugin's data folder directly (not through Configurate).

jdbcUrl=jdbc:mariadb://localhost:3306/farmpass?useSSL=false driverClassName=org.mariadb.jdbc.Driver dataSource.user=testuser dataSource.password=test623 poolName=AstralFarmPass-Standalone

On connect, DatabaseService executes the bundled schema.sql, creating the tables below if they do not already exist:

Table

Purpose

seasons

One row per season — id, starts_at, ends_at.

quests

One row per generated quest — id, season_id (cascades on season delete), blueprint_id, value, unlocks_at, expires_at, created_at.

categories.yml and rewards.yml

categories.yml is loaded into CategoriesConfiguration and rewards.yml into RewardsConfiguration. Both are covered in full on their own pages:

  • Seasons & Categories — the daily/weekly category definitions and their regeneration rules that drive SeasonRotationService's quest generation.

  • Rewards — the point-threshold rewards granted from rewards.yml.

quests/ blueprint folder

BlueprintService.load() scans every YAML file under the quests/ folder (not just simple.yml) with configurationManager().loadFolder(...), deserialising each one as a BlueprintConfiguration whose blueprints map (keyed by blueprint id) is flattened into a single in-memory registry of QuestBlueprint entries. You can split blueprints across as many files as you like — file name and file count are not significant, only the blueprints.<id> keys inside each file.

blueprints: wheat: display: material: "wheat" name: "Wheat Farmer" lore: - "Harvest %required%/%total% wheat to complete this quest." goal: type: "break-block" materials: - "wheat" requirements: daily: min: 5 max: 15 weekly: min: 16 max: 25

See Quests & Goals for the full blueprint field reference and the catalogue of goal.type values.

Every file under menus/ is an AstralCore menu blueprint (see the core menu system docs). AstralFarmPass ships one: farmpass-main, the menu /pass opens via MenuService.openMainMenu.

id: "farmpass-main" title: "%img_offset_-8%<white>%img_generic_27_half%%img_offset_-176%%img_title%%img_offset_-112%<font:alphabet:alphabet>farm pass" size: 54 use-player-inventory: true layouts: quests: taint: "quests" provider: "%farmpass_quests%" items: quest: material: "paper" copy-from: "%parameter_quest_item%" slot: - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 taints: - "quests"

Field

Description

layouts.quests.provider

%farmpass_quests% — the placeholder that supplies the list of quest entries to lay out into the quests taint.

items.quest.copy-from

%parameter_quest_item% — for each provided entry, the menu item is built by copying the item stack passed in as the quest_item parameter (the individual quest's display icon).

Reloading

/pass reload (permission farmpass.reload) calls AstralFarmPass.loadConfiguration() directly, which re-copies database.properties, reloads messages.yml, re-reads config.yml, rewards.yml, and categories.yml, then re-runs CategoriesService.load(), BlueprintService.load(), and MenuService.load() — so quest blueprints, categories, rewards, and menus all pick up file changes without a restart. It does not reconnect the database or messaging connections, and does not affect the currently active season. See Commands.

Last modified: 25 July 2026