Перейти к содержимому
Mineforgian

LeafRTP | Random Teleport

Fast Random Teleportation for everyone, configurable and extensible

Загрузки
6K
Подписчики
8
Обновлён
16 августа 2026 г.
Лицензия
MIT

Опубликован 11 мая 2026 г.

LeafRTP - Random Teleport

Purpose

LeafRTP is a /rtp command. It teleports a player to a random, safe spot in the world, in the most cpu-efficient way it can.

Origin

We were all players once, and we've all complained about "lag" on servers. Many of us tried to pinpoint where it came from and tbh in my studies it took days of work just to find out that a random teleport plugin was triggering performance issues. The biggest cost in any profiling tool was never labeled based on who called the api - that part is obscured, so the source of the thousands of extra chunks in memory is misattributed. I went through the "blame the users" phase and wised up to realize that it's better to fix the tool than to tell people not to use it.

In 2021, this project started as a demonstration of mathematical principles and as a high-difficulty optimization puzzle. I wanted to make something for the community to reference and create a new performance standard, make a name for myself as an obsessive developer. It was received instead as a product and a bunch of features were requested, so I worked on the design elegance so that a few design details resulted in an exponential number of possible configurations. As a result it's a little off-meta but not difficult to fully understand. Measure in chunks, define some regions, and access them via command or api, and anything in between is server design nuance.

"Chunks" were selected as the measurement because the cost to the server is chunk-based rather than block-based and checking adjacent blocks is "optimal" if it doesn't leave a chunk boundary.

I don't like regulating how to use it nor what to use it with, so in V2 I refactored to use more swappable suppliers and consumers, making it easy to programmatically swap safety checks, biome checks, shapes, etc.. There wasn't much optimization to do, so I studied coding practices. Frankly "clean code" is a regret as it increased input latency but the structure gave me a pretty good launch point for reorganization.

For v3 I needed to update for modern game versions and modern web platforms. I got some bright ideas about cache locality optimizations, data access optimizations, cross-platform support via SPI (service provider interface) concepts, and active tracking to catch any "memory leak" that I heard about but could never seem to reproduce on my rig.

Following the V3 update and micro optimizing the selection process, I've created a test bench plugin to assist with testing throughput up to 1 rtp call per gametick (20/s) which has demonstrated performance falloff in the pure reroll model, in every implementation I tested, except this one. I was also able to verify that a common optimization to "use loaded chunks" tends towards placing users in each others' bases to exacerbate either griefing or rerolling depending on claim integration.

Paper, Spigot, Folia, Fabric, NeoForge, and Velocity, on Minecraft 1.21.x / 26.x


What makes it different

Most /rtp plugins are designed around a script: "pick a spot, check it, try, try again" + "add x feature". This creates non-deterministic compute costs around "try again". LeafRTP is a reconstruction for engineering rigor in the foundations, prioritizing stability under load.

I have documented design details more precisely here, denoting design/feature decisions, superseding decisions, and alternatives considered.

Spatial mapping and memory

Measurements show me about 35-65% of a world is "unsafe" for placement, based on oceans, lava, void.

Selections come off a space-filling Archimedean spiral curve, an indexed mapping from 1D to 2D. The math, with distribution plots: Why LeafRTP exists.

The spatial mapping enables storing and recalling information about prior selections, including biome and invalidity cause, using segments rather than image compression, as this enables a specific optimization - offset selections. The location selection phase is a constant-time lookup with occasional table rebuilding that excludes invalid locations, e.g. oceans, lava, void.

Anvil pre-filter

An Anvil (.mca) pre-filter reads biome and block data straight from the region files on disk, so batches of locations can be filtered if a world is generated and those locations are unloaded. It also helps with reading what the world actually contains, rather than what the generator predicts. The common shortcuts (getBiome, getHighestBlockAt) answer from the generation noise map, which can disagree with the real terrain once a spot has been edited or carried across a Minecraft version. Architecture.

Pre-verified cache

