Placeholders
AstralDungeons registers a dungeons namespace on both modules — but they are entirely different placeholder sets, because they answer different questions. On the dungeon server dungeons reads the live run; on the bridge it reads the player's dungeon inventory. Several nested namespaces (data, blueprint, preset, grid, inventory) are reachable only through an object registered into a specific container.
For the placeholder syntax itself (%namespace_key%, %outer_{inner}%) see Placeholders.
Namespace | Where | Reachable from |
|---|---|---|
Dungeon server | Any container with a | |
Bridge | Any container with a | |
Bridge |
| |
Bridge | The entry messages, and anywhere a blueprint is registered. | |
Bridge | A preset object, usually via | |
Bridge |
|
dungeons_* on the dungeon server
DungeonsPlaceholders (paper) is a ComplexPlaceholder registered once, globally, into RootPlaceholderContainer from the Paper module's onEnable. Because PlaceholderContainer.placeholder(namespace) falls back to the root container for any namespace it doesn't hold locally, %dungeons_*% resolves from any placeholder container built on that server once a Player context is attached — including the ad-hoc containers the listeners build for the player-death and chat-format messages.
Every key below returns null when the placeholder is not resolving against a Player context.
Placeholder | Type | Description |
|---|---|---|
| double | The player's live, unclaimed run experience, off the |
| boolean | Whether the player is still an alive participant of their instance. |
| boolean | Whether the player is currently registered to any instance. |
|
| The player's AstralParty party object, for further nesting ( |
|
| The player's instance state — |
| int | The number of entities the instance is currently tracking. |
| int | The number of mob spawn markers the instance was created with. |
Any other sub-key — including bare %dungeons% — resolves to null.
dungeons_inventory_* on the bridge
The bridge's DungeonsPlaceholders exposes exactly one key — inventory — which resolves to the viewing player's DungeonInventory (looked up through SyncAPI.findData), and the rest of the path is handled by that object. null when the context is not a Player or the player has no synced dungeon inventory.
See Dungeon Inventory & Presets for what these mean; slot indices are 0 helmet, 1 chestplate, 2 leggings, 3 boots, 4 main hand, 5 off hand, 6–23 storage.
Placeholder | Type | Description |
|---|---|---|
|
| Slot 0 of the inventory's own array. |
|
| Slot 1, same. |
|
| Slot 2, same. |
|
| Slot 3, same. |
|
| Slot |
|
| All 24 slots as a provider, empty slots included as empty stacks — so a menu layout renders the whole grid and provider index equals slot index. |
|
| The grid the player is wearing: the equipped preset's content, or the inventory's own array when none is equipped. Nest further with |
|
| The player's presets, for a menu layout. Each entry nests as |
|
| The equipped preset object, or |
| boolean | Whether a preset is equipped. |
| String | The equipped preset's UUID, or the literal string |
| double | The summed value of AstralItems stat |
Stat totals
%dungeons_inventory_stat_<key>% sums one AstralItems stat over the worn grid. The remainder of the placeholder path is collapsed into an Adventure Key, so a namespaced stat works: %dungeons_inventory_stat_astralitems:strength%.
Two filters apply per item:
Items AstralItems does not recognise, or that carry no stats, contribute nothing.
An item whose blueprint has an armour-equip pipeline contributes only if that pipeline head's requirements pass for the viewing player. An item with no such pipeline always contributes. A requirement that throws counts as failed.
So the total reflects what the player would actually benefit from, not merely what is in the grid. It requires a Player context; anything else yields null.
preset_*
Reachable from a preset object — a %dungeons_inventory_presets% provider entry (%parameter_preset% in a layout) or %dungeons_inventory_activePreset%.
Placeholder | Type | Description |
|---|---|---|
| String | The preset's name. |
| String | Its UUID, as a string. |
|
| All 24 slots, empty ones as empty stacks. |
|
| Slot |
Bare %preset% resolves to the preset object itself, which is what lets it be passed to an action or a menu parameter: [toggle-preset] %parameter_preset%, [open-menu] dungeons-preset:preset=%parameter_preset%.
grid_*
%dungeons_inventory_equipped% resolves to a DungeonInventoryGrid — the worn array, without saying whether it came from a preset or the inventory.
Placeholder | Type | Description |
|---|---|---|
|
| All 24 slots, empty ones as empty stacks. |
|
| Slot |
In practice menus write the whole path in one go — %dungeons_inventory_equipped_slot_0% — rather than thinking of grid as a separate namespace.
blueprint_*
The bridge DungeonBlueprint is itself a ComplexPlaceholder. It is registered into the one-off container built for each of the entry messages — creation-start, creation-success, failed-requirements, no-available-server, invalid-party-size.
Placeholder | Type | Description |
|---|---|---|
| String | The blueprint id. |
| Component | Its display name, resolved against the calling container. |
|
| Its key item, resolved (but not stamped with the |
|
| Its portal particle. |
Bare %blueprint% resolves to the blueprint object itself.
data_* (bridge, reward-claim actions only)
DungeonPlayerData is itself a ComplexPlaceholder, but it is never registered into RootPlaceholderContainer — %data_*% is not globally available anywhere on the network. Instead, PlayerDataService#claimRewards (bridge) builds a one-off PlaceholderContainer for the returning player, registers the just-claimed DungeonPlayerData into it, and runs the bridge's reward-actions against that container. The placeholder is therefore scoped to that single action run.
Because the registration happens after DungeonCompletedEvent fires, the values a listener wrote are the ones these placeholders report.
Placeholder | Type | Description |
|---|---|---|
| String | The blueprint the run was for. |
| double | Experience accumulated across the run. |
| int | Mobs this player personally killed. |
| long | Run length in milliseconds, stamped when the player left the dungeon server. |
| boolean | Whether the boss was defeated while this player was alive. |
Any other sub-key (or none) resolves to null. The commands list carried by the same object is not exposed as a placeholder — claimRewards dispatches those separately from console, after the reward actions run, with %player_name% substituted into each command string.