Astral Realms Documentation Help

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.

# Server settings maximum-islands: 100 islands-group: "islands" # Unload an island world after it has had no players for this many seconds. # 0 uses the 5 minute default; a negative value disables idle unloading. world-idle-unload-seconds: 300 # Generators generators: enabled: true default: "overworld" # Settings default-settings: - CROPS_GROWTH - EGG_LAY - ENDERMAN_GRIEF - FIRE_SPREAD - GHAST_FIREBALL - LAVA_FLOW - PVP - TNT_EXPLOSION - TREE_GROWTH - WATER_FLOW - WITHER_EXPLOSION

Backed by SkyblockConfiguration:

Key

Type

Default

Description

maximum-islands

int

100

Island capacity of this server instance. ServerService republishes (loadedIslands, maximumIslands) to cache every 300 ticks (15s); findEmptiestServer() picks the least-loaded server whose loadedIslands < maximumIslands when routing a new island.

islands-group

String

"islands"

Server group name, compared against AstralCore's AstralPaperAPI.serverInformation().group() by SkyblockConfiguration.isIslandServer(). Only servers in this group start the idle-unload sweep and register IslandSettingsListener/IslandPermissionsListener.

world-idle-unload-seconds

int

300

Seconds an island world may sit loaded with no players before the idle sweep unloads it. SkyblockConfiguration.worldIdleUnloadSeconds(): 0 /absent falls back to 300; a negative value disables idle unloading entirely. The sweep itself (WorldService.sweepIdleWorlds) runs every IDLE_SWEEP_INTERVAL_TICKS (600 ticks / 30s), and only on island-group servers.

generators.enabled

boolean

true

Gates whether GeneratorListener is registered at all.

generators.default

String

"overworld"

Id of the generators/<id>.yml blueprint currently in effect. Maps to Generators.defaultGenerator, annotated @Setting("default") since default is a Java keyword.

default-settings

Set<IslandSettings>

see above

IslandSettings values seeded as enabled on every newly created island. Any IslandSettings constant omitted here starts disabled. The full catalogue (including the mutually-exclusive time/weather locks) lives in Roles, Permissions & Settings.

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.

sql-url: "jdbc:mysql://{host}:{port}/{database}?autoReconnect=true&allowMultiQueries=true&useSSL={usessl}" host: "10.0.0.5" port: 3306 database: "slimeworlds" username: "changeme" password: "changeme" useSsl: true

Key

Java field

Description

sql-url

sqlUrl

JDBC URL template; {host}, {port}, {database} and {usessl} are substituted from the keys below.

host/port/database

host/port/database

MySQL connection target for the SlimeWorld store.

username/password

username/password

Database credentials.

useSsl

useSsl

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.

blocks: DIAMOND_BLOCK: 300 EMERALD_BLOCK: 150 ENDER_CHEST: 150 'MOB_SPAWNER:IRON_GOLEM': 10000 COBBLESTONE: 1 DIRT: 2

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.

id: "overworld" blocks: COBBLESTONE: 50 STONE: 5 SAND: 5 DIRT: 10 GRASS_BLOCK: 10 OAK_LOG: 5 OAK_LEAVES: 5

Field

Type

Description

id

String

Generator id. Duplicate ids across files are logged and the later file is skipped.

blocks

Map<Material, Double>

Relative weights fed into a RandomCollection<BlockData> — they don't need to sum to any particular total, only their ratios matter. Non-block materials (Material.isBlock() == false) are silently skipped.

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: trueBlueprintService.load() throws IllegalStateException if none does. /is create <name> <blueprint> falls back to blueprints().defaultBlueprint() when no blueprint argument is given.

id: "default" default: true source-world: "default.slime" spawn-location: x: 0 y: 65 z: 0 yaw: 0 pitch: 0 world: "default" icon: material: stone name: "Default Blueprint" lore: - "This is the default blueprint." - "It is used when no other blueprint is specified."

Field

Java field

Description

id

id

Blueprint id — also what the @islandBlueprints command completion and IslandBlueprintContextResolver resolve against.

default

isDefault (@Setting("default"))

Exactly one blueprint, across every file, must set this true.

source-world

sourceWorld

Name of the SlimeWorld file under sourceWorlds/ (the .slime suffix is stripped before asp.readWorld(...)) that WorldService.createNewWorld clones when a new island is created. BlueprintService.load() skips (with a warning) any blueprint whose sourceWorlds/<source-world> file doesn't exist.

spawn-location

spawnLocation (MinecraftLocation)

x/y/z/yaw seed the cloned world's spawn point via a SlimePropertyMap; pitch and world are carried on the record but not read when building it.

icon

icon (ItemStackWrapper)

Menu display for this blueprint, e.g. in the /is create blueprint picker.

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.

type: WORLDBORDER_SIZE levels: 0: level: 0 price: 0 value: 1000 1: level: 1 price: 1000 currency: "default" currency-display: "Default Currency" value: 2000 unlock-actions: - "[message] gg"

Field

Type

Description

type

UpgradeType

Which upgrade track this file defines.

levels

Map<Integer, Level>

Level number → level definition. IslandUpgrade.maxLevel() is the highest key present; an island with no purchase on record is at level 0.

Each levels.<n> entry:

Field

Type

Description

level

int

The level number — should match its map key.

price

double

Cost to purchase this level.

currency

String

Currency id charged (optional at a free level 0).

currency-display

ComponentWrapper

MiniMessage display name of the currency, shown to players.

value

double

The effect magnitude at this level (e.g. worldborder radius in blocks for WORLDBORDER_SIZE) — interpreted per UpgradeType by whatever feature reads it.

unlock-actions

PaperActionList

AstralCore actions run once when a player reaches this level.

roles.yml, settings.yml & permissions.yml

  • roles.yml seeds the roles every island starts with (RolesConfigurationMap<String, Entry>, one entry per role): name, type (IslandRole.Type), weight, default (@Setting("default")isDefault; the role auto-assigned to new members), icon, and permissions (raw IslandPermission names, or the ALL wildcard).

  • settings.yml and permissions.yml are icon-only lookup tables (Map<IslandSettings, ItemStackWrapper>/Map<IslandPermission, ItemStackWrapper>, loaded via loadEnum) 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():

  1. Copies database.properties if it doesn't already exist.

  2. Reloads config.yml, loader.yml, roles.yml and block-values.yml into their configuration records.

  3. Reloads messages.yml into ASMessages, and settings.yml/permissions.yml into IslandSettings/IslandPermission.

  4. Fully reloads blueprints/, menus, dialogs, generators/, and upgrades/ 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 (maximumIslandsmaximum-islands, worldIdleUnloadSecondsworld-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

Generators.defaultGenerator

SkyblockConfiguration.Generators

generators.default

IslandBlueprint.isDefault

IslandBlueprint

default

RolesConfiguration.Entry.isDefault

RolesConfiguration.Entry

default

Last modified: 25 July 2026