Home›Java›Mods›Roam | Random Wild Teleport
Roam | Random Wild Teleport
ModsJava

Roam | Random Wild Teleport

Java mod listed for Minecraft 1.20–26.x. Download on the author's site.

⬇ Download on Spigot
Roam
Async, GUI-driven random teleport for Paper / Purpur / Folia
The wild has never been one click away.

Source-available · Folia-native · 1.20.1 → 26.3 · Even 16-direction spread · 12 claim plugins · Iris + TerraformGenerator · 7 languages​

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━​

Important — server software requirements

Roam requires Paper, Purpur, or Folia. Spigot is not supported — Roam relies on Paper's Adventure API, async chunk loading, and Folia's region / global / async schedulers, none of which Spigot exposes. If you are on Spigot, switch to Paper first (it is a drop-in replacement).

Supported Minecraft range: 1.20.1 → 1.21.11 → 26.1.x → 26.2 → 26.3 — twenty releases, one jar.
(Paper rebranded its versioning after 1.21.11 — there is no 1.21.12; the next stable is 26.1.0.)

Java runtime: whatever your Minecraft version needs, not Roam — 17 for 1.20.1–1.20.4, 21 for 1.20.5–1.21.11, 25 for 26.x. Roam's own bytecode targets 17, so it never raises your floor.

Forward compatibility is verified, not assumed. Every build runs a checker that walks each API reference the shipped jar makes and resolves it against a target server API's full classpath, failing on removed members and on class/interface flips (the trap that broke Biome, Sound and InventoryView mid-range). The current jar is verified clean against all twenty published releases in the range, and was tested live on Paper 26.3.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━​

Why Roam

Production-grade performance — measured at 0.91 % server-thread CPU on a live multi-world Folia node (Spark profiler). The two main hotspots are the command dispatcher (0.51 %, proportional to /rtp usage) and the Folia region scheduler returning to the player thread (0.40 %). No hidden overhead, no idle loops, no memory leaks.

Searches that do not generate the world away — vanilla biome pre-filter, a server-wide chunk-load limit and several columns checked per chunk. Load test on a fixed seed:

Even spread over the whole zone NEW — with distribution: spread, consecutive /rtps walk an outward spiral shared by the whole server: 16 directions per lap, one distance ring further out each lap, 64 cells before a repeat. No more players clustering where land is easiest to find. Never makes an RTP fail, and grows on its own with your radius. Off by default.

Async parallel candidate search — multiple candidates evaluated concurrently (configurable 1–16). Cuts p95 latency from 5–10 s (sequential) to 1–2 s on dense or heavily-claimed worlds.

Adaptive self-tuning — an MSPT probe throttles background generation to zero under load and clamps search parallelism, so /rtp never piles chunk loads onto a struggling tick loop. Each world learns its own search difficulty.

Folia-native architecture — region, global and async schedulers throughout. Lazy-expiry concurrent maps, no per-player tasks running on region threads.

Exploration-gated biome unlocks — opt-in progression mode: players must physically discover a biome before /rtp biome will take them there. First contact fires an advancement toast, a chat notice and a sound. No other RTP plugin ships this.

12 region / claim plugins — WorldGuard, GriefPrevention, GriefDefender, Lands, RedProtect, Residence, Towny, Factions (FactionsUUID, Saber, Kitteh-fork), KingdomsX, HuskClaims, HuskTowns, CrashClaim. Owner-aware bypass on 8 of them.

Custom generator support — Iris (auto-detects the biome registry from IrisDimension) and TerraformGenerator (full BiomeBank exposure: SCARLET_FOREST, BADLANDS_CANYON, ~85 biomes). Fully reflective; degrades gracefully when absent.

Built-in interactive GUI — chest menus with biome selector, favorites, history, stats and world selection, plus an admin menu that edits per-world settings in-game. No addons required. Every string lives in gui_<lang>.yml.