Safe destinations are prepared at-rate and a number of them are kept ready in a cache per defined region, so serving /rtp is handing back a coordinate that's already checked. The numbers are in the Performance section below.


Features

  • In-game tuning - /rtp menu opens a clickable book (Paper / Folia; chat-paginated elsewhere) to browse worlds, pick regions, and change settings live. Includes search function.
  • Effects engine - particles, sounds, fireworks, potions, titles on every teleport phase.
  • Live map heatmaps - /rtp scan paints region safety onto a real held map.
  • Economy - charge per /rtp (Vault), per-region pricing, auto-refund on cancel.
  • 12 claim integrations - GriefDefender, GriefPrevention, Lands, WorldGuard, TownyAdvanced, SaberFactions, FactionsBridge, HuskClaims, RedProtect, CrashClaim, KingdomsX, Residence.
  • PvP / combat-tag gate, PlaceholderAPI, per-player cooldowns & limits, multi-world overrides.
  • Cross-server /rtp - Running on Velocity enables cross-server communication via tcp socket, extensible to addons.
  • Platform-independent engine - core code runs on pure java and custom implementations, enabling cross-server support via lightweight suppliers
  • Docs in jar - in V3 I started including version-specific docs with the jar in case I update the wiki for newer versions
  • Reproducible benchmarks with raw CSVs and per-run analyses: helpers/StressTestRTP/
  • bStats enabled - anonymous usage stats help prioritize platform work.
  • Thorough API with examples - packed addons function as examples of hooking in to add checks or change /rtp behavior.
  • Modifiable SPI - Most compatibility-related parts are swappable, e.g. server backend, economy, location validity, shapes, world border, pvp checks, platform creation, commands.

Watch it work

/rtp scan paints region safety onto a real in-game map (green safe, red unsafe) as it verifies it. /rtp info reports live TPS/MSPT, heap, latency percentiles, and rejection causes, no metrics add-on. The heavy verification runs off-tick on every platform. Watch the scan paint a region live (video). Details: Scan & spatial memory, Diagnostics.


Requirements

  • Java 21+
  • A supported server - Paper, Spigot, or a Bukkit-family fork (Arclight / Mohist for Forge bridges), or Fabric / NeoForge (1.21.x / 26.x).

Install

  1. Drop LeafRTP-x.y.z.jar into plugins/ (or mods/).
  2. Start the server. A default region is written for you.
  3. Type /rtp. It works.
  4. Size the region to your world, and point each world at a region. radius, centerX, and centerZ live inside the region's shape: block and are measured in chunks, not blocks - a radius of 625 reaches 10,000 blocks. See Regions and Worlds.

I recommend trying /rtp admin

Start here: Quick start and Intended usage. The full admin guide is auto-unpacked into plugins/RTP/docs/ on first run, and lives online at the admin guide.


Performance

Every number below comes from a public harness: helpers/StressTestRTP/.

Full benchmark vs. alternative random teleport plugins on Paper, Spigot, and Folia

Paper rows: 2 OPed clients spamming /rtp back-to-back, queues enabled where the plugin offers them, cooldowns/delays zeroed. Folia run: 3 OPed clients, radius equalized to 4096 blocks, ~600 s per plugin.

Every benchmark row below was measured locally on the same rig. In the support matrix, cells read from plugin docs or inferred from architecture are noted inline.

Metrics: Throughput (TP/s, higher better) | MSPT p99 (worst 1-in-100 main-thread tick in ms, lower better) | Min TPS (lowest TPS observed; 20.00 = no hiccup) | CPU / TP (main-thread CPU per successful teleport).

Paper 1.20.1 / 1.21.11 - the reference dataset. Eight plugins, same harness, same world, same two OPed clients.

