tutorial:shield
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
tutorial:shield [2023/12/17 01:07] – finally updated this page cringestar_boi | tutorial:shield [2023/12/22 04:12] – almost done cringestar_boi | ||
---|---|---|---|
Line 40: | Line 40: | ||
===== Adding a custom shield ===== | ===== Adding a custom shield ===== | ||
- | **If you want your shield to support banner decoration on your shield, | + | **If you want your shield to support banner decoration on your shield, |
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 fabric shield api installed.\\ | ||
Line 89: | Line 89: | ||
<code javascript> | <code javascript> | ||
{ | { | ||
- | " | + | " |
+ | " | ||
+ | " | ||
+ | } | ||
} | } | ||
</ | </ | ||
Line 109: | Line 112: | ||
} | } | ||
</ | </ | ||
- | And with that, your shield is done! | + | And with that, your non-decorateable |
+ | |||
+ | ===== Adding a custom shield with banner support ===== | ||
+ | If you want to make your shield accept banners and decorateable like a vanilla shield, the process is slightly different. | ||
+ | |||
+ | We still make the item in the same way, just make it a FabricBannerShieldItem: | ||
+ | <code java> | ||
+ | public static final Item NETHERITE_BANNER_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500), | ||
+ | </ | ||
+ | |||
+ | Then, we have to register it: | ||
+ | |||
+ | <code java> | ||
+ | Registry.register(Registries.ITEM, | ||
+ | </ | ||
+ | |||
+ | If you want to add your shield to a creative tab, add this into your '' | ||
+ | <code java> | ||
+ | ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { | ||
+ | entries.addAfter(Items.SHIELD, | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | 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, | ||
+ | |||
+ | |||
+ | First, we will need to create an '' | ||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | @Override | ||
+ | public void onInitializeClient() { | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Next, we will register out '' | ||
+ | |||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | @Override | ||
+ | public void onInitializeClient() { | ||
+ | EntityModelLayerRegistry.registerModelLayer(netherite_banner_shield_model_layer, | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Then we will create our shield model, | ||
+ | |||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | public static ShieldEntityModel modelNetheriteShield; | ||
+ | |||
+ | @Override | ||
+ | public void onInitializeClient() { | ||
+ | EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | And then register that shield model, | ||
+ | |||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | public static ShieldEntityModel modelNetheriteShield; | ||
+ | |||
+ | @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; | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Next, we have to create our two '' | ||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | 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; | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Finally, we are going to register our shield with the '' | ||
+ | <code java> | ||
+ | public class ExampleModClient implements ClientModInitializer { | ||
+ | |||
+ | public static final EntityModelLayer netherite_banner_shield_model_layer = new EntityModelLayer(new Identifier(" | ||
+ | |||
+ | 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. \\ | ||
+ | |||
+ | Firstly, inside '' | ||
+ | |||
+ | <code javascript> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | In the same folder, create another file, '' | ||
+ | <code javascript> | ||
+ | { | ||
+ | " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | For this next step, you will add a '' | ||
+ | Then, you will need to make a '' | ||
+ | |||
+ | Then, you will move both of these textures into '' | ||
+ | |||
+ | Lastly, create a '' | ||
+ | <code javascript> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Don't forget to add it to **en_us.json** in '' | ||
+ | <code javascript> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } |
tutorial/shield.txt · Last modified: 2024/01/14 18:05 by cringestar_boi