Three storage backends — YAML (default), SQLite and MariaDB. Drivers are shaded; cooldowns and cache persist across restarts on SQL, writes survive a database outage, and Roam falls back to YAML if SQL is unavailable.

Seven languages bundled — chat and GUI: English, Spanish, Brazilian Portuguese, Russian, Simplified Chinese, Romanian, German. Custom locales supported; MiniMessage and legacy & colour codes.

Source-available — fully readable, buildable and modifiable. Premium-level engineering at no cost.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━​

Top features at a glance

Biome collection GUI — undiscovered biomes render as sealed crystal cards that flip to each biome's own icon once explored, with curated textured heads, a description and a "You'll find:" line per biome. Cave biomes ( lush_caves, dripstone_caves) and the new 26.3 Dappled Forest included.

Economy integration (Vault) — optional cost per RTP, per-world overrides and permission-based free tiers.

First-join RTP — teleports new players into the wild, with temporary damage immunity on arrival.

Custom locations / presets — admin-defined named anchors with per-point spread and weighted random selection; /rtp location <name> targets one directly.

Per-permission RTP setups — different zones, worlds, cooldowns and costs for VIP or premium ranks without duplicating configs.

Cooldown tier permissions — roam.cooldown.<seconds> (lowest value wins) and roam.cooldown.reduction.<%> with HIGHEST, ADDITIVE or MULTIPLICATIVE stacking.

Demand-gated location cache — idle worlds stop generating terrain in the background; with warm chunks, a cache hit costs a disk read instead of a generation, making /rtp effectively instant.

Sign-based RTP — place a [RTP] sign and right-click to teleport. Automatic cyan rewrite prevents conflicts with vanilla text.

Citizens NPC integration — click-to-RTP NPCs with RANDOM, BIOME, GUI and WORLD_PICKER modes. No extra plugins.

Post-teleport invulnerability — short damage-immunity window with PvP-safe logic (cancels on attack in both directions).

Audit log — optional append-only CSV-style log of every RTP. Thread-safe, Folia-compatible, player names escaped.

Density radar — /rtp check runs a sample search without cooldown or cost, so players can preview RTP density before teleporting.

Hunger gate — optional requirement ( global.require-hunger: <0..20>) for survival or roleplay servers.

EssentialsX /back integration — one back-stack shared between Roam and EssentialsX.

HMCCosmetics compatibility — never teleports players while they edit cosmetics.

CombatLogX compatibility — blocks /rtp while players are combat-tagged.

Public API + events — gg.roam.api for developers, including 3 cancellable events.

PlaceholderAPI support — 9 placeholders (cooldown state, history count, total RTPs, distance, discovered biomes, last biome and more).

Anonymous bStats metrics — custom charts; disable via plugins/bStats/config.yml.

Built-in update checker — GitLab Releases API with a 6-hour cache. Operators only, console notice, no nag spam.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━​

Spoiler: Compared to other RTP plugins
✔ = first-class built-in · ~ = indirect (addon, partial or separate library) · ✗ = not available

Roam vs BetterRTP vs Essentials /rtp

