Configuration
AstralPack#loadConfiguration loads the single file config.yml into the MainConfiguration record, then recomputes every pack (see Overview — Computing packs). There is no messages.yml and no database.properties: every command reply is hard-coded English text in PackCommand, and the only configurable player-facing text is each pack's prompt.
config.yml
packs:
main:
id: "main"
url: "https://cdn.astralrealms.fr/generated.zip"
groups:
- "spawn"
- "resource"
- "build"
prompt: "Veuillez télécharger et installer le ressource pour le jouer sur Astral Realms."
unload-on-group-change: false
tower:
id: "tower"
url: "https://cdn.astralrealms.fr/tower.zip"
groups:
- "tower"
prompt: "Veuillez télécharger et installer le ressource pour le jouer sur Astral Realms."
unload-on-group-change: true
dungeon:
id: "dungeon"
url: "https://cdn.astralrealms.fr/dungeon.zip"
groups:
- "dungeon"
prompt: "Veuillez télécharger et installer le ressource pour le jouer sur Astral Realms."
unload-on-group-change: true
Key | Type | Description |
|---|
packs
| Map of pack blueprint | Every resource pack the proxy knows about. MainConfiguration is record MainConfiguration(Map<String, PackBlueprint> packs) — this is the only key in the file. |
The map key (main, tower, dungeon) is for YAML organisation only. Everything in code keys off the id field: command argument resolution, tab completion, computed-pack lookup and de-duplication, and the log lines. The shipped file sets key == id; keeping them equal is the sane convention, but nothing enforces it.
packs
Each entry is a PackBlueprint record — record PackBlueprint(String id, String url, List<String> groups, Component prompt, boolean unloadOnGroupChange), @ConfigSerializable. Configurate maps camelCase fields to kebab-case keys, so unloadOnGroupChange is the YAML key unload-on-group-change.
Field | Type | Description |
|---|
id
| String | The pack's identity. Matched case-insensitively by the <pack> command argument, listed verbatim by the @packs tab-completion, and used as the lookup/de-duplication key for the computed pack. |
url
| String | Direct HTTP(S) URL to the pack ZIP. The proxy downloads it at startup to compute the SHA-1, and a ?cacheKey=<random hex> query string is appended to the URL that is both hashed and handed to the client. The pack's UUID is UUID.nameUUIDFromBytes(url.getBytes()), derived from the raw URL without the cache key — stable across cache-busts, but two blueprints sharing a url produce the same pack UUID and interfere with each other's send and remove calls. |
groups
| List of String | AstralCore server groups (MinecraftServer#group) this pack applies to. A player entering the configuration phase for a server in one of these groups is sent the pack, unless it is already applied or still downloading. |
prompt
| MiniMessage String → Component | The confirm-dialog message, passed to ResourcePackRequest.prompt(...). Deserialized by AstralCore's ComponentTypeSerializer, which calls AdventureUtils.deserialize → MiniMessage.deserialize(raw, CoreRegistry.resolvers()), so MiniMessage tags and AstralCore's global tag resolvers are available. An absent node yields Component.empty(). All packs are sent with .required(true). |
unload-on-group-change
| boolean | When true, the pack is removed from the player (player.removeResourcePacks(...)) as soon as they enter configuration for a server whose group is not in this pack's groups and the pack is currently applied or pending. When false the pack stays applied everywhere once installed — which is why the shipped global main pack sets false while the per-area tower and dungeon packs set true. The shipped file sets this explicitly on every pack. |
How packs are matched
A pack is sent only when blueprint.groups().contains(group) — a plain List.contains, so the match is exact and case-sensitive. The group strings must match AstralCore's registered group names exactly; a pack whose groups never match any registered server group is never sent. The full sequence is described in Overview — Configuration-phase flow.
Reloading
/pack reload re-reads this file. It clears and asynchronously recomputes every pack, so already-connected players keep whatever they have until they next pass through the configuration phase or someone runs /pack update.
See also
Overview — hash computation, cache busting, and the configuration-phase flow these keys drive.
Commands — /pack, /pack update, /pack reload.
Last modified: 25 September 2026