User Tools

Site Tools


tutorial:shield

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:shield [2021/10/18 06:34] – grammar cringestar_boitutorial:shield [2024/01/14 18:05] (current) – fixed model cringestar_boi
Line 1: Line 1:
-====== Making a Custom Shield in Minecraft ======+====== Making a Custom Shield in Minecraft [1.19-1.20] ======
  
 Congrats! You just learned how to create your custom sword in the last tutorial! Now imagine you want to shield yourself from that sword if your friend got it. If you made it too op, a regular shield won't do. So we will see how to make a custom shield.\\  Congrats! You just learned how to create your custom sword in the last tutorial! Now imagine you want to shield yourself from that sword if your friend got it. If you made it too op, a regular shield won't do. So we will see how to make a custom shield.\\ 
-Luckily, CrimsonDawn45 has already made a library to help with this! If he didn't, you probably would be sitting here for the next hour to follow this tutorial, so thanks CrimsonDawn45!+Luckily, StellarWind22 has already made a library to help with this! If she didn't, you probably would be sitting here for the next hour following this tutorial, so thanks StellarWind22!
  
-Library source is available at https://github.com/CrimsonDawn45/Fabric-Shield-Lib+The library source is available at https://github.com/CrimsonDawn45/Fabric-Shield-Lib 
 + 
 +Library compiled as a jar is available at https://www.curseforge.com/minecraft/mc-mods/fabric-shield-lib
  
 ===== Adding the library to your project ===== ===== Adding the library to your project =====
Line 11: Line 13:
 **gradle.properties**\\  **gradle.properties**\\ 
 <code java> <code java>
-fabric_shield_lib_version=1.4.1+fabric_shield_lib_version=1.7.2-1.20.4 
 +midnightlib_version=1.5.2-fabric 
 +mod_menu_version=9.0.0-pre.1 
 +fabricasm_version=2.3
 </code>\\  </code>\\ 
 **build.gradle** (under dependencies)\\  **build.gradle** (under dependencies)\\ 
 <code java> <code java>
-modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}-${project.minecraft_version}"+ modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}
 + 
 + modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}" 
 + 
 + modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" 
 + 
 + modImplementation "com.github.Chocohead:Fabric-ASM:v${project.fabricasm_version}"
 </code>\\  </code>\\ 