▸ Async parallel search — Roam ✔ 1–16 candidates · BetterRTP ~ single-threaded · Essentials ✗
▸ Even direction / distance spread — Roam ✔ 16-direction outward spiral · BetterRTP ✗ · Essentials ✗
▸ Folia support — Roam ✔ native · BetterRTP ✗ · Essentials ✗
▸ Verified version range (build gate) — Roam ✔ 20 releases, one jar · BetterRTP ✗ · Essentials ✗
▸ Adaptive load throttling — Roam ✔ MSPT probe, per-world tuning · BetterRTP ✗ · Essentials ✗
▸ Built-in GUI — Roam ✔ player + admin menus · BetterRTP ~ addon required · Essentials ✗
▸ Exploration-gated biome unlocks — Roam ✔ toast + chat + sound · BetterRTP ✗ · Essentials ✗
▸ Biome collection GUI — Roam ✔ textured heads, progress counter · BetterRTP ✗ · Essentials ✗
▸ Economy integration (Vault) — Roam ✔ per-world + tiers · BetterRTP ✔ · Essentials ✗
▸ First-join RTP — Roam ✔ + arrival invulnerability · BetterRTP ✔ · Essentials ✗
▸ Custom locations / presets — Roam ✔ weighted + targeted · BetterRTP ✔ named · Essentials ✗
▸ World overrides (nether → overworld) — Roam ✔ · BetterRTP ✔ · Essentials ✗
▸ Permission tiers / groups — Roam ✔ setups + tiered cooldowns · BetterRTP ✔ · Essentials ✗
▸ Biome-targeted RTP — Roam ✔ vanilla + caves + Iris + TerraformGenerator · BetterRTP ✔ vanilla · Essentials ✗
▸ Region / claim awareness — Roam ✔ 12 plugins, owner + trusted bypass · BetterRTP ✔ generic · Essentials ✗
▸ WorldGuard custom flag — Roam ✔ roam-deny + flag-only mode · BetterRTP ✗ · Essentials ✗
▸ Pre-warmed location cache — Roam ✔ SQL-persistable, demand-gated · BetterRTP ✗ · Essentials ✗
▸ Chunk preload — Roam ✔ two-phase, configurable radius · BetterRTP ~ via PaperLib · Essentials ✗
▸ Storage backend — Roam ✔ YAML / SQLite / MariaDB · BetterRTP YAML · Essentials YAML
▸ Audit log — Roam ✔ Folia-safe CSV · BetterRTP ✗ · Essentials ✗
▸ Density preview / radar — Roam ✔ /rtp check · BetterRTP ✗ · Essentials ✗
▸ Citizens NPC integration — Roam ✔ 4 actions, no addon · BetterRTP ✗ · Essentials ✗
▸ RTP on death — Roam ✔ per-world, bed/anchor respected · BetterRTP ✗ · Essentials ✗
▸ Sign-based RTPs — Roam ✔ cyan anti-collision · BetterRTP ✔ · Essentials ✗
▸ Cross-dimension biome validation — Roam ✔ refuses with hint · BetterRTP ✗ · Essentials ✗
▸ Action-bar feedback — Roam ✔ search + warmup · BetterRTP ✗ · Essentials ✗
▸ Built-in update checker — Roam ✔ GitLab releases · BetterRTP ✔ · Essentials ✗
▸ Three cooldown stacking modes — Roam ✔ HIGHEST / ADDITIVE / MULTIPLICATIVE · BetterRTP ✗ · Essentials ✗
▸ Live config edit (no /reload) — Roam ✔ /roamadmin edit + admin menu · BetterRTP ✔ /rtp edit · Essentials ✗
▸ Hunger gate — Roam ✔ · BetterRTP ✗ · Essentials ✗
▸ Public API + cancellable events — Roam ✔ · BetterRTP ~ internal · Essentials ✗

Spoiler: Installation
1. Drop Roam-<version>.jar into your plugins/ folder. Paper, Purpur or Folia, 1.20.1 → 26.3.

2. Start the server once. Roam writes a default config, seven message files and seven GUI files into plugins/Roam/.

3. (Optional) Install soft-depends — Vault, PlaceholderAPI, EssentialsX, Iris, TerraformGenerator, Chunky, Citizens, HMCCosmetics, CombatLogX, any of the 12 region-protection plugins. Roam picks them up on the next restart and the startup banner reports which hooks are live.

4. Edit plugins/Roam/config.yml: add a worlds.<your-world-name> block (or rename the default), set biome-finder.enabled: true for the biome finder, distribution: spread for an even spread, and storage.type: SQLITE for zero-setup persistence.

5. /roamadmin reload (or restart). Run /rtp in-game to verify; /roamadmin info prints active hooks and the storage backend.

