Skip to content
Leaf26 edited this page Jun 17, 2026 · 2 revisions

safety.yml controls landing validation and correction: it decides what counts as a safe spot to stand on, what blocks disqualify a landing (lava, water, cactus, ...), and what to do on arrival. The biome whitelist/blacklist (biomeWhitelist + biomes) is covered on the Biome Controls page.

!!! note "Why this is a list, not a hardcoded rule" "Don't land in water/lava/cactus" is not a fixed rule baked into the plugin - it is just the default contents of safety.yml's unsafeBlocks list. You edit that list (and airBlocks) to define what "safe" means on your server, which matters once mods add blocks the vanilla defaults have never heard of.

Base example (start here)

safety.yml ships with sensible vanilla defaults, so most servers never touch it. The base rules below are the part you should understand first - the rest of the file is fine-tuning.

# safety.yml - the core landing rules (vanilla defaults shown trimmed)

# Blocks that count as walkable "air" above the landing spot.
airBlocks:
  - "AIR"
  - "CAVE_AIR"
  - "#minecraft:flowers"
  - "#minecraft:leaves"
  - "SHORT_GRASS"
  - "SNOW"

# Blocks that DISQUALIFY a landing spot. This is the "don't land in
# water/lava/cactus" list - edit it to taste.
unsafeBlocks:
  - "WATER"
  - "LAVA"
  - "*[waterlogged=true]"   # any waterlogged block
  - "CACTUS"
  - "MAGMA_BLOCK"
  - "#minecraft:fire"
  - "POWDER_SNOW"

# Biome filter (see the Biome Controls page).
biomeWhitelist: false      # false = the list below is a blacklist
biomes:
  - "OCEAN"
  - "RIVER"
  - "THE_VOID"

That is enough for a vanilla survival server: a player lands on solid ground, never inside water/lava/cactus, and never in an ocean, river, or the void.

!!! tip "You rarely need to start from scratch" The default safety.yml already contains a thorough vanilla list (every ocean variant, fire, sweet berries, pointed dripstone, kelp, and so on). Treat the block lists as something you add to for mods, not something you rewrite.

A complex example: a heavily modded server with extra worlds

Here is a more involved setup to show the syntax in context. Picture a modded server running, for example:

  • a terrain/biome mod that adds new natural blocks (say poison_ivy and quicksand that hurt the player),
  • a dimension mod that adds two extra worlds (mining_dim full of exposed lava lakes, and aether made largely of cloud blocks you would fall through),
  • a tech mod whose machines you do not want players dropped on top of.

The block lists in safety.yml are global by default, but every key here can be overridden per region with /rtp config regions <region> <key>=<value>. So the strategy is: put server-wide hazards in the global file, and put per-dimension quirks on that dimension's region.

1. Global additions (apply everywhere)

Add the modded hazards that are dangerous in any world to the global unsafeBlocks. Modded blocks use their namespaced material name (uppercased Bukkit form) just like vanilla ones, and tags work too:

# safety.yml (global)
unsafeBlocks:
  # ... keep all the vanilla defaults ...
  - "WATER"
  - "LAVA"
  - "CACTUS"
  # --- modded additions ---
  - "POISON_IVY"               # biomemod hazard block
  - "QUICKSAND"
  - "#mymod:machines"          # never drop a player onto a tech machine (a tag the mod registers)
  - "*[lit=true]"              # any block currently "lit" (furnaces, etc.) - state predicate

!!! note "Syntax recap" - MATERIAL - a plain block, modded or vanilla (POISON_IVY). - #namespace:tag - every block in a registered tag (#mymod:machines). - *[prop=val] / MATERIAL[prop>=n] - block-state predicates (*[lit=true], LAVA[level<=3]). - These combine: see the token grammar section below for the full rules.

Plain-English: what is a #namespace:tag?

If you have never written code, the #mymod:machines syntax can look cryptic. It is simpler than it seems:

  • A tag is just a named basket of blocks that a mod author bundled together so other things can refer to them all at once - instead of you having to list every single block by hand.
  • The part before the colon (mymod) is the namespace - i.e. which mod the basket comes from. minecraft is vanilla's namespace; every mod gets its own (create, mekanism, farmersdelight, ...).
  • The part after the colon (machines) is the name of the basket the mod author chose.
  • The leading # is what tells LeafRTP "this is a basket, not a single block."

So #mymod:machines reads as: "every block the mymod mod filed under its machines basket." Add that one line and you have banned the player from landing on all of that mod's machines, even ones added in a future update, without naming a single one.

!!! tip "A real example: vanilla and the Create mod" You already use tags without realizing it. Vanilla Minecraft ships baskets like #minecraft:logs (every wood type's log), #minecraft:wool (all 16 wool colors), and #minecraft:leaves. Writing #minecraft:logs in airBlocks covers oak, birch, spruce, cherry, and any log a future update adds - one line instead of a dozen.