-At the time of writing, latest project.fabric_shield_lib_version should be 1.4.1, and latest project.minecraft_version should be 1.17.1. This page will be updated whenever a new update comes out.\\ \\  + 
-**build.gradle** (under repositories)\\ +At the time of writing, the latest project.fabric_shield_lib_version should be 1.7.2, which supports versions: 
 +  * **1.20.2** - **1.20.4** (''1.7.2-1.20.4''
 +  * **1.20** - **1.20.1** (''1.7.2-1.20.1''
 +  * **1.19.3** - **1.19.4** (''1.7.2-1.19.4''
 +  * **1.19** - **1.19.2** (''1.7.2-1.19.2''
 +  * **1.18.2** (''1.7.2-1.18.2''
 +  * **1.17.1** (''1.7.2-1.17.1'')\\  
 +**build.gradle** (inside repositories, the one above dependencies)\\ 
 <code java> <code java>
-allprojects { repositories { maven { url 'https://jitpack.io' } } }+ maven {url 'https://jitpack.io'} 
 + maven {url "https://maven.terraformersmc.com/releases/"} 
 + maven {url = "https://api.modrinth.com/maven"}
 </code>\\  </code>\\ 
 +
 +__//**Midnight Lib and FabricASM are included in the FabricShieldLib release (.jar on Curseforge/Modrinth) but need to be used as dependencies when developing**//__
  
 ===== Adding a custom shield ===== ===== Adding a custom shield =====
-**If you want your shield to support banner decoration, there are extra steps that will be covered after the main creation.**\\+**If you want your shield to support banner decoration on your shieldplease skip to the next section**\\
 On to the non-boring steps! We will now make a custom shield!\\ \\  On to the non-boring steps! We will now make a custom shield!\\ \\ 
-If you have followed the above steps correctly and refreshed the project, then you will have the fabric shield api installed.\\ +If you have followed the above steps correctly and refreshed the project, then you will have the FabricShieldLib installed.\\ 
 If so, the first step to do is create a new instance of an Item like: If so, the first step to do is create a new instance of an Item like:
 <code java> <code java>
-public static final Item NETHERITE_SHIELD = new FabricShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItem+public static final Item NETHERITE_SHIELD = new FabricShieldItem(new FabricItemSettings().maxDamage(2500), 10, 13, Items.NETHERITE_INGOT); // FabricShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItems
-</code>\\  +</code> 
-Then, we have to register it, like so:\\ + 
 +Then, we have to register it, like so: 
 + 
 <code java> <code java>
-Registry.register(Registry.ITEM, new Identifier("examplemod", "netherite_shield"), NETHERITE_SHIELD) +Registry.register(Registries.ITEM, new Identifier("examplemod", "netherite_shield"), NETHERITE_SHIELD); 
-</code>\\  +</code> 
-And our shield is done!\\ + 
 +If you want to add your shield to a creative tab, add this into your ''onInitialize()'' method: 
 +<code java> 
 +ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { 
 + entries.add(NETHERITE_SHIELD); 
 +}); 
 +</code> 
 + 
 +And our shield is (code-wise) done!\\ 
 Now, we have to create the textures and models of the shield.\\  Now, we have to create the textures and models of the shield.\\ 
-For the texture, you can use anything. A good place to start is looking at mojang's shield image and changing it. Put it in resources/textures/item/<filename>.png\\ +For the texture, you can use anything. A good place to start is to look at Mojang's shield texture and change it. Put it in ''resources/assets/examplemod/textures/item/netherite_shield.png''\\ 
 Now, for the models, we have to write a few .json files.\\  Now, for the models, we have to write a few .json files.\\ 
-For the model file without blockingwe use: \\ + 
 + 
 +Inside ''resources/assets/examplemod/models/item/''create a ''netherite_shield.json'' file and put this inside it:\\  
 <code javascript> <code javascript>
 { {
-    "parent":"fabricshieldlib:item/fabric_shield_template",+    "parent":"fabricshieldlib:item/fabric_shield",
     "textures":{     "textures":{
         "shield":"examplemod:item/netherite_shield"         "shield":"examplemod:item/netherite_shield"
Line 56: Line 91:
 } }
 </code>\\  </code>\\ 
-Put it in resources/models/item/netherite_shield.json\\  + 
-For the blocking modeluse this\\ +In the same foldercreate another file, ''netherite_shield_blocking.json'', and put his inside it
 <code javascript> <code javascript>
 { {
-  "parent": "fabricshieldlib:item/fabric_shield_blocking_template"+  "parent": "fabricshieldlib:item/fabric_shield_blocking"
 +  "textures":
 +    "shield":"examplemod:item/netherite_shield" 
 +  }
 } }
 </code>\\  </code>\\ 
-Plop it in resources/models/item/netherite_shield_blocking.json\\ \\  + 
-Don't forget to add it to **en_us.json**\\ +Lastly, create a ''shields.json'' file in ''resources/data/c/tags/items/shields.json'' and add your shield to it:
 <code javascript> <code javascript>
 { {
-  "item.examplemod.netherite_shield": "Netherite Shield"+  "replace": false, 
 +  "values":
 +    "examplemod:netherite_shield" 
 +  ]
 } }
 </code>\\  </code>\\ 
-And with that, your shield is done! 
  
- +Don't forget to add it to **en_us.json** in ''resources/assets/lang/en_us.json''\\  
-===== Adding banner support to your shield ===== +<code javascript
- +
-This is where mixins get involved. +  "item.examplemod.netherite_shield": "Netherite Shield" 
- +}
-First thing you will want to do is to change //FabricShieldItem// to //FabricBannerShieldItem// so that it will be able to be crafted with banners. +
- +
-<code java+
-public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItem)+
 </code>\\  </code>\\ 
 +And with that, your non-decorateable shield is done!
  
-Next, we will need to create an ''EntityModelLayer'' to use later. I recommend making it in your main class.+===== Adding a custom shield with banner support ===== 
 +The process is slightly different if you want to make your shield accept banners and decorateable like a vanilla shield.
  
 +We still make the item in the same way, just make it a FabricBannerShieldItem:
 <code java> <code java>
-public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); +public static final Item NETHERITE_BANNER_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItems)
 </code> </code>
