All notable changes to EzRTP are documented here.
Format follows Keep a Changelog.
Versions follow Semantic Versioning.
Release tags use the v prefix (e.g. v3.0.2).
/rtp reloadnow immediately applies GUI configuration updates fromgui.ymlby rebuilding GUI rendering from the current in-memory configuration instead of startup-cached values.- Reload now closes both standard RTP GUI sessions and faction-claim GUI sessions so open inventories cannot retain stale pre-reload settings.
- Focused regression test coverage for GUI reload behavior:
RandomTeleportGuiManagerReloadConfigTestverifies that opening the GUI after configuration replacement uses the updated title and row count immediately.
- Minecraft
26.2compatibility updates:- added
SULFUR_CAVESto rare-biome defaults/search paths, - updated biome compatibility handling for modern registry-based lookup paths.
- added
- CI server download resolution migrated to PaperMC Fill API (
fill.papermc.io) and now sends an explicit non-genericUser-Agentheader as required by the service. - Smoke testing workflow expanded from a single Folia target to a matrix that validates:
- latest Folia build, and
- Paper
1.13.xfor earliest supported compatibility coverage.
- Dependency and tooling updates merged via Dependabot:
com.github.ez-plugins:teams-api1.8.0->2.4.0.- GitHub Actions
actions/checkoutv6->v7. - GitHub Actions
DavidAnson/markdownlint-cli2-actionv23->v24.
- Kyori Adventure BOM and related versions moved to
5.2.0for current Paper API compatibility.
- GitHub Actions workflow resolver for smoke-test target versions:
- fixed YAML parsing issues in embedded resolver scripting,
- fixed selector propagation into Python resolver invocation,
- fixed mixed-type version sort key handling that could fail on Paper version token comparisons.
- Removed a duplicate stale block in
messages/en.ymlthat produced duplicate-key warnings at startup. - Replaced deprecated
Biome.valueOf/Biome.valuesusage with compatibility-safe registry-backed resolution paths used across biome-related logic.
- EzCountdown integration (optional soft-dependency):
- RTP countdown display can now be delegated to EzCountdown for richer, configurable display channels.
- Configurable display types per RTP world:
ACTION_BAR,BOSS_BAR,TITLE,CHAT,SCOREBOARD,DIALOG. - Configurable MiniMessage format string with
{formatted}placeholder for remaining time. - Each teleporting player receives an ephemeral, per-player countdown with permission-scoped visibility.
- Falls back to the built-in bossbar/chat countdown automatically when EzCountdown is absent or
ezcountdown.enabled: false. - New
countdown.ezcountdown.*config section inrtp.yml(disabled by default).
EzCountdownadded as optional soft-dependency inplugin.yml.- Factions RTP (TeamsAPI):
- Added
/rtp factionto open a claim-selection GUI from all TeamsAPI claims available to the player's team. - Added TeamsAPI subcommand integration for
/f rtpvia the TeamsAPI subcommand API (when provided by the installed TeamsAPI version). - Claim selection now sets the selected claim chunk as RTP center and then applies normal per-world RTP behavior/settings.
- Added
- New
faction-gui.ymlfile for full claim-GUI configuration. - Heatmap claim overlays (admin insight):
- Added claim border overlay mode for
/rtp heatmapand/rtp heatmap saveviaclaims-overlayflag. - Added
rtp.ymloptions underheatmap.claims-overlay.*:enabledstyle(border)colorline-width
- Added claim border overlay mode for
- Claim-constrained fake RTP simulation:
- Added
/rtp fake <amount> claims [world]to generate simulated points on faction claims owned by the executor’s team.
- Added
- TeamsAPI dependency bumped from
1.4.1to1.8.0. - TeamsAPI
/f rtpsubcommand integration rewritten: replaced the reflection-basedProxyapproach with a properAbstractTeamsSubcommandsubclass (requires TeamsAPI ≥ 1.8.0). - TeamsAPI subcommand registration now uses an explicit
isPluginEnabled("TeamsAPI")guard instead of relying onNoClassDefFoundErrorsuppression. - Faction claim GUI icons now attempt to use player skulls when claimant/owner identity is available, with configurable fallback material when unavailable.
- Added configurable title, size, claim item format/lore, skull toggle, and navigation slot/name settings for faction GUI pages.
- Update checker refactored to use
mc-plugin-update-notifierwith Modrinth as primary source and GitHub Releases as fallback source.
- Heatmap enablement now resolves correctly for inherited/fallback world settings (
heatmap.enabled) and no longer reads as disabled unexpectedly in world/GUI override paths. /rtp heatmapno longer hard-requires biome cache for non-biome heatmaps. Biome cache is only required for biome-filtered heatmap requests.- Spigot startup compatibility fixed in update checking (
JavaPlugin#getDescription().getVersion()used instead of Paper-only metadata calls). - Message loading now supports both top-level keys and nested
messages.*language-file layouts. - Language file handling is now non-destructive: startup repair only targets clearly corrupted message files, with automatic backfill of missing message keys while preserving existing translations/customizations.
- PvP tag integration: EzRTP now detects when a player enters combat and cancels their
pending teleport or active countdown. Three plugins are supported out of the box:
- CombatLogX — auto-detected at startup; soft dependency.
- PvPManager — auto-detected at startup; soft dependency.
- Simple Combat Log (NikeyV1/CombatLog) — auto-detected at startup; soft dependency.
- All three are added to
softdependinplugin.ymlso they load before EzRTP when present. No configuration change is required on servers that do not use any of them. - New
pvp-tag-integrationsection inrtp.yml:cancel-countdown-on-pvp-tag(defaulttrue): cancel an active countdown the moment the player is tagged.cancel-queued-on-pvp-tag(defaulttrue): skip a queued teleport if the player is already in combat when their slot is dispatched.
- New message keys
countdown-pvp-cancelandqueue-pvp-tag-cancelinmessages/*.ymlfor the cancellation notifications. - Modrinth release metadata now declares
pvpmanagerandsimple-combatlogas optional dependencies.
- Folia teleport crash (
UnsupportedOperationException: Must use teleportAsync while in region threading):BukkitPlatformSchedulernow overridesteleportAsyncand, when running on Folia (regionizedRuntimecapability), callsplayer.teleportAsync(Location)via reflection instead of the forbidden synchronousplayer.teleport(). The Bukkit module was the only scheduler that still used the synchronous fallback from the interface default;PaperPlatformScheduleralready calledteleportAsyncdirectly.
BukkitPlatformSchedulernow handles Folia servers correctly. Previously, running EzRTP on Folia without the Paper runtime module caused anUnsupportedOperationExceptionduring plugin enable because the BukkitCraftSchedulerrejects all synchronous task scheduling on Folia. The scheduler now detectsregionizedRuntimecapabilities and routes all scheduling calls through Folia'sGlobalRegionScheduler/RegionSchedulervia reflection, matching the behaviour already present inPaperPlatformScheduler.
PerformanceSnapshot#fmtnow passesLocale.UStoString#format, ensuring decimal separators are always locale-independent (dots, not commas).
- Dependency scope for
ezrtp-commonin theezrtp-paperandezrtp-purpurmodules changed toprovided; the common module is bundled by the main plugin JAR and must not be re-included by platform modules.
- TeamsAPI claim avoidance: EzRTP now integrates with TeamsAPI to skip chunk-claimed areas during RTP destination search.
- New protection provider id:
teamsapi. Works alongside the existingworldguardandgriefpreventionproviders. - Enabled automatically when TeamsAPI (with a compatible claim provider) is installed. Silently skipped when absent, no errors, no configuration changes required.
teamsapiadded to the defaultprotection.providerslist inrtp.yml.TeamsAPIadded tosoftdependinplugin.yml.- Claim availability is evaluated dynamically per check, so a claim plugin that loads after EzRTP is picked up without a reload.
- New protection provider id:
- Message suppression via config (
config.yml):messages.suppress-player: whentrue, silences all teleport-related messages to players globally (searching, countdown, queue position, success, failure, cost).messages.suppress-console: whentrue, silences the executor notification that/forcertpsends to the command sender globally.
--skip-messagecommand flag: can be appended to/rtp,/rtp <center|region>,/forcertp <player> [world], and/rtp forcertp <player> [world]to suppress both player-facing and executor messages for that single invocation. Tab-completion suggests the flag.BiomeCompatutility (ezrtp-common): reflection-basedsafeName(Biome)andsafeValueOf(String)helpers that work correctly whetherorg.bukkit.block.Biomeis an enum (Spigot/Bukkit ≤ Paper 25) or an interface (Paper 26+), preventingIncompatibleClassChangeErrorat runtime.- Movement-cancel during countdown: if a player moves too far from their starting position while a countdown is running, the teleport is cancelled.
countdown.cancel-on-move(defaulttrue) — enable or disable the feature.countdown.cancel-distance(default2.0) — distance in blocks that triggers cancellation.countdown.warn-distance(default1.0) — distance in blocks that sends a one-time warning before cancellation. Set to0to disable the warning.- Two new message keys:
countdown-move-warnandcountdown-move-cancel(configurable inmessages/en.yml).
- Minecraft version support expanded to 1.13+:
api-versioninplugin.ymllowered from1.21to1.13; plugin will now load on any server from MC 1.13 onwards. - Java 17 output bytecode:
maven.compiler.releasechanged from25to17so the built JARs run on Java 17+ hosts. The build toolchain still requires JDK 25 to compile againstpaper-api. - Modrinth
game-versionsbroadened to>=1.13in release and nightly workflows (was>=26.1). RareBiomeRegistry.getDefaultRareBiomes(): replaced a single try/catch wrapping allBiome.valueOf()calls with per-biomeBiomeCompat.safeValueOf()guards, so a biome absent on the running server version (e.g.MODIFIED_JUNGLEremoved in 1.18,DEEP_DARKadded in 1.19) no longer silently prevents the remaining biomes from being registered.- All
biome.name()call sites replaced withBiomeCompat.safeName(biome)acrossRareBiomeRegistry,GuiSettings,BiomeLocationCache,StatsSubcommand, andHeatmapSubcommand.
- Stale
<fork>,<executable>, and<jvm>references to deletedjava25.javac/java25.javaproperties removed from rootpom.xmlcompiler and Surefire plugin configuration.
- Initial changelog entry. See repository history for prior changes.