Spoiler: Commands
Player commands

▸ /rtp — instant random teleport (or open the GUI, depending on gui.open-on-command)
▸ /rtp <world> — RTP within a specific world
▸ /rtp <player> [world] — RTP another player (requires roam.others)
▸ /rtp gui (alias menu) — force-open the GUI
▸ /rtp biome [name] (alias biomes) — no name opens the biome collection GUI; with a name, teleports to that biome
▸ /rtp location [name] (alias loc) — list or teleport to an admin-defined preset
▸ /rtp back — return to your last RTP location
▸ /rtp save <name> — save the current location as a favorite
▸ /rtp del <name> — delete a favorite
▸ /rtp go <favorite> — teleport to one of your favorites
▸ /rtp favorites · /rtp history · /rtp stats — your favorites, history and stats
▸ /rtp check [world] (alias radar) — pre-flight density radar; sample search, no cooldown or charge

Admin commands

▸ /roamadmin gui (alias menu) — admin menu: pick a world, click its settings
▸ /roamadmin reload (or /rtp reload) — reload config and language files
▸ /roamadmin version — print the plugin version
▸ /roamadmin info — active hooks, region integrations, storage backend, world count
▸ /roamadmin resetcooldown <player> — clear a player's persistent cooldown
▸ /roamadmin unstick <player> — force-clear stuck teleport state
▸ /roamadmin pregen <world> — delegate to Chunky to pre-generate the configured RTP zone
▸ /roamadmin edit <world> <field> <value> — live-edit per-world config without /reload (world name validated)
▸ /roamadmin testsearch <world> — dry-run the real search and print the result with reject telemetry; works from console and RCON

Aliases: /wild, /randomtp, /wilderness, /roam

Tab-completion is permission- and context-aware: subcommands, accessible worlds and (with roam.others) online players; second-argument suggestions adapt per subcommand — biomes filtered by source mode and unlock state, favorites scoped to the player, and so on.

Spoiler: Permissions
Core

▸ roam.use — default true — use /rtp
▸ roam.biome — default true — use the biome finder
▸ roam.biome.bypass-unlock — default op — target biomes without discovering them first
▸ roam.back — default true — /rtp back
▸ roam.favorites — default true — save and use favorites
▸ roam.world.<name> — default true — per-world access (roam.world.* for all)
▸ roam.location.<name> — default true (wildcard) — use a preset with /rtp location
▸ roam.check — default true — use /rtp check
▸ roam.others — default op — teleport other players
▸ roam.update-notify — default op — in-game notice when a newer release exists
▸ roam.admin — default op — admin commands

Bypasses

▸ roam.bypass.cooldown — default op — skip cooldown
▸ roam.bypass.warmup — default op — skip the warmup countdown
▸ roam.bypass.cost — default op — skip economy cost
▸ roam.bypass.favorites — default op — skip the favorites cap
▸ roam.bypass.combat — default op — skip the CombatLogX block
▸ roam.bypass.hunger — default op — skip the hunger gate
▸ roam.bypass.region.<id> — default op — land inside a specific claim system (roam.bypass.region.* for all)
▸ roam.bypass.region.own — default true — land inside your own claims
▸ roam.bypass.region.trusted — default true — land inside claims where you are a trusted member

Tiers and signs

▸ roam.cooldown.<seconds> — tier override; the smallest matching number wins
▸ roam.cooldown.reduction.<%> — percent reduction, combined per cooldown.reduction-stacking
▸ roam.setup.<id> — gate for a per-permission setup defined under setups:
▸ roam.sign.create — default op — place an [RTP] sign
▸ roam.sign.use — default true — right-click an RTP sign

Spoiler: Version-range safety
The failure mode it prevents. Paper occasionally converts an enum into an interface — Biome and Sound in 1.21.5, InventoryView in 1.21. A call compiled against the enum form is emitted as an invoke against a class; on a server shipping the interface the JVM refuses to link it and throws IncompatibleClassChangeError. That is an Error, not an Exception, so ordinary defensive catch blocks do not contain it — the command breaks outright instead of degrading.

