Minecraft
A server can only send one resource pack (two or more only on 1.20.3+, and plugins often still need one). When you want several packs (a texture pack, custom item models, a GUI pack, sounds), you merge them into a single zip. Copying folders on top of each other seems to work, but silently breaks anything two packs both define.
How merging actually works
Every file in a pack has a path, like assets/minecraft/textures/block/stone.png. When two packs contain the same path, only one file can win.
| File type | What happens on a clash | What you must do |
|---|---|---|
Textures (.png), sounds (.ogg) |
One replaces the other. | Pick which pack wins: usually the more specific one. |
pack.mcmeta, pack.png |
Only one is used. | Keep one, set the right pack_format. |
Item model files (assets/minecraft/models/item/*.json, and assets/minecraft/items/*.json on 1.21.4+) |
One replaces the other, and every custom model in the losing file disappears. | Merge the contents (see below). |
sounds.json |
One replaces the other: all the losing pack's custom sounds stop playing. | Merge the JSON objects. |
Language files (lang/en_us.json) |
One replaces the other. | Merge the JSON objects. |
Atlas files (atlases/*.json, 1.19.3+) |
One replaces the other: textures outside the default folders go missing. | Merge the sources lists. |
Fonts (font/default.json) |
One replaces the other: custom GUI glyphs and emojis vanish. | Merge the providers lists, and make sure no two use the same character. |
Rule of thumb: images and sounds pick a winner; JSON files get merged.
Step by step
- Back up all the packs, and write down the order of importance (the pack whose textures should win goes last).
- Make a new folder, e.g.
ServerPack/. - Copy the least important pack in first, then each next pack on top. When your file manager asks about replacing, note every JSON file it wants to replace; those need merging. Let images and sounds be replaced.
- For each clashing JSON file, open both versions and combine them:
Item models (1.21.3 and older): combine the
overridesarrays and keep them sorted bycustom_model_data, lowest first. Two packs using the same number for different items is a real conflict: change one pack's numbers (and the items that use them).{ "parent": "minecraft:item/handheld", "textures": { "layer0": "minecraft:item/diamond_sword" }, "overrides": [ { "predicate": { "custom_model_data": 1001 }, "model": "packa:item/ruby_sword" }, { "predicate": { "custom_model_data": 2001 }, "model": "packb:item/frost_blade" } ] }Item definitions (1.21.4+): custom models live in
assets/<namespace>/items/<item>.jsonwith arange_dispatchorselecton custom model data. Merge theentries/caseslists the same way.sounds.json / lang files: they're objects of named entries. Copy every entry from both into one object; if both define the same key, keep one.
Atlases: combine the
sourceslists.Fonts: combine the
providerslists.
- Write one
pack.mcmetawith thepack_formatfor your server version. - Zip the contents of
ServerPack/(sopack.mcmetais at the top of the zip). - Validate the JSON: a single missing comma breaks the whole file. Paste each edited file into a JSON validator, or open the pack in a game client and check
logs/latest.logforCouldn't parseerrors. - Test in your own game, then host it.
Avoid clashes in the first place
- Use your own namespace. Put custom models and textures under
assets/yourpack/...instead ofassets/minecraft/.... Only the small "hook" files (the vanilla item model or item definition that points to your model) need to live inminecraft. - Reserve number ranges for custom model data: e.g. pack A uses 1000–1999, pack B 2000–2999.
- Keep a source folder for each pack and rebuild the merged zip from them, instead of editing the merged copy by hand each time.
Let a plugin do the merging
If you run ItemsAdder, Nexo or Oraxen, they build the server pack themselves and can import other packs into it: drop the other pack into the plugin's merge/import folder (see that plugin's documentation) and reload. They handle the model and font merging for you, and many custom-item plugins conflict with a hand-set resource-pack anyway.
Optimise the result
Large merged packs download slowly. PackSquash compresses PNGs, OGGs and JSON losslessly and can cut a pack's size by half or more. Run it on the final merged pack, then recalculate the SHA-1.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Some custom items show as the plain vanilla item | Their model file lost a clash. Merge the overrides / item-definition entries. |
| Pink-and-black checkered textures | A model points to a texture path that's missing, often moved during merging, or missing from an atlas. |
| Custom sounds silent | sounds.json was replaced instead of merged. |
| GUI icons or emojis missing | font/default.json was replaced instead of merged, or two packs used the same character. |
| Whole pack fails to load | Invalid JSON somewhere, or pack.mcmeta isn't at the top of the zip. Check the client's latest.log. |
