COWMODSКаталог модов

LeafRTP | Random Teleport

Off-tick random teleport engine with spatial memory

Автор: leaf2614,5 тыс.13обновлён 19 окт. 2026 г.
УправлениеОптимизацияТранспорт

Описание

LeafRTP: Random Teleport

Build Java Platforms Web Editor Coverage Bugs Maintainability

What it is

LeafRTP is a random teleport (RTP) plugin. /rtp or /wild sends a player to a random safe spot inside a region you set. It finds and checks spots ahead of time, reading the world files on disk, and keeps a queue of checked spots ready.

I've worked on it in my own time since 2021. The benchmarks and the test harness are in the repo, and every number on this page can be rerun from them.

One jar for Paper and Spigot (1.18+), Folia (1.21.11+), Fabric (1.20.1 and 1.21+, needs Fabric API) and NeoForge (1.21.1+), up to 26.3. It also loads on Velocity for /rtp across a network.

Web editor: a circular region with an inner exclusion zone drawn over the world map

Drawing where players land, in the browser editor (/rtp editor).

The short version

5 ms median from /rtp to arrival over 4,194 paced teleports (Paper).

  • Efficient: the server stayed at full speed through all 4,194 paced teleports, at up to 20 a second.
  • Fast: 40 teleports per second on Paper and 180 per second on Folia, at full server speed.
  • Distinct: across two Paper 26.2 runs of 4,096 teleports, no two landings were within 48 blocks (closest pair: 70); random picks put about 80 pairs that close in each run.
  • Portable: /rtp config import reads your BetterRTP, JustRTP or EzRTP config, previews it, and never overwrites without overwrite=true.
  • One jar: the same core on Paper, Spigot, Folia, Fabric and NeoForge, and on Velocity for /rtp across a network.
More highlights
  • Peak throughput: 249.7 teleports per second peak on Folia.
  • Web workspace: draw region borders on a map in your browser (/rtp editor). No inbound port needed.
  • Action engine: Scripted teleports that start from a trigger, like stepping into a zone or queueing for a duel.
  • Custom terrain: Spots are read from the region files on disk, including Iris, Terra, datapack and upgraded worlds.
  • Claim checks: 16 claim plugins on Bukkit / Paper / Folia plus FTB Chunks and Open Parties and Claims on Fabric / NeoForge, and the teleport is refused if a check cannot answer. Optional PvP combat-tag check.

Benchmark comparisons and hardware metrics are in Performance.

Common setups

These work without extra plugins:

  • Spawn portals & launch pads: Step-in trigger zones over portal frames or launch pads run teleports, with an optional countdown hologram and effects.
  • First-join random spawn: Grant rtp.onevent.firstjoin to send new players to random spots on login. A reserve cache keeps a destination ready.
  • Survival and resource worlds: Players start far from each other's bases: across two Paper 26.2 runs of 4,096 teleports, no two landings were within 48 blocks (closest pair: 70).

More setups: Features, recipes, actions guide.


Install

Requirements: Paper or Spigot 1.18+, Folia 1.21.11+, Fabric 1.20.1 or 1.21+, or NeoForge 1.21.1+, up to 26.3. Java 17+ (Minecraft itself needs Java 21 from 1.20.5 and Java 25 on 26.x).

Nightly CI boots 1.21.11 and 26.3. I take bug reports from 1.21.11 to the latest release; older versions should run, but fixes there are best effort. Folia is the exception: it is experimental and only its current builds are maintained, so Folia older than 1.21.11 is not supported and can crash without RTP's involvement. Exact per-version status is in the support matrix.

  1. Drop LeafRTP-x.y.z.jar into plugins/ (or mods/).
  2. Type /rtp. With the bundled GUI addon it opens a picker listing your regions, with links to the map visualizations and the admin panel; without it, /rtp teleports straight away.

That's enough to run. If you want to tune it, my recommended order is:

  1. /rtp admin setup.
  2. Set each region's radius for how players will use it. The wizard doesn't ask; use e.g. /rtp config regions default shape.radius=10km, or drag the border in /rtp editor.
  3. /rtp scan start to pre-check the terrain.
  4. A stress test if you expect heavy traffic.

Customize (optional):

  • Web workspace: /rtp editor opens it in your browser. Draw region borders on a map, edit settings with each key's docs beside it, and review a diff before applying. Screenshots and a walkthrough: web workspace guide.
  • Chat wizard: /rtp admin setup (guided setup)
  • YAML files: plugins/RTP/ (radius: 10km, teleportCooldown: 30s)
  • Switching from another rtp plugin: /rtp config import finds the old plugin's folder in plugins/ on its own (or point it anywhere with path=<dir>), then previews the translated config and permissions; add overwrite=true to write them (switching guide).

(Advanced database, network proxy, and cache tuning: see the admin guide.)


Features

  • Setting it up: web editor, in-game admin book, chat wizard, /rtp config import, /rtp scan, live map visualizations, 11 languages.
  • For players: /rtp and /wild, region, world and biome picks, /rtp back, menus, per-player queues, effects, landing platforms.
  • Gameplay and worlds: any number of regions in six shapes, arrival schematics, auto-RTP on events, Vault pricing, an optional combat-tag check.
  • Actions: step-in portals, party scatter, 1v1 and 2v2 arenas, anchor drops.
  • Claims and safety: 16 claim plugins on Bukkit-family servers plus FTB Chunks and Open Parties and Claims on Fabric and NeoForge, and a configurable block safety filter.
  • Networks and developers: cross-server /rtp over Velocity; rtp-api addons, SPI-swappable parts, PlaceholderAPI, bStats.

More: Features. Commands and permissions are in the collapsed block near the end.


Performance

I compare throughput under load, latency from /rtp to arrival, and tick stability. On Paper, world ticking runs on a single main thread, while on Folia, world ticking is distributed across independent regional worker threads. LeafRTP checks candidates against region files (.mca and .linear) off-tick and keeps a queue of verified destinations, avoiding synchronous chunk loading and main-thread stalls.

Paper 26.2 & Folia 26.2 Performance Under Load (Linux Threadripper 7970X, 48 bot clients, 16k radius):

These are snapshots of each plugin under one harness on my hardware. The other plugins make different trade-offs, and most don't aim for 100+ TP/s.

PluginPaper safe maxPaper peakFolia safe maxFolia peak
LeafRTP40 TP/s (MSPT 45 ms, min TPS 19.2)103.3 TP/s180 TP/s (MSPT < 50 ms)249.7 TP/s (19.0 avg TPS)
HuskHomes40 TP/s (MSPT 46 ms, min TPS 16.4)46.0 TP/s60 TP/s60.0 TP/s
JakesRTP20 TP/s (MSPT 44 ms, min TPS 18.4)86.6 TP/s (TPS < 5)-Not loaded (no Folia support declared)
BetterRTP20 TP/s (MSPT 43 ms, min TPS 16.2)39.5 TP/s (2% failed)-Did not complete on this rig
JustRTP20 TP/s (MSPT 40 ms, min TPS 19.5)25.7 TP/s10 TP/s18.7 TP/s
EzRTP5 TP/s (MSPT 24 ms, min TPS 20.0)8.5 TP/s< 20 TP/s19.7 TP/s

In the Paper columns, MSPT is the highest per-run p95 at the safe-max stage, and min TPS is the lowest 10 s average in any of those runs.

Method, rig and terms

