Fixed
- **World resets working again** — Reverted the `WorldCreator.ofKey()` change introduced in 1.1.6. In Paper 26.1, after a world is unloaded via `Bukkit.unloadWorld()`, its dimension key remains registered internally for the session. Re-creating with the same custom-namespace key (e.g. `bubblereset:resource_world`) was silently rejected by Paper, causing `Bukkit.createWorld()` to return `null` and leaving the world permanently missing — players received the "under Maintenance" message on every teleport attempt.
Clarified (no code change)
- **World folder location is correct** — Paper 26.1 follows Minecraft's dimension storage architecture: all worlds are stored as dimensions inside the primary server level (`world/dimensions/minecraft/<name>/`). Root-level world folders are no longer created by Paper 26.x. This is expected behavior; worlds function identically — teleports, resets, borders, and game rules all work as before.
Fixed
- **World folders now created at server root** — `WorldCreator` was using an implicit `minecraft:` namespace, causing newer Paper/Purpur builds to store resource worlds as sub-dimensions inside `world/dimensions/minecraft/` instead of as top-level folders. Switched to `WorldCreator.ofKey(new NamespacedKey(plugin, name))` so the dimension key becomes `bubblereset:resource_world`, which Paper correctly resolves to a standalone world folder at the server root. Fix applies to both initial world creation and post-reset recreation.
Paper API updated to 26.1.2 (build 53, stable) — new Paper version scheme (26.1.2.build.53-stable)
plugin.yml api-version updated to '26.1.2' (required format for Paper 26.1+)
Java compiler target bumped from 21 → 25 to match Paper 26.1 recommended baseline
MockBukkit updated from MockBukkit-v1.20:3.15.1 → MockBukkit-v1.21:3.133.2
Improved (resource world regeneration)
Player eviction uses teleportAsync() — players are now kicked from the world via Paper's async teleport API before reset, reducing main-thread stall during chunk unloading
Spawn chunk pre-warming after recreation — after a new resource world is generated, a configurable radius of chunks around spawn is pre-loaded with getChunkAtAsync() so the world is immediately ready for players (performance.spawn-preload-radius, default 3)
preloadChunksAsync() simplified — removed a redundant CompletableFuture wrapper; getChunkAtAsync() is already non-blocking and handles its own threading
deleteWorldFolder() rewritten with NIO — now uses Files.walk(...).sorted(reverseOrder()) to guarantee files are deleted before their parent directories, fixing the silent-failure case where non-empty directories were not deleted
Added -
New `/rwadmin reload` command - Dedicated reload command with enhanced feedback
- Displays reload time in milliseconds
- Reports number of reset timers cleared
- Shows cached worlds cleared count
- Confirms config cache rebuild status
-
New `/rwadmin test <feature>` command - Comprehensive testing system for diagnostics
- `
cache` - View world and config cache contents with entry counts
- `
timer` - Display next reset times for all worlds (shows remaining hours/minutes)
- `
performance` - Show operation performance metrics (teleport, reset timings)
- `
tps` - Check current server TPS with color-coded health indicators (green/yellow/red)
- `
config` - Verify configuration loading for all worlds (displays name, auto-reset status, interval/time_of_day mode)
-
Enhanced tab completion - Added full tab completion support for `
/rwadmin` subcommands and test features
Improved -
Reload command feedback - More detailed output showing exactly what was cleared and recalculated
-
World cache management - Reload now properly clears world cache in addition to config cache and reset timers
-
Admin panel access - `
/rwadmin` with no arguments opens admin panel, or use `
/rwadmin panel` explicitly
-
Console compatibility - Reload and test commands now work from console, not just in-game
Fixed - Continued fix from v1.1.2: Reset timers properly clear on reload, ensuring `
time_of_day` changes take effect immediately
Technical - Refactored command handler to support subcommands (panel, reload, test)
- Added dedicated test methods for each diagnostic feature
- Updated ResourceTabCompleter to handle both `
/resource` and `
/rwadmin` commands
- Improved error handling and permission checks for admin commands
✨ New Features Time-of-day automated resets - Added `automated_resets.time_of_day` (format `HH:mm`) under each dimension. - When set, the auto-reset schedule runs at that local server time instead of using the interval timer. - Existing interval-based scheduling still works as a fallback when `time_of_day` is blank.
️ Fixes
Custom menu heads (Base64 textures) - Fixed `
/resource` menu custom head textures showing as Steve.
- Head textures are now applied using the Base64 `
textures` value reliably (preferred) with URL/JSON fallback.
- Config now documents that `
menu.items.<slot>.texture` supports Base64 (recommended) or a textures URL.
Datapacks support (custom structures / loot tables) - New `
datapacks` config section to automatically copy datapacks into freshly created resource worlds.
- Optional `
/minecraft:reload` after copying so datapacks apply without a full restart.
- Configurable source (`
world:<name>` or `
folder:<path>`) and per-dimension apply toggles.
Per-world teleport toggle - New `
teleport_enabled` option per dimension:
- `
world.teleport_enabled`
- `
nether.teleport_enabled`
- `
end.teleport_enabled`
- Blocks teleports from both `
/resource tp <world>` and the `
/resource` GUI when disabled.
️ Improvements - Added clear notes in `
config.yml` explaining default `
/resource` GUI behavior and permissions.
- Improved GUI click handling to identify the BubbleReset menu reliably (uses a dedicated inventory holder).
- Added a fallback to read the menu action from item lore when PDC is unavailable.