Configuration
plugins/AstralHomes/config.yml is loaded through AstralCore's Configurate-backed configuration manager directly into the MainConfiguration record — camelCase Java fields map to kebab-case YAML keys (e.g. restoreLocationOnJoinGroups → restore-location-on-join-groups). Reload at runtime with /home reload (astralhomes.admin.reload); see Reloading below.
config.yml
Shipped defaults:
YAML key | Java field | Type | Description |
|---|---|---|---|
|
|
| World names where |
|
|
| Permission node → teleport warmup duration. |
|
|
| Permission node → maximum number of homes. |
|
|
| World name → permission required to send a teleport request into that world. |
|
|
| Server groups where a player's last in-world location is restored on join. |
blacklist
Worlds a player cannot /sethome in. HomeService.set checks the player's current world name against this list before doing anything else (before the SetHomeEvent, before the home-limit check) and, if present, aborts and sends HOME_BLACKLISTED_WORLD — the home is neither created nor updated. It only gates setting a home; it does not stop a player from teleporting to an existing home located in a now-blacklisted world. Shipped default blocks the spawn world only. See Homes.
warmup
A permission → Duration map, parsed by AstralCore's DurationTypeSerializer/DurationParser (y, d, h, m, s, ms units, combinable — e.g. "1d 5h"). MainConfiguration.warmup(Player) walks the map entries and, for each permission the player holds, replaces the running value with the entry's duration only if it is strictly lower than the current running value — the running value starts at a hardcoded 3s. In practice this means:
A player matching no configured permission gets the
3shardcoded fallback.astralhomes.mvp: 0salways wins when held, since0sis lower than everything else.A configured duration greater than the 3s fallback can never be applied on its own. With the shipped defaults, a player holding only
astralhomes.default(5s) is not granted5s— the loop only lowers the running value, so it never rises off the3sstarting point, and the result is identical to holding no warmup permission at all. This is a real quirk ofMainConfiguration.warmup(), not a documentation simplification — raising a permission's warmup above 3 seconds by editing this map alone has no effect unless every lower entry is also removed or raised.
The resolved duration is applied by the shared WarmupService (action-bar progress display, cancelled on movement/disconnect) before /home teleports, /warp, /spawn, and /back. Accepted /tpa//tpahere requests teleport immediately and are not subject to this warmup — see Teleport Requests.
limits
A permission → int map. MainConfiguration.limit(Player) walks the map and keeps the highest limit among the permissions the player holds, falling back to 1 if none match. HomeService.set enforces this only when creating a new home (renaming/overwriting an existing home by name is never blocked by the limit) — once data.homes().size() reaches the resolved limit, the player is sent HOME_LIMIT_REACHED with the %limit% placeholder and the home is not created.
worlds-permissions
World name → permission node. Used exclusively by TeleportationRequestService to gate /tpa and /tpahere: when a request's target player is standing in a world present in this map, the sending player must hold the mapped permission, or the request is rejected with WORLD_PROTECTED (checked both for local same-server targets in doPreFlightCheck and for cross-server targets, where the recipient's server reports its world's permission back over the messaging exchange). Shipped defaults protect world_nether (worlds.nether) and world_the_end (worlds.end). See Teleport Requests.
restore-location-on-join-groups
Server groups (AstralPaperAPI.serverInformation().group()) in which HomeSnapshotAdapter.apply restores a player's last known location on join, provided the player wasn't already teleported on join by the teleportation service. The stored location itself is keyed per specific server (serverId:world, set by HomeSnapshotAdapter.unload on quit via HomePlayerData.setLastServerLocation), not per group — so a match requires rejoining that exact server instance in that exact world, with restoration only enabled at all when that server's group is listed here. The restore only happens if the stored location passes LocationUtils.isSafeLocation. Shipped default enables this for the construction and resource groups.
database.properties
Copied into plugins/AstralHomes/ on first boot (and on every /home reload, though an existing file is never overwritten) for DatabaseService to open a HikariCP-pooled MariaDB connection — see the AstralCore database docs for the full key reference. AstralHomes only stores one thing in this database: warps (homes, last-locations, and the TPA toggle are AstralSync-replicated per-player data, not SQL rows — see Overview). The warps table is created automatically from the bundled schema.sql on first connection:
Column | Type | Notes |
|---|---|---|
|
| Primary key, defaults to |
|
| Unique warp name. |
|
| Server group the warp was set on. |
|
| Location coordinates. |
|
| Look direction. |
|
| World name. |
|
| Auto-managed. |
messages.yml
Every user-facing string the plugin sends is a case of the HomesMessages enum, loaded from messages.yml (one YAML key per enum constant, kebab-cased — e.g. HOME_LIMIT_REACHED → home-limit-reached). Edit the value for each key to customize the text; see Placeholders for the %...% tokens each message supports.
Reloading
/home reload (requires astralhomes.admin.reload) re-runs AstralHomes.loadConfiguration(), which re-copies database.properties (no-op if it already exists), reloads config.yml into MainConfiguration, reloads messages.yml into HomesMessages, and reloads the menu definitions. It does not reconnect the database, messaging, or cache services — those are only established during onEnable, so changes to database.properties, RabbitMQ, or Redis credentials require a full restart. See Commands.