Space Pod Destinations

From DragonMineZ Wiki

Space Pod destinations are the places a player can warp to from the Space Pod menu. They are a datapack system, not a config/dragonminez file, which makes them a good fit for datapacks and add-ons that want to add their own destinations (for example, a custom dimension mod adding its own entry).

Loader: SpacePodDestinationRegistry (src/main/java/com/dragonminez/common/spacepod/SpacePodDestinationRegistry.java), a vanilla SimpleJsonResourceReloadListener over the spacepod directory. It reloads with the vanilla /reload or a restart, not with /dmzreload, and it is synced to clients automatically when datapacks sync.

File location

data/<namespace>/spacepod/destinations.json

Any namespace can contribute a destinations.json (or any other filename under that folder). They are all loaded together, sorted by resource location. DragonMineZ's own bundled file is data/dragonminez/spacepod/destinations.json.

Shipped destinations

DragonMineZ's bundled data/dragonminez/spacepod/destinations.json uses "replace": true and contains:

id Menu name Dimension Lands at Unlock rule
overworld Earth minecraft:overworld Same X/Y/Z as the player ALWAYS
namek Namek dragonminez:namek Same X/Y/Z as the player ALWAYS
otherworld Otherworld dragonminez:otherworld 54, 210, 1082 OTHERWORLD_ENABLED and the side quest bulma_otherworld_drive (Otherworld Drive)
sacredkaiplanet Sacred Kai Planet dragonminez:sacredkaiplanet Same X/Y/Z as the player Saga quest buu_saga:23 (Buu Saga)
cereal Cereal Planet dragonminez:cereal_planet Same X/Y/Z as the player NEVER (reserved for an add-on dimension)
beerus Beerus Planet dmzsuper:beerus_planet Same X/Y/Z as the player NEVER (reserved for an add-on dimension)
time_chamber Time Chamber dragonminez:time_chamber 0.5, 130, 0.5 Side quest bulma_time_chamber_link (Temporal Comm-Link)
demon_realm Demon Realm dragonminez:demon_realm 160.5, 745, 0.5 (above the Third Demon World) Saga quest daima_saga:3 (To the Demon Realm, Daima Saga)

All shipped entries use "show_when_locked": true, so locked worlds show up grayed out. See Dimensions for what each world offers.

Load order matters Files are applied in resource-location order, and DragonMineZ's bundled file uses "replace": true. A file in a namespace that sorts before dragonminez (for example addon:) is wiped by it: use a namespace that sorts after dragonminez, or put your own data/dragonminez/spacepod/destinations.json in a datapack to replace DragonMineZ's list. Entries are not merged by id: adding an entry with an id that already exists doesn't change the existing one.

Top-level shape

{
  "replace": false,
  "destinations": [ ... ]
}

replace is optional and defaults to false. If true, it clears every destination loaded before this file and then adds this file's own. Use it if you want your pack to be the only authority on the destination list instead of adding to the others.

Destination fields

Field Type What it does
id String Unique destination id.
name String Translation key, or a literal string if translate is false.
translate Boolean Defaults to true (treat name as a translation key).
dimension String Id of the target dimension.
icon_index Integer Index into the built-in Space Pod icon sheet. Exactly one of icon_index and icon_texture is required.
icon_texture String Resource location of a custom texture, as an alternative to icon_index.
x, y, z Number Target coordinates. Either provide all three, or only y (a special case that keeps the player's current X and Z and only changes their Y), or leave out all three. Providing just x or just z without the others is an error.
show_when_locked Boolean Defaults to true. If true, a locked destination still shows (grayed out); if false, it is hidden entirely until unlocked.
unlock_rules String or object The unlock condition (see Unlock rules).

Unlock rules

Primitives

Primitives are bare strings:

Rule Unlocked when
"ALWAYS" Always.
"NEVER" Never. This effectively disables the destination unless another pack overrides it.
"KAIO_UNLOCKED" The player has unlocked Kaio's planet.
"OTHERWORLD_ENABLED" Otherworld generation is enabled in the server config.

Conditions

Conditions are objects:

Rule Shape Unlocked when
Quest { "quest": "<quest_id>" } The player has completed that quest. Side quest and saga quest ids both work (for example "buu_saga:23").
Level { "level": N } The player's level is at least N.
Race { "race": "<race_name>" } The player's race matches (case-insensitive).
Tag { "tag": "<player_tag>" } The player has this Minecraft scoreboard tag.
Visited dimension { "visited_dimension": "<dimension_id>" } The player has visited that dimension before.
Stat { "stat": { "name": "<STAT_NAME>", "min": N } } The player's stat (for example STRENGTH) is at least N.

Composite operators

Composite operators can be nested to any depth, freely mixing primitives, conditions and other composites:

{ "and": [ <rule>, <rule>, ... ] }
{ "or":  [ <rule>, <rule>, ... ] }
{ "not": <rule> }

Examples

Always available:

{
  "id": "overworld",
  "name": "gui.dragonminez.spacepod.overworld",
  "dimension": "minecraft:overworld",
  "icon_index": 0,
  "unlock_rules": "ALWAYS"
}

Gated by an AND of a global toggle and a quest, with fixed coordinates:

{
  "id": "otherworld",
  "name": "gui.dragonminez.spacepod.otherworld",
  "dimension": "dragonminez:otherworld",
  "icon_index": 2,
  "x": 54.0,
  "y": 210.0,
  "z": 1082.0,
  "unlock_rules": {
    "and": ["OTHERWORLD_ENABLED", { "quest": "bulma_otherworld_drive" }]
  }
}

Gated by a single saga quest, with fixed coordinates (the shipped Demon Realm entry):

{
  "id": "demon_realm",
  "name": "gui.dragonminez.spacepod.demon_realm",
  "dimension": "dragonminez:demon_realm",
  "icon_index": 6,
  "x": 160.5,
  "y": 745.0,
  "z": 0.5,
  "unlock_rules": { "quest": "daima_saga:3" }
}

Gated by a side quest, with the "keep X and Z, change only Y" coordinate form (my_pack:sky_island is a made-up example):

{
  "id": "sky_island",
  "name": "My Sky Island",
  "translate": false,
  "dimension": "my_pack:sky_island",
  "icon_index": 2,
  "y": 130.0,
  "unlock_rules": { "quest": "bulma_time_chamber_link" }
}

A destination that can never be unlocked through this pack (useful if you want it hidden unless another pack overrides it):

{
  "id": "cereal",
  "name": "gui.dragonminez.spacepod.cereal",
  "dimension": "dragonminez:cereal_planet",
  "icon_index": 4,
  "unlock_rules": "NEVER"
}

A deeper nested example that combines level or race with a tag exclusion:

{
  "unlock_rules": {
    "and": [
      { "or": [{ "level": 10 }, { "race": "saiyan" }] },
      { "not": { "tag": "tutorial_skipped" } }
    ]
  }
}

Client screen

Players browse destinations in SpacePodScreen (client side), which shows up to 7 entries at once and grays out or hides locked ones according to show_when_locked.

Reload and validate

  1. Add or edit data/<namespace>/spacepod/destinations.json.
  2. Validate the JSON syntax (see How to JSON).
  3. Run the vanilla /reload, or restart. This isn't covered by /dmzreload (see Reloading and Updating Changes).
  4. Open the Space Pod menu in game and check that the destination appears and unlocks as expected.