Placeholders
AstralSkyblock registers one root namespace and four chaining namespaces with AstralCore. For the placeholder syntax itself (%a_b_c%, %a_{b_c}%, $e(...)) see Placeholders.
skyblock_* (root)
SkyblockPlaceholders registers under RootPlaceholderContainer — usable anywhere AstralCore evaluates a placeholder (menus, dialogs, messages).
Placeholder | Type | Description |
|---|---|---|
| Island? | The requesting player's island, resolved via |
island_*
Island is itself a ComplexPlaceholder (namespace island). Reached via %skyblock_player_island_*%, or registered directly wherever a command/service builds a PlaceholderContainer for a specific island (.registerPlaceholder(island) — surfaces as bare %island_*%), or passed into a menu as a %parameters_island% parameter and chained as %parameter_island_*%/%parameters_island_*% inside that menu's own placeholder scope.
Placeholder | Type | Description |
|---|---|---|
| UUID | Primary key. |
| String | Island name. |
| Boolean | Lock state. |
| int | Island level. |
| IslandMember | The owning member — chain into |
| ItemProvider<IslandMember> | All members, for a layout |
| ItemProvider<IslandRole> | All roles, for a layout |
| ItemProvider<setting> | Every |
| Boolean | Whether the current |
| int | The island's purchased level for |
| long | Last-updated timestamp (epoch millis). |
| long | Creation timestamp (epoch millis). |
A bare %island% (no further tokens) returns the Island instance itself.
hasPermission and upgradeLevel each consume every remaining token as the enum name (context.collapseRemaining()), so multi-word enum constants work without extra escaping:
setting_*
IslandSettingsPlaceholder (namespace setting) pairs one IslandSettings enum constant with the island it belongs to. Reached by iterating %island_settings% inside a menu layout — the layout's taint: (e.g. setting) exposes the current item as %parameter_setting_*%/%parameters_setting_*% for that iteration.
Placeholder | Type | Description |
|---|---|---|
| String | The |
| ItemStackPlaceholder | The setting's configured icon ( |
| Boolean | Whether the paired island currently has this setting enabled ( |
A bare %setting% (no further tokens) returns the IslandSettings enum constant itself.
See Roles, Permissions & Settings for the full list of IslandSettings values and their conflict groups.
permission_*
IslandPermissionPlaceholder (namespace permission) pairs one IslandPermission enum constant with the IslandRole it belongs to. Reached by iterating a role's %role_permissions% (an IslandPermissionsItemProvider) inside a menu layout, exposed under that layout's taint: the same way as setting_* above.
Placeholder | Type | Description |
|---|---|---|
| String | The |
| ItemStackPlaceholder | The permission's configured icon ( |
| Boolean | Whether the paired role currently grants this permission ( |
A bare %permission% (no further tokens) returns the IslandPermission enum constant itself.
See Roles, Permissions & Settings for the full list of IslandPermission values and where roles are edited.
upgrade_*
IslandUpgrade (namespace upgrade) represents one priced, levelled track loaded from upgrades/*.yml (e.g. WORLDBORDER_SIZE). Reached wherever a service or menu registers an IslandUpgrade directly, or by iterating the upgrade registry.
Placeholder | Type | Description |
|---|---|---|
| UpgradeType | The upgrade's enum type. |
| ItemProvider<level> | Every configured |
| Level? | The |
A bare %upgrade% (no further tokens) returns the IslandUpgrade record itself.
level_*
IslandUpgrade.Level (namespace level) is one purchasable rung of an upgrade track.
Placeholder | Type | Description |
|---|---|---|
| int | The level number. |
| double | Cost to purchase this level. |
| String | Currency id charged (e.g. |
| Component | Display name for the currency, resolved from the configured |
| double | The gameplay value granted at this level (meaning depends on |
A bare %level% (no further tokens) returns the Level record itself.
See Islands for the full upgrade purchase flow and the UpgradeType catalogue.
Resolution chaining
Every namespace above implements ComplexPlaceholder.get(PlaceholderContext), which switches on context.next() one underscore-separated token at a time. A case that returns another ComplexPlaceholder (or an ItemProvider, which is one) is a chain point — resolution keeps consuming tokens against the new object until a leaf value is returned. This is how %skyblock_player_island_settings_at_0_enabled% walks from the root namespace, into the caller's island, into its settings provider, to a specific setting, down to a boolean leaf.
Usage note
These placeholders are consumed almost entirely inside menus/*.yml and messages.yml. Two registration patterns show up across the source:
Chained from the player —
%skyblock_player_island_*%, used in menuview-requirementsthat gate buttons on the viewer's own island (e.g.%skyblock_player_island_hasPermission_SET_SETTINGS%inmain.yml).Registered directly — commands and services build a
PlaceholderContainerfor a specific island (not necessarily the viewer's) and register it with.registerPlaceholder(island), plus atargetplayer where relevant:AstralPaperAPI.createPlaceholderContainer(kicker).registerPlaceholder(island).registerDirect("target", ...). This surfaces as bare%island_*%/%target_*%inmessages.ymlstrings such asmember-not-found: "%target_name% is not a member of %island_name%."Menus instead receive the island as an open parameter (%parameters_island%) and chain from there.
See Placeholders for the shared %parameters_*%/%layouts_*% mechanics that carry the island through a menu.