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 [2022/09/05 19:22] – fixed version cringestar_boitutorial:shield [2024/09/29 19:35] (current) – updated with 1.21 guide and past guides cringestar_boi
Line 1: Line 1:
-__**THIS PAGE SHOULD WORK FOR 1.17-1.19THE 1.14-1.16 SECTIONS HAVE NOT BEEN TESTED IN A LONG TIME, SO THEY MAY NOT WORK.**__+====== Making a Custom Shield in Minecraft [1.19-1.21.1] ====== 
 +:!: The tutorial depends on third-party libraries.
  
-====== Making a Custom Shield in Minecraft [1.19-1.14] ======+Congrats! You just learned how to create your custom tools in the last tutorial! Now imagine you want to shield yourself from that sword if your friend got itIf 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, 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!
-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!+
  
-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 Library compiled as a jar is available at https://www.curseforge.com/minecraft/mc-mods/fabric-shield-lib
Line 12: Line 12:
 ===== Adding the library to your project ===== ===== Adding the library to your project =====
  
-Add the following code to the files mentioned:\\ \\  +Add the following code to the files mentioned:
-**gradle.properties**\\  +
-<code java> +
-fabric_shield_lib_version=1.6.0-1.19 +
-</code>\\  +
-**build.gradle** (under dependencies)\\  +
-<code java> +
-modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}" +
-</code>\\  +
-At the time of writing, latest project.fabric_shield_lib_version should be 1.6.0-1.19. This page will be updated whenever a new update comes out.\\ \\  +
-**build.gradle** (under repositories, the one above dependencies)\\  +
-<code java> +
- maven { url = 'https://jitpack.io'+
-</code>\\ +
  
-__//**If you are doing this in Minecraft version 1.17 or higher or using FabricShieldLib version 1.5.0 or higher, add these things as well:**//__+**gradle.properties** 
 +<file properties gradle.properties> 
 +fabric_shield_lib_version=1.7.2-1.21.1 
 +midnightlib_version=1.5.8-fabric 
 +mod_menu_version=11.0.1 
 +fabricasm_version=2.3 
 +</file>
  
-**gradle.properties**\\  +**build.gradle** (under ''dependencies'' block)  
-<code java+<file groovy build.gradle
- fabric_asm_version=2.+ modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}" 
- cloth_version=8.1.77 + modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}" 
- mod_menu_version=4.0.6 + modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" 
- crowdlin_version=1.4+1.19 + modImplementation "com.github.Chocohead:Fabric-ASM:v${project.fabricasm_version}" 
-</code>\\ +</file>
  