The gate. A checker walks every reference the shipped jar makes into the server API and resolves it against a target API's full classpath, failing on removed members and on class/interface flips. It runs in CI on every push, and a sweep mode checks every published release in the range rather than just the endpoints — which matters, because InventoryView breaks in the middle of the range while both ends look clean.

Verified clean against: 1.20.1 · 1.20.2 · 1.20.3 · 1.20.4 · 1.20.5 · 1.20.6 · 1.21 · 1.21.1 · 1.21.3 · 1.21.4 · 1.21.5 · 1.21.6 · 1.21.7 · 1.21.8 · 1.21.9 · 1.21.10 · 1.21.11 · 26.1.2 · 26.2 · 26.3

Biome and sound identities are resolved through the server registries rather than enum constants, so the same SCREAMING_SNAKE names work across the whole range — your biome-blacklist entries and /rtp biome arguments mean the same thing on 1.20.1 and on 26.3.

Spoiler: Engineering and quality details
Async and concurrency

▸ Parallel candidate search — N candidates evaluated simultaneously. First safe wins; the rest become no-ops.
▸ Vanilla biome pre-filter and Iris fast-path — water and biome checks run against the generator's own noise instead of generating a chunk per rejected candidate.
▸ Server-wide chunk-load limit and several columns per chunk — crowds of /rtp never pile up chunk generations.
▸ Two-phase chunk preload — teleports wait only on the 9 chunks around the player; the outer ring loads after arrival.
▸ Folia-first scheduling — a single Scheduler utility picks RegionScheduler, AsyncScheduler or GlobalRegionScheduler when available, and falls back to Bukkit otherwise.
▸ Lazy-expiry concurrent maps — invulnerability state is evicted on first read after the deadline; no per-player removal task on region threads.
▸ Async data flush with dirty-flag tracking — favorites / history / stats writes mark entries dirty; one async flush every 30 s coalesces all dirty players. Reads always hit memory.

Storage layer

▸ Composite per-world cooldown key — (player_uuid, world), so per-world isolation works at the database layer, not just in memory.
▸ Dual-path fallback — if SQL is unreachable at startup, Roam logs a warning, falls back to YAML, and finishes enabling.
▸ Writes survive a database outage — failed SQL writes are retried instead of lost.
▸ Indexed location-cache table — pre-warmed safe locations persist across restarts.
▸ Demand-gated cache — worlds nobody is RTP-ing into stop generating terrain in the background.

Region protection depth

▸ 12 plugins, auto-detected when present. WorldGuard, GriefPrevention and Towny use build-time APIs; the other nine bind reflectively with version-tolerant fallbacks so minor upstream API drift does not require a recompile.
▸ Owner-aware bypass on 8 plugins — GriefPrevention, GriefDefender, Lands, WorldGuard, Residence, Towny, RedProtect, Factions.
▸ Trusted-member bypass — GriefPrevention, GriefDefender, Lands, Towny, WorldGuard, with a per-player roam.bypass.region.trusted toggle.
▸ WorldGuard custom flag — registers the roam-deny StateFlag. With flag-only-mode, only WG regions carrying the flag block RTP.
▸ Per-world hook toggles — disable any of the 12 hooks per world, or region protection entirely (for resource worlds, for example).
▸ Optional LRU + TTL cache of isProtected() results for high-concurrency servers.
▸ Distinct claim-rejection message — teleport-fail-region when 70 % or more of the candidates were rejected by region checks.

Player safeguards

