Tags
Creators
Details
3.3.0
Compatibility
Required content
Changes
Upgrade note.
rtp.servers.*now defaults totrueinstead ofop, so in network mode every player can reach open cross-server regions; restrict with negative permissions if you relied on the old default.CIRCLEandSQUAREnow use new selection engines that ignoreweight; useCIRCLE_DEPRECATED_PURE_SPIRALorSQUARE_DEPRECATED_PURE_SPIRALto keep the 3.2.1 behavior. Region shapes now default tomode: REROLLinstead ofACCUMULATE; files that setmodekeep their value. Inconfig.yml,defaults.shape.uniquePlacementsnow defaults to"auto"(a radius matching the view distance) instead of0, anddefaults.spatialResolutionto"auto"(scaled to the region's size) instead of3; set0and3to keep the 3.2.1 values. Both jars now load on Minecraft 1.18 or newer with Java 17 or newer; the Lite jar no longer loads on 1.13 - 1.17. Folia is supported only from 1.21.11; older Folia still loads the jar but is no longer supported. Saved memory and region cache files from 3.2.1 still load, but RTP rewrites them in a new format at the next save or shutdown, and 3.2.1 can't read that format, so back upplugins/RTP/if you may need to roll back.
Added
-
Runs on Spigot and Paper 1.18 - 1.20.6, and on Java 17 (ADR-113). The full jar now loads on Spigot and Paper 1.18 through 1.20.6, and Fabric 1.20.1 servers can run it on Java 17. These older versions are best-effort and are not covered by automated tests. NeoForge still needs 1.21.1 or newer, and Fabric 1.20.2 - 1.20.6 is not supported. Folia is supported from 1.21.11: it is experimental and only its current builds are maintained, so older Folia builds are not supported and can crash on their own. Bug reports are accepted for Minecraft 1.21.11 through the latest release; the per-version status is in the support matrix.
-
Tag exclusions in
safety.yml(ADR-017). Remove entries from a block tag instead of listing every variant by hand, e.g.#minecraft:slabs - OAK_SLAB. -
Actions. Script multi-step teleports in YAML: what happens before, during and after the teleport, what to do on failure or timeout, and conditions that must pass first (permission, balance, cooldown, world, biome, time, server load and more). Destinations can be anchored to a player, a claim, a faction or a world center, and teams can be placed together. Walk-in triggers start an action when a player enters a zone. Commands:
/rtp action(rtp.action;/rtp triggerand/rtp runare other names for it),/rtp action cancel(rtp.action.cancel) and/rtp back(rtp.back). The bundled action addon ships ready-made modes such as arena, KOTH, scatter and teams. -
Web config editor (
/rtp editor). Edit RTP's configs in a browser and apply the changes back to the server. Permission:rtp.editor. The region map shows the land of every loaded world, including the nether and the end, and a region's world can be picked from the worlds the server detected. Passwords, tokens and other secrets are redacted before anything leaves the server and are never overwritten by the editor. Only config files inside the plugin folder can be written, and a browser must be trusted before it can apply changes (revoke with/rtp editor untrust; optional expiry witheditor.trust.maxAgeDaysinadvanced/network.yml). -
Import from other RTP plugins (
/rtp config import, ADR-066). Reads another random-teleport plugin's config folder, such as BetterRTP, JustRTP or EzRTP, by recognizing common config layouts, and moves over worlds, radius, shape, cooldowns, prices, database, effects and JustRTP zones. Permission:rtp.config. The old plugin doesn't need to be installed. Existing files are only replaced withoverwrite=true, and are backed up first./rtp config import permissionsprints LuckPerms commands that map BetterRTP, JustRTP and EzRTP permission nodes to RTP's. -
Setup wizard (
/rtp admin setup). A guided first-time setup in chat or the console: world, gameplay, performance, preview, confirm. Your config is backed up before anything is written. Permission:rtp.admin.setup. -
Teleport near your own claim or faction. Actions can pick destinations around the player's land, with Towny, GriefPrevention and SaberFactions/FactionsUUID supported through the bundled claim addon. The search center stays put through small land changes, and terrain already known to be bad is reused so new searches start fast.
-
Selection heatmap and pipeline views (
/rtp visualization heatmap,/rtp visualization pipeline). See on the in-game map where destinations land and how the search moves through a region. Permission:rtp.menu.admin. -
More claim plugins. The bundled claim addon also keeps players out of HuskTowns, PlotSquared, UltimateClaims and MinePlots land.
-
Minecraft 26.3 on Fabric. The Fabric jar also runs on 26.3 servers.
-
Holograms. Status and pre-teleport text can be shown as holograms, using built-in text displays on 1.19.4+ or DecentHolograms / HolographicDisplays.
-
New engines for
CIRCLEandSQUARE(ADR-085, ADR-088). Picks spread evenly by area and never repeat a chunk within a pass. Inmode: REROLLplayers are kept several chunks apart without using up the region, soexpand: falseregions never run out; very narrow strips of land on internal cell borders may be skipped. Bad-land memory is smaller and faster, and its saved files are up to a third smaller.weightno longer applies; the old shapes remain as*_DEPRECATED_PURE_SPIRAL. -
Commands as teleport effects, and a
deathstage (effects-api-ADR-007). Run console or player commands at any teleport stage, with player and location placeholders. The newdeathstage runs effects when a player dies. -
Claim and spacing rejections expire (ADR-079). Land rejected for a reason that can change, such as a claim or another player nearby, is retried after the time set in
advanced/ttl.ymlinstead of being avoided forever. Bad terrain is still remembered permanently. -
Units in configs and commands. Write
radius: 5km,teleportCooldown: 2h30morcacheCap: 256mb. Distance, time and size units are supported; plain numbers keep their old meaning. -
World border check. RTP warns when a region reaches past the world border and keeps destinations inside it.
-
API on Maven Central.
rtp-api,rtp-coreand the API libraries they depend on, such ascommands-apiandeffects-api, are published to Maven Central. Platform jars are not. -
For addon developers. New
rtp-apisurfaces for actions, claim boundaries (ClaimBoundaryProvider), web editor extensions (EditorExtensionRegistry, ADR-107; tabs are built from the editor's own widgets, so no addon code runs in the browser, and no bundled addon uses them yet), and extra region-file formats (RegionFormatRegistry, ADR-077; RTP itself reads only Anvil.mcaand loads other formats such as.linearasynchronously).
Changed
-
RTP is now MIT-licensed in full (ADR-108). The PolyForm Noncommercial terms on non-core source (ADR-061) are withdrawn. Free and Pro jars are both MIT; Pro is a support tier and grants no extra licence. Earlier releases keep the licence they shipped with.
-
Location queues renamed to hot, cold and backlog (ADR-078). The
L1/L2/L3names in/rtp infoand the docs now say what each queue holds. Queues always release the chunks of locations they drop. -
Background search loads far fewer chunks (ADR-110). Filling the location queues first checks chunks that are already loaded or saved on disk. Only locations held ready for teleport get their surrounding view-distance area preloaded. Other spots load just the landing chunk and its safety neighbours, so the cache still fills on fresh, unexplored worlds. Those chunks are checked as they load and RTP doesn't keep them loaded. Fill pauses while the server is short on memory.
-
The backlog queue never loads chunks and feeds the cold queue (ADR-028). Backlog picks the region-file pre-check accepts move into the cold queue with no chunk load. Picks it cannot read from disk, such as ungenerated land, are checked one at a time by the background search instead of being passed on unchecked. Backlog picks fill within each pulse's time budget (
asyncAllottedTime, keeping 20% spare for other work). The backlog count in/rtp infoshows only locations the region-file pre-check accepted; rejected picks are dropped straight away. -
Queued locations are fully checked before a player gets one (S-001, S-003). When a cold location is promoted to the ready queue, RTP now checks the world border, biome filter, safety radius and claim plugins on the loaded chunk, after finding the landing height. Locations from the backlog or the database used to skip these checks, so a player could land in a claim or a filtered biome.
-
Region-file pre-check tunes itself (ADR-109). RTP measures, per region, whether reading candidates straight from region files saves time and turns the pre-check on or off accordingly. Nothing to configure.
-
Faster region-file access (ADR-016). Checks against the same region file are batched so each file is opened once instead of once per chunk, read buffers are reused, and save detection no longer hits the file system on every lookup.
-
Paper picks sync or async teleport per teleport (ADR-005). Teleports to an already-loaded chunk happen immediately; all others load the chunk off the main thread first. Set
teleportPath: ASYNCinadvanced/performance.ymlto always use async. -
Less main-thread work per teleport on Paper, Spigot and Folia. Block-name lookups are cached and the arrival-schematic check no longer touches the disk on every teleport.
-
Tidier shipped config files. Comments are clearly attached to their settings and stay attached when RTP rewrites a file (ADR-042), and long comments that cluttered menu tooltips are shortened.
-
REROLLis the default selection mode.CIRCLE,SQUARE,ELLIPSEandRECTANGLE, and the shippedconfig.ymlin every language, now usemode: REROLL: no spot repeats until the shuffle has cycled and back-to-back spacing stays exact, at the cost of one in-memory check per known-bad chunk.ACCUMULATEstays available for regions that need every draw to be a guaranteed O(1). Regions that setmodekeep their value. -
All memory shapes share one selection routine. Shapes had drifted apart in how they handle bad land,
modeanduniqueplacements(see Fixed); they now behave consistently. -
ELLIPSEturns offexpand: truewith a one-time warning, asPOLYGONalready did. Expanding pushed picks outside the ellipse, where they were rejected. -
bStats on every platform, without a bundled bStats library. Fabric and NeoForge now report too. RTP uses its own small, dependency-free client (bstats-api-ADR-001), keeping the same data, opt-out and server ID on Paper, Spigot and Folia.
-
RTP leaves more of each tick to the server and other plugins.
syncAllottedTimenow defaults to 5 ms andasyncAllottedTimeto 25 ms, and both are capped at 25 ms. Queued commands, scripted actions and promotion checks for ready-queue locations now count againstsyncAllottedTime, and RTP starts at most 8 chunk loads per region per refill. On Fabric and NeoForge, RTP's end-of-tick work stops atsyncAllottedTimeand background work uses at most half the CPU cores.periodnow means ticks between refills of the same region. -
minTPSnow pauses background cache filling, and the newmaxMSPTsetting (default 45 ms) pauses it when ticks run long even though TPS still reads 20. Players already waiting are still served. On Folia the server-wide pause uses the mean TPS across regions, and a slow region is handled on its own: RTP runs one background task per tick there and fills from other regions instead. -
Folia divides RTP's work across region threads instead of stacking it on one. Under heavy
/rtpload one region could fall to about 1.4 TPS while the mean stayed near 19 (ADR-112).- Location checks, retries, claim checks and teleport setup that followed a chunk load now continue on async workers instead of the region thread that loaded the chunk.
- RTP's work for each region runs in order, within
syncAllottedTimeper region thread; anything left waits behind other regions until that region's next tick. - Regions that are slow or backed up get one RTP task per tick, and the ready queue fills from other regions meanwhile.
- The limit on concurrent region tasks applies to every kind of region task, and work waiting for a slot runs in order instead of polling.
- Folia task queues now always run at least one task per pulse and stop inline work once their time budget is spent. Cold-cache refill per region turn is no longer limited to two tasks.
-
For addon developers.
rtp-api,rtp-coreand the shared API modules they pull in (commands-api,effects-api,maps-api,metrics-api,anvil-api,yaml-api,bstats-api) are compiled to Java 17 bytecode (ADR-113), so addons that build against them can target Java 17. The bundled addons are Java 17 too.
Deprecated
- For addon developers.
PaletteIdentifierNormalizerinrtp-apiis deprecated; use the one inanvil-api.
Removed
-
Party and tether addons. LeafRTPPartyAddon and LeafRTPTetherAddon are no longer built. For group teleports, use the action addon's
teamsandscattermodes. -
For addon developers. The Bukkit-only classes in
commands-api(BukkitCommand,BukkitCommandRegistrar,BukkitParameter,StringCommandDispatcher,BukkitTreeCommandand theLocalParameterspackage) and itsplugin.ymlare removed; use the platform-neutralcommandsapi.commonandcommandsapi.brigadierpackages. The Bukkit command classes andplugin.ymlineffects-apiare removed too. The Fabric effect classes inio.github.dailystruggle.effectsapi.fabricmoved out ofeffects-apitoio.github.dailystruggle.rtp.fabric.effectsin the Fabric adapter, soeffects-apino longer needs a Minecraft or Fabric classpath.
Fixed
-
Moving during the
/rtpwarmup now cancels the teleport. Walking farther thancancelDistanceduringteleportDelaywas ignored for/rtp, because the player's starting position was never recorded, so the teleport went ahead anyway. -
RTP could freeze Fabric 1.20.1 and 1.21.1 servers and run them out of memory. Each chunk load added a chunk ticket that kept a large area around the candidate loaded and was never released, so the server kept generating chunks, partly on the main thread. Loaded chunks were also read as missing, so no locations were found there. Tickets now cover only the area RTP needs and are released after use, and chunks load off the main thread.
-
On Fabric 1.21.5 through 1.21.11, RTP read every chunk it loaded as missing and could release a cached location's chunk early. Chunk results are now read correctly, and the temporary load ticket no longer removes the ticket that keeps a cached location loaded. Chunk loads now always use the non-blocking path, so they can't stall the main thread.
-
Arriving players could trigger a main-thread chunk load. On servers that unload chunks immediately, the landing chunk could unload just before the player arrived. It now stays loaded briefly after a teleport.
-
Background safety checks read whole region files to inspect one chunk. They now read only that chunk, cutting CPU and memory churn on pregenerated worlds.
-
Teleports could stall under heavy load because config reads contended on a shared lock (ADR-094). Reads are now lock-free and reloads switch over in one step.
-
uniquePlacementscould use up a region withexpand: falsewithin seconds of startup. It now applies only whenexpand: true. -
Reserving chunks around a destination could load them on the main thread on Bukkit, Spigot and Paper. They are now loaded in the background first.
-
Claim protection switched itself off after a single error, so players could land in protected land until a restart. An error now rejects only that one location, and the integration stays active. WorldGuard regions also block landings when RTP's custom flag couldn't be registered.
-
Cross-server
/rtprequests could vanish with multiple proxies sharing a Redis queue, or after a Redis hiccup. Requests are now handed to the proxy that holds the player. -
Some region-file chunks always fell back to a full chunk load. The last chunk of a file that the server hadn't closed yet was treated as unreadable.
-
MySQL and PostgreSQL storage stopped saving after a few minutes because database connections were never returned to the pool.
-
Worlds using
region-file-compression=lz4never got the region-file safety check. -
/rtp scanrejected generated land on Minecraft 26.3 and never finished half-generated chunks. RTP now reads 26.3's block format from region files. Chunks the server saved mid-generation are loaded so the server can finish them, instead of being marked bad. -
lz4-java is no longer bundled. LZ4 region chunks are decoded by RTP's own bounds-checked code, which closes CVE-2025-12183 and CVE-2026-59949 and makes the jar smaller.
-
Corrupt or crafted region chunks could crash the safety check or force huge memory use. Such chunks are now loaded normally instead.
-
The scan land percentage was wrong during scans, and the scan boss bar showed progress in its place. Progress is now
[scan_progress]. -
MSPT on Fabric and NeoForge was stuck at 50 ms or higher. It measured the time between ticks, which includes the server's idle sleep, instead of the time spent in a tick. This also made RTP throttle itself as if the server were overloaded. Expect much lower readings in
/rtp info. -
Shape
modeanduniqueplacementsinconsistencies.modevalues are case-insensitive,NEARESTmode no longer returns known-bad locations or ignoresuniqueplacementsonCIRCLEandELLIPSE,SQUARE_NORMALreadsuniqueplacementsas a radius, and regions usinguniqueplacementsno longer slow down as RTP learns more bad land. -
The
JUMPvertical adjustor discarded whole chunks after a miss in a single column. -
Players who left stayed in memory through their teleport history and boss bars. RTP now keeps only their ID and the data cooldowns need.
-
Fabric on Minecraft 26.x left live chunk loads out of
/rtp info, skipped the top block row, and held chunks the server had unloaded. Live loads are now counted, the height limit includes the top block, and RTP's chunk cache is bounded instead of keeping every chunk it loaded. -
Repeated hex colors showed a stray
&on servers without Adventure. -
syncAllottedTimeandasyncAllottedTimeabove 25 were silently capped, and thehigh-performanceand arena presets wrote 50. The cap is now documented, and the presets use values within it. -
periodrefilled each region one tick early (every 19 ticks atperiod: 20). -
Background area scans could stall a tick thread while waiting for claim plugins to answer.
-
Fabric and NeoForge could start an unlimited number of background threads, and a slow repeating task could run several copies at once.
-
On Folia, delayed tasks ran immediately, cancelled tasks still ran, and one failing task skipped the rest of that tick's queue. Chunk tickets were also changed on the wrong thread. With spark installed, RTP also lost its own TPS readings.
-
/rtp scanprogress lines showed a speed and ETA that jumped wildly between updates (for example 150 cps, then 3,000 cps). They now show the average since the previous progress line. -
/rtp scanstalled for seconds at a time on large pregenerated worlds. RTP re-checked the region file format by listing the whole region folder every 10 seconds; it now detects the format once. -
/rtp scanon circle regions checked chunks outside the circle, and generated them on fresh worlds. These are the corners of the square area the scan walks. It now skips them without recording them, so they no longer count toward land % or toward the learned bad area thatexpanduses. -
On Paper and Folia 26.1 or newer,
/rtp scanand the background search did not recognize pregenerated land and loaded every chunk through the server, which put heavy load on the scheduler. RTP looked for region files in the old folder layout; it now also reads the newworld/dimensions/<namespace>/<name>/region/layout. -
The free jar declares the same permissions as the Pro jar. Its
plugin.ymllackedrtp.version,rtp.biome,rtp.menu.admin,rtp.personalqueueand thertp.onevent.*nodes, so/rtp versionwas op-only and no auto-RTP event permission was declared.
Security
Network mode upgrade note. Upgrade every backend and proxy together: network messages and shared-store records now use a new signed format that older builds can't read. Tokens, queue entries and Redis waitlist entries in the old format are rejected, not migrated, so players waiting in a Redis waitlist from an older build need to run the command again. Network mode now requires a Base64
RTP_NET_SECRETof at least 32 bytes;plugin-message,proxy-cacheandautocan instead run unsigned withnetwork.allowUnsigned: trueinadvanced/network.yml.
-
More network traffic and shared records are signed. Proxy-cache replies, request queues and Redis waitlists are now signed with the network secret too, as Redis heartbeats and reservation tokens already were, all in a new record format, so a modded client or anyone with store access can't inject fake servers, regions or requests. Tampered entries are dropped with a warning.
-
One cross-server request at a time per player. A proxy ignores a new request from a player while their previous one is still being handled.
-
Proxy-direct link hardening. All requests are signed, the listener binds to
127.0.0.1by default, and new settings add an IP allowlist (allowedClients) and TLS with optional client certificates. Connection counts are capped. -
Redis connection options. TLS, ACL usernames (
rediss://user@host) and passwords from environment variables (passwordEnv). A password left in YAML logs a warning. -
Hardened Redis replies. Oversized or deeply nested Redis replies are rejected.
-
RTPAPI.teleportnow checks destination permissions, so menus and addons can't send players to worlds, biomes, regions or servers they lack permission for. ReturnsNO_PERMISSION; addons that relied on bypassing this must grant the permission themselves. -
reg:command patterns are capped at 256 characters, so a crafted pattern from the console or API can't stall the server.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:TZNIQSHX:zsiMgQcP"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:TZNIQSHX:zsiMgQcP"
}

