tutorial:shield
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
tutorial:shield [2025/06/18 05:21] – cringestar_boi | tutorial:shield [2025/06/21 18:39] (current) – updated to 1.21.4 cringestar_boi | ||
---|---|---|---|
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.4] ====== |
:!: 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.0-1.21.4 |
- | mod_menu_version=12.0.0-beta.1 | + | mod_menu_version=13.0.0 |
- | midnightlib_version=1.6.4-fabric | + | midnightlib_version=1.6.6-fabric |
fabricasm_version=2.3 | fabricasm_version=2.3 | ||
</ | </ | ||
Line 31: | Line 31: | ||
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.4** ('' | ||
* **1.21.2** - **1.21.3** ('' | * **1.21.2** - **1.21.3** ('' | ||
* **1.21** - **1.21.1** ('' | * **1.21** - **1.21.1** ('' | ||
Line 70: | Line 71: | ||
< | < | ||
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); | ||
}); | }); | ||
+ | ... | ||
} | } | ||
+ | ... | ||
} | } | ||
</ | </ | ||
Line 91: | Line 96: | ||
<file javascript resources/ | <file javascript resources/ | ||
{ | { | ||
- | | + | |
- | " | + | " |
- | " | + | " |
- | }, | + | } |
- | " | + | |
- | { | + | |
- | " | + | |
- | " | + | |
- | }, | + | |
- | " | + | |
- | } | + | |
- | ] | + | |
} | } | ||
</ | </ | ||
Line 256: | Line 253: | ||
</ | </ | ||
- | Finally, we are going to register | + | 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(" |
- | public class ExampleModClient implements ClientModInitializer { | + | settings -> new FabricBannerShieldItem(settings, |
- | public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(Identifier.of(" | + | 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, | ||
- | public static final SpriteIdentifier NETHERITE_BANNER_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
- | |||
- | @Override | ||
- | public void onInitializeClient() { | ||
- | EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, | ||
- | | ||
- | ShieldSetModelCallback.EVENT.register((loader) -> { | ||
- | modelNetheriteShield = new ShieldEntityModel(loader.getModelPart(netherite_banner_shield_model_layer)); | ||
- | return ActionResult.PASS; | ||
- | }); | ||
- | |||
- | BuiltinItemRendererRegistry.INSTANCE.register(ExampleMod.NETHERITE_BANNER_SHIELD, | ||
- | renderBanner(stack, | ||
- | //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. | ||
- | }); | ||
- | } | ||
- | } | ||
</ | </ | ||
+ | |||
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 287: | ||
Next, inside '' | Next, inside '' | ||
- | <code javascript resources/ | + | <code javascript resources/ |
{ | { | ||
- | " | + | " |
- | " | + | |
- | { | + | |
- | " | + | |
- | " | + | |
- | }, | + | |
- | " | + | |
- | } | + | |
- | ] | + | |
} | } | ||
</ | </ | ||
In the same folder, create another file, '' | In the same folder, create another file, '' | ||
- | <code javascript resources/ | + | <code javascript resources/ |
{ | { | ||
- | " | + | " |
- | " | + | |
- | " | + | |
- | } | + | |
} | } | ||
</ | </ | ||
Line 376: | Line 349: | ||
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 | ||
+ | </ | ||
+ | |||
+ | Next, remove the '' | ||
+ | |||
+ | <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, | ||
+ | renderBanner(stack, | ||
+ | //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. | ||
+ | }); | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Finally, change the following models to these formats: (netherite_shield_blocking.json will be unchanged) | ||
+ | |||
+ | <file javascript resources/ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code javascript resources/ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code javascript resources/ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
===== 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, |
<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 | ||
</ | </ | ||
Line 396: | Line 440: | ||
===== 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, |
<file properties gradle.properties> | <file properties gradle.properties> | ||
Line 410: | Line 454: | ||
===== 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 | + | If you are working in 1.20.4, **follow the changes for all higher versions |
**gradle.properties** | **gradle.properties** | ||
Line 419: | Line 463: | ||
Additionally, | Additionally, | ||
+ | |||
+ | ===== 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 | ||
+ | </ | ||
===== 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 | + | If you are working in 1.19, **follow the changes for all higher versions |
**gradle.properties** | **gradle.properties** | ||
Line 428: | Line 481: | ||
mod_menu_version=4.2.0-beta.2 | mod_menu_version=4.2.0-beta.2 | ||
</ | </ | ||
+ |
tutorial/shield.1750224086.txt.gz · Last modified: 2025/06/18 05:21 by cringestar_boi