Commands
| Command | Description | Permission |
|---|---|---|
| /rtp [world] | Teleport to a random safe location. If no world is specified, opens the world selection GUI. If a world name is given, attempts RTP directly in that world. | essentialsc.rtp |
Configuration
All RTP settings live under the rtp: section in config.yml.
rtp:
enabled: true
cooldown: 60
warmup: 5
cancel-on-movement: true
particles: true
max-attempts: 10
min-y: 64
max-y: 128
use-world-border: true
global:
min-radius: 1000
max-radius: 10000
blocked-biomes:
- ocean
- deep_ocean
worlds:
world:
enabled: true
min-radius: 1000
max-radius: 10000
display-name: "<#55FF55>Overworld"
world_nether:
enabled: false
min-radius: 500
max-radius: 3000
display-name: "<#FF5555>The Nether"
blocked-biomes:
- basalt_deltas
world_the_end:
enabled: true
min-radius: 1000
max-radius: 10000
display-name: "<#FF55FF>The End"
world_nether) or suffix match (e.g., nether matches any world ending in -nether). This allows config keys like nether: to match world_nether automatically.
Permissions
| Permission | Description | Default |
|---|---|---|
| essentialsc.rtp | Use /rtp | true |
| essentialsc.rtp.world.* | RTP to all worlds | op |
| essentialsc.rtp.world.overworld | RTP to overworld | true |
| essentialsc.rtp.world.nether | RTP to nether | true |
| essentialsc.rtp.world.end | RTP to end | true |
| essentialsc.rtp.bypass.cooldown | Bypass RTP cooldown | op |
| essentialsc.rtp.bypass.warmup | Bypass RTP warmup | op |
| essentialsc.rtp.bypass.movement | Bypass RTP movement check | op |
world_nether:, the permission is essentialsc.rtp.world.world_nether. If you use nether: as the config key, it becomes essentialsc.rtp.world.nether. The .* wildcard grants access to all configured worlds regardless of their keys.
Safe Location Search
When you run /rtp, the plugin searches for a safe location asynchronously:
- Permission check — Verifies
essentialsc.rtpand the specific world permission. - Cooldown check — If on cooldown, shows remaining time. Bypassed by
essentialsc.rtp.bypass.cooldown. - World enabled check — The world must have
enabled: truein config. - Random coordinate generation — Uses polar coordinates: random angle (0-2pi) and random distance between min-radius and max-radius from world spawn.
- World border check — If
use-world-border: true, the coordinate must be inside the border. - Async chunk loading — The chunk at the target coordinates is loaded asynchronously via
getChunkAtAsync(). - Y-level determination
- Overworld — Uses
getHighestBlockYAt() - Nether — Searches downward from Y=min(126, maxY) to Y=max(1, minY), looking for solid ground with air space above. Skips bedrock below Y=5.
- End — Uses highest block YAt, but gets 3x max attempts (30) because End islands are sparse
- Overworld — Uses
- Biome check — The biome at the location must not be in the world's
blocked-biomeslist. - Safety validation — Ground block must be solid and not lava, cactus, fire, or magma block. Feet and head blocks must be air or non-solid.
- Retry loop — If any check fails, a new random coordinate is generated. Up to 10 attempts (30 for End).
If no safe location is found after all attempts, the player is notified and no cooldown is applied.
Teleport and Effects
Once a safe location is found:
- Random orientation — Yaw is randomized (0-360 degrees), pitch is set to 0 degrees.
- Async teleport — Performed via
scheduler.teleportAsync()for Folia safety. - Cooldown applied — Only on successful teleport.
- Back location saved — The player's pre-teleport location is stored for
/back. - Particles — 30 portal particles in a random spread around the destination, plus one explosion particle at the exact location (if
rtp.particles: true). - Sounds — Enderman teleport sound plays at the destination for both the player and the world.
- Success message — Coordinates and world name are displayed via MiniMessage.
Warmup
If warmup is enabled (default 5s):
- A pling sound plays at the start.
- An action bar countdown updates every second with remaining time.
- A hat sound (quiet click) plays on each tick during countdown.
- Movement is checked at block coordinates (X/Y/Z). If the player moves and
cancel-on-movementis true, the teleport is cancelled. Bypassed byessentialsc.rtp.bypass.movement. - Quitting during warmup cancels the teleport and cleans up all state.
GUI
Running /rtp without arguments opens the world selection GUI:
- Layout — 27-slot inventory with 3 world slots per page (positions 11, 13, 15).
- Icons — Environment-based materials: grass block (overworld), netherrack (nether), end stone (end). Disabled or permission-locked worlds show a barrier.
- Information — Each icon shows the display name (MiniMessage), enabled status, permission status, live player count, and min/max radius.
- Pagination — Arrow buttons for previous/next page, book icon showing current page.
- Live refresh — The GUI updates every second (20 ticks) to reflect current player counts and world status.
- Click to teleport — Clicking an enabled, permitted world closes the GUI and starts the RTP process for that world.
The GUI is fully async-safe and cleans up all tasks and state when closed.
Troubleshooting
"No safe location found after 10 attempts"
The search radius may be too large, the blocked-biomes list too restrictive, or the world too sparse (especially the End). Increase max-attempts, reduce blocked-biomes, or shrink the radius.
"You do not have permission for this world"
The player lacks the specific world permission. Grant essentialsc.rtp.world.<key> matching the config key, or essentialsc.rtp.world.* for all worlds.
Cooldown not resetting
Cooldowns are stored in-memory and reset on server restart. If a player reports cooldown issues, check that rtp.cooldown is not set to an unexpectedly high value.
Nether RTP falling into lava
The Nether search algorithm skips lava, cactus, fire, and magma blocks, but may find locations above lava lakes. Increase min-y for the Nether or add crimson_forest and warped_forest to blocked-biomes for safer results.
GUI not updating player counts
The GUI refreshes every second. If counts appear stuck, the player may have closed and reopened the GUI too quickly. The refresh task cleans up on inventory close.
World border blocking all locations
If use-world-border: true and the border is very small, most random coordinates will be outside it. Either disable world border checking or expand the border.