- 
-And now we get to the mixin. Don't worry, its an easy one. 
  
-If this is your first time[[tutorial:mixin_registration|here's how to register mixins on your fabric.mod.json]] +Thenwe have to register it: 
- + 
-We will make a class called ''RendererMixin'' and write:+
 <code java> <code java>
-@Mixin (BuiltinModelItemRenderer.class) +Registry.register(Registries.ITEM, new Identifier("examplemod", "netherite_banner_shield"), NETHERITE_BANNER_SHIELD);
-public class RendererMixin { +
- +
-{+
 </code> </code>
  
-Then we will make the necessary ''Spriteidentifier''s and a ''ShieldEntityModel''.+If you want to add your shield to creative tab, add this into your ''onInitialize()'' method:
 <code java> <code java>
-@Mixin (BuiltinModelItemRenderer.class) +ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> 
-public class RendererMixin + entries.addAfter(Items.SHIELD,NETHERITE_BANNER_SHIELD); 
-    private ShieldEntityModel modelNetheriteShield; +});
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTUREnew Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern")); +
-}+
 </code> </code>
  
-Next, we need to @Shadow the ''entityModelLoader'' so that we can use it to initialize our model. +Now the item is created, we need to set up its rendering. For these steps, we are going to be working in our client mod initializerwhich should already be set up for you in the fabric example mod.
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
-    private ShieldEntityModel modelNetheriteShield; +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTUREnew Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));+
  
-    @Final 
-    @Shadow 
-    private EntityModelLoader entityModelLoader; 
-}     
-</code> 
  
-Now we will inject into the ''reload'' method to initialize our model.+First, we will need to create an ''EntityModelLayer'' to use later.
 <code java> <code java>
-@Mixin (BuiltinModelItemRenderer.class) +public class ExampleModClient implements ClientModInitializer {
-public class RendererMixin { +
-   private ShieldEntityModel modelNetheriteShield; +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));+
  
-    @Final +    public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier("examplemod", "netherite_banner_shield"),"main");
-    @Shadow +
-    private EntityModelLoader entityModelLoader;+
  
- +    @Override 
-    @Inject(method = "reload", at = @At("HEAD")) +    public void onInitializeClient() {
-    private void setModelNetheriteShield(CallbackInfo ci){ +
-        modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleMod.NETHERITE_SHIELD_MODEL_LAYER)); +
-    } +
-+
-</code>     +
-  +
-Now we get to the most important part of the mixin. We will inject a method to render a banner on our shield. +
-   +
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
-   private ShieldEntityModel modelNetheriteShield; +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern")); +
- +
-    @Final +
-    @Shadow +
-    private EntityModelLoader entityModelLoader; +
- +
- +
-    @Inject(method = "reload", at = @At("HEAD")) +
-    private void setModelNetheriteShield(CallbackInfo ci){ +
-        this.modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleMod.NETHERITE_SHIELD_MODEL_LAYER)); +
-    }+
          