Mods do the exact same thing. The popular **Create** mod (gears, belts, and contraptions) files its blocks under the `create` namespace, so a tag like `#create:fan_transparent` or `#create:tracks` groups related blocks for you. You do not invent these names - the mod author does, and you can find them in the mod's data or wiki. When you write `#create:tracks` in `unsafeBlocks`, you are saying "never drop a player onto a Create train track," and it keeps working even after Create adds new track variants. That is the whole point of a tag: **name the group once, and the list maintains itself.**

2. Per-region tuning for each extra dimension

Now handle the per-world quirks on each dimension's region instead of polluting the global list.

The lava-lake mining dimension is dangerous, so widen the hazard scan there:

# scan a 1-block radius around the landing point, not just the block itself
/rtp config regions mining_dim safetyRadius=1

The Aether is mostly cloud blocks a player falls straight through, so mark them unsafe only for that region and (optionally) build a tiny emergency platform when nothing solid is found:

/rtp config regions aether unsafeBlocks=AETHER_CLOUD,COLD_AETHER_CLOUD
/rtp config regions aether platformRadius=1
/rtp config regions aether platformMaterial=AETHER_DIRT

!!! tip "Why per-region instead of global" AETHER_CLOUD is only meaningful in the Aether, and an emergency platform is a heavy hammer you do not want firing in your normal overworld. Scoping these to the region that needs them keeps the overworld fast and the rules readable.

3. Biome filtering for a modded biome spread

If the biome mod adds many ocean-like or barren biomes, blacklist them the same way as vanilla (these can also be set per region - see Biome Controls):

# safety.yml (global) or per-region override
biomeWhitelist: false
biomes:
  - "OCEAN"
  - "RIVER"
  - "THE_VOID"
  - "MYMOD_TOXIC_WASTES"      # modded biome you never want to land in
  - "MYMOD_OPEN_AIR"

The takeaway

  • Global file = hazards true everywhere (lava, water, your machines).
  • Per-region overrides = quirks of one dimension (cloud blocks, wider scan, an emergency platform).
  • Modded blocks/biomes are referenced by their registered name exactly like vanilla ones, and the tag/predicate grammar works on them too.

!!! warning "Test before release" After adding modded entries, do a test scan (/rtp scan start region=<name>) and watch the logs for selection failures - a typo'd modded material name simply will not match anything and is dropped at load with a startup WARNING. See What NOT to do!.


Reference

Landing protection

Key Default Purpose
invulnerabilityTime 5 Seconds of invulnerability after arrival (prevents fall/fire/drowning damage on landing).
safetyRadius 0 Block radius around the landing point to check for hazards. 0 checks only the landing block.
staleChunkRetryLimit 2 Bounded retry budget for the stale-chunk guard (prevents races where a chunk unloads before evaluation).
anvilPrefilterEnabled true Off-thread anvil pre-filter (rejects unsafe biomes/blocks without loading chunks).

Emergency platforms

A legacy fallback that builds a small platform when no solid ground is found. Disabled by default.

Key Default Purpose
platformRadius -1 Radius of the emergency platform. -1 disables it (recommended).
platformDepth 1 Downward depth of the platform.
platformAirHeight 2 Air height ensured above the platform.
platformMaterial GLASS Block used when no solid block exists.
platformRestoreSeconds -1 Restore the footprint to its original blocks after this many seconds. -1 never restores; 0 restores when the chunk next loads. The countdown only advances while the chunk is loaded and survives restarts. (Bukkit/Paper/Folia only; Fabric does not build platforms.)

Block filters and token grammar

airBlocks (walkable space above the landing) and unsafeBlocks (rejected landing targets) accept a token grammar:

  • MATERIAL - plain material (e.g. LAVA). (All editions.)
  • (Pro) MATERIAL[prop=val,prop2=val2] - match only when block-state properties match (case-insensitive string equality).
  • (Pro) MATERIAL[prop>=n] - numeric block-state range comparison (>=, <=, >, <; n a whole number, e.g. LAVA[level<=3]).
  • (Pro) #namespace:tag - every material in a block tag (e.g. #minecraft:logs).
  • (Pro) #namespace:tag[prop=val] - tag members matching properties.
  • (Pro) *[prop=val] - any material matching properties (e.g. *[waterlogged=true]).

Notes:

  • Multiple predicates inside one [ ... ] combine with logical AND; two range bounds on one key form an interval (LAVA[level>=2,level<=5]).
  • A block whose property is absent or non-numeric is a miss (fail-open) - it is never rejected by a predicate it cannot satisfy.
  • Malformed tokens are dropped at load with a single startup WARNING, never silently ignored.

Edition note. Plain materials work in every edition. The tag (#...) and predicate ([...]) grammar ships only in the full (Pro) edition; the rtp-lite variant treats both lists as flat material allow/deny lists.

Defaults include AIR, #minecraft:flowers, #minecraft:leaves (air) and LAVA, WATER, *[waterlogged=true], CACTUS, #minecraft:logs (unsafe).

version is an internal config version - do not change it.

Clone this wiki locally