Plugin TP/s MSPT p99 (ms) Min TPS CPU / TP (ms) Success
LeafRTP 19.8 4 20.00 16.9 100 %
JakesRTP 20.0 70 20.00 26.0 100 %
BetterRTP 7.3 852 20.00 53.6 100 %
HuskHomes 6.2 372 20.00 52.2 100 %
AdvancedRTP 2.16 2 100 19.95 92.1 96.3 %
EzRTP 1.76 2 903 19.95 139.6 100 %
AsyRTP 1.67 4 534 19.95 38.8 100 %
EssentialsX /tpr 0.96 4 504 19.95 88.9 75.9 % *
  • EssentialsX /tpr is a teleport-request command (handshake + accept), not a teleport-do command; the harness's 5 s per-attempt deadline times out a fraction of the request-accept latencies. Numbers are dispatch-shaped, not plugin-broken.

Spigot 1.20.1

Plugin TP/s MSPT p99 (ms) Min TPS
LeafRTP 1.52 3 6.4
JakesRTP 1.04 2 252 7.5*
BetterRTP 1.33 3 790 2.18
HuskHomes 0.93 4 939 2.59
  • JakesRTP ran last in the phase order and inherited chunk pressure left over from the earlier phases, so its TPS floor is not cleanly attributable to JakesRTP alone.

Folia 26.1

(only EzRTP also completed the Folia run; the other tested plugins had compatibility or performance issues there)

Plugin TP/s CPU / TP (ms) Watchdog stalls Success
LeafRTP 12.5 4.15 0 100 %
EzRTP 5.3 6.34 7 (one region 20.4 s) 96.2 %

EzRTP's 7 watchdog stalls (one region unresponsive 20.4 s) are the server's own record of synchronous World.loadChunk calls on region threads; LeafRTP issued none. For reference, the Pro Folia adapter cleared the same run at 13.5 TP/s. The shared rtp-core engine, not a Pro-only adapter, carries the free build's Folia result.

Caveats. Small client counts (2 on Paper, 3 on Folia); the Folia run's EzRTP failure is corroborated by the server's own watchdog log, independent of the harness. Competitor plugins update frequently; corrections welcome via GitHub issue with a contradicting repro or doc link.

Full methodology, raw CSVs, per-run analyses: helpers/StressTestRTP/. Video benchmark of /rtp on a custom world generator: youtu.be/V0NyNK9JydM.

Commands, placeholders, soft-deps

Commands (full reference: admin guide)

  • /rtp - teleport to the default region for your current world or open gui (depending on addons).
  • /rtp [parameter]=[value] - specify region=, world=, player=, or temporary overrides.
  • /rtp reload - reload all configuration from disk.
  • /rtp scan start|pause|resume|reset|cancel - pre-warm spatial memory by walking a region (renamed from /rtp fill in 2.x). Demo: youtu.be/Ftjy1zw_S04.
  • /rtp menu - interactive book menu.

PlaceholderAPI

  • %rtp_player_status% - idle, waiting, teleporting, ...
  • %rtp_total_queue_length%, %rtp_public_queue_length%, %rtp_personal_queue_length%
  • %rtp_teleport_world%, %rtp_teleport_x%, %rtp_teleport_y%, %rtp_teleport_z%

Soft dependencies (all optional): Vault (for the optional economy charge), PlaceholderAPI, ProtocolLib. PaperLib is no longer required.

FAQ

Q: How do I stop /rtp from lagging my server, and why is LeafRTP faster than other random teleport plugins? A: Most /rtp calls serve from a pre-warmed queue - chunks are already loaded and safety-checked before you type the command. Two design choices make that queue cheap to keep full: a persistent spatial memory per region (the plugin remembers which sectors of the world failed safety checks, so the spiral selector skips known-bad ground instead of rerolling forever), and an off-tick async pre-filter (Anvil region files are read directly to reject unsafe biomes/blocks before any chunk is loaded, so candidate verification never blocks the main thread). The pre-warmed queue is just the visible tip - the spatial memory keeps candidate selection bounded, and the async pre-filter keeps verification off the tick loop.