-    @Inject(method = "render", at = @At("HEAD")) 
-    private void mainRender(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo ci) { 
-        if (stack.isOf(ExampleMod.NETHERITE_SHIELD)) { 
-            FabricShieldItem.renderBanner(stack, matrices, vertexConsumers, light, overlay, modelNetheriteShield, NETHERITE_SHIELD_BASE, NETHERITE_SHIELD_BASE_NO_PATTERN);  
-            //The first five parameters are taken from the method, while the last 3 you provide yourself. You will provide the model, and then your 2 sprite identifiers in the order of ''//SHIELD_NAME//_BASE'' and then ''//SHIELD_NAME//_BASE_NOPATTERN. 
-'' 
-        } 
     }     }
- 
-     
 } }
-</code>     +</code>
  
-There is one more big thing and five little things that we have left to do.+Next, we will register out ''EntityModelLayer'' that we made previously
  
-We have to register our ''entityModelLayer'' and our ''SpriteIdentifiers'' in our ''ClientModInitalizer''.+<code java> 
 +public class ExampleModClient implements ClientModInitializer {
  
-To create our ''ClientModInitalizer'', we will make a new class called ''ExampleModClient'' and implement ''ClientModInitializer''. We will also implement and override the method ''onInitializeClient'' **(If you already have a client initializeryou can skip these next 2 steps.)**+    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​
  
-<code java> 
-public class ExampleModClient implements ClientModInitializer { 
     @Override     @Override
     public void onInitializeClient() {     public void onInitializeClient() {
-    + EntityModelLayerRegistry.registerModelLayer(netherite_banner_shield_model_layer, ShieldEntityModel::getTexturedModelData);
     }     }
 } }
 </code> </code>
  
-Before we do any work in our client mod initializerwe need to register its entrypoint in ''fabric.mod.json''.+Then we will create our shield model,
  
-<code javascript+<code java
-{ +public class ExampleModClient implements ClientModInitializer {
-  [...] +
-  "entrypoints":+
-    "main":+
-      "net.fabricmc.ExampleMod" +
-    ], +
-    "client":+
-      "net.fabricmc.ExampleModClient" +
-    ] +
-  } +
-  [...] +
-+
-</code>+
  
-Okso now that is donewe can work in our client initializer.+    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod""netherite_shield"),"main"); ​ 
 +     
 +    public static ShieldEntityModel modelNetheriteShield;
  
-First, we will register out ''EntityModelLayer'' that we made previously.  
- 
-<code java> 
-public class ExampleModClient implements ClientModInitializer { 
     @Override     @Override
     public void onInitializeClient() {     public void onInitializeClient() {
-        EntityModelLayerRegistry.registerModelLayer(ExampleMod.NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);+        EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);
     }     }
 } }
 </code> </code>
  
-Next we will register our 2 ''SpriteIdentifier''s.+And then register that shield model,
  
 <code java> <code java>
 public class ExampleModClient implements ClientModInitializer { public class ExampleModClient implements ClientModInitializer {
 +
 +    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main");
 +    
 +    public static ShieldEntityModel modelNetheriteShield;
 +
     @Override     @Override
     public void onInitializeClient() {     public void onInitializeClient() {
-        EntityModelLayerRegistry.registerModelLayer(ExampleMod.NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); +        EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); 
-        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).register((atlasTexture, registry) -> { +         
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base")); +        ShieldSetModelCallback.EVENT.register((loader) -> { 
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern"))+     modelNetheriteShield = new ShieldEntityModel(loader.getModelPart(netherite_banner_shield_model_layer)); 
-        });+     return ActionResult.PASS
 + });
     }     }
 } }
 </code> </code>
  
