ResourcePackManager (RSPM)
ResourcePackManager discovers, merges, hosts, and distributes resource packs from supported plugins and from manually supplied packs. It can also convert the merged Java pack into a Bedrock resource pack so GeyserMC players see the same custom content as Java players, and it ships first-class support for BungeeCord, Waterfall, and Velocity proxy networks.
What It Does
- discovers supported plugin packs and merges them according to
priorityOrder - runs its own built-in HTTP server so it can self-host the merged pack (no external file host required)
- can fall back to MagmaGuy's free hosting (auto-host) when self-hosting isn't viable
- can force or optionally prompt pack use
- watches for pack changes and re-merges automatically when sources stabilize
- converts the merged Java pack into a Bedrock resource pack for GeyserMC
- works on proxy networks: every backend produces its own Bedrock pack, the proxy plugin pulls them, merges them, and serves the result through Geyser
Architecture at a Glance
RSPM v2 is a multi-module Maven build, but it ships as a single jar: ResourcePackManager.jar. That one jar contains the Bukkit/Paper plugin, the Velocity plugin, and the BungeeCord/Waterfall plugin all at once — Minecraft loads whichever entry point matches the platform it's running on. There are no longer separate ResourcePackManager-Velocity.jar / ResourcePackManager-BungeeCord.jar files and no proxy-extension/ folder.
The same jar plays two roles depending on where you drop it:
- As a backend plugin (on each Paper/Spigot backend) — mixes Java packs, runs the Bedrock converter, hosts the pack, exposes a small HTTP server, and pushes packs to Java clients.
- As a proxy plugin (on a Velocity or BungeeCord/Waterfall proxy) — pulls each backend's Bedrock pack and mappings, merges them into a single network-wide pack, and serves it to Bedrock clients via the proxy's Geyser.
A standalone server only needs the jar on the backend. A proxy network needs the same jar on every backend AND a copy on the proxy.
When the backend detects a local Geyser-Spigot install, it also drops a bundled ResourcePackManager-GeyserBridge.jar into Geyser-Spigot/extensions/ (a Geyser extension, not a separate plugin) so Geyser can render RSPM's custom Bedrock entities.
Hosting Options
Three delivery paths, picked automatically in this order when autoHost: true:
- Self-host first (
preferSelfHost: true, default) — RSPM starts its own HTTP server, runs a chain of sanity checks (non-LAN address, localhost self-probe, magmaguy.com external-reachability probe), and announces the local URL to clients. Zero bandwidth cost to MagmaGuy. - Remote auto-host fallback — if any self-host check fails, RSPM uploads the pack to MagmaGuy's CDN at
magmaguy.com/rsp/and announces that URL instead. - Forced self-host (
selfHostForce: true) — skips both probes and remote upload entirely. Mainly for testing.
If autoHost: false, RSPM writes the merged zip to plugins/ResourcePackManager/output/ and you take it from there.
See Self-hosting for the full delivery decision tree, port resolution, and external-host detection.
Java-to-Bedrock Conversion
The Bedrock converter is no longer FreeMinecraftModels-only. It walks every 1.21.4+ items definition file (assets/<namespace>/items/*.json) in the merged pack and produces Bedrock geometry, attachables, and inventory icons for whichever plugin shipped them:
- Bedrock players see 3D items, custom armor, and modeled equipment for any plugin whose pack uses the 1.21.4+ items-definition format.
- Custom armor textures render on Bedrock players using the vanilla armor geometry with the Java texture as the visible layer.
- Inventory icons for 3D items are software-rendered from the Java model through the
display.guitransform. - The Bedrock pack is served live per Bedrock session via Geyser's API, so texture and model tweaks reach the next joining Bedrock player without a server restart. Custom-item mappings still require a restart because Geyser registers them at boot.
- Twelve user-tunable knobs for held-item display offsets (six first-person, six third-person) in
bedrock_display_offsets.yml.
Current Integrations
ResourcePackManager ships with premade integration entries for these plugins:
- BackpackPlus
- BetterHUD
- BetterStructures
- CannonRTP
- EliteMobs
- EternalTD
- FreeMinecraftModels
- InfiniteVehicles
- ItemsAdder
- MegaBlockSurvivors
- MMOInventory
- ModelEngine
- Nexo
- Nova
- Oraxen
- RealisticSurvival
- ResurrectionChest
- ValhallaMMO
- vane-core
Each integration only activates if the plugin is installed and its configured local path or remote URL is usable. The plugin also detects Geyser (Geyser-Spigot on a backend, Geyser-Velocity / Geyser-BungeeCord on a proxy) at startup and wires Bedrock pack delivery into whichever one it finds.
Where to Go Next
- Setup — operator workflow for a standalone server
- Proxy networks — step-by-step setup for BungeeCord / Waterfall / Velocity
- Self-hosting — built-in HTTP server, port resolution, external-host detection
- Bedrock / Geyser conversion — what gets converted, tuning knobs
- FAQ — common questions
- Troubleshooting — what to check when something's broken
- API — registering packs from your own plugin