Multipacks have a power feature: Post processing passes. These passes modify files in your pack into something else, such as splitting sprite atlas into multiple PNGs, or applying multiple PNG overlays on top of an sprite. ```json { "//": "multipacks.json contents", "...": "...", "postProcess": } ``` There are 2 JSON types that post processing can accept: an object or an array that contains ````: ```ts type WithPostProcess = PackIndex & { postProcess?: PostProcessingObject }; type PostProcessingObject = object | PostProcessingObject[]; ``` ## Why is it so powerful? For most developers that are using Multipacks Engine, there is a way to obtain build results, which is shared across all packs during building process: ```java BundleResult result = bundler.bundle(pack, outputStream, new BundleInclude[] { BundleInclude.RESOURCES, BundleInclude.DATA }); ModelDataAllocator models = result.getOrCreate(ModelDataAllocator.class, ModelDataAllocator::new); AllocatedModelData data = models.mappedModels.get(new ResourcePath("namespace:my-custom-item")); ItemStack is = server.getItemFactory().createItemStack(data.itemId.toString()); ItemMeta meta = is.getItemMeta(); meta.setCustomItemModel(data.modelId); is.setItemMeta(meta); ``` For pack creators, it's just a way to reuse assets from other packs, but you don't have to copy and paste every time the author updates the pack. Isn't that cool? ## List of post processing passes - [Include](./Post-Processing_Include): Including other passes from JSON file. - Files manipulation (does not affect actual files) + [Copy](./Post-Processing_Copy): Copy files + [Move](./Post-Processing_Move): Move files + [Delete](./Post-Processing_Delete): Delete files - Advanced + [Font Icons](./Post-Processing_Font-Icons) + [Textures Atlas Template](./Post-Processing_Atlas) + [Overlays](./Post-Processing_Overlay) - Allocations + [Custom Item Models](./Post-Processing_Custom-Item-Models) ## More processing passes If you think that's not enough, consider using Multipacks plugins.