Q: Is LeafRTP complicated to set up, and does it have economy, a GUI, and particle effects? A: No, and yes. Drop the jar in and /rtp works immediately, on a default region written for you. Size that region to your world - shape, radius, center - and /rtp menu does it in-game without editing YAML. It includes a clickable GUI menu, Vault economy (charge per teleport with per-region pricing), a particle / sound / firework effects engine, live map heatmaps, and twelve claim-plugin integrations.

Q: Why is it called "LeafRTP" now instead of just "RTP"? A: "RTP" is the generic term for random teleport, so the old name was nearly impossible to find - it collided with every other random-teleport plugin, command, and forum thread in search and marketplace indexes. "LeafRTP" is a distinct, indexable name that points unambiguously at this plugin while keeping the /rtp command, rtp-api, config paths, and data files exactly as they were. Nothing changes for existing installs - only the public name.

Q: Does it work with Iris / Terra / custom datapack generators? A: Yes. Region files are read directly, so modded and namespaced biome and block IDs are preserved. No configuration needed. Because biome data comes from the populated .mca files rather than the live generator/noise-map lookup, /rtp biome=<name> stays correct even on worlds that were pregenerated elsewhere or migrated across a Minecraft version, where seed-based biome assignment has drifted.

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, so both are already expressible without a separate shape type.

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 any chunks it reaches that aren't on disk yet (via the server's own world generator) while recording which sectors are unsafe in persistent spatial memory. A separate pre-generator stays optional: run Chunky first if you want the whole map on disk up front, and scan will then read those chunks cheaply through the Anvil pre-filter instead of generating them as it goes.

Q: I'm on NeoForge. A: NeoForge is a first-class supported platform on Minecraft 1.21.x / 26.x - just drop the mod in.

Q: I'm on Forge. A: Run Arclight or Mohist (officially supported) and use this jar. A native Forge adapter is not planned.

Q: Memory and MSPT - should I worry? A: LeafRTP trades a bounded amount of RAM (the queue, bounded by cacheCap) for speed. TPS should not drop below ~19 from LeafRTP alone on a healthy server; MSPT spikes during new-area generation are expected - that's the cost of generating chunks, not RTP.

Q: How do I report a bug? A: GitHub issue with server version, LeafRTP version, platform, relevant config files, and the error log section. See the admin guide for the full reproduction template.

Community Support Policy (read before filing an issue)

Support for the free build is community-tier and best-effort. A solo maintainer ships fixes when properly-reported issues land.

  • Support covers bugs and configuration questions, after you've read the admin guide.
  • Bug reports need a reproduction: server version, LeafRTP version, platform (Spigot / Paper / fork), config.yml, regions/, safety.yml, and the relevant server.log section. Reports without these are asked for them once, then closed.
  • "It doesn't work" is not a bug report. Tell me what you did, what you expected, and what actually happened.
  • Response time: no SLA on the free build. Critical safety issues jump the queue regardless.
  • Feature requests via GitHub issues. Priority follows the published roadmap, not ticket volume.

Links

Ченджлог

3.2.1Релиз26.1.1, 26.1.2, 26.2 · 16 августа 2026 г.

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.
3.2.0Релиз26.1.1, 26.1.2, 26.2 · 22 июня 2026 г.

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

3.1.3-hotfixРелиз26.1.1, 26.1.2, 26.2 · 19 июня 2026 г.

the server backends for fabric and neoforge were left off for no reason. Fixed

3.1.3Релиз26.1.1, 26.1.2, 26.2 · 18 июня 2026 г.

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.

3.1.2Релиз26.1, 26.1.1, 26.1.2 · 13 июня 2026 г.

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 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). 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.

3.1.1Релиз26.1, 26.1.1, 26.1.2 · 10 июня 2026 г.

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.
3.1.0Релиз26.1, 26.1.1, 26.1.2 · 31 мая 2026 г.

[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) 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, 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). 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). 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). 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). 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): 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 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.
3.0.0Релиз26.1, 26.1.1, 26.1.2 · 27 мая 2026 г.

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.

Комментарии

Загружаем…