-**(These versions will be updated in this wiki alongside the mod version)**+At the time of writing, the latest project.fabric_shield_lib_version should be 1.7.2, which supports versions: 
 +  * **1.21** - **1.21.1** (''1.7.2-1.21.1'') 
 +  * **1.20.5** - **1.20.6** (''1.7.2-1.20.6''
 +  * **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'' block) 
 +<file groovy build.gradle> 
 + maven {url = 'https://jitpack.io'
 + maven {url "https://maven.terraformersmc.com/releases/"
 + maven {url = "https://api.modrinth.com/maven"
 +</file>\\ 
  
-**build.gradle** (under dependencies)\\  +__//**Midnight Lib and FabricASM are included in the FabricShieldLib release (.jar on Curseforge/Modrinth) but need to be used as dependencies when developing**//__
-<code java>+
  
- modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}") { +===== Adding a custom shield ===== 
- exclude(group: "net.fabricmc.fabric-api"+**If you want your shield to support banner decoration on your shield, please skip to the next section**
-+
- include("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}")+
  
- modCompileOnly modRuntimeOnly ("com.terraformersmc:modmenu:${project.mod_menu_version}"),+On to the non-boring steps! We will now make a custom shield!
- exclude(group: "net.fabricmc.fabric-api"+
- }+
  
- modImplementation("com.github.Chocohead:Fabric-ASM:v${project.fabric_asm_version}") { +If you have followed the above steps correctly and refreshed the project, then you will have the FabricShieldLib installed.
- exclude (group: "net.fabricmc.fabric-api"+
-+
- include("com.github.Chocohead:Fabric-ASM:v${project.fabric_asm_version}")+
  
-</code>\\ +If so, the first step to do is create a new instance of an ''Item'' (see [[items]] tutorial), like: 
 +<code java TutorialItems> 
 +public final class TutorialItems { 
 +    // ... 
 +    public static final Item NETHERITE_SHIELD = register(new FabricShieldItem(new FabricItemSettings().maxDamage(2500), 10, 13, Items.NETHERITE_INGOT), "netherite_shield");  
 +    //The constructor for the item takes in the following values: FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItems 
 +    // ... 
 +
 +</code>
  
-**build.gradle** (under repositories, the one above dependencies)\\  +If you want to add your shield to a [[itemgroup|item groups]], for example, the "Combatgroup, use:
-<code java> +
- maven { url "https://maven.shedaniel.me/+
- maven { url "https://maven.terraformersmc.com/releases/"+
-</code>\\ +
  
-===== Adding a custom shield ===== +<yarncode java ExampleMod
-**If you want your shield to support banner decoration, there are extra steps that will be covered after the main creation.**\\ +public class ExampleMod implements ModInitializer { 
-On to the non-boring steps! We will now make a custom shield!\\ \\  +    @Override 
-If you have followed the above steps correctly and refreshed the project, then you will have the fabric shield api installed.\\  +    public void onInitialize() 
-If so, the first step to do is create a new instance of an Item like: +        ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { 
-<code java> +            entries.add(NETHERITE_SHIELD)
-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+        })
-</code>+    } 
 +} 
 +</yarncode>
  
-Then, we have to register it, like so: +And our shield is (code-wise) done! 
-  + 
-<code java> +Now, we have to create the textures and models of the shield. 
-Registry.register(Registry.ITEM, new Identifier("examplemod", "netherite_shield"), NETHERITE_SHIELD); + 
-</code>+For the texture, you can use anythingA good place to start is to look at Mojang's shield texture and change itPut it in ''resources/assets/tutorial/textures/item/netherite_shield.png''
  
-And our shield is done!\\  +Now, for the models, we have to write a few .json files
-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/assets/examplemod/textures/item/<filename>.png''\\  +Inside ''resources/assets/tutorial/models/item/'', create ''netherite_shield.json'' file and put this inside it: 
-Nowfor the models, we have to write few .json files.\\  + 
-For the model file without blocking, we use\\  +<file javascript resources/assets/tutorial/models/item/netherite_shield.json>
-<code javascript>+
 { {
     "parent":"fabricshieldlib:item/fabric_shield",     "parent":"fabricshieldlib:item/fabric_shield",
     "textures":{     "textures":{
-        "shield":"examplemod:item/netherite_shield"+        "shield":"tutorial:item/netherite_shield"
     },     },
     "overrides": [     "overrides": [
Line 95: Line 99:
                 "blocking": 1                 "blocking": 1
             },             },
-            "model": "examplemod:item/netherite_shield_blocking"+            "model": "tutorial:item/netherite_shield_blocking"
         }         }
     ]     ]
 } }
-</code>\\  +</file>  
-Put it in ''resources/assets/examplemod/models/item/netherite_shield.json''\\  + 
-For the blocking model, use this: \\  +In the same folder, create another file, ''netherite_shield_blocking.json'', and put his inside it:  
-<code javascript>+<file javascript resources/assets/tutorial/models/item/netherite_shield_blocking.json>
 { {
-  "parent": "fabricshieldlib:item/fabric_shield_blocking"+  "parent": "fabricshieldlib:item/fabric_shield_blocking"
 +  "textures":
 +    "shield":"tutorial:item/netherite_shield" 
 +  }
 } }
-</code>\\  +</file
-Plop it in resources/models/item/netherite_shield_blocking.json\\ \\  + 
-Don't forget to add it to **en_us.json** in ''resources/assets/lang/en_us.json''\\  +Then, as a [[tags|conventional tag]], create a ''shield.json'' file in ''resources/data/c/tags/item/tools/shield.json'' and add your shield to it: 
-<code javascript>+<code javascript resources/data/c/tags/items/shields.json>
 { {
-  "item.examplemod.netherite_shield": "Netherite Shield"+  "replace": false, 
 +  "values":
 +    "tutorial:netherite_shield" 
 +  ]
 } }