Most of an rtp plugin's work happens inside server API calls, so a profiler lists it under generic chunk functions. The public harness in helpers/StressTestRTP/ attributes it back to the plugin. Rig: AMD Ryzen Threadripper 7970X (32 cores / 64 threads, 128 GB RAM, NVMe), Ubuntu 24.04 LTS, Java 25, 16 GB heap, 48 scripted bot clients (devstack/clients/bench-swarm.js). On Paper, the server ran under realtime scheduling (SCHED_FIFO, priority 10) with only the plugin under test loaded, and restarted before every run.

Each Paper run steps through 60 s stages at 5, 10, 20, 40, 80, 160 and 320 teleports per second and stops after two failed stages in a row. The other plugins' Paper rows pool 4 runs each from 2026-10-17; LeafRTP's pool 2 runs of the 3.3.0 build (20261018-022257, 20261018-023204). The Folia columns come from separate Folia ramps, and they reproduce on the current build. Each plugin ran on the latest version it supported at the time of the run, with cooldowns, delays and countdowns zeroed and its queue on at its default size where it has one.

The other plugins ran at their documented defaults, because I can't tune settings their authors don't document. LeafRTP's shipped refill, queue and backlog settings (refill every 20 ticks, a 50-spot ready queue, a 1,000-spot backlog, a pause when server speed drops) are sized for typical player traffic, and all they do is limit how fast new requests are taken in. The bench config lifts that limit so the harness can find the break point: refill every tick (period: 1) with no pause, a 10-spot ready queue and no backlog (config and the full list of changes). The cost of each teleport is the same either way.

Terms used on this page: TP/s is teleports per second. TPS is server ticks per second; 20 is full speed and the most it can reach, and normal variation measures a little under it. MSPT is milliseconds per tick; above 50 ms the server falls below 20 TPS and players feel lag. A lag spike is a tick over 50 ms. Off-tick work runs off the server's main tick thread, so it doesn't stall the game loop. A ready queue is a stock of spots checked in advance, so most /rtp calls are answered without a live check. A chunk ticket is a hold that keeps one chunk (a 16 x 16 block column) loaded until the hold is released. Rejection sampling picks a random spot, checks it, and draws again on failure, with no cap on retries. REROLL (the default) and ACCUMULATE are two selection modes: REROLL skips known-bad chunks and draws again, at one in-memory check per known-bad chunk, and ACCUMULATE draws only from chunks not known to be bad, so every pick is a guaranteed O(1) (spacing notes). Safe max is the highest stage a plugin passed in every run, with the same rule on Paper and Folia: it delivered at least 95% of the requested rate, MSPT p95 stayed at or under 50 ms, and at most 1% of teleports failed. p95 / p99 is the time that 95% / 99% of teleports came in under.

  • Paper vs. Folia: Paper places every arriving player on one main thread, so no plugin here gets much past 40 TP/s at 20 TPS. Above its safe max on Paper, LeafRTP still completed every teleport: 21,924 of 21,924 in the 80 and 160 TP/s stages, delivering up to 103.3 TP/s while the server slowed to about 9-10 TPS (MSPT p95 88-105 ms). Folia spreads that work across region threads, and LeafRTP reached 180 TP/s at 19.6 regional TPS (198 ms median latency), peaking at 249.7 TP/s.

Latency at equal load: time from /rtp to arrival, pooled over each plugin's Paper runs. Each cell is p50 / p99 in milliseconds (full table with p95).

Plugin5 TP/s10 TP/s20 TP/s40 TP/s
LeafRTP5 / 65 / 65 / 7158 / 285
JakesRTP [1]0 / 133 / 264 / 234 / 24 (MSPT p95 77-118 ms)
HuskHomes221 / 517224 / 426275 / 474568 / 1,574
BetterRTP156 / 709199 / 806199 / 815510 / 4,323 (127 failed)
EzRTP154 / 905failed (619 of 2,396)--
JustRTP367 / 2,471473 / 2,480476 / 2,477failed (25.5 of 40 TP/s delivered)

- means no result in the pooled runs. For LeafRTP at 5, 10 and 20 TP/s the max was 58 ms over 4,194 teleports, and its MSPT p95 was 21-37 ms per run. [1] JakesRTP had the lowest median at those rates, but its MSPT p95 reached 77-118 ms at 40 TP/s. At 40 TP/s LeafRTP's ready queue runs out in this config, so those teleports wait on a live selection.

What I changed on each plugin so they do the same job

Every plugin used the same 1,024 to 16,384 block circle, with cooldowns, delays and countdowns off. These changes make the work comparable; none of them tune for speed.

PluginChangeWhy
EzRTPWater landings offBy default it can land on water and add ice under the player, which accepts spots the others reject
EzRTPBiome checks on (plugins/EzRTP/rtp.yml)Without them it skipped placement checks and reported 29.47 TP/s it wasn't earning (run 20261006-135938)
EzRTPRun through forcertpSkips its cooldown and limit checks; it also ships a 5 s countdown
BetterRTPMaxRadius: 17408Its circle formula cuts MinRadius off the outer edge, so 16384 would only reach 15,360 blocks
BetterRTPRadius checked on the landing scatterIt reverts config edits on shutdown
HuskHomesCentered on /spawnIt has no center setting
AllCommand checked with /<plugin>:rtp <TAB>When two plugins register /rtp, the prefixed command can reach the wrong one; this voided one earlier run set

Source and the rest of the controls: PRE_WRITEUP.md, sections 3, 6 and 7.

Full benchmark tables, methodology, and per-run analyses: helpers/StressTestRTP/.

Where each plugin lands players (Paper 26.2, 4,096 teleports):

Cross-plugin destination scatter comparison

Where each plugin landed 4,096 players in the Paper 26.2 run (20261008-003310), every one set to the same 1,024 to 16,384 block circle around 0,0. The green box under each panel is the LeafRTP region shape that gives the same distance-from-center spread, so any of these distributions is a config change in LeafRTP. Each config is replayed through LeafRTP's own shape code over the same terrain: LeafRTP and BetterRTP match CIRCLE, EzRTP and HuskHomes match CIRCLE_NORMAL, and JustRTP and JakesRTP match the spiral power curve.

