Configuration
Every YAML in plugins/AstralSkyblock/ is documented here. Reload at runtime with /is reload.
config.yml
The core behavioural configuration — server capacity, world lifecycle, generators, and the settings applied to newly created islands.
Backed by SkyblockConfiguration:
Key | Type | Default | Description |
|---|---|---|---|
| int |
| Island capacity of this server instance. |
| String |
| Server group name, compared against AstralCore's |
| int |
| Seconds an island world may sit loaded with no players before the idle sweep unloads it. |
| boolean |
| Gates whether |
| String |
| Id of the |
|
| see above |
|
loader.yml
Connection details for the MySQL-backed SlimeWorld loader (MysqlLoader) that AstralSkyblock uses to store and clone island worlds. Deserialized once into ASPLoaderConfiguration and handed to WorldService.load() when it constructs worldLoader during plugin enable.
Key | Java field | Description |
|---|---|---|
|
| JDBC URL template; |
|
| MySQL connection target for the SlimeWorld store. |
|
| Database credentials. |
|
| Whether the JDBC connection negotiates SSL. |
block-values.yml
Assigns a numeric "worth" to block types, used to identify valuable blocks. Keys are Material names; the special form 'MOB_SPAWNER:<ENTITY>' matches a placed spawner whose CreatureSpawner.getSpawnedType() equals <ENTITY> (case-insensitive) — not the generic SPAWNER material — so 'MOB_SPAWNER:IRON_GOLEM' only matches a spawner currently set to spawn Iron Golems.
BlockValueConfiguration.blocks() lazily resolves the raw Map<String, Integer> into a Map<Predicate<Block>, Integer> — each entry becomes either an exact (case-insensitive) material-name predicate, or the spawner/entity-type predicate for MOB_SPAWNER: keys.
Current runtime use is narrower than the worth values suggest: IslandPermissionsListener.isValuable(Block) reads only the predicate keys (blocks().keySet().stream().anyMatch(...)) to decide whether a broken block should be gated behind IslandPermission.VALUABLE_BREAK. The islands table has a cached level column (schema.sql: "cached rank metric (recalc job); /is top orders by this") that these worth values are clearly meant to roll up into, but no recalculation job reading the Integer values exists in the current codebase — they are presently unused for scoring.
generators/<id>.yml
One file per cobblestone/basalt generator blueprint, loaded by GeneratorService.load() from the generators/ folder (created if missing). The active generator is generators.default in config.yml; GeneratorService.defaultGenerator() looks it up and logs a warning at load time if it doesn't exist.
Field | Type | Description |
|---|---|---|
| String | Generator id. Duplicate ids across files are logged and the later file is skipped. |
|
| Relative weights fed into a |
GeneratorListener replaces a newly-formed COBBLESTONE/BASALT block (from a BlockFormEvent — lava meeting water) inside an island world with randomBlock() drawn from this weighted pool, cancelling the vanilla result. The listener currently always resolves generators().defaultGenerator() regardless of which island is firing the event (// TODO: Replace that in source) — every island effectively shares the single plugin-wide default generator today, even though multiple generators/<id>.yml files can be defined.
blueprints/<id>.yml
Island world templates, loaded by BlueprintService.load() from blueprints/. Exactly one blueprint across all files must set default: true — BlueprintService.load() throws IllegalStateException if none does. /is create <name> <blueprint> falls back to blueprints().defaultBlueprint() when no blueprint argument is given.
Field | Java field | Description |
|---|---|---|
|
| Blueprint id — also what the |
|
| Exactly one blueprint, across every file, must set this |
|
| Name of the SlimeWorld file under |
|
|
|
|
| Menu display for this blueprint, e.g. in the |
upgrades/<type>.yml
One file per upgradeable island stat, loaded by UpgradeService.load() from upgrades/. type must be one of the UpgradeType enum: WORLDBORDER_SIZE, MEMBERS_LIMIT, COOP_LIMIT, GENERATOR, HOPPERS_LIMIT, CROP_GROWTH_SPEED, SPAWNERS_RATE, MOB_DROPS, MINECART_LIMITS. A duplicate type across files is logged and skipped.
Field | Type | Description |
|---|---|---|
|
| Which upgrade track this file defines. |
|
| Level number → level definition. |
Each levels.<n> entry:
Field | Type | Description |
|---|---|---|
| int | The level number — should match its map key. |
| double | Cost to purchase this level. |
| String | Currency id charged (optional at a free level |
|
| MiniMessage display name of the currency, shown to players. |
| double | The effect magnitude at this level (e.g. worldborder radius in blocks for |
|
| AstralCore actions run once when a player reaches this level. |
roles.yml, settings.yml & permissions.yml
roles.ymlseeds the roles every island starts with (RolesConfiguration—Map<String, Entry>, one entry per role):name,type(IslandRole.Type),weight,default(@Setting("default")→isDefault; the role auto-assigned to new members),icon, andpermissions(rawIslandPermissionnames, or theALLwildcard).settings.ymlandpermissions.ymlare icon-only lookup tables (Map<IslandSettings, ItemStackWrapper>/Map<IslandPermission, ItemStackWrapper>, loaded vialoadEnum) that back the settings/permissions toggle menus.
Full role, permission and setting catalogues, defaults, and menu behavior are covered in Roles, Permissions & Settings.
messages.yml
Every player-facing string, loaded into the ASMessages enum via loadEnum("messages.yml", ASMessages.class). Values are MiniMessage strings that accept %placeholder% tokens resolved per message; a key missing from the file is logged as a warning and skipped rather than failing the whole load.
Reload
/is reload (aliases /skyblock reload, /island reload; permission skyblock.reload) re-runs AstralSkyblock.loadConfiguration():
Copies
database.propertiesif it doesn't already exist.Reloads
config.yml,loader.yml,roles.ymlandblock-values.ymlinto their configuration records.Reloads
messages.ymlintoASMessages, andsettings.yml/permissions.ymlintoIslandSettings/IslandPermission.Fully reloads
blueprints/, menus, dialogs,generators/, andupgrades/from disk — each service clears its in-memory map and re-scans its folder, so files added or removed since the last load take effect.
Not re-applied by reload: WorldService.load() guards with if (this.worldLoader != null) return;, so it is a no-op on every call after plugin enable. Changes to loader.yml's connection settings only take effect on a full plugin/server restart — the same is true of the database, cache, and messaging connections, which are all opened once in onEnable and not reopened by loadConfiguration().
Configurate mapping note
All of the records above are Configurate @ConfigSerializable types. An unannotated camelCase Java field maps to a kebab-case YAML key (maximumIslands → maximum-islands, worldIdleUnloadSeconds → world-idle-unload-seconds). Where the natural key would collide with the Java keyword default, the field is renamed and annotated with @Setting("default"):
Java field | Declaring type | YAML key |
|---|---|---|
|
|
|
|
|
|
|
|
|