-</code>\\  
-And with that, your shield is done! 
- 
- 
-===== Adding banner support to your shield (1.17+) ===== 
- 
-If you are using 1.17/1.18 instead of 1.19, please change versions in **gradle.properties** to: 
-<code java> 
- fabric_shield_lib_version=1.5.3-1.18 
- fabric_asm_version=2.3 
- cloth_version=6.2.57 
- mod_menu_version=3.0.1 
- crowdlin_version=1.4+1.18 
-</code> 
-or 
-<code java> 
- fabric_shield_lib_version=1.5.3-1.17 
- fabric_asm_version=2.3 
- cloth_version=5.3.63 
- mod_menu_version=2.0.15 
- crowdlin_version=1.3+1.17 
 </code> </code>
  
- +Lastly, to make it enchantable, create a ''durability.json'' file in ''resources/data/minecraft/tags/item/enchantable/durability.json'' and add your shield to it: 
-This is where mixins get involved. +<code javascript resources/data/minecraft/tags/item/enchantable/durability.json> 
- +
-First thing you will want to do is to change //FabricShieldItem// to //FabricBannerShieldItem// so that it will be able to be crafted with banners. +  "replace": false, 
- +  "values":
-<code java> +    "tutorial:netherite_shield" 
-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>
  
-Now, we have to register a few things in our ''ClientModInitalizer''. +Don't forget to add it to **en_us.json** in ''resources/assets/tutorial/lang/en_us.json'' 
- +<code javascript resources/assets/tutorial/lang/en_us.json
-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 initializer, you can skip these next 2 steps.)** +
- +  "item.tutorial.netherite_shield": "Netherite Shield"
-<code java+
-public class ExampleModClient implements ClientModInitializer +
-    @Override +
-    public void onInitializeClient() { +
-     +
-    }+
 } }
-</code>+</code>\\  
 +And with that, your non-decorateable shield is done!
  
-Before we do any work in our client mod initializer, we need to register its entrypoint in ''fabric.mod.json''.+===== 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.
  
-<code javascript> +We still make the item in the same way, just make it a ''FabricBannerShieldItem'': 
-+<code java TutorialItems
-  [...] +    public static final Item NETHERITE_BANNER_SHIELD = register(new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500), 10, 13, Items.NETHERITE_INGOT), "netherite_banner_shield");
-  "entrypoints": { +
-    "main":+
-      "net.fabricmc.ExampleMod" +
-    ], +
-    "client": [ +
-      "net.fabricmc.ExampleModClient" +
-    ] +
-  } +
-  [...] +
-}+
 </code> </code>
 +If you want to add your shield to a [[itemgroup|item groups]], for example, the "Combat" group, use:  
 + 
 +<yarncode java ExampleMod>  
 +public class ExampleMod implements ModInitializer {  
 +    @Override  
 +    public void onInitialize() {  
 +        ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> {  
 +            // ...  
 +            entries.add(NETHERITE_BANNER_SHIELD);  
 +        });  
 +    }  
 +}  
 +</yarncode>
  
-Ok, so now that is done, we can work in our client initializer.+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 initializer, which should already be set up for you in the fabric example mod.
  
 First, we will need to create an ''EntityModelLayer'' to use later. First, we will need to create an ''EntityModelLayer'' to use later.
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class ExampleModClient implements ClientModInitializer { public class ExampleModClient implements ClientModInitializer {
- +    public static final EntityModelLayer NETHERITE_BANNER_SHIELD_MODEL_LAYER = new EntityModelLayer(Identifier.of("tutorial", "netherite_banner_shield"),"main");
-    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); +
  
     @Override     @Override
Line 193: Line 182:
  
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 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 final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(Identifier.of("tutorial", "netherite_shield"),"main");
  
     @Override     @Override
     public void onInitializeClient() {     public void onInitializeClient() {
-        EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);+ EntityModelLayerRegistry.registerModelLayer(NETHERITE_BANNER_SHILED_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);
     }     }
 } }
 </code> </code>
  
-Then we will register our 2 ''SpriteIdentifier''s.+Then we will create our shield model,
  
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class ExampleModClient implements ClientModInitializer { public class ExampleModClient implements ClientModInitializer {
- +    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(Identifier.of("tutorial", "netherite_shield"), "main"); 
-    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(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")); 
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern")); 
-        }); 
     }     }
 } }
 </code> </code>
  
