Skip to content

DailyStruggle/RTP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

373 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

RTP — Random Teleport

Current Version: 3.0.0-beta.1⚠️ beta. Supported on Spigot / Paper / Folia. Fabric ships in-tree but is not yet functional — see Beta Scope, Known Issues & Roadmap in CHANGELOG.md.

A high-performance random teleportation plugin for Bukkit-derived Minecraft servers (Spigot, Paper, Folia).

Build Release Java SpigotMC

🔗 SpigotMC Resource Page


Why RTP?

Most random teleport plugins work by repeatedly rolling random coordinates until they find a valid spot, a naive approach that can stall the server under load. RTP takes a different approach, rooted in a mathematical proof that maps the 2D teleport region onto a 1D curve, which eliminates rerolling entirely and guarantees uniform spatial distribution:

  • Bounded algorithms, not rerolling. Location selection runs in deterministic time (O(log n)) by preemptively subtracting known-invalid sectors from the candidate space. See the original mathematical writeup and ADR-001 for the full rationale.
  • Pre-generation queue. Safe locations are validated asynchronously before a player asks for one, so teleports resolve in 0–2 game ticks (≤ 100 ms) on average.
  • Spatial Memory. The plugin maps the entire teleport region and remembers invalid areas, such as oceans, solid blocks, and claims. Use /rtp scan to proactively map out a region, ensuring deterministic performance and instant skips of unsafe territory.
  • Multi-region support. A single world can have any number of independent teleport regions, each with its own shape, distribution, permissions, and queue.
  • Platform-aware concurrency. Separate adapters for Spigot, Paper, and Folia ensure correct thread-safety on each server type, including Folia's region-based multithreading.
  • Extensible API. Addon developers can register custom shapes, vertical adjustors, and claim-check hooks without modifying the plugin.

Supported Platforms

Platform Min Version Notes
Spigot 1.20 Baseline adapter
Paper 1.20 Uses async chunk loading APIs
Folia 1.20 Full regional-thread scheduling support
Fabric 1.21 Native mod support — targeted for 3.0.0 final, not functional in 3.0.0-beta.1 (roadmap)
Forge / NeoForge No native adapter planned. Use a Bukkit-compatibility launcher (e.g. Arclight or Mohist) and run the Spigot/Paper build.

Runtime: Java 21+


⚠️ Pregenerate Your World First — and Pick a Capable Server

RTP loads chunks asynchronously on demand (S-005 — never sync chunk I/O on the main thread). On a freshly-explored world, the first teleports and the first /rtp scan are bound by the host server's chunk-generation throughput, not by RTP. On suboptimal server software — most notably stock Fabric / vanilla chunk systems on 1.20.1 — generation runs largely on the tick thread and can take several seconds per chunk, which will stall the queue (and even mass-pregeneration tools such as Chunky can stall the server on the same hardware).

Strongly recommended:

  1. Use a server software with a parallel chunk system for production traffic. Paper and Folia scale well; vanilla Fabric is supported but is single-tick-thread bound for FULL-status generation and will struggle on cold worlds regardless of how RTP is tuned.
  2. Pregenerate every world you'll add to RTP (e.g. with Chunky or WorldBorder) sized to match each region's configured radius before putting RTP into production traffic. On Fabric specifically, expect pregeneration itself to be slow and to require a maintenance window — not something to do on a live server. See QUICK_START Step 0 for sizing guidance.

If you're on Fabric and the world is not pregenerated, RTP will keep working, but /rtp attempt rates and queue fill rates will be capped by the server's generation throughput, not by RTP's pipeline.


Features

  • Shapes: Circle, square, rectangle, each supporting flat, normal, and exponential distributions.
  • Distributions: Tune where players land, such as uniform spread, center-weighted, or ring-shaped.
  • Biome filters: Exclude specific biomes (e.g., ocean, nether_wastes) per region.
  • Claim integration: Works with GriefPrevention, WorldGuard, Towny, and any addon implementing the validation hook.
  • Economy support: Optional Vault integration to charge players per teleport.
  • Per-region permissions: Fine-grained permission nodes per region and per world.
  • Runtime config reload: Adjust region settings by command without restarting the server.
  • Persistent state: Spatial memory and region shape data survive server restarts, avoiding cold-start rebuild penalties.

Shapes

Circle with exponential distribution (σ = 0.1, 1.0, 10.0): circle-exponential

Square with exponential distribution (σ = 0.1, 1.0, 10.0): square-exponential

Circle with normal distribution: circle-normal

Square with normal distribution: square-normal

Rectangle with flat distribution and rotation: rectangle-flat

Custom shapes can be registered at runtime via the rtp-api. See the addons/ directory for examples.


Repository Structure

Directory Purpose
rtp-api/ Public API and shared models. Compile addons against this module only.
commands-api/ Unified multi-platform command framework.
effects-api/ Unified multi-platform visual/particle effects framework.
rtp-core/ Platform-agnostic core logic: regions, shapes, queues, database, memory tracking.
rtp-plugin/ Plugin entry point for Bukkit platforms. Bridges core with Spigot/Paper/Folia adapters.
rtp-spigot/ Spigot platform adapter.
rtp-paper/ Paper platform adapter (async chunk loading).
rtp-folia/ Folia platform adapter (regional thread scheduling).
rtp-fabric/ Fabric platform adapter and mod entry point (Planned).
addons/ Example addons: Iris integration, Glide. (Claim plugin integrations are folded into the core).
Python Test Scripts/ Visualisation scripts for distribution math and geometry validation.

Documentation

Choose your path:

I am a… Start here
Server administrator installing or operating RTP docs/FOR_SERVER_ADMINS.md
Addon developer extending RTP via rtp-api docs/FOR_ADDON_DEVELOPERS.md
Core contributor to rtp-core, rtp-api, or a platform adapter docs/FOR_CONTRIBUTORS.md

Full Reference Index

See docs/MAP.md for a one-line catalog of every document, or docs/dev/INDEX.md for a task-to-file router. Root-level: CONTRIBUTING.md, CHANGELOG.md, SECURITY.md.


A Note On AI Assistance

I am a solo engineer, and I use AI coding assistants (LLM-based pair-programming tools) for scaffolding, refactoring, test generation, and documentation drafting. Every line that ships is reviewed, tested, and signed off by me — architecture, safety invariants (thread model, chunk-ticket lifecycle, claim checks), and release decisions are mine alone. No AI output is published without human verification against the requirements in docs/dev/REQUIREMENTS.md and the test suite. If you prefer plugins written without AI tooling in the loop at all, RTP is not that plugin, and I would rather you know up front.


Contributing

See CONTRIBUTING.md for build instructions, code style rules, and the workflow for adding requirements.

New to the plugin? Start with docs/FOR_SERVER_ADMINS.md. Want to extend it? See docs/FOR_ADDON_DEVELOPERS.md.

The short version:

  1. ./gradlew build (compile and run all tests)
  2. ./gradlew spotlessApply (format code before pushing)
  3. If you add a requirement, add a row to docs/dev/TRACEABILITY.md in the same commit, as CI will fail otherwise.

About

fun with spatial math

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages