Resourceloader
A simple and flexible resource pack loader and merger plugin for Minecraft servers. Load different resource packs and merge multiple packs into one with ResourceLoader!
Features
- Load the server's default resource pack with a simple command
- Configure and load multiple additional resource packs
- Merge multiple resource packs in the plugin itself
- Support for both URL and file-based resource packs
- Easy-to-use commands
- Permission-based access control
- Simple configuration
Commands
/load- Load the default server resource pack/load <packname>- Load a specific resource pack/mergepack <output-file>.zip <pack1> <pack2> [pack3...]- Merge existing resource packs in the plugin itself/listpacks- List all available resource packs/resourcereload- Reload the plugin configuration/resourceversion- Check the version of ResourceLoader you're running
Permissions
resourceloader.load- Allows using the /load command (default: true)resourceloader.list- Allows using the /listpacks command (default: true)resourceloader.reload- Allows reloading the plugin configuration (default: op)resourceloader.admin- Allows access to all the admin commands of ResourceLoader (default: op)
Configuration
# Main server resource pack
# Can be either a URL or a file name in the packs folder
# For URLs: "https://example.com/server-pack.zip"
# For files: "server-pack.zip"
server-pack: "server-pack.zip"
# Web server settings
server-port: 40021 # Default port, can be changed to any open port on your host
localhost: false # Set to false for production servers, true only for local testing
server-address: "" # Will try to auto-detect if empty
fallback-address: "localhost" # Used if auto-detection fails
# Additional resource packs
# Can use either URLs or files from the packs folder
# For URLs: "https://example.com/examplepack.zip"
# For files: "example-pack.zip"
resource-packs:
exampleurlpack: "https://example.com/examplepack.zip"
examplefilepack: "example-pack.zip"
Installation
- Download the latest release
- Place the JAR file in your server's
pluginsfolder - Start/restart your server
- A
packsfolder will be created inplugins/Resourceloader/ - Place your resource pack files in the
packsfolder - Configure the packs in
config.yml - Use
/resourcereloadto apply changes
File-based Resource Packs
To use file-based resource packs:
- Place your .zip resource pack files in the
plugins/Resourceloader/packs/folder - In config.yml, use just the filename (e.g., "my-pack.zip") instead of a full URL
- The plugin will automatically look for the file in the packs folder
URL-based Resource Packs
For URL-based packs:
- Use the complete URL in config.yml (e.g., "https://example.com/pack.zip")
- Ensure the URL is directly downloadable
- The URL must point to a valid Minecraft resource pack .zip file
Requirements
- Minecraft 1.13 or newer
- Spigot/Paper server
Support
If you encounter any issues or have suggestions, please contact @vortexunwanted on discord.
All Versions
+ Add Version### Runs on Minecraft 1.13 through 26.3 again
Since 2.3, Resourceloader refused to load on anything older than 1.21, and every version needed Java 17 (which most 1.13–1.16 servers don't run), even though older versions were listed. 2.5.2 runs on **every version from 1.13 to 26.3, on the Java version that server already uses (Java 8 or newer)**. It was tested end to end (loading, autoload, enforcement, URL packs, merging, the merge GUI,
/checkpack, languages) on Paper 1.13.2, 1.14.4, 1.15.2, 1.16.5, 1.17.1, 1.18.2, 1.19.4, 1.20.2, 1.20.4, 1.20.6, 1.21.4, 1.21.11 and 26.3.What depends on the server version:
- 1.18+:** under enforcement, the pack prompt shows the pack as required.
- Before 1.20.2:**
/mergepackwrites the server's own pack format into the merged pack, since clients that old only readpack_format. Players there don't get an "incompatible" warning. - 1.20.3+:** packs have ids, so a pack added by
/autoloadinuse-server-propertiesmode stacks on top of the server.properties pack. On older versions it replaces it, because clients before 1.20.3 hold one server pack at a time.
### 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 withresourceloader.bypasswere kicked as well. Kicks now only happen whenenforcement.enabledis on, and only for the pack enforced on join. A pack a player picks later can be declined freely. - Packs copied into the
packsfolder 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. Customstorage.resource-pack-directoryfolders are now watched too. - Merged packs work on 1.21.9+ and 26.x.**
/mergepacknever actually saved the updatedpack.mcmetainto 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, plussupported_formatsfor 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.jsonentries are combined the way the game combines stacked packs. Models are no longer broken by gluing together elements from different packs. /autoloadnow 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: falseno longer breaks URL packs. enforcement.use-server-properties:**/autoloadpreferences 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 usemin_format/max_format, flags the samepack.mcmetamistakes 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.
/mergepackoutput names are cleaned up, so a name can no longer write outside the packs folder.- A warning is logged at startup when
server.addressis 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.
/loadwith a URL pack shows "Loading…" once instead of twice.
### Fixes
- Misplaced pack entries are repaired automatically** (#11). Pack entries written at the top level of
config.ymlinstead of underresource-packs:used to be silently ignored, so/loadand/packlistshowed nothing. They are now moved intoresource-packson startup and/resourcereload(a backup is saved asconfig.yml.pre-repair.bak) and the correct layout is explained in the log. - Warns when enforcement is enabled but
server-packis empty. - Missing-pack warnings now show the full path the file was expected at.
/loadmatches pack names case-insensitively./removepackno longer errors whenresource-packsis missing./checkpackhonours a customstorage.resource-pack-directory.- Fixed messages with more than one placeholder being corrupted.
### Translations
- New
languageoption inconfig.yml:en,ru,tr,ko,zh(locale-style values likeru_RUorzh-CNalso work). Translations are extracted tolang/messages_<code>.ymland fall back to English for any missing key. - All chat, help, version-check,
/removepack,/checkpackand merge GUI text is now inmessages.yml, so every message can be customised. - Added the missing
kick.declinedandenforcement.restricted-commandmessage keys.
- Fixed config reading issues
- Improved logging
- Improved merged pack integrity
- Added
/checkpack <packname>command for comprehensive pack validation - Validates pack structure, JSON files, and texture references
- Checks pack.mcmeta format and compatibility with server version
- Provides detailed error reports and warnings
- Supports both local and URL-based pack validation
### Performance Optimizations
- Implemented SHA1 hash caching system to prevent redundant downloads
- Added automatic cache cleanup with configurable retention periods
- Optimized pack serving with reduced memory footprint
- Enhanced file system event batching to reduce server load
### Improved Pack Merging
- Enhanced JSON merging with intelligent handling of model files and blockstates
- Automatic pack format detection and compatibility adjustment
- Better conflict resolution for duplicate textures and assets
- Improved metadata preservation during merge operations
### File System Operations
- Resolved recursive renaming loops and duplicate notifications
- Fixed file watcher to properly batch events and prevent spam
- Added processing locks and delays to handle rapid file system changes
- Improved file operation error handling and recovery
### Monitoring and Statistics
- Added pack usage tracking and performance metrics
- Implemented player preference history with configurable limits
- Enhanced cache statistics and monitoring capabilities
- Improved validation result reporting with formatted output
### Security and Stability
- Added input sanitization for pack names and file paths
- Enhanced permission validation throughout command execution
- Implemented safer file operations with atomic writes where possible
- Improved configuration protection against corruption
- Fixed
/autoload - Added functionality for utilizing
server.propertiesto load resource pack before player joins - Added customizable resource pack folder path
- Allowed auto-detection to be toggle-able
- Fixed bugs in messages
- Added new
messages.yml - Made resource pack merging more efficient and space conscious
- Made resource pack loading smoother and more dynamic
1. **Resource Pack Enforcement**
- Server owners can now require players to use resource packs
- Players can be kicked or restricted if they decline the pack
- Admins can give special players permission to bypass this requirement
- Better messages when packs are loading, accepted, or fail
2. **Smart Caching System**
- Resource packs now load much faster for returning players
- Server automatically cleans up old cached packs
- Less bandwidth usage for both server and players
- Better handling of connection issues
3. **Performance Improvements**
- Much faster resource pack loading
- Better handling of large packs
- Reduced server resource usage
- Smoother experience when switching packs
## Quality of Life Updates
- Better error messages when something goes wrong
- Clearer feedback when loading packs
- More reliable pack merging
- Updated for latest Minecraft version
## For Server Admins
New configuration options in
config.yml:``
yaml
enforcement:
enabled: false # Turn on/off required resource packs
action: kick # What happens when players decline (kick or restrict)
decline-message: "You must accept the resource pack!"
`
`yaml
cache:
enabled: true # Turn on/off pack caching
days: 7 # How long to keep cached packs
auto-cleanup: true # Automatically remove old cache
``Users can now merge multiple resource packs on their server into a single pack right in their server itself!
The webserver that's created for hosting the resource pack files locally is now more secure and optimized.
## Added a version checking command
/resourceversion (/rv) now tells you the version of Resourceloader you're running.
Resource packs can now be locally hosted on the server and be referenced through file path.
## Added /autoload
Players can now automatically set a preferred resource pack to load when they join the server using /autoload