-And now we get to the mixin. Don't worryits an easy one.+And then register that shield model,
  
-If this is your first time, [[tutorial:mixin_registration|here's how to register mixins on your fabric.mod.json]] //__(Make sure to make a **client** mixin)__// 
- 
-We will make a class called ''RendererMixin'' and write: 
 <code java> <code java>
-@Mixin (BuiltinModelItemRenderer.class+@Environment(EnvType.CLIENT
-public class RendererMixin { +public class ExampleModClient implements ClientModInitializer { 
- +    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(Identifier.of("tutorial", "netherite_shield"),"main"); 
-+
-</code> +
- +
-Then we will make the necessary ''Spriteidentifier''s and a ''ShieldEntityModel''. The ''Spriteidentifier''s will be the same as in your ''ClientModInitializer''+
-<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")); +
-+
-</code> +
- +
-Next, we need to @Shadow the ''entityModelLoader'' so that we can use it to initialize our model. +
-<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; +
-}     +
-</code> +
- +
-Now we will inject into the ''reload'' method to initialize our model. +
-<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){ +
-        modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleModClient.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_TEXTUREnew 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(ExampleModClient.NETHERITE_SHIELD_MODEL_LAYER)); +
-    }+
          
-    @Inject(method = "render", at = @At("HEAD")) +    public static ShieldEntityModel modelNetheriteShield;
-    private void mainRender(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo ci) { +
-        if (stack.isOf(ExampleMod.NETHERITE_SHIELD)) { +
-            FabricShieldLibClient.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>      
- 
-That is now all of the complicated things done! We now only need to change our existing model, add a ''nopattern'' texture, and move our textures to the locations we identified earlier. 
- 
-In your shield model, ''netherite_shield.json'' for us, we need to change the parent and remove the texture. 
-<code javascript> 
-{ 
-  "parent":"fabricshieldlib:item/fabric_banner_shield", 
-    "overrides": [ 
-        { 
-            "predicate": { 
-                "blocking": 1 
-            }, 
-            "model": "examplemod:item/netherite_shield_blocking" 
-        } 
-    ] 
-} 
-</code> 
- 
-You also have to change your blocking model for your shield, ''netherite_shield_blocking.json'' for us, to: 
- 
-<code javascript> 
-{ 
-  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" 
-} 
-</code> 
- 
-For this next step, you will add ''_base_nopattern'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base_nopattern''. 
-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''. 
- 
-For one last thing, you will need to add names for each of your shield color variants in ''en_us.json''. 
-<code javascript> 
-{ 
-    "item.examplemod.netherite_shield": "Netherite Shield", 
-    "item.examplemod.netherite_shield.red": "Red Netherite Shield", 
-    "item.examplemod.netherite_shield.orange": "Orange Netherite 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>     
- 
-===== Adding banner support to your shield (1.16) ===== 
- 
-This is where mixins get involved. 
- 
-First, change the fabric_shield_lib in **gradle.properties** 
-\\  
-<code java> 
-fabric_shield_lib_version=1.4.5-1.16 
-</code> 
-\\  
- 
-Next 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> 
- 
-Now, we have to register a few things in our ''ClientModInitalizer''. 
- 
-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 initializer, you can skip these next 2 steps.)** 
- 
-<code java> 
-public class ExampleModClient implements ClientModInitializer { 
     @Override     @Override
     public void onInitializeClient() {     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> </code>
  
-Before we do any work in our client mod initializer, we need to register its entrypoint in ''fabric.mod.json''+Next, we have to create our two ''SpriteIdentifiers'',
- +
-<code javascript> +
-+
-  [...] +
-  "entrypoints":+
-    "main":+
-      "net.fabricmc.ExampleMod" +
-    ], +
-    "client":+
-      "net.fabricmc.ExampleModClient" +
-    ] +
-  } +
-  [...] +
-+
-</code> +
- +
-Ok, so now that is done, we can work in our client initializer. +
- +
-The only thing that we will need to do is register our 2 ''SpriteIdentifier''s. +
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class ExampleModClient implements ClientModInitializer { public class ExampleModClient implements ClientModInitializer {
  
-    @Override + public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(Identifier.of("tutorial", "netherite_banner_shield"), "main");
-    public void onInitializeClient() { +
-        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).register((atlasTexture, registry) -> { +
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base")); +
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern")); +
-        }); +
-    } +
-+
-</code>+
  
-And now we get to the mixin. Don't worry, its an easy one.+ public static ShieldEntityModel modelNetheriteShield;
  
-If this is your first time[[tutorial:mixin_registration|here's how to register mixins on your fabric.mod.json]] //__(Make sure to make a **client** mixin)__/+ public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTUREIdentifier.of("tutorial", "entity/netherite_banner_shield_base")); 
- + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, Identifier.of("tutorial", "entity/netherite_banner_shield_base_nopattern"));
-We will make a class called ''RendererMixin'' and write: +
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin {+
  
 + @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> </code>
  
-Then we will make the necessary ''Spriteidentifier''s and a ''ShieldEntityModel''. The ''Spriteidentifier''s will be the same as in your ''ClientModInitializer''.+Finally, we are going to register our shield with the ''BuiltinItemRendererRegistry'',
 <code java> <code java>
-@Mixin (BuiltinModelItemRenderer.class+@Environment(EnvType.CLIENT
-public class RendererMixin +public class ExampleModClient implements ClientModInitializer 
-    private ShieldEntityModel modelNetheriteShield = new ShieldEntityModel; + public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(Identifier.of("tutorial", "netherite_banner_shield"),"main");
-    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")); +
-+
-</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 = new ShieldEntityModel; +
-    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_TEXTUREnew Identifier("examplemod","entity/netherite_shield_base_nopattern")); +
-     +
-    @Inject(method = "render", at = @At("HEAD")) +
-    private void mainRender(ItemStack stack, MatrixStack matrix, VertexConsumerProvider vertexConsumerProvider, int light, int overlay, CallbackInfo ci) { +
-        if (stack.getItem() == ExampleMod.NETHERITE_SHIELD)) { +
-            FabricShieldLibClient.renderBanner(stack, matrix, vertexConsumerProvider, light, overlay, modelFabricShield, 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. +
-'' +
-        } +
-    }+
  
-     + public static ShieldEntityModel modelNetheriteShield;
-+
-</code>     +
  
-That is now all of the complicated things done! We now only need to change our existing modeladd a ''nopattern'' textureand move our textures to the locations we identified earlier.+ public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, Identifier.of("tutorial""entity/netherite_banner_shield_base")); 
 + public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTUREIdentifier.of("tutorial", "entity/netherite_banner_shield_base_nopattern"));
  
-In your shield model, ''netherite_shield.json'' for us, we need to change the parent and remove the texture. + @Override 
-<code javascript> + public void onInitializeClient() 
-+            EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); 
-  "parent":"fabricshieldlib:item/fabric_banner_shield", +         
-    "overrides": [ +            ShieldSetModelCallback.EVENT.register((loader) -> 
-        { +         modelNetheriteShield = new ShieldEntityModel(loader.getModelPart(netherite_banner_shield_model_layer)); 
-            "predicate": +         return ActionResult.PASS; 
-                "blocking": 1 +     }); 
-            }, +  
-            "model": "examplemod:item/netherite_shield_blocking" +            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> </code>
  
-You also have to change your blocking model for your shield, ''netherite_shield_blocking.json'' for us, to:+That is all of our code done, we only have a few json files to make.
  
-<code javascript>+First, create a ''blocks.json'' file inside of ''resources/assets/minecraft/atlases/''. Inside of it, you will have to list your ''SpriteIdentifiers'' from your client mod initializer like this: 
 +<code javascript resources/assets/minecraft/atlases/blocks.json>
 { {
-  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"+  "sources": 
 +    { 
 +      "type": "single", 
 +      "resource": "tutorial:entity/netherite_banner_shield_base" 
 +    }, 
 +    { 
 +      "type": "single", 
 +      "resource": "tutorial:entity/netherite_banner_shield_base_nopattern" 
 +    } 
 +  ]
 } }
 </code> </code>
  
-For this next step, you will add ''_base'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base''+Nextinside ''resources/assets/tutorial/models/item/'', create a ''netherite_banner_shield.json'' file and put this 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 resources/assets/tutorial/models/item/etherite_banner_shield.json>
- +
-Thenyou 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''. +
-<code javascript>+
 { {
-    "item.examplemod.netherite_shield": "Netherite Shield", +  "parent":"fabricshieldlib:item/fabric_banner_shield", 
-    "item.examplemod.netherite_shield.red""Red Netherite Shield", +  "overrides": [ 
-    "item.examplemod.netherite_shield.orange": "Orange Netherite Shield", +    { 
-    "item.examplemod.netherite_shield.yellow": "Yellow Netherite Shield", +      "predicate": { 
-    "item.examplemod.netherite_shield.lime": "Lime Netherite Shield", +        "blocking": 1 
-    "item.examplemod.netherite_shield.green": "Green Netherite Shield", +      }
-    "item.examplemod.netherite_shield.light_blue": "Light Blue Netherite Shield", +      "model": "tutorial:item/netherite_banner_shield_blocking"
-    "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>     +
- +
-===== Adding banner support to your shield (1.15) ===== +
- +
-This is where mixins get involved. +
- +
-First, change the fabric_shield_lib in **gradle.properties** +
-\\  +
-<code java> +
-fabric_shield_lib_version=1.4.5-1.15 +
-</code> +
-\\  +
- +
-Next 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> +
- +
-Now, we have to register a few things in our ''ClientModInitalizer''+
- +
-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 initializer, you can skip these next 2 steps.)** +
- +
-<code java> +
-public class ExampleModClient implements ClientModInitializer { +
-    @Override +
-    public void onInitializeClient() { +
-    +
     }     }
 +  ]
 } }
 </code> </code>
  
-Before we do any work in our client mod initializerwe need to register its entrypoint in ''fabric.mod.json''+In the same folder, create another file, ''netherite_banner_shield_blocking.json'', and put his inside it:  
- +<code javascript resources/assets/tutorial/models/item/etherite_banner_shield_blocking.json>
-<code javascript>+
 { {
-  [...] +  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking", 
-  "entrypoints": +  "textures":{ 
-    "main": [ +    "shield":"tutorial:item/netherite_banner_shield"
-      "net.fabricmc.ExampleMod" +
-    ], +
-    "client": +
-      "net.fabricmc.ExampleModClient" +
-    ]+
   }   }
-  [...] 
 } }
 </code> </code>
  
-Okso now that is donewe can work in our client initializer.+For this next stepyou will add a ''netherite_shield_base_nopattern'' texturewhich 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.
  
-The only thing that we will need to do is register our 2 ''SpriteIdentifier''s.+Then, you will move both of these textures into ''resources/assets/<modid>/textures/entity''.
  
-<code java> +Nextcreate a ''shields.json'' file in ''resources/data/c/tags/items/shields.json'' and add your shield to it: 
-public class ExampleModClient implements ClientModInitializer { +<code javascript resources/data/c/tags/items/shields.json>
- +
-    @Override +
-    public void onInitializeClient() { +
-        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register((atlasTextureregistry) -> { +
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base")); +
-            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern")); +
-        }); +
-    } +
-+
-</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]] //__(Make sure to make a **client** mixin)__// +
- +
-We will make a class called ''RendererMixin'' and write: +
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
- +
-+
-</code> +
- +
-Then we will make the necessary ''Spriteidentifier''s and a ''ShieldEntityModel''. The ''Spriteidentifier''s will be the same as in your ''ClientModInitializer''+
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
-    private ShieldEntityModel modelNetheriteShield = new ShieldEntityModel; +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base_nopattern")); +
-+
-</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 = new ShieldEntityModel; +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base")); +
-    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base_nopattern")); +
-     +
-    @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.getItem() == ExampleMod.NETHERITE_SHIELD)) { +
-            FabricShieldLibClient.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>      +
- +
-That is now all of the complicated things done! We now only need to change our existing model, add a ''nopattern'' texture, and move our textures to the locations we identified earlier. +
- +
-In your shield model, ''netherite_shield.json'' for us, we need to change the parent and remove the texture. +
-<code javascript>+
 { {
-  "parent":"fabricshieldlib:item/fabric_banner_shield"+  "replace": false
-    "overrides": [ +  "values": [ 
-        { +    "tutorial:netherite_banner_shield
-            "predicate": +  ]
-                "blocking": 1 +
-            }, +
-            "model": "examplemod:item/netherite_shield_blocking" +
-        } +
-    ]+
 } }
 </code> </code>
  