▸ Cross-dimension biome validation — /rtp biome refuses biomes outside the player's dimension, with a clear hint.
▸ The destination is re-checked right before the teleport; paid RTPs are charged only on success.
▸ Wardrobe, combat and hunger gates — each bypassable per permission.
▸ Bed / anchor respawn exclusion from RTP-on-death — players who set a respawn point still respawn there.
▸ Cancel-on-attack covers both directions — invulnerability ends if the protected player takes or deals damage.

Permission tier model

▸ Per-permission setups — setups.<id> blocks override world defaults when the permission is held, resolved in descending priority.
▸ Cooldown tier perms — roam.cooldown.<seconds>; the smallest matching number wins.
▸ Three reduction stacking modes — HIGHEST (best rank wins), ADDITIVE (capped at 100 %), MULTIPLICATIVE (compound on residual, so the cooldown never reaches zero).

Observability

▸ bStats charts — language, platform, per-hook availability, GUI and cache enablement, region-protection presence, active hook count, storage backend.
▸ Built-in update checker — GitLab Releases API plus a 6-hour on-disk cache. Op-only console notice.
▸ Audit log — Folia-safe synchronised writer, CSV-escaped player names, reopened on /roamadmin reload for external rotation.
▸ /roamadmin info and /roamadmin testsearch — single-command diagnostics; testsearch prints why candidates were rejected.
▸ /roamadmin edit and the admin menu — live mutation of 12+ per-world fields, world name validated.
▸ Coloured ASCII startup banner with version, world count and a per-hook checkmark; matching shutdown banner.

Spoiler: Even spread — distribution: spread
Opt-in per world via distribution: spread (circle shape). Default is random, so nothing changes on update.

With independent random draws, directions with more water, or with areas the search has learnt to skip (claims, rough terrain), quietly get far fewer RTPs — on a live server, 81 RTPs gave 18 to the south-east and only 3 to the north-west.

With spread, consecutive /rtps walk an outward spiral shared by the whole server:

▸ 16 directions per lap, one every 22.5°.
▸ 4 distance rings between min-radius and max-radius; each lap goes one ring further out, then back to the inner ring — 64 cells before a repeat.
▸ A search spends 60 % of its attempts inside its cell, then keeps looking in the whole zone, so it never makes an RTP fail.
▸ The cells are computed from the current radius, so raising max-radius widens the spiral on its own.
▸ Biome searches and the square shape keep the plain random draw.

Spoiler: Biome unlocks — exploration-gated /rtp
Opt-in via biome-finder.unlock.enabled: true. Off by default — nothing about /rtp biome changes unless you turn it on.

With unlocks active, /rtp biome only accepts biomes the player has physically passed through. Walking into a new biome fires an advancement-style toast, a chat notice and a sound, and unlocks it permanently.

▸ The GUI becomes a collection — undiscovered biomes render as sealed amethyst crystals that shatter into each biome's own block (or a custom head) as players explore, with a description and a "You'll find:" line on every card.
▸ Locked biomes are hidden from tab-complete; staff can bypass with roam.biome.bypass-unlock.
▸ Works on vanilla, Iris and TerraformGenerator biomes alike.

Spoiler: GUI customization
Every player-facing string in the chest menus lives in gui_<lang>.yml, not in code — and the GUI is part of the translation set, so one language: setting switches chat and menus together. Translate, rebrand or rewrite without recompiling:

▸ Inventory titles for each menu (main, biome picker, favorites, history, stats, admin)
▸ Item names and lore for every button
▸ Pagination strings
▸ World environment labels (OVERWORLD / NETHER / THE_END)
▸ Biome-source labels (Iris pack biome / TerraformGenerator biome)

Click routing is tag-based, so you can rewrite titles freely without breaking it.

Spoiler: Languages
Roam ships with seven translations bundled — chat and GUI:

▸ en — English (default) — messages_en.yml + gui_en.yml
▸ es — Español — messages_es.yml + gui_es.yml
▸ pt_BR — Português do Brasil — messages_pt_BR.yml + gui_pt_BR.yml
▸ ru — Русский — messages_ru.yml + gui_ru.yml
▸ zh_CN — 简体中文 — messages_zh_CN.yml + gui_zh_CN.yml
▸ ro — Română — messages_ro.yml + gui_ro.yml
▸ de — Deutsch — messages_de.yml + gui_de.yml