-That is now all of the complicated things done! We now only need to change our existing model, add a ''nopattern'' textureand move our textures to the locations we identified earlier.+Next, we have to create our two ''SpriteIdentifiers'', 
 +<code java> 
 +public class ExampleModClient implements ClientModInitializer {
  
-In your shield model, ''netherite_shield.json'' for uswe need to change the parent and remove the texture.+ public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier("examplemod", "netherite_banner_shield"),"main"); 
 + 
 + public static ShieldEntityModel modelNetheriteShield; 
 + 
 + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod", "entity/netherite_banner_shield_base")); 
 + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod", "entity/netherite_banner_shield_base_nopattern")); 
 + 
 + @Override 
 + public void onInitializeClient() { 
 +            EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); 
 +         
 +            ShieldSetModelCallback.EVENT.register((loader) -> { 
 +         modelNetheriteShield = new ShieldEntityModel(loader.getModelPart(netherite_banner_shield_model_layer)); 
 +         return ActionResult.PASS; 
 +     }); 
 +
 +
 +</code> 
 + 
 +Finally, we are going to register our shield with the ''BuiltinItemRendererRegistry'', 
 +<code java> 
 +public class ExampleModClient implements ClientModInitializer { 
 + 
 + public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier("examplemod", "netherite_banner_shield"),"main"); 
 + 
 + public static ShieldEntityModel modelNetheriteShield; 
 + 
 + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod", "entity/netherite_banner_shield_base")); 
 + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod", "entity/netherite_banner_shield_base_nopattern")); 
 + 
 + @Override 
 + public void onInitializeClient() { 
 +            EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); 
 +         
 +            ShieldSetModelCallback.EVENT.register((loader) -> { 
 +         modelNetheriteShield = new ShieldEntityModel(loader.getModelPart(netherite_banner_shield_model_layer)); 
 +         return ActionResult.PASS; 
 +     }); 
 +  
 +            BuiltinItemRendererRegistry.INSTANCE.register(ExampleMod.NETHERITE_BANNER_SHIELD, (stack, mode, matrices, vertexConsumers, light, overlay) -> { 
 + renderBanner(stack, matrices, vertexConsumers, light, overlay, modelNetheriteShield, NETHERITE_BANNER_SHIELD_BASE, NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN); 
 +                //The first five parameters are taken from the method, while the last 3 you provide yourself. You will provide the model, and then your 2 sprite identifiers in the order of SHIELD_NAME_BASE and then SHIELD_NAME_BASE_NOPATTERN. 
 +     }); 
 +
 +
 +</code>\\ 
 + 
 +That is all of our code done, we only have a few .json files to make. \\ 
 + 
 +First, create a ''blocks.json'' file inside of ''resources/assets/minecraft/atlases/''
 + 
 +Inside of ityou will have to list your ''SpriteIdentifiers'' from your client mod initializer like this:
 <code javascript> <code javascript>
 { {
-  "parent":"fabricshieldlib:item/fabric_shield_banner_support_template", +  "sources": 
-    "overrides": [ +    { 
-        +      "type": "single", 
-            "predicate": +      "resource": "examplemod:entity/netherite_banner_shield_base" 
-                "blocking": 1 +    }, 
-            }+    
-            "model": "examplemod:item/netherite_shield_blocking+      "type": "single", 
-        +      "resource": "examplemod:entity/netherite_banner_shield_base_nopattern
-    ]+    
 +  ]
 } }
 </code> </code>
  
-You also have to change your blocking model for your shield, ''netherite_shield_blocking.json'' for us, to:+Nextinside ''resources/assets/examplemod/models/item/'', create a ''netherite_banner_shield.json'' file and put this inside it:\\ 
  
 <code javascript> <code javascript>
 { {
-  "parent":"fabricshieldlib:item/fabric_shield_banner_support_blocking_template"+  "parent":"fabricshieldlib:item/fabric_banner_shield"
 +  "overrides":
 +    { 
 +      "predicate":
 +        "blocking":
 +      }, 
 +      "model": "examplemod:item/netherite_banner_shield_blocking" 
 +    } 
 +  ]
 } }
-</code>+</code>\\ 
  