-You also have to change your blocking model for your shield, ''netherite_shield_blocking.json'' for us, to: +Finally create a ''durability.json'' file in ''resources/data/minecraft/tags/item/enchantable/durability.json'' and add your shield to it
- +<code javascript resources/data/minecraft/tags/item/enchantable/durability.json>
-<code javascript>+
 { {
-  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"+  "replace": false, 
 +  "values":
 +    "tutorial:netherite_banner_shield" 
 +  ]
 } }
 </code> </code>
  
-For this next step, you will add ''_base'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base''. +Don't forget to add it to **en_us.json** in ''resources/assets/lang/en_us.json'' along with the color variants,\\ 
-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. +
- +
-Then, you will move both of these textures into ''resources/assets/<modid>/textures/entity''+
- +
-For one last thing, you will need to add names for each of your shield color variants in ''en_us.json''.+
 <code javascript> <code javascript>
 { {
-    "item.examplemod.netherite_shield": "Netherite Shield", +  "item.tutorial.netherite_banner_shield": "Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.red": "Red Netherite Shield", +  "item.tutorial.netherite_banner_shield.red": "Red Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.orange": "Orange Netherite Shield", +  "item.tutorial.netherite_banner_shield.orange": "Orange Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.yellow": "Yellow Netherite Shield", +  "item.tutorial.netherite_banner_shield.yellow": "Yellow Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.lime": "Lime Netherite Shield", +  "item.tutorial.netherite_banner_shield.lime": "Lime Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.green": "Green Netherite Shield", +  "item.tutorial.netherite_banner_shield.green": "Green Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.light_blue": "Light Blue Netherite Shield", +  "item.tutorial.netherite_banner_shield.light_blue": "Light Blue Banner Netherite Shield", 
-    "item.examplemod.netherite_shield.cyan": "Cyan Netherite Shield", +  "item.tutorial.netherite_banner_shield.cyan": "Cyan Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.blue": "Blue Netherite Shield", +  "item.tutorial.netherite_banner_shield.blue": "Blue Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.purple": "Purple Netherite Shield", +  "item.tutorial.netherite_banner_shield.purple": "Purple Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.magenta": "Magenta Netherite Shield", +  "item.tutorial.netherite_banner_shield.magenta": "Magenta Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.pink": "Pink Netherite Shield", +  "item.tutorial.netherite_banner_shield.pink": "Pink Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.brown": "Brown Netherite Shield", +  "item.tutorial.netherite_banner_shield.brown": "Brown Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.white": "White Netherite Shield", +  "item.tutorial.netherite_banner_shield.white": "White Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.light_gray": "Light Gray Netherite Shield", +  "item.tutorial.netherite_banner_shield.light_gray": "Light Gray Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.gray": "Gray Netherite Shield", +  "item.tutorial.netherite_banner_shield.gray": "Gray Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.dark_gray": "Dark Gray Netherite Shield", +  "item.tutorial.netherite_banner_shield.dark_gray": "Dark Gray Netherite Banner Shield", 
-    "item.examplemod.netherite_shield.black": "Black Netherite Shield"+  "item.tutorial.netherite_banner_shield.black": "Black Netherite Banner Shield"
 } }