Caveats. The region-file check only works on terrain that exists; any plugin has to generate a chunk that was never generated. The Linux stress test used 48 idle bots with server view distance capped at 2: real connections and chunk sends, with nobody moving or building. Heap reached the 16 GB limit in LeafRTP 100 TP/s runs under G1; separating long-term retention from deferred GC collection is ongoing. Hardware, view distance, world state (how much of it is unsafe, whether it's pregenerated) and other plugins will move the numbers. The other plugins update often; if a number here is out of date, open a GitHub issue with a repro or a doc link and I'll correct it. The harness measures dispatch-to-arrival latency, per-attempt cost, and success rate as defined above; it does not measure claim-plugin compatibility or safety rules.

Full methodology, per-run analyses, and the runs not shown here (equalized-radius Folia, pinned-heap GC profiling, the wide-radius single-plugin run): helpers/StressTestRTP/. Video of /rtp on a custom world generator: youtu.be/V0NyNK9JydM.


How it works

  • Spatial memory: biomes and invalid chunks (with cause and TTL) are remembered at chunk resolution across restarts.
  • Region-file pre-filter: candidates are read from .mca and .linear region files and rejected off-tick.
  • Pre-verified cache: safe destinations wait in background queues; on Paper the median from /rtp to arrival was 5 ms in the paced benchmark.
  • Spacing: a keyed shuffle of the region.

Details, derivations and charts: How it works. Spacing statistics: Spacing between players.

How I test it, and what the tests have found

A plugin can pass one of these tools and fail another.

ToolWhat it drivesWhat it catches
Stress harness (helpers/StressTestRTP/)Scripted bot clients that join like players, in closed-loop, open-loop and paced modes, with spark and JFR attachedThroughput ceiling, MSPT and ticks over 50 ms, chunks and CPU per teleport, and which thread pays for them
Behavior fuzzer (scripts/bench_fuzz.py)Seeded bot programs: /rtp, move, quit, rejoin under a new name, die, console reload. Coverage-guided search, automatic replay and shrinkingMemory the server still holds after a full GC, scored against a control run with no rtp plugin. Every plugin gets the same seeds, bots and server
Jazzer targetsThe Anvil chunk and column readers, the LZ4 decoder, the NBT readers and the Redis (RESP) reply parser; only the two Anvil readers have real-region seedsCrashes and unexpected exceptions on malformed input; failing inputs are saved as reproducers
Spacing simulationsLanding coordinates from real stress runs and from the shape modelsRepeats, clustering and distance to the nearest earlier landing
Safety and mutation testsOne test per safety prohibition, plus weekly PIT on the teleport pipeline and three other rtp-core packagesRules that must never break, and tests that wouldn't notice a broken rule

What they found:

  • Retained player sessions (fuzzer). LeafRTP kept a disconnected player's objects alive through its last-teleport records. The fuzzer flagged it and it reproduced on replay; it is fixed in 3.3.0 and covered by a regression test. The latest 3.3.0 run retained 0 players across 86 episodes, including config reloads. The run found nothing within its budget, which doesn't rule a leak out.
  • Main-thread chunk load on arrival (spark). A profile of the Paper stress run put 14.1 s of a 115.7 s phase (about 3.4 ms per teleport) in the arriving player's first tick loading its landing chunk synchronously. The cause was the arrival chunk ticket being released before the player's own ticket held it. The fix keeps the ticket through the first ticks. A later spark profile of the Linux 100 TP/s run (20261009-085505, 5.8k teleports per profile window) shows Entity.isInWall at 0.02-0.03 s of 59.5 s on the server thread, with no chunk load under it.
  • Repeats under spacing (simulation). Modeling consecutive landings showed that with expand: false a used chunk can come up again under "ACCUMULATE" mode due to continuously shifting offsets. This is disclosed in the region spacing notes. Both obvious fixes were tested and ruled out.
  • Harness errors. An overnight driver loaded the wrong plugin set for four Linux rows, so they measured a server without the plugin. I caught it on inspection and threw those rows out.
  • Fuzzer scoring noise. An object count the control run lacks can score as a leak while retained memory matches the control. I read verdicts against bytes retained and replay every candidate before trusting it.

I reproduce every finding from a recorded seed before counting it. The fuzzer method, limits and run logs are in LEAK_FUZZING.md.

Testing and quality gates

Why I made it

I started this project for the challenge of solving a hard problem. Every time a player ran /rtp, people wrote "LAG" in chat. I thought "the problem is with pure rejection sampling. This seems solvable if I can figure out an efficient memory system". After watching 3Blue1Brown videos, I set out to prove mathematically that spatial memory could fix that, using a custom space-filling curve to spread candidates evenly without rerolling.

I built the rest in stages:

  • v1: Proved the math. Built the space-filling spiral to map 2D territory uniformly, so picks don't duplicate or clump and no player positions need tracking.
  • v2: Tackled initial SPI models and platform compatibility, though latency degraded significantly in the process.
  • v3: Rebuilt so one core runs on every platform. Switched from chunk forceloading to ticketing, added explicit task tracking and cleanup so nothing leaks, split features into modular SPIs, made it testable without a server, and set rules for AI tooling: I design the seams and make the decisions recorded in the ADRs, and AI writes code inside those seams (repetitive wrappers, platform APIs I didn't know well, unit tests, devstack YAML) that I review before it lands.
  • 3.3.0: Added static analysis, fuzzing, mutation testing and CPU and memory profiling, and used them to remove the bottlenecks behind the benchmark numbers above.

Architecture decisions, benchmarks, and design history are recorded in the Architecture Decision Records and Why LeafRTP Exists. AI Usage covers what AI tooling writes here and what I don't use it for: system design, code review and git operations.


Commands, permissions, configuration files

Commands (aliases: /rtp, /wild):

CommandDescriptionPermission
/rtp / /wildRandom teleport to the default region for your current world (or the GUI picker, if that addon is installed)rtp.use
/rtp region=<name>Teleport to a named regionrtp.region / rtp.regions.*
/rtp world=<world>Teleport within a specific worldrtp.world / rtp.worlds.*
/rtp player=<name>Teleport another playerrtp.other
/rtp biome=<biome>Teleport to a chosen biomertp.biome / rtp.biome.*
/rtp action <name> [player]Trigger a scripted action, arena, or matchmaking duelrtp.action / rtp.action.<name>
/rtp action cancel [action]Leave a matchmaking queue or cancel an action entryrtp.action.cancel
/rtp backReturn to where you were before the last /rtprtp.back
/rtp centerx=<x> centerz=<z> radius=<r>One-off overrides for this call; units allowed (radius=10km)rtp.params
/rtp menuPlayer book menurtp.use
/rtp guiOpen the menu a GUI addon bound to /rtp; without one, a plain teleportrtp.gui
/rtp adminOperator book menurtp.menu.admin
/rtp editor [local|trust|untrust|apply]Web editor link, offline copy, browser trust and revocation (untrust key=<prefix|all>), token applyrtp.editor
/rtp clear <cache|cooldown|queue|limit|invuln>Clear location caches, cooldowns, queues, use limits or invulnerabilityrtp.admin
/rtp infoOperator diagnosticsrtp.info
/rtp reload [file]Reload all configuration, or one filertp.reload
/rtp config <file> <key>=<value> [...]Set one or more keys in a file (dotted for nested keys, e.g. /rtp config regions default shape.radius=10km), save, then reloadrtp.config + rtp.update
/rtp config <file> view|viewrawOpen a config file as a book menu, or print its raw YAML to chatrtp.config
/rtp config <regions|worlds> add=<name>|remove=<name>Create or delete a region or world file (default can't be removed)rtp.config
/rtp config import [source] [path=<dir>] [overwrite=true]Translate another rtp plugin's config (auto-detected, or any folder via path=); never overwrites without overwrite=truertp.config
/rtp config import permissions [source] [apply=true]Dry-run the LuckPerms commands that copy BetterRTP, JustRTP or EzRTP nodes onto rtp.*; apply=true runs themrtp.config
/rtp config language <locale>Switch config files and messages to a bundled locale, then reloadrtp.config
/rtp admin setup <world|gameplay|perf|preview|confirm>Guided first-time setup from preset configsrtp.admin.setup
/rtp scan start|pause|resume|reset|cancelOffline spatial memory pregeneration (was /rtp fill in 2.x)rtp.scan
/rtp visualization [held|export <type>]Render live held map charts or export high-resolution PNG/BMP diagnostic imagesrtp.admin

Permissions (full set in plugin.yml):

PermissionDefaultGrants
rtp.usetrueUse /rtp and /wild
rtp.seetrueTab-complete /rtp
rtp.freeopSkip the Vault charge
rtp.paramsopPer-call overrides (centerx=, centerz=, radius=)
rtp.personalqueuefalseReserve a per-player pre-warmed location
rtp.onevent.*falseAuto-RTP on join / firstjoin / respawn / changeworld / move / teleport
rtp.backop/rtp back
rtp.editorop/rtp editor and its subcommands
rtp.guiop/rtp gui
rtp.actionop/rtp action <name>; each action also checks rtp.action.<name> (or the permission set in its file)
rtp.action.cancelop/rtp action cancel for your own entries; rtp.action.cancel.other for other players and session IDs
rtp.updateopSetting keys with /rtp config <file> <key>=<value>; granted by rtp.config
rtp.servers.*trueCross-server destinations in network mode (was op before 3.3.0)
rtp.adminop/rtp clear, plus rtp.reload, rtp.config, rtp.scan, rtp.info and rtp.menu.admin
rtp.admin.setupop/rtp admin setup wizard
rtp.*opEverything

Configuration files under plugins/RTP/. Every file reloads at runtime (/rtp reload) and accepts human units like 10km or 30s. Most servers only edit the core files:

FileControlsExample keys
config.ymlDelays, cooldowns, move-cancel distanceteleportDelay, teleportCooldown, cancelDistance
definitions/regions/<name>.ymlShape, radius, center, price, permissionsshape.name, shape.radius, price, requirePermission
safety.ymlInvulnerability, landing platforms, PvP checkinvulnerabilityTime, platformRadius, pvpCheckEnabled
advanced/blocks.ymlUnsafe blocks (lava, water), air blocks and block tagsunsafeBlocks, airBlocks
economy.ymlVault pricing and cancellation refundsprice, refundOnCancel
definitions/actions/<name>.ymlPortals, party spacing, and arena boundsminSeparation, confinement.damage

(Advanced database, network proxy, custom biomes, and message templates come with working defaults. See the full configuration guide for details.)

Soft dependencies (all optional): Vault (for the economy charge), PlaceholderAPI, and the claim, combat-tag and hologram plugins listed above. PaperLib is no longer needed.

Block-list token grammar (advanced/blocks.yml)

Six token shapes can be mixed freely in unsafeBlocks and airBlocks (advanced/blocks.yml):

  • Plain material: LAVA, MAGMA_BLOCK.
  • Material + state predicate: OAK_SLAB[waterlogged=true]. Multiple predicates AND together: OAK_SLAB[waterlogged=true,type=top].
  • Numeric range predicate: WATER[level>=5], LIGHT[level<8]. Fails open on a missing or non-numeric value.
  • Vanilla block tag: #minecraft:leaves, #minecraft:fire, #minecraft:campfires. Expanded from the server's live block-tag registry when the config loads; datapack and modded tags work too.
  • Tag + state predicate: #minecraft:slabs[waterlogged=true].
  • Wildcard + state predicate: *[waterlogged=true]: one line instead of listing every waterloggable block.

Unknown tags and properties fail open: a config written for a newer MC version still loads on an older one. Malformed tokens are never silent: [WARNING] [safety.yml] rejected unsafe-blocks token '<token>': <reason> (the log prefix still names safety.yml, where these lists used to live). Block states are only read when a token needs them, and plain-material configs cost nothing extra. On an older install, lists kept in safety.yml are moved into advanced/blocks.yml on load, and plain-material entries keep working unchanged.

FAQ

Q: Will players land on top of each other or in each other's bases? A: Rarely, and no player positions are tracked. In two Paper 26.2 runs of 4,096 teleports each, no spot repeated, no two landings were within 48 blocks and the closest pair was 70 blocks apart; that is a measured result, not a guaranteed minimum. The default REROLL mode doesn't repeat a spot until the shuffle has cycled; on ACCUMULATE a used spot can come up again at about the random-pick rate. See Spacing between players.

Q: How does it avoid lagging the server? A: Most /rtp calls are served from a queue of locations checked before anyone typed the command. The queue refills off the main thread: it skips ground it has already rejected and checks the rest against the region files before loading any chunk. Details are in How it works.

Q: Is it complicated to set up? A: No. The guided setup wizard (/rtp admin setup) picks a preset for your server type. It doesn't ask for a radius, so size each region in the web workspace (/rtp editor), the in-game book (/rtp admin), or with one command (/rtp config regions default shape.radius=10km). If you are migrating from another plugin, /rtp config import finds its folder and translates your existing files, with a preview before anything is written.

Q: How is the web editor secured? Does it open ports on my server? A: Not to the outside. The hosted editor needs no inbound port: it connects outbound over TLS to an ephemeral WebSocket relay. Local mode (/rtp editor local) binds a token-authenticated socket on 127.0.0.1 only, which nothing outside the machine can reach. All messages require RSA-2048 signatures with strictly increasing sequence counters and single-use, expiring trust nonces.

Q: Why is it called "LeafRTP" now instead of just "RTP"? A: "RTP" is the generic name for random teleport, and the old name was just the function. That worked for years with older search and word of mouth (passing 400k downloads under that name), but current search and marketplace indexes lump it in with every other random-teleport plugin, command and forum thread, and it stopped showing up. "LeafRTP" is a name that points at this plugin. The /rtp command, rtp-api, config paths and data files stay exactly as they were, and nothing changes for existing installs.

Q: Does it work on Folia? A: Yes, on Folia 1.21.11 and newer. Folia is experimental and only its current builds are maintained, so older Folia builds aren't supported; they can crash on their own. How it loads chunks there is under Chunk loading, by platform. In the Folia benchmarks it had 0 watchdog stalls.

Q: How do I set up teleportation between worlds? A: Resolution order: the player's current world (or the world= parameter) -> that world's target region -> the region's target world. See World configuration.

Q: Do you support triangle / diamond region shapes? A: Use the Polygon shape. A triangle is a 3-vertex polygon and a diamond is a rotated square.

Q: Do I need Chunky or another pre-generator? A: No, but they work well together. /rtp scan walks a region off-tick, verifies safety and generates chunks that aren't on disk yet while recording which sectors are unsafe. Run Chunky first if you want the whole map on disk up front; scan then reads those chunks through the region-file pre-filter.

Q: Iris / Terra / custom datapack generators, or a world upgraded from an older version? A: Yes. Region files are read directly: modded and namespaced IDs are kept, and /rtp biome=<x> matches what's on disk. Plugins that use the live noise-map lookup get this wrong after a version migration. Chunks that were never populated fall back to a live load.

Q: What about the Linear (.linear) region format? A: Yes, with no setup. LeafRTP reads Anvil (.mca) and Linear (.linear, v1 and v2) region files directly. On Linear servers (such as Leaves, Gale, LinearPaper, or Fabric with the Linear Region Format mod) it uses the Zstandard library the server already has, so the jar bundles no extra libraries. It checks that decompressor once at startup and checks each file's header and bounds as it reads. If Zstandard is missing or a file is damaged, that spot is checked through the server's normal async chunk load instead.

Q: I'm on NeoForge. A: There's a native NeoForge adapter for 1.21.x / 26.x running the same core as every other platform. I test it less than the Bukkit family and Fabric, and broader testing on the 26.x carrier is still ongoing. If you hit something there, it goes to the front of my list.

Q: I'm on Forge. A: Run Arclight or Mohist and use this jar. A native Forge adapter isn't planned.

Q: Memory and MSPT: should I worry? A: In the paced Paper benchmark (598 teleports at 5 per second across 2 runs), MSPT p95 was 21.2-21.3 ms per run and TPS stayed at or above 19.98. At 40 per second it was 42.6-45.2 ms, with TPS at or above 19.19. Those runs recorded no idle baseline, so this is the whole server's tick time with 48 bots online, not LeafRTP's share of it. Locations kept in the hot queue hold chunk tickets so arrival doesn't wait on chunk loading, and MemoryTracker makes sure those tickets are released. Under heap pressure (old-generation use at or above maxHeapPercent, 85% by default; on a JVM with no separate old-generation pool and under 512 MB free, total heap use counts too) background filling pauses and the held tickets are dropped back to cold storage, which frees the pinned chunks right away.

Q: Can I use ItemsAdder, Oraxen, Nexo, or CustomModelData in the GUI menu? A: Yes. Icons in guimenu.yml take ia:<id>, oraxen:<id>, nexo:<id>, hdb:<id>, head:<player>, base64:<hash> and <MATERIAL>:<cmd>. Most of the item plugins behind these prefixes are paid and closed source, so CI can't run them; those hooks are tested against stubs and open-source stand-ins, and support for them is best effort. If the item plugin is missing or its API changes, the icon falls back to a vanilla material. See Custom Item & Menu Integration.

Q: How do I report a bug? A: Open a GitHub issue with your server version, LeafRTP version, platform, the relevant config files and the error from the log. The admin guide has a full reproduction template. I take reports for Minecraft 1.21.11 through the latest release; on older versions it should still run, and I'll look when I can.

Support

Support is me, in my spare time, so it's best effort.

  • For config questions, try the web workspace first (/rtp editor): it shows each setting's docs next to the value. I help with bugs and anything still unclear after that.
  • A bug report needs: server version, LeafRTP version, platform, config.yml, definitions/regions/, safety.yml, advanced/blocks.yml, and the relevant part of the server log. If something's missing I'll ask for it.
  • "It doesn't work" isn't something I can act on. Tell me what you did, what you expected, and what happened instead.
  • There's no guaranteed response time. Safety bugs (bad landings, chunk leaks, claim bypasses) get looked at first.
  • Feature requests go in GitHub issues.

Links

Галерея

Fully configurable messages & effectsweb editor (/rtp editor)Action EngineRTP gui

Последние версии

Все версии →
release

3.3.0

3.3.0
19 окт. 2026 г.1,5 тыс.Minecraft: 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 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.2, 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, 26.1.1, 26.1.2, 26.2, 26.3bukkit, fabric, folia, neoforge, paper, spigot, velocity
Скачать
Что нового
> **Upgrade note.** `rtp.servers.*` now defaults to `true` instead of `op`, so in network mode every player can reach open cross-server regions; restrict with negative permissions if you relied on the old default. `CIRCLE` and `SQUARE` now use new selection engines that ignore `weight`; use `CIRCLE_DEPRECATED_PURE_SPIRAL` or `SQUARE_DEPRECATED_PURE_SPIRAL` to keep the 3.2.1 behavior. Region shapes now default to `mode: REROLL` instead of `ACCUMULATE`; files that set `mode` keep their value. In `config.yml`, `defaults.shape.uniquePlacements` now defaults to `"auto"` (a radius matching the view distance) instead of `0`, and `defaults.spatialResolution` to `"auto"` (scaled to the region's size) instead of `3`; set `0` and `3` to 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 up `plugins/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](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-113-java-17-baseline-and-26x-support-boundary.md)).** 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](https://github.com/DailyStruggle/RTP/blob/V3/docs/dev/SUPPORT_MATRIX.md). - **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 trigger` and `/rtp run` are 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 with `editor.trust.maxAgeDays` in `advanced/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 with `overwrite=true`, and are backed up first. `/rtp config import permissions` prints 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 `CIRCLE` and `SQUARE` (ADR-085, ADR-088).** Picks spread evenly by area and never repeat a chunk within a pass. In `mode: REROLL` players are kept several chunks apart without using up the region, so `expand: false` regions 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. `weight` no longer applies; the old shapes remain as `*_DEPRECATED_PURE_SPIRAL`. - **Commands as teleport effects, and a `death` stage (effects-api-ADR-007).** Run console or player commands at any teleport stage, with player and location placeholders. The new `death` stage 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.yml` instead of being avoided forever. Bad terrain is still remembered permanently. - **Units in configs and commands.** Write `radius: 5km`, `teleportCooldown: 2h30m` or `cacheCap: 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-core` and the API libraries they depend on, such as `commands-api` and `effects-api`, are published to Maven Central. Platform jars are not. - **For addon developers.** New `rtp-api` surfaces 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 `.mca` and loads other formats such as `.linear` asynchronously). ### Changed - **RTP is now MIT-licensed in full ([ADR-108](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-108-all-mit-licensing-pro-as-support.md)).** 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`/`L3` names in `/rtp info` and 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 info` shows 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: ASYNC` in `advanced/performance.yml` to 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. - **`REROLL` is the default selection mode.** `CIRCLE`, `SQUARE`, `ELLIPSE` and `RECTANGLE`, and the shipped `config.yml` in every language, now use `mode: 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. `ACCUMULATE` stays available for regions that need every draw to be a guaranteed O(1). Regions that set `mode` keep their value. - **All memory shapes share one selection routine.** Shapes had drifted apart in how they handle bad land, `mode` and `uniqueplacements` (see Fixed); they now behave consistently. - **`ELLIPSE` turns off `expand: true` with a one-time warning,** as `POLYGON` already 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](https://github.com/DailyStruggle/RTP/tree/V3/api/bstats-api/docs/adr/bstats-api-ADR-001-dependency-free-client.md)), 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.** `syncAllottedTime` now defaults to 5 ms and `asyncAllottedTime` to 25 ms, and both are capped at 25 ms. Queued commands, scripted actions and promotion checks for ready-queue locations now count against `syncAllottedTime`, and RTP starts at most 8 chunk loads per region per refill. On Fabric and NeoForge, RTP's end-of-tick work stops at `syncAllottedTime` and background work uses at most half the CPU cores. `period` now means ticks between refills of the same region. - **`minTPS` now pauses background cache filling,** and the new `maxMSPT` setting (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 `/rtp` load 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 `syncAllottedTime` per 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-core` and 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](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-113-java-17-baseline-and-26x-support-boundary.md)), so addons that build against them can target Java 17. The bundled addons are Java 17 too. ### Deprecated - **For addon developers.** `PaletteIdentifierNormalizer` in `rtp-api` is deprecated; use the one in `anvil-api`. ### Removed - **Party and tether addons.** LeafRTPPartyAddon and LeafRTPTetherAddon are no longer built. For group teleports, use the action addon's `teams` and `scatter` modes. - **For addon developers.** The Bukkit-only classes in `commands-api` (`BukkitCommand`, `BukkitCommandRegistrar`, `BukkitParameter`, `StringCommandDispatcher`, `BukkitTreeCommand` and the `LocalParameters` package) and its `plugin.yml` are removed; use the platform-neutral `commandsapi.common` and `commandsapi.brigadier` packages. The Bukkit command classes and `plugin.yml` in `effects-api` are removed too. The Fabric effect classes in `io.github.dailystruggle.effectsapi.fabric` moved out of `effects-api` to `io.github.dailystruggle.rtp.fabric.effects` in the Fabric adapter, so `effects-api` no longer needs a Minecraft or Fabric classpath. ### Fixed - **Moving during the `/rtp` warmup now cancels the teleport.** Walking farther than `cancelDistance` during `teleportDelay` was 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. - **`uniquePlacements` could use up a region with `expand: false`** within seconds of startup. It now applies only when `expand: 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 `/rtp` requests 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=lz4` never got the region-file safety check.** - **`/rtp scan` rejected 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 `mode` and `uniqueplacements` inconsistencies.** `mode` values are case-insensitive, `NEAREST` mode no longer returns known-bad locations or ignores `uniqueplacements` on `CIRCLE` and `ELLIPSE`, `SQUARE_NORMAL` reads `uniqueplacements` as a radius, and regions using `uniqueplacements` no longer slow down as RTP learns more bad land. - **The `JUMP` vertical 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. - **`syncAllottedTime` and `asyncAllottedTime` above 25 were silently capped,** and the `high-performance` and arena presets wrote 50. The cap is now documented, and the presets use values within it. - **`period` refilled each region one tick early** (every 19 ticks at `period: 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 scan` progress 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 scan` stalled 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 scan` on 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 that `expand` uses. - **On Paper and Folia 26.1 or newer, `/rtp scan` and 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 new `world/dimensions/<namespace>/<name>/region/` layout. - **The free jar declares the same permissions as the Pro jar.** Its `plugin.yml` lacked `rtp.version`, `rtp.biome`, `rtp.menu.admin`, `rtp.personalqueue` and the `rtp.onevent.*` nodes, so `/rtp version` was 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_SECRET` of at least 32 bytes; `plugin-message`, `proxy-cache` and `auto` can instead run unsigned with `network.allowUnsigned: true` in `advanced/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.1` by 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.teleport` now checks destination permissions,** so menus and addons can't send players to worlds, biomes, regions or servers they lack permission for. Returns `NO_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. ---
release

LeafRTP | Random Teleport 3.2.1

3.2.1
16 авг. 2026 г.7 тыс.Minecraft: 1.21, 1.21.1, 1.21.2, 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, 26.1.1, 26.1.2, 26.2bukkit, fabric, folia, neoforge, paper, purpur, spigot, velocity
Скачать
Что нового
# RTP 3.2.1 ## Added - **In-game config editor now shows a picker for fixed-value settings.** Settings that only accept a set of values (like `database.type`, or region shape/vert types) used to open a blank text box where a typo silently reset the value. You now pick from a list with the current value marked. - **Teleport view-distance clamp for smoother arrivals.** RTP can briefly lower a player's view distance just before a teleport and raise it back one step at a time, spreading out the chunk-loading work so weaker servers don't stutter on arrival. New `viewDistanceRestoreInterval` in `performance.yml` (default 10s; `0` disables). Bukkit/Paper/Folia only. ## Changed - **`config.yml` is now purely teleport behavior.** Database settings moved to a new `database.yml`, and the redundant Redis block was removed (use `network.yml`). Customized values are not auto-migrated - re-set them in the new files. - **The `plugins/RTP/` folder was reorganized into a cleaner layout.** Everyday files stay at the top; your regions/worlds/effects moved under `definitions/`, and rarely-edited files moved under `advanced/`. RTP relocates your files automatically on upgrade and never overwrites anything - no re-tuning needed. - **Biome-weighting settings moved** to `advanced/biomes.yml` so all biome options live in one file. Not auto-migrated - re-set a customized value there. - **Bundled add-on configs moved into an `addons/` subfolder** (Countdown, GUI menu, claim integrations). Existing files are relocated automatically. `config.yml` now has a "where to find things" index at the top. - **Config files now have proper header comments** so each setting's own comment stays clean for menu tooltips. - **RTP-lite now ships the same configs and docs as the full edition** for consistency. ## Fixed - **Fixed several NeoForge and Fabric chunk-loading problems on newer Minecraft versions** - a `/rtp` chunk request could freeze the server tick, fail to generate chunks (spamming the console and starving the teleport cache), or fail outright. Chunks now load correctly. - **Color codes in config comments now show as literal text** in the `/rtp config` menu hover instead of being turned into actual colors. - **NeoForge on MC 26.2 no longer crashes when a colored `/rtp` message is sent** (e.g. clicking a GUI destination). - **GUI/menu addon teleports now apply the economy charge** instead of teleporting for free (teleport price, per-region prices, and `rtp.free` all apply; failed teleports are refunded). - **Fixed a stray `x` character before the `[RTP]` prefix** on NeoForge/Fabric when a gradient wraps a nested rainbow. - **Fixed the last character of a gradient message** rendering in the start color instead of the end color on NeoForge/Fabric. - **GUI/menu addon teleports are now instant when a location is already cached**, matching the `/rtp` command.
release

LeafRTP | Random Teleport 3.2.0

3.2.0
22 июн. 2026 г.4,7 тыс.Minecraft: 1.21, 1.21.1, 1.21.2, 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, 26.1.1, 26.1.2, 26.2bukkit, fabric, folia, neoforge, paper, purpur, spigot, velocity
Скачать
Что нового
## RTP 3.2.0 **Big change:** RTP now comes with a menu built in. Type `/rtp` and you get a clickable picker instead of instant teleport. Don't like it? Delete `addons/LeafRTPGuiAddon.jar` to go back to instant. (The menu has an instant option too, and it falls back to instant when no menu is available.) **New** - Countdowns now show as a boss bar instead of spamming chat. - `/rtp` now sends you to open-sky spots by default - no more spawning in caves. - Now ships the full safety config (more block options out of the box). - The plugin quietly learns biomes from chunks players load, for better results. **Fixed** - `requireSkyLight` no longer drops players in caves. - The `/rtp` menu now opens on Fabric and NeoForge too. - Low-memory servers no longer get stuck pausing forever - RTP now frees memory. - Per-world setups now actually work. - Lots of Fabric and NeoForge 1.26 fixes: no more crashes on teleport effects, chunks generate properly, and the server no longer freezes loading them. [Full changelog](https://github.com/DailyStruggle/RTP/blob/V3/CHANGELOG.md)
release

LeafRTP | Random Teleport 3.1.3

3.1.3-hotfix
19 июн. 2026 г.376Minecraft: 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.2, 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, 26.1.1, 26.1.2, 26.2bukkit, fabric, folia, neoforge, paper, spigot, velocity
Скачать
Что нового
the server backends for fabric and neoforge were left off for no reason. Fixed
release

LeafRTP | Random Teleport 3.1.3

3.1.3
18 июн. 2026 г.287Minecraft: 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.2, 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, 26.1.1, 26.1.2, 26.2bukkit, fabric, folia, neoforge, paper, spigot, velocity
Скачать
Что нового
## LeafRTP 3.1.3 **MiniMessage color/gradient support everywhere (even on plain Spigot), six new claim integrations, a world picker in the menu, and a heap-pressure safety brake.** ### Added - **MiniMessage markup anywhere color codes work** - named/hex colors, gradients, decorations. Gradients now render even on **pure Spigot** (no Adventure). Chat, titles, action bar, console, Fabric & NeoForge all honor it. - **Six new claim integrations**: SaberFactions, FactionsBridge, Residence, CrashClaim, HuskClaims, KingdomsX - now **twelve bundled**. - **World picker row** in the `/rtp` menu. - **Drop-in `plugins/RTP/addons/` folder** for addon jars (no `plugin.yml` needed). ### Fixed - **WorldGuard protection now actually enforced** - a flag-logic inversion let RTP land players inside protected regions. - **Gradients mixed with legacy/hex codes no longer break.** - **A throwing claim/region verifier now fails safe** (rejects instead of silently accepting). - **`/rtp region:<r> world:<w>` now teleports into that world**, with a dimension-correct vert for nether/end. - **Heap-pressure backoff** - background cache fill pauses over `maxHeapPercent` (default 85), preventing small-heap GC-thrash hangs. ### Changed - MC 26.2 Fabric adapter re-pinned to the **26.2 final** release. - Bundled claim deps refreshed; dropped the unmaintained legacy **Factions (1.6.9.x)** and pre-2.x **HuskTowns** integrations. *100% free, MIT-licensed. Also on Modrinth.*
release

LeafRTP | Random Teleport 3.1.2

3.1.2
13 июн. 2026 г.194Minecraft: 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.2, 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, 26.1.1, 26.1.2bukkit, fabric, folia, neoforge, paper, purpur, spigot, velocity
Скачать
Что нового
This release fixes the last blockers for Folia and cross-server networking in the free build. Folia support required adjusting a handful of scheduler call sites so work lands on the correct region thread; networking required a new `proxy-direct` transport that uses the proxy itself as the shared store, so the average server owner doesn't need to set up Redis or SQL to get cross-server `/rtp`. ### Added - **Basic Folia support.** The lite build now runs on Folia: `folia-supported: true` is set in `plugin.yml`, a new `FoliaAwareScheduler` routes work through Paper API's regionized and per-entity schedulers, and teleports go through `Entity#teleportAsync`. The throughput-optimized `rtp-folia` adapter remains Pro-only. - **Cross-server `/rtp` on the DB-free `proxy-direct` tier, as a drop-in alternative to Redis/SQL.** A cross-server `/rtp <server>:<region>` issued on a lobby now moves the player and runs `/rtp` on the destination backend with no Redis/SQL required. `proxy-direct` uses the proxy's own in-memory transport as the shared store, reached over an outbound TCP connection via a thin RPC, HMAC-signed when `RTP_NET_SECRET` is set. - **`proxy-direct` network transport: player-independent cross-server region discovery.** `transport.type: proxy-direct` lets a backend publish its real region list at startup with no player online, so cross-server tab-completion converges with zero players on any backend. No Redis/SQL required. - **Per-server `/rtp` permission gate for networked backends.** Cross-server `/rtp <server>:<region>` is now gated by `rtp.servers.<server>` in addition to `rtp.regions.<region>`, so operators can allow/deny teleport per backend. `rtp.servers.*` defaults to op and is a child of `rtp.*`. - **`/rtp info biomes` biome-occupancy leaderboard.** Reports which biomes online players actually spend their time in, ranked by share - useful for gauging where players congregate. Counts are in-memory only and reset on restart/reload. Gated by the existing `rtp.info` permission. - **spark profiler is now an optional source for `/rtp info` TPS/MSPT metrics.** When [spark](https://spark.lucko.me/) is installed, RTP merges spark's richer per-window TPS (1m/5m/15m) and mean MSPT over the native binding. Pure soft-dependency via reflection; no compile dependency added. - **`performance.yml#biomeWeights` ships the full vanilla biome set pre-listed at weight `1.0`.** Every vanilla overworld/nether/end biome is now enumerated as a ready-to-edit reference. Behaviour is unchanged: an all-`1.0` map is identical to the prior default. - **Biome-probability weighting** ([ADR-062](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-062-biome-probability-weighting.md)). New `performance.yml` knobs `biomeWeighted` (default `false`) and `biomeWeights` (biome id -> relative weight) let operators bias or suppress specific biomes in the teleport draw. When enabled, the location selector draws a target biome proportionally to its configured weight, then explores via the bounded spiral until that biome is confirmed. - **Registry-aware gray-space steering for biome weighting.** A requested biome the world can produce but that recall memory has not yet recorded stays reachable via bounded-spiral exploration rather than being treated as weight `0`. Each recorded biome defers a run-count-proportional share of its weight to exploration, so a high weight on a thinly-recorded biome can never amplify single-run clustering. - **`/rtp version` (alias `/rtp about`) subcommand.** Reports the running plugin version, platform brand, and host server version. Gated by a new `rtp.version` permission (default `true`, child of `rtp.*`). ### Fixed - **Map charts and metrics work correctly on Folia** (new in this release alongside Folia support). Map chart delivery is dispatched to the region thread owning the viewer's chunk via `RTP.scheduler.runTask(viewerLocation, ...)` rather than the global region thread, avoiding a `NullPointerException` on delivery. Metrics install falls through Folia -> Paper -> raw Bukkit sampler so bStats and `/rtp info` report live data from first boot. - **Relative coordinate tokens (`/rtp centerx=~ centerz=~`) now resolve to the player's position.** A `~` value previously fell through to `Boolean.valueOf("~") == false`, silently setting the center to `0`. A new `resolveRelativeCoordinate` helper resolves `~`, `~<n>`, `-~`, and `-~<n>` against the player's current X/Z. - **Fabric and NeoForge no longer suggest `/rtp` subcommands or parameters the caller lacks permission for.** The Brigadier bridge's suggestion provider now gates suggestions through `BrigadierBridgeContext.permissionCheck()`, closing a tab-completion leak on Brigadier-dispatched platforms. ### Changed - **Released jars trimmed of dead weight.** Both Pro and lite jars now exclude compile-only IntelliJ annotation classes and orphan Maven metadata that leaked in from shaded dependencies. No code or API change. - **`/rtp info` stays compact before any metrics are sampled.** TPS, MSPT, pipeline latency, percentile, and database-latency rows are suppressed until their underlying values exist. Always-available rows (JVM heap, queue depth, pending teleports, generation outcomes) are unchanged. - **Per-batch `[TRACE] ScanTask diag` line demoted from INFO to FINE.** No longer spams the console during a world scan; still available at elevated log levels.
release

LeafRTP | Random Teleport 3.1.2 - Neoforge support added

3.1.1
10 июн. 2026 г.100Minecraft: 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.2, 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, 26.1.1, 26.1.2bukkit, fabric, neoforge, paper, purpur, spigot
Скачать
Что нового
**NEW** - Vault economy support now ships in lite: optional per-`/rtp` charging (price, priceOther, surcharges, balance floor, refund-on-cancel) works out of the box. Dormant at zero cost when Vault isn't installed. - German (`de`) locale translation expanded (the locale already existed; this pass translates more of it). - Region-specific schematic paste, with a shared translator across platforms. - Optional PvP / combat-tag gate (off by default) with bundled integrations for PvPManager, CombatLogX and Simple Combat Log, plus a native combat tracker. - `/rtp clearcache` admin command and a new `rtp.admin` permission node. - `/rtp info` now surfaces generation success/failure rates and per-cause breakdowns; live-updating bad-locations map during a scan. - `uniquePlacements` is now an integer chunk radius (legacy true/false still accepted); config getters tolerate boolean<->int cross-typing. - Optional emergency-platform block-restoration timeout (`safety.yml`: `platformRestoreSeconds`). **CHANGED** - RTP is now MIT-licensed (open-core dual licensing). The jar bundles the MIT license text. - Region biome visualization now sources pixels from saved scan biome data only.
release

LeafRTP | Random Teleport 3.1.0

3.1.0
31 мая 2026 г.190Minecraft: 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.2, 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, 26.1.1, 26.1.2bukkit, fabric, paper, purpur, spigot
Скачать
Что нового
## [3.1.0] - 2026-05-31 ### Added - **German (`de`) locale** shipped across all config/message files; full locale parity maintained. - **Region-specific schematic paste platforms** ([ADR-058](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-058-region-specific-schematic-paste.md)) with new `PasteOptions` API and `RegionVerifierRegistry` footprint claim checks (S-003). New prefabs updated to use it (`skyblock`, `oneblock`, `high-performance`, `multi-world`). - **Pluggable bare-`/rtp` root action** ([ADR-056](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-056-bare-rtp-root-action.md), REQ-API-F-006). New `RootActionRegistry` SPI (`RTPAPI.hooks().rootAction()`) lets an addon take over a bare `/rtp` (e.g. open a GUI menu) instead of teleporting; subcommands are never routed through it. Shipped with an example menu addon. - **Platform-agnostic addon SPI** ([ADR-057](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-057-platform-agnostic-addon-spi.md)). New `RTPAddon` lifecycle interface + `AddonRegistry` (`RTP.addons`, ServiceLoader-based) so an addon jar runs unchanged on Bukkit/Paper/Folia, Fabric, and proxy JVMs. `RTP_ExampleAddon` ported with zero `org.bukkit.*` imports. - **Optional PvP / combat-tag gate** ([ADR-055](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-055-pvp-combat-gate.md)). Off by default (`safety.yml#pvpCheckEnabled=false`). When enabled, `/rtp` is refused for a player currently in combat, using either a bound `PvPCombatStateRegistry` provider (combat-tag plugins such as PvPManager / SimpleCombatLog / CombatLogX) or RTP's built-in native damage tracker. The native tracker is now fed on every supported platform: Bukkit/Paper/Folia via an `EntityDamageByEntityEvent` listener and Fabric via `ServerLivingEntityEvents.AFTER_DAMAGE` (both resolve the projectile shooter / primed-TNT igniter as the aggressor and stamp victim/aggressor per `pvpTagVictim` / `pvpTagAggressor`). The gate is consulted at the `/rtp` pre-dispatch surface before the player is enrolled, fails open (a broken external provider never blocks a teleport), audits every refusal at WARNING (REQ-RTP-S-004), and uses the new configurable `messages.yml#pvpInCombat` string (REQ-RTP-F-013). Six `safety.yml` knobs: `pvpCheckEnabled`, `pvpCombatTagSeconds`, `pvpOnCombat`, `pvpSource`, `pvpTagVictim`, `pvpTagAggressor`. - **Bundled combat-tag plugin integrations for the PvP gate** ([ADR-055](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-055-pvp-combat-gate.md)). New reflection-based soft-depend adapters for PvPManager, CombatLogX, and Simple Combat Log (`rtp-plugin/.../softdepends/pvp/`); `PvPIntegrations.setup` binds the first enabled plugin (priority PvPManager, then CombatLogX, then Simple Combat Log) to `PvPCombatStateRegistry` via `RTPAPI.hooks().pvpCombatState()`, gated on `isPluginEnabled(...)` like the claim integrations. When none is installed (or `pvpSource: NATIVE`), the native combat tracker answers; a reflective/API-version failure disables the adapter for the session and treats the player as not-in-combat (REQ-RTP-S-004). Wired in both the full and rtp-lite bootstraps. Covered by `PvPCombatAdapterTest`. - **`uniquePlacements` is now an integer chunk radius** (was boolean; defaults to `0` = off). `N >= 1` clears a `(2N-1)x(2N-1)` chunk square around each used spot so placements spread out; legacy `true`/`false` still coerce to `1`/`0`. Retired spots tagged with a dedicated `uniquePlacement` fail cause. - **Config getters tolerate boolean<->int cross-typing**, so a legacy `true`/`false` on a now-numeric knob (or `0`/`1` on a boolean knob) resolves instead of throwing. - **Optional emergency-platform block-restoration timeout** ([ADR-060](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-060-emergency-platform-block-restoration-timeout.md)). New `safety.yml` knob `platformRestoreSeconds` (`-1` = disabled default; `0` = restore on first loaded pulse; `> 0` = after that many seconds). Restores are chunk-load-aware (never force-loads, S-005), Folia-safe, and persisted across restarts. - **`/rtp info` now surfaces generation outcomes** (REQ-RTP-OBS-007, [ADR-052](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-052-outcome-metrics-and-cause-tagged-bad-locations.md)): success/failure rate and a per-cause rejection breakdown, via six new placeholders and three `messages.yml` lines. - **Live-updating bad-locations map during a world scan**: the admin "Region shape" chart now re-renders ~1 Hz from the in-memory bad-keys cache so scan progress is visible without re-issuing the command. - **New bStats charts**: `language_selection`, MSPT-p99 by platform/game-version/plugin-version, and aggregate generation-outcome (success rate + top failure cause). All privacy-safe (bucketised / whitelisted categories). - **`/rtp clearcache` admin command** (permission `rtp.admin`). Clears the L1 (kept), L2 (unkept), and L3 (backlog) location caches for every region across the board in one shot, releasing any held chunk reservations and dropping the associated persisted rows; the scan/queue machinery refills the caches afterwards. Backed by a new `RegionQueueManager.clearCaches()`. - **`rtp.admin` permission node** declared in `plugin.yml` (both full and lite), gating `/rtp clearcache` and grouping the existing admin tooling permissions (`rtp.reload`, `rtp.config`, `rtp.scan`, `rtp.info`) as children so a single grant covers all admin commands. - **(Pro)** **Numeric range predicates in the safety-list grammar** ([ADR-017](https://github.com/DailyStruggle/RTP/tree/V3/docs/adr/ADR-017-block-tags-and-state-predicates-in-safety-lists.md) amendment). `safety.yml::unsafeBlocks` / `airBlocks` now accept block-state comparisons (`LAVA[level<=3]`, `FIRE[age>=10]`, `*[level>=8]`); multiple bounds AND together. rtp-lite ignores tag/predicate tokens. ### Changed - **Region biome visualization now sources its pixels from saved region biome data only.** `RegionBiomesResolver` no longer reads on-disk `.mca` palettes via `RTPWorld.readBiomesInRegionFile`; it classifies each in-disk pixel through the new `MemoryShape.biomeAt(int, int)` / `biomeAt(long)`, a floor-search over the persisted `biomeKeysCache` / `biomePrefixSumsCache` accumulated by the scan pipeline (no chunk I/O, S-005-clean). Pixels with no recorded biome render as unsampled (BLACK), so the chart reflects what the scan has actually saved for the region.
release

RTP 3.0.0

3.0.0
27 мая 2026 г.103Minecraft: 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.2, 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, 26.1.1, 26.1.2bukkit, fabric, paper, purpur, spigot
Скачать
Что нового
transferring from spigotmc resource https://www.spigotmc.org/resources/rtp.94812/ runs on paper and fabric, a few things left to implement on the fabric side of things but the core functionality works.