-For this next step, you will add ''_base'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base''+In the same folder, create another file, ''netherite_banner_shield_blocking.json'', and put his inside it:  
-Then, you will need to make a ''nopattern'' version for your shield texture, so ''netherite_shield_base_nopattern''. I recommend looking at the vanilla shield's ''nopattern'' texture.+<code javascript> 
 +
 +  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking", 
 +  "textures":
 +    "shield":"examplemod:item/netherite_shield" 
 +  } 
 +
 +</code>\\  
 + 
 +For this next step, you will add ''netherite_shield_base_nopattern'' texture, which will be a standard shield texture
 +Then, you will need to make a ''base'' version for your shield texture, so ''netherite_shield_base''. I recommend looking at the vanilla shield's ''base'' texture.
  
 Then, you will move both of these textures into ''resources/assets/<modid>/textures/entity''. Then, you will move both of these textures into ''resources/assets/<modid>/textures/entity''.
  
-For one last thingyou will need to add names for each of your shield color variants in ''en_us.json''.+Lastlycreate a ''shields.json'' file in ''resources/data/c/tags/items/shields.json'' and add your shield to it:
 <code javascript> <code javascript>
 { {
-    "item.examplemod.netherite_shield": "Netherite Shield"+  "replace": false
-    "item.examplemod.netherite_shield.red": "Red Netherite Shield", +  "values": [ 
-    "item.examplemod.netherite_shield.orange": "Orange Netherite Shield", +    "examplemod:netherite_banner_shield
-    "item.examplemod.netherite_shield.yellow": "Yellow Netherite Shield", +  ]
-    "item.examplemod.netherite_shield.lime": "Lime Netherite Shield", +
-    "item.examplemod.netherite_shield.green": "Green Netherite Shield", +
-    "item.examplemod.netherite_shield.light_blue": "Light Blue Netherite Shield", +
-    "item.examplemod.netherite_shield.cyan": "Cyan Netherite Shield", +
-    "item.examplemod.netherite_shield.blue": "Blue Netherite Shield", +
-    "item.examplemod.netherite_shield.purple": "Purple Netherite Shield", +
-    "item.examplemod.netherite_shield.magenta": "Magenta Netherite Shield", +
-    "item.examplemod.netherite_shield.pink": "Pink Netherite Shield", +
-    "item.examplemod.netherite_shield.brown": "Brown Netherite Shield", +
-    "item.examplemod.netherite_shield.white": "White Netherite Shield", +
-    "item.examplemod.netherite_shield.light_gray": "Light Gray Netherite Shield", +
-    "item.examplemod.netherite_shield.gray": "Gray Netherite Shield", +
-    "item.examplemod.netherite_shield.dark_gray": "Dark Gray Netherite Shield", +
-    "item.examplemod.netherite_shield.black": "Black Netherite Shield"+
 } }
-</code>    +</code>\\ 
  
-Now your shield is done and has banner support!+Don't forget to add it to **en_us.json** in ''resources/assets/lang/en_us.json'' along with the color variants,\\  
 +<code javascript> 
 +
 +  "item.examplemod.netherite_banner_shield": "Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.red": "Red Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.orange": "Orange Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.yellow": "Yellow Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.lime": "Lime Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.green": "Green Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.light_blue": "Light Blue Banner Netherite Shield", 
 +  "item.examplemod.netherite_banner_shield.cyan": "Cyan Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.blue": "Blue Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.purple": "Purple Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.magenta": "Magenta Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.pink": "Pink Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.brown": "Brown Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.white": "White Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.light_gray": "Light Gray Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.gray": "Gray Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.dark_gray": "Dark Gray Netherite Banner Shield", 
 +  "item.examplemod.netherite_banner_shield.black": "Black Netherite Banner Shield" 
 +
 +</code> 
 + 
 +And now your shield is fully completed and supports banner decoration! 
 + 
 +===== Changes for 1.19 ===== 
 +If you are working in 1.19, make sure to change the FabricShieldLib and FAPI versions accordingly as well as changing your Midnight Lib and Mod Menu dependencies to these versions:\\ 
 +**gradle.properties** 
 +<code java> 
 +midnightlib_version=1.0.0-fabric 
 +mod_menu_version=4.2.0-beta.2 
 +</code>
tutorial/shield.1634538860.txt.gz · Last modified: 2021/10/18 06:34 by cringestar_boi