-</code>     
-===== Adding banner support to your shield (1.14) ===== 
- 
-This is where mixins get involved. 
- 
-First, change the fabric_shield_lib in **gradle.properties** 
-\\  
-<code java> 
-fabric_shield_lib_version=1.4.5-1.14 
 </code> </code>
-\\  
  
-Next thing you will want to do is to change //FabricShieldItem// to //FabricBannerShieldItem// so that it will be able to be crafted with banners.+And now your shield is fully completed and supports banner decoration!
  
-<code java> +===== Changes for 1.20.6 ===== 
-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) +If you are working in 1.20.6first change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
-</code>+
  
-The only thing we will need to do now is to add a simple mixin.+<file properties gradle.properties> 
 +mod_menu_version=10.0.0-beta.1 
 +midnightlib_version=1.5.5-fabric 
 +</file>
  
-If this is your first time[[tutorial:mixin_registration|here's how to register mixins on your fabric.mod.json]] //__(Make sure to make a **client** mixin)__//+Nextchange all instances of ''Identifier.of'' to ''new Identifier''; these are when you are registering your item, creating your ''EntityModelLayer'', and creating your ''SpriteIdentifiers''.
  
-We will make a class called ''RendererMixin'' and write: +Then, change your ''shield.json'' in ''resources/data/c/tags/item/tools/shield.json'' to ''shields.json'' file in ''resources/data/c/tags/items/shields.json'' 
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin {+
  
-+Finally, move your ''durability.json'' from ''resources/data/minecraft/tags/items/enchantable/durability.json'' to ''resources/data/minecraft/tags/item/enchantable/durability.json''
-</code>+
  
-Then we will make the necessary ''Identifier''s. They will be the path to your textures and the second one will have an additional **_nopattern** added to the file name. +===== Changes for 1.20.===== 
-<code java> +If you are working in 1.20.4**follow the changes for 1.20.first**then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
-    private static final Identifier NETHERITE_SHIELD_BASE new Identifier("examplemod","entity/netherite_shield_base"); +
-    private static final Identifier NETHERITE_SHIELD_BASE_NO_PATTERN new Identifier("examplemod","entity/netherite_shield_base_nopattern"); +
-+
-</code>  +
-  +
-Now we get to the most important part of the mixinWe will inject a method to render a banner on our shield**Do not forget to mark the inject with //cancellable true//** +
-   +
-<code java> +
-@Mixin (BuiltinModelItemRenderer.class) +
-public class RendererMixin { +
-    private static final Identifier NETHERITE_SHIELD_BASE new Identifier("examplemod","entity/netherite_shield_base"); +
-    private static final Identifier NETHERITE_SHIELD_BASE_NO_PATTERN new Identifier("examplemod","entity/netherite_shield_base_nopattern"); +
-     +
-    @Inject(method "render", at = @At("HEAD"), cancellable true) +
-    private void mainRender(ItemStack stackCallbackInfo callbackInfo) { +
-        if (stack.getItem() == ExampleMod.NETHERITE_SHIELD)) { +
-            //The first parameter is taken from the methodwhile you will provide your 2 identifiers in the order of ''//SHIELD_NAME//_BASE_NOPATTERN'' and then ''//SHIELD_NAME//_BASE''+
-            FabricShieldBannerRendering.render(stack, NETHERITE_SHIELD_BASE_NO_PATTERN, NETHERITE_SHIELD_BASE); +
-            callbackInfo.cancel(); +
-        } +
-    }+
  
-     +**gradle.properties** 
-} +<file properties gradle.properties> 
-</code    +midnightlib_version=1.5.2-fabric 
 +mod_menu_version=9.0.0-pre.1 
 +</file>
  
-That is now all of the complicated things done! We now only need to change our existing model, add a ''nopattern'' texture, and move our textures to the locations we identified earlier.+Additionally, **remove the** ''durability.json'' **file** completely.
  
-In your shield model, ''netherite_shield.json'' for us, we need to change the parent and remove the texture. +===== Changes for 1.19 ===== 
-<code javascript> +If you are working in 1.19**follow the changes for 1.20.6 and 1.20.4 first**then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
-+
-  "parent":"fabricshieldlib:item/fabric_banner_shield", +
-    "overrides":+
-        { +
-            "predicate":+
-                "blocking": 1 +
-            }, +
-            "model": "examplemod:item/netherite_shield_blocking" +
-        } +
-    ] +
-+
-</code> +
- +
-You also have to change your blocking model for your shield, ''netherite_shield_blocking.json'' for us, to: +
- +
-<code javascript> +
-+
-  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" +
-+
-</code> +
- +
-For this next step, you will add ''_base'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base''. +
-Thenyou 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. +
- +
-Then, you will move both of these textures into ''resources/assets/<modid>/textures/entity''+
- +
-For one last thing, you will need to add names for each of your shield color variants in ''en_us.json''. +
-<code javascript> +
-+
-    "item.examplemod.netherite_shield": "Netherite Shield", +
-    "item.examplemod.netherite_shield.red""Red Netherite Shield", +
-    "item.examplemod.netherite_shield.orange": "Orange Netherite 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>    +
  
-Now your shield is done and has banner support!+**gradle.properties** 
 +<file properties gradle.properties> 
 +midnightlib_version=1.0.0-fabric 
 +mod_menu_version=4.2.0-beta.2 
 +</file>
tutorial/shield.1662405733.txt.gz · Last modified: 2022/09/05 19:22 by cringestar_boi