Drop in your own locale with the same file names. Contributions of new languages welcome.

Spoiler: Configuration example
Code (Text):

global:
  warmup: 3              # seconds before teleport
  cooldown: 300          # per-player cooldown in seconds
  search-parallelism: 4  # parallel candidates (1-16)
  cancel-on-damage: true
  cancel-on-move: true
  post-teleport-invulnerability:
    enabled: true
    duration-seconds: 5

data:
  first-join-rtp:
    enabled: false       # opt-in: RTP first-time joiners
    world: "world"
  audit-log:
    enabled: false       # append-only RTP log

biome-finder:
  enabled: false         # opt-in
  source: AUTO           # AUTO | IRIS_ONLY | TERRAFORM_ONLY | VANILLA_ONLY | MIXED
  max-radius: 10000

worlds:
  world:
    enabled: true
    shape: circle        # circle (default) | square
    distribution: random # random (default) | spread
    min-radius: 100
    max-radius: 5000
    respect-world-border: true
    biome-blacklist: [OCEAN, RIVER, FROZEN_OCEAN]

storage:
  type: NONE             # NONE | SQLITE | MARIADB

language: en             # en | es | pt_BR | ru | zh_CN | ro | de
 

Spoiler: Developer API
Roam exposes a small, stable API in the gg.roam.api package:

Code (Text):

import gg.roam.api.RoamAPI;
import gg.roam.api.RoamProvider;

RoamAPI roam = RoamProvider.get();
if (roam != null) {
    roam.randomTeleport(player);
}
 
Three cancellable Bukkit events:

▸ RoamPreTeleportEvent — before the search starts. The cheapest veto point. Use setCancelReason(String) for custom messages.
▸ RoamLocationFoundEvent — after a safe location is found, before the chunk preload. Mutable destination via setLocation().
▸ RoamPostTeleportEvent — after the player has arrived. Use it for achievements, audit or after-effects. Fires on the player's region thread on Folia.

The API follows semver. Methods are added between minor releases and never removed or signature-changed without a major bump. Check getApiVersion() for capability branching.

Spoiler: Soft-depend integrations
Detected automatically on enable; absent integrations degrade gracefully, with no errors and no console spam. The startup banner reports which hooks are live.

Region / claim plugins (12)
WorldGuard, GriefPrevention, GriefDefender, Lands, RedProtect, Residence, Towny, Factions (FactionsUUID + Saber + Kitteh-fork), KingdomsX, HuskClaims, HuskTowns, CrashClaim

Everything else
Vault, PlaceholderAPI, EssentialsX, Iris, TerraformGenerator, Chunky, Citizens, HMCCosmetics, CombatLogX

The Iris integration is flagged experimental: it works without server lag, but chunk loading on Iris teleports is still slow. Mitigations are documented in the README.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━​

Support

▸ Bug reports and feature requests: GitLab issue tracker
▸ Source code: gitlab.com/naren.sanchez.h/roam
▸ Full changelog: CHANGELOG.md
▸ Security issues: email [email protected] (please don't file public issues for security)

License

Roam is source-available, not open-source.
Free to: install, run and modify on your own server (commercial servers included).
Not allowed: redistribution or publishing a fork as a product.
Full terms: EULA (English) · EULA (Español)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Made with care by Naren Sánchez
Built for the FrontierCraft network and battle-tested in production.

The wild, one click away.​
Quick facts

Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.

Roam | Random Wild Teleport is a free Minecraft Java mod. Compatible with Minecraft 1.20, 1.20.6, 1.21, 26.1 and newer. Downloaded 148 times (via Spigot). Download it and open it directly in the game.

Explore more