CMI mode didn't work — v1.4 ran the wrong command and CMI rejected it. v1.5 runs the correct one (cmi:spawn <player>, with spawn <player> as fallback). mode: cmi now teleports your players as expected.
Smaller jar (986 KB → 16 KB)
The MiniMessage / Adventure libraries are no longer bundled inside the jar. The server downloads them once on first start into its shared libraries/ folder and reuses them for every plugin that needs them.
You don't need to do anything. Drop the jar in, start the server, done. Internet required on first boot only (subsequent starts use the cached copy).
Air-gapped server? Copy the libraries/net/kyori/ folder over from any machine with internet.
What changed under the hood
CMI dispatch command corrected.
Adventure + MiniMessage moved out of the jar, declared in plugin.yml under a libraries: block (Bukkit LibraryLoader, Spigot/Paper/Folia 1.18+).
Shading removed entirely.
Drop-in replacement for 1.4. No config changes. Compatible with Spigot, Paper, Purpur & Folia 1.18 – 1.21+.
CMI mode — set mode: cmi to dispatch /cmi spawn <player>. For servers running CMI instead of EssentialsX.
MiniMessage + HEX support — the join message now accepts modern MiniMessage syntax (HEX, gradients, hover, click). Legacy & codes still work — format is auto-detected per message.
Code (YAML):
message: "<gradient:#55FF55:#00AAFF>Teleported to spawn for safety.</gradient>"
Fixed
Essentials "Unknown command" error — /spawn lives in the EssentialsSpawn module, not Essentials core, so essentials:spawn fails on servers that only have the spawn module loaded. v1.4 tries essentialsspawn:spawn → spawn → essentials:spawn in order. Resolves the Unknown or incomplete command, see below for error essentials:spawn Tester<--[HERE] report.
Tech
Adventure 4.3.4 + MiniMessage 4.13.1 shaded and relocated under cc.arrowtan.safeSpawn.lib.kyori — no clash with Paper's bundled Adventure.
CMI added to softdepend.
Drop-in replacement for 1.3. No config changes required — defaults are unchanged, new MiniMessage examples are added via auto-migration.
Compatible with Spigot, Paper, Purpur & Folia 1.18 – 1.21+.
Folia support. Plugin now runs on Folia servers (regionised multithreading fork of Paper) without throwing UnsupportedOperationException from the scheduler or sync teleport.
folia-supported flag.folia-supported: true added to plugin.yml so Folia loads SafeSpawn without the unsupported-software warning.
SchedulerAdapter abstraction. Detects Folia at runtime via class probe and routes work to the correct scheduler:
Delayed per-player tasks → Player#getScheduler().runDelayed(...) on Folia, BukkitScheduler#runTaskLater elsewhere.
Essentials command dispatch → GlobalRegionScheduler#execute(...) on Folia, direct dispatch elsewhere.
Player teleport → Player#teleportAsync(Location) on Paper/Folia, sync Player#teleport(Location) on plain Spigot.
✦ Changed
TeleportService routes all scheduling and teleporting through SchedulerAdapter instead of calling BukkitScheduler and Player#teleport directly.
✦ Compatibility
Drop-in replacement for v1.2. No config changes.
Same jar runs on Spigot, Paper, and Folia. Folia classes accessed via reflection — still compiles against plain Spigot 1.18.2 API.
Spigot/Paper behavior identical to v1.2. Folia class probe fails → original code paths.
On Folia, EssentialsX is not officially Folia-compatible. If Essentials throws when invoked, SafeSpawn falls back to custom-location (same fallback policy as before).
Download the jar and drop it in plugins/. Restart or /safespawn reload is not enough — full restart required for the new flag to take effect on Folia. — zArrowTan
Essentials teleport got cancelled when players moved during the warmup. SafeSpawn was running /spawn as the player, which triggered Essentials' teleport-warmup countdown (default 5s). Any movement during those 5 seconds cancelled the teleport and the player stayed inside the restricted world.
Changed
Essentials mode now dispatches essentials:spawn <player> from the console sender instead of running /spawn as the player. Console bypasses the warmup, so the teleport is instant and unaffected by player movement.
Namespaced command (essentials:spawn) prevents collision with other plugins that register a /spawn alias.
Compatibility
Drop-in replacement for v1.1. No config changes required.
Requires the console to have permission to run essentials:spawn <player> (granted by default in EssentialsX).
SafeSpawn v1.1 nLogin support + auto config migration
+ Added
nLogin integration. Teleport now fires after the player authenticates (AuthenticateEvent), so nLogin's freeze + pre-auth location restore can't override SafeSpawn Auto-enables when nLogin is installed.
wait-for-login config option (default true). Set to false to force PlayerJoinEvent behavior even with nLogin present.
Config auto-migration. New keys shipped in future updates are added to your config.yml automatically on enable and on /safespawn reload. Your existing values are preserved.
× Fixed
Players getting stuck in duels and other restricted worlds on servers using nLogin. Root cause: PlayerJoinEvent fired while the player was still unauthenticated and frozen by nLogin.
Teleport now re-checks the player's world inside the scheduled task, so a player who already left the restricted world is not yanked back.
Typo on the name field in plugin.yml.
~ Changed
Teleport logic extracted into a shared TeleportService, used by both the join and auth paths. No behavior change for non-nLogin servers.
softdepend now includes nLogin alongside Essentials.
i Compatibility
Drop-in replacement for v1.0. No config changes required.
Spigot 1.18+ (1.20, 1.21 confirmed).
Works with or without nLogin / EssentialsX installed.
Install: drop SafeSpawn-1.1.jar in plugins/, restart server. Author: zArrowTan — https://arrowtan.cc