Resourceloader 2.5.1
### Fixes
- **Players are no longer kicked for declining or failing an optional pack.** With enforcement off (the default), declining a pack sent by `/load`, or failing to download it, kicked the player, and operators with `resourceloader.bypass` were kicked as well. Kicks now only happen when `enforcement.enabled` is on, and only for the pack enforced on join. A pack a player picks later can be declined freely.
- **Packs copied into the `packs` folder while the server was off are now detected** on startup and on `/resourcereload`. Before, only packs added while the server was running got registered. Files that aren't valid zips are skipped with a warning. Custom `storage.resource-pack-directory` folders are now watched too.
- **Merged packs work on 1.21.9+ and 26.x.** `/mergepack` never actually saved the updated `pack.mcmeta` into the zip, and its version table stopped at 1.21, so 26.x clients saw merged packs as incompatible. Merged packs now declare a format range covering every input pack and the server's own version, in the layout newer clients require (`min_format`/`max_format`, plus `supported_formats` for older ones).
- **Merge priority with 3+ packs:** a file from a middle pack could be overridden by the first pack. Later packs now always win.
- **Merging no longer drops content from lower packs:** language strings, texture atlas sources and `sounds.json` entries are combined the way the game combines stacked packs. Models are no longer broken by gluing together elements from different packs.
- **`/autoload` now works with URL packs** (it used to do nothing), matches pack names case-insensitively, and players with bypass still get their own autoload pack on join.
- **Enforcement:** the enforced pack is now sent as required. `enforcement.restrict` (blocking `/tp`, `/home`, `/spawn`… and interactions until the pack has loaded) now works. An autoload preference pointing at a removed pack no longer lets a player skip the enforced pack.
- **URL packs:** if the pack's host is down, the cached copy is used instead of failing. Unchanged packs are no longer re-downloaded after a restart. An interrupted download no longer leaves a broken cached file. `cache.enabled: false` no longer breaks URL packs.
- **`enforcement.use-server-properties`:** `/autoload` preferences now apply on join, and a preferred pack is added on top of the server.properties pack instead of replacing it.
- **`/checkpack`:** accepts 1.21.9+/26.x packs that use `min_format`/`max_format`, flags the same `pack.mcmeta` mistakes the game refuses to load, warns when a pack's version doesn't match the server, stops reporting vanilla textures as missing, and no longer shows "successful" next to critical issues.
- **Merge GUI:** selected packs now show "✓ Selected", and clicking items in your own inventory no longer triggers the Merge/Cancel buttons.
- `/mergepack` output names are cleaned up, so a name can no longer write outside the packs folder.
- A warning is logged at startup when `server.address` is empty and the detected address is a loopback or Docker one, the usual reason pack downloads fail on Docker/Pterodactyl hosts.
- Packs are no longer re-hashed on every send, which cuts join lag with large packs.
- `/load` with a URL pack shows "Loading…" once instead of twice.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }