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 [2025/06/18 05:14] – updated to 1.21.3 cringestar_boitutorial:shield [2025/11/13 23:28] (current) – Updated to 1.21.5 and added and added a section on the conditional model format needed to make the shield work bouncingelf10
Line 1: Line 1:
-====== Making a Custom Shield in Minecraft [1.19-1.21.3] ======+====== Making a Custom Shield in Minecraft [1.19-1.21.5] ======
 :!: The tutorial depends on third-party libraries. :!: The tutorial depends on third-party libraries.
  
Line 16: Line 16:
 **gradle.properties** **gradle.properties**
 <file properties gradle.properties> <file properties gradle.properties>
-fabric_shield_lib_version=1.8.0-pre1-1.21.3 +fabric_shield_lib_version=1.8.3-1.21.5 
-mod_menu_version=12.0.0-beta.1 +mod_menu_version=14.0.0 
-midnightlib_version=1.6.4-fabric+midnightlib_version=1.7.3+1.21.4-fabric
 fabricasm_version=2.3 fabricasm_version=2.3
 </file> </file>
 +
 +Find the corresponding mod versions for your Minecraft version
  
 **build.gradle** (under ''dependencies'' block)  **build.gradle** (under ''dependencies'' block) 
Line 31: Line 33:
  
 At the time of writing, these are the most up-to-date FabricShieldLib versions: At the time of writing, these are the most up-to-date FabricShieldLib versions:
 +  * **1.21.5** (''1.8.3-1.21.5'')
 +  * **1.21.4** (''1.8.0-1.21.4'')
   * **1.21.2** - **1.21.3** (''1.8.0-pre1-1.21.3'')   * **1.21.2** - **1.21.3** (''1.8.0-pre1-1.21.3'')
   * **1.21** - **1.21.1** (''1.7.2-1.21.1'')   * **1.21** - **1.21.1** (''1.7.2-1.21.1'')
Line 56: Line 60:
 If you have followed the above steps correctly and refreshed the project, then you will have the FabricShieldLib 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'' (see [[items]] tutorial), like:+If so, the first step to do is create a new instance of an ''Item'' (see [[https://docs.fabricmc.net/develop/items/first-item|items]] tutorial), like:
 <code java TutorialItems> <code java TutorialItems>
 public final class TutorialItems { public final class TutorialItems {
Line 70: Line 74:
 <yarncode java ExampleMod> <yarncode java ExampleMod>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
 +    ...
     @Override     @Override
     public void onInitialize() {     public void onInitialize() {
 +        ...
         ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> {         ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> {
             entries.add(NETHERITE_SHIELD);             entries.add(NETHERITE_SHIELD);
         });         });
 +        ...
     }     }
 +    ...
 } }
 </yarncode> </yarncode>
Line 91: Line 99:
 <file javascript resources/assets/tutorial/models/item/netherite_shield.json> <file javascript resources/assets/tutorial/models/item/netherite_shield.json>
 { {
-    "parent":"fabricshieldlib:item/fabric_shield", +  "parent":"fabricshieldlib:item/fabric_shield", 
-    "textures":+  "textures":
-        "shield":"tutorial:item/netherite_shield" +    "shield":"tutorial:item/netherite_shield" 
-    }+  }
-    "overrides":+
-        { +
-            "predicate":+
-                "blocking":+
-            }, +
-            "model": "tutorial:item/netherite_shield_blocking" +
-        } +
-    ]+
 } }
 </file>  </file> 
Line 112: Line 112:
   "textures":{   "textures":{
     "shield":"tutorial:item/netherite_shield"     "shield":"tutorial:item/netherite_shield"
 +  }
 +}
 +</file>
 +
 +Assuming you've made the Item correctly, you should've also made an Item Model Description. We need to add the conditional model format, so your ''item/netherite_shield.json'' should look like this:
 +<file javascript resources/assets/tutorial/item/netherite_shield.json>
 +{
 +  "model": {
 +    "type": "minecraft:condition",
 +    "property": "minecraft:using_item",
 +    "on_false": {
 +      "type": "minecraft:model",
 +      "model": "collision-point:item/netherite_shield"
 +    },
 +    "on_true": {
 +      "type": "minecraft:model",
 +      "model": "collision-point:item/netherite_shield_blocking"
 +    }
   }   }
 } }
Line 256: Line 274:
 </code> </code>
  
-Finally, we are going to register our shield with the ''BuiltinItemRendererRegistry'',+Finally, we will want to go back to our item and add a component to it to store its model information like so: 
 <code java> <code java>
-@Environment(EnvType.CLIENT+ public static final Item NETHERITE_BANNER_SHIELD = register("netherite_banner_shield", 
-public class ExampleModClient implements ClientModInitializer { + settings -> new FabricBannerShieldItem(settings,10, 13, Items.NETHERITE_INGOT), // FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItem
- public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(Identifier.of("tutorial""netherite_banner_shield"),"main");+ new Item.Settings().maxDamage(2500).component(FabricShieldLib.MODEL_COMPONENT, 
 + new FabricShieldModelComponent( 
 + ExampleModClient.NETHERITE_BANNER_SHIELD_BASE.getTextureId()//Your base texture, from the client initializer 
 + ExampleModClient.NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN.getTextureId(), //Your no-pattern texture, from the client initializer 
 + ExampleModClient.netherite_banner_shield_model_layer.toString() // Your model layer, from the client initializer 
 + )));
  
- public static ShieldEntityModel modelNetheriteShield; 
- 
- 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_TEXTURE, Identifier.of("tutorial", "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> </code>
 +
  
 That is all of our code done, we only have a few json files to make. That is all of our code done, we only have a few json files to make.
Line 303: Line 308:
  
 Next, inside ''resources/assets/tutorial/models/item/'', create a ''netherite_banner_shield.json'' file and put this inside it: Next, inside ''resources/assets/tutorial/models/item/'', create a ''netherite_banner_shield.json'' file and put this inside it:
-<code javascript resources/assets/tutorial/models/item/etherite_banner_shield.json>+<code javascript resources/assets/tutorial/models/item/netherite_banner_shield.json>
 { {
-  "parent":"fabricshieldlib:item/fabric_banner_shield"+  "parent":"fabricshieldlib:item/fabric_banner_shield"
-  "overrides":+
-    { +
-      "predicate":+
-        "blocking":+
-      }, +
-      "model": "tutorial:item/netherite_banner_shield_blocking" +
-    } +
-  ]+
 } }
 </code> </code>
  
 In the same folder, create another file, ''netherite_banner_shield_blocking.json'', and put his inside it:  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 resources/assets/tutorial/models/item/netherite_banner_shield_blocking.json>
 { {
-  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"+  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"
-  "textures":+
-    "shield":"tutorial:item/netherite_banner_shield" +
-  }+
 } }
 </code> </code>
Line 376: Line 370:
  
 And now your shield is fully completed and supports banner decoration! And now your shield is fully completed and supports banner decoration!
 +===== Changes for 1.21.3 =====
 +If you are working in 1.21.3, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
 +
 +<file properties gradle.properties>
 +mod_menu_version=12.0.0-beta.1
 +midnightlib_version=1.6.4-fabric
 +</file>
 +
 +Next, remove the ''FabricShieldLib.MODEL_COMPONENT'' from your shields. Then, you will want to register your shield with the ''BuiltinItemRendererRegistry'':
 +
 +<code java>
 +...
 +import static com.github.crimsondawn45.fabricshieldlib.initializers.FabricShieldLibClient.renderBanner;
 +...
 +public class ExampleModClient implements ClientModInitializer {
 + ...
 + @Override
 + public void onInitializeClient() {
 +                ...
 + 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>
 +
 +Finally, change the following models to these formats: (netherite_shield_blocking.json will be unchanged)
 +
 +<file javascript resources/assets/tutorial/models/item/netherite_shield.json>
 +{
 +    "parent":"fabricshieldlib:item/fabric_shield",
 +    "textures":{
 +        "shield":"tutorial:item/netherite_shield"
 +    },
 +    "overrides": [
 +        {
 +            "predicate": {
 +                "blocking": 1
 +            },
 +            "model": "tutorial:item/netherite_shield_blocking"
 +        }
 +    ]
 +}
 +</file> 
 +
 +<code javascript resources/assets/tutorial/models/item/etherite_banner_shield.json>
 +{
 +  "parent":"fabricshieldlib:item/fabric_banner_shield",
 +  "overrides": [
 +    {
 +      "predicate": {
 +        "blocking": 1
 +      },
 +      "model": "tutorial:item/netherite_banner_shield_blocking"
 +    }
 +  ]
 +}
 +</code>
 +
 +<code javascript resources/assets/tutorial/models/item/etherite_banner_shield_blocking.json>
 +{
 +  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking",
 +  "textures":{
 +    "shield":"tutorial:item/netherite_banner_shield"
 +  }
 +}
 +</code>
  
 ===== Changes for 1.21.1 ===== ===== Changes for 1.21.1 =====
-If you are working in 1.21.1, first change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\+If you are working in 1.21.1, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
  
 <file properties gradle.properties> <file properties gradle.properties>
-midnightlib_version=1.5.8-fabric 
 mod_menu_version=11.0.1 mod_menu_version=11.0.1
 +midnightlib_version=1.5.8-fabric
 </file> </file>
  
Line 396: Line 461:
  
 ===== Changes for 1.20.6 ===== ===== Changes for 1.20.6 =====
-If you are working in 1.20.6, first change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\+If you are working in 1.20.6, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
  
 <file properties gradle.properties> <file properties gradle.properties>
Line 410: Line 475:
  
 ===== Changes for 1.20.4 ===== ===== Changes for 1.20.4 =====
-If you are working in 1.20.4, **follow the changes for 1.20.6 first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\+If you are working in 1.20.4, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
  
 **gradle.properties** **gradle.properties**
Line 419: Line 484:
  
 Additionally, **remove the** ''durability.json'' **file** completely. Additionally, **remove the** ''durability.json'' **file** completely.
 +
 +===== Changes for 1.20.1 =====
 +If you are working in 1.20.1, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
 +
 +**gradle.properties**
 +<file properties gradle.properties>
 +midnightlib_version=1.4.1-fabric
 +mod_menu_version=7.1.0
 +</file>
  
 ===== Changes for 1.19 ===== ===== Changes for 1.19 =====
-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:\\+If you are working in 1.19, **follow the changes for all higher versions first**, then change the FabricShieldLib and FAPI versions accordingly and change your other dependencies to these versions:\\
  
 **gradle.properties** **gradle.properties**
Line 428: Line 502:
 mod_menu_version=4.2.0-beta.2 mod_menu_version=4.2.0-beta.2
 </file> </file>
 +
tutorial/shield.1750223697.txt.gz · Last modified: 2025/06/18 05:14 by cringestar_boi