====== Minecraft でカスタムの盾を作成(1.18-1.14) ====== おめでとう!前回のチュートリアルでカスタムの剣の作成方法を学習しました。友達が剣を手に入れたら、その剣から身を守りたいと想像してみてください。強すぎると普通の盾じゃダメ。カスタムの盾の作成方法を見てみましょう。\\ 幸いなことに、 CrimsonDawn45 氏はこれを支援するライブラリをすでに作成しています!そうでなければ、おそらくこのチュートリアルに従うために、ここで 1 時間座っていることになるでしょう。 CrimsonDawn45 氏に感謝します! ライブラリのソースは https://github.com/CrimsonDawn45/Fabric-Shield-Lib で入手できます jar としてコンパイルされたライブラリは、https://www.curseforge.com/minecraft/mc-mods/fabric-shield-lib で入手できます ===== プロジェクトへのライブラリの追加 ===== 上記のファイルに次のコードを追加してください:\\ \\ **gradle.properties**\\ fabric_shield_lib_version=1.5.3-1.18 \\ **build.gradle** (under dependencies)\\ modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}" \\ 執筆時点で、最新の project.fabric_shield_lib_version は 1.5.3-1.18 である必要があります。このページは、新しいアップデートが公開されるたびに更新されます。\\ \\ **build.gradle** (under repositories)\\ allprojects { repositories { maven { url 'https://jitpack.io' } } } \\ ===== カスタムの盾の追加 ===== **盾で旗の模様をサポートしたい場合は、メインの作成後に追加の手順が必要です。**\\ 飽きのこないステップへ!カスタムの盾を作成します!\\ \\ 上記の手順を正しく実行してプロジェクトを更新すると、 Fabric の盾 API がインストールされます。\\ その場合、最初のステップは、次のような Item の新しいインスタンスを作成することです: 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) そして、次のように登録する必要があります: Registry.register(Registry.ITEM, new Identifier("examplemod", "netherite_shield"), NETHERITE_SHIELD) これで盾の完成です!\\ 次に、盾のテクスチャとモデルを作成する必要があります.\\ テクスチャーはなんでも使えます。開始するのに適した場所は、 Mojang の盾の画像を見て変更することです。 resources/textures/item/.png に入れます ここで、モデル用にいくつかの .json ファイルを作成する必要があります。\\ ブロッキングなしのモデルファイルの場合、次を使用します:\\ { "parent":"fabricshieldlib:item/fabric_shield", "textures":{ "shield":"examplemod:item/netherite_shield" }, "overrides": [ { "predicate": { "blocking": 1 }, "model": "examplemod:item/netherite_shield_blocking" } ] } \\ resources/models/item/netherite_shield.json に入れます\\ ブロッキングモデルの場合、これを使用します:\\ { "parent": "fabricshieldlib:item/fabric_shield_blocking" } \\ resources/models/item/netherite_shield_blocking.json に配置\\ \\ **ja_jp.json** に追加することを忘れないでください\\ { "item.examplemod.netherite_shield": "ネザライトの盾" } \\ これで、シールドの完成です! ===== 盾に旗の模様のサポートを追加する(1.17+) ===== 1.18 ではなく 1.17 を使用している場合は、**gradle.properties** の fabric_shield_lib_version を次のように変更してください: fabric_shield_lib_version=1.4.5-1.17 これは、ミックスインが関与する場所です。 最初に行う必要があるのは、//FabricShieldItem// を //FabricBannerShieldItem// に変更して、バナーで作成できるようにすることです。 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) ここで、 ''ClientModInitalizer'' にいくつか登録する必要があります。 ''ClientModInitalizer'' を作成するには、 ''ExampleModClient'' という名前の新しいクラスを作成し、 ''ClientModInitializer'' を実装します。 また、 ''onInitializeClient'' メソッドを実装してオーバーライドします **(クライアント初期化子が既にある場合は、これらの次の 2 つの手順をスキップできます。)** public class ExampleModClient implements ClientModInitializer { @Override public void onInitializeClient() { } } クライアント Mod 初期化子で作業を行う前に、 ''fabric.mod.json'' にそのエントリポイントを登録する必要があります。 { [...] "entrypoints": { "main": [ "net.fabricmc.ExampleMod" ], "client": [ "net.fabricmc.ExampleModClient" ] } [...] } これで、クライアント初期化子で作業できます。 最初に、後で使用する ''EntityModelLayer'' を作成する必要があります。 public class ExampleModClient implements ClientModInitializer { public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​ @Override public void onInitializeClient() { } } 次に、先ほど作成した ''EntityModelLayer'' を登録します。 public class ExampleModClient implements ClientModInitializer { public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​ @Override public void onInitializeClient() { EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData); } } 次に、 2 つの ''SpriteIdentifier'' を登録します。 public class ExampleModClient implements ClientModInitializer { public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​ @Override public void onInitializeClient() { 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")); }); } } そして今、ミックスインを手に入れます。心配はいりません。簡単です。 初めての場合は、 [[tutorial:mixin_registration|fabric.mod.json にミックスインを登録する方法はこちら]] //__(必ず client ミックスインを作成してください)__// RendererMixin というクラスを作成し、次のように記述します: @Mixin (BuiltinModelItemRenderer.class) public class RendererMixin { } 次に、必要な ''Spriteidentifier'' と ''ShieldEntityModel'' を作成します。 ''Spriteidentifier'' は、 ''ClientModInitializer'' と同じになります。 @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")); } 次に、 ''entityModelLoader'' を @Shadow して、モデルの初期化に使用できるようにする必要があります。 @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; } 次に、''reload'' メソッドに注入して、モデルを初期化します。 @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)); } } ここで、ミックスインの最も重要な部分に進みます。盾に旗の模様をレンダリングするメソッドを挿入します。 @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(ExampleModClient.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)) { 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. '' } } } これで複雑な作業はすべて完了です!既存のモデルを変更し、''nopattern'' テクスチャを追加し、テクスチャを以前に特定した場所に移動するだけです。 盾モデル ''netherite_shield.json'' では、親を変更してテクスチャを削除する必要があります。 { "parent":"fabricshieldlib:item/fabric_banner_shield", "overrides": [ { "predicate": { "blocking": 1 }, "model": "examplemod:item/netherite_shield_blocking" } ] } また、盾のブロックモデル ''netherite_shield_blocking.json'' を次のように変更する必要があります: { "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" } この次のステップでは、 ''_base'' を現在のシールド テクスチャに追加するため、 ''netherite_shield'' を ''netherite_shield_base'' に追加します。 次に、盾のテクスチャの ''nopattern'' バージョンを作成する必要があるため、''netherite_shield_base_nopattern''. バニラの盾の ''nopattern'' テクスチャを見ることをお勧めします。 次に、これらの両方のテクスチャを ''resources/assets//textures/entity'' に移動します。 最後に、 ''ja_jp.json'' で各シールド カラー バリエーションの名前を追加する必要があります。 { "item.examplemod.netherite_shield": "ネザライトの盾", "item.examplemod.netherite_shield.red": "赤のネザライトの盾", "item.examplemod.netherite_shield.orange": "橙色のネザライトの盾", "item.examplemod.netherite_shield.yellow": "黄色のネザライトの盾", "item.examplemod.netherite_shield.lime": "黄緑色のネザライトの盾", "item.examplemod.netherite_shield.green": "緑色のネザライトの盾", "item.examplemod.netherite_shield.light_blue": "空色のネザライトの盾", "item.examplemod.netherite_shield.cyan": "青緑色のネザライトの盾", "item.examplemod.netherite_shield.blue": "青色のネザライトの盾", "item.examplemod.netherite_shield.purple": "紫色のネザライトの盾", "item.examplemod.netherite_shield.magenta": "赤紫色のネザライトの盾", "item.examplemod.netherite_shield.pink": "桃色のネザライトの盾", "item.examplemod.netherite_shield.brown": "茶色のネザライトの盾", "item.examplemod.netherite_shield.white": "白色のネザライトの盾", "item.examplemod.netherite_shield.light_gray": "薄灰色のネザライトの盾", "item.examplemod.netherite_shield.gray": "灰色のネザライトの盾", "item.examplemod.netherite_shield.dark_gray": "濃灰色のネザライトの盾", "item.examplemod.netherite_shield.black": "黒色のネザライトの盾" } ===== 盾に旗の模様のサポートを追加する(1.16) ===== これは、ミックスインが関与する場所です。 まず、**gradle.properties** の fabric_shield_lib を変更します。 \\ fabric_shield_lib_version=1.4.5-1.16 \\ 次に行う必要があるのは、 //FabricShieldItem// を //FabricBannerShieldItem// に変更して、バナーで作成できるようにすることです。 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) ここで、''ClientModInitalizer'' にいくつか登録する必要があります。 ''ClientModInitalizer'' を作成するには、 ''ExampleModClient'' という名前の新しいクラスを作成し、 ''ClientModInitializer'' を実装します。 また、''onInitializeClient'' メソッドを実装してオーバーライドします **(クライアント初期化子が既にある場合は、これらの次の 2 つの手順をスキップできます。)** public class ExampleModClient implements ClientModInitializer { @Override public void onInitializeClient() { } } クライアント Mod 初期化子で作業を行う前に、 ''fabric.mod.json'' にそのエントリポイントを登録する必要があります。 { [...] "entrypoints": { "main": [ "net.fabricmc.ExampleMod" ], "client": [ "net.fabricmc.ExampleModClient" ] } [...] } これで、クライアント初期化子で作業できます。 必要な作業は、2 つの ''SpriteIdentifier'' を登録することだけです。 public class ExampleModClient implements ClientModInitializer { @Override 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")); }); } } そして今、ミックスインを手に入れます。心配はいりません。簡単です。 初めての場合は、 [[tutorial:mixin_registration|fabric.mod.json にミックスインを登録する方法はこちら]] //__(必ず client ミックスインを作成してください)__// RendererMixin というクラスを作成し、次のように記述します: @Mixin (BuiltinModelItemRenderer.class) public class RendererMixin { } 次に、必要な ''Spriteidentifier'' と ''ShieldEntityModel'' を作成します。 ''Spriteidentifier'' は、''ClientModInitializer'' と同じになります。 @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_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern")); } ここで、ミックスインの最も重要な部分に進みます。盾に旗の模様をレンダリングするメソッドを挿入します。 @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_TEXTURE, new 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. '' } } } これで複雑な作業はすべて完了です。既存のモデルを変更し、 ''nopattern'' テクスチャを追加し、テクスチャを以前に特定した場所に移動するだけです。 盾モデル ''netherite_shield.json'' では、親を変更してテクスチャを削除する必要があります。 { "parent":"fabricshieldlib:item/fabric_banner_shield", "overrides": [ { "predicate": { "blocking": 1 }, "model": "examplemod:item/netherite_shield_blocking" } ] } また、盾のブロックモデル ''netherite_shield_blocking.json'' を次のように変更する必要があります: { "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" } この次のステップでは、 ''_base'' を現在のシールド テクスチャに追加するため、''netherite_shield'' を ''netherite_shield_base'' に追加します。 次に、盾テクスチャの ''nopattern'' バージョンを作成する必要があるため、''netherite_shield_base_nopattern'' を作成します。 バニラシールドの ''nopattern'' テクスチャを見ることをお勧めします。 次に、これらの両方のテクスチャを ''resources/assets//textures/entity'' に移動します。 最後に、 ''ja_jp.json'' で各盾のカラーバリエーションの名前を追加する必要があります。 { "item.examplemod.netherite_shield": "ネザライトの盾", "item.examplemod.netherite_shield.red": "赤のネザライトの盾", "item.examplemod.netherite_shield.orange": "橙色のネザライトの盾", "item.examplemod.netherite_shield.yellow": "黄色のネザライトの盾", "item.examplemod.netherite_shield.lime": "黄緑色のネザライトの盾", "item.examplemod.netherite_shield.green": "緑色のネザライトの盾", "item.examplemod.netherite_shield.light_blue": "空色のネザライトの盾", "item.examplemod.netherite_shield.cyan": "青緑色のネザライトの盾", "item.examplemod.netherite_shield.blue": "青色のネザライトの盾", "item.examplemod.netherite_shield.purple": "紫色のネザライトの盾", "item.examplemod.netherite_shield.magenta": "赤紫色のネザライトの盾", "item.examplemod.netherite_shield.pink": "桃色のネザライトの盾", "item.examplemod.netherite_shield.brown": "茶色のネザライトの盾", "item.examplemod.netherite_shield.white": "白色のネザライトの盾", "item.examplemod.netherite_shield.light_gray": "薄灰色のネザライトの盾", "item.examplemod.netherite_shield.gray": "灰色のネザライトの盾", "item.examplemod.netherite_shield.dark_gray": "濃灰色のネザライトの盾", "item.examplemod.netherite_shield.black": "黒色のネザライトの盾" } ===== 盾に旗の模様のサポートを追加する(1.15) ===== これは、ミックスインが関与する場所です。 First, change the fabric_shield_lib in **gradle.properties** \\ fabric_shield_lib_version=1.4.5-1.15 \\ 次に行う必要があるのは、 //FabricShieldItem// を //FabricBannerShieldItem// に変更して、バナーで作成できるようにすることです。 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) ここで、''ClientModInitalizer'' にいくつか登録する必要があります。 ''ClientModInitalizer'' を作成するには、 ''ExampleModClient'' という名前の新しいクラスを作成し、 ''ClientModInitializer'' を実装します。 また、''onInitializeClient'' メソッドを実装してオーバーライドします。 **(クライアント初期化子が既にある場合は、これらの次の 2 つの手順をスキップできます。)** public class ExampleModClient implements ClientModInitializer { @Override public void onInitializeClient() { } } クライアント Mod イニシャライザで作業を行う前に、''fabric.mod.json'' にそのエントリポイントを登録する必要があります。 { [...] "entrypoints": { "main": [ "net.fabricmc.ExampleMod" ], "client": [ "net.fabricmc.ExampleModClient" ] } [...] } これで、クライアント初期化子で作業できます。 必要な作業は、 2 つの ''SpriteIdentifier'' を登録することだけです。 public class ExampleModClient implements ClientModInitializer { @Override public void onInitializeClient() { ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register((atlasTexture, registry) -> { registry.register(new Identifier("examplemod", "entity/netherite_shield_base")); registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern")); }); } } そして今、ミックスインを手に入れます。心配はいりません。簡単です。 初めての場合は、 [[tutorial:mixin_registration|fabric.mod.json にミックスインを登録する方法はこちら]] //__(必ず client ミックスインを作成してください)__// RendererMixin というクラスを作成し、次のように記述します: @Mixin (BuiltinModelItemRenderer.class) public class RendererMixin { } 次に、必要な ''Spriteidentifier'' と ''ShieldEntityModel'' を作成します。 ''Spriteidentifier'' は、 ''ClientModInitializer'' と同じになります。 @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")); } ここで、ミックスインの最も重要な部分に進みます。盾に旗の模様をレンダリングするメソッドを挿入します。 @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. '' } } } これで複雑な作業はすべて完了です!既存のモデルを変更し、 ''nopattern'' テクスチャを追加し、テクスチャを以前に特定した場所に移動するだけです。 盾モデル ''netherite_shield.json'' では、親を変更してテクスチャを削除する必要があります。 { "parent":"fabricshieldlib:item/fabric_banner_shield", "overrides": [ { "predicate": { "blocking": 1 }, "model": "examplemod:item/netherite_shield_blocking" } ] } また、盾のブロックモデル ''netherite_shield_blocking.json'' を次のように変更する必要があります: { "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" } For this next step, you will add ''_base'' to your current shield texture, so ''netherite_shield'' to ''netherite_shield_base''. 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. 次に、これらの両方のテクスチャを ''resources/assets//textures/entity'' に移動します。 最後に、 ''ja_jp.json'' で各盾のカラーバリエーションの名前を追加する必要があります。 { "item.examplemod.netherite_shield": "ネザライトの盾", "item.examplemod.netherite_shield.red": "赤のネザライトの盾", "item.examplemod.netherite_shield.orange": "橙色のネザライトの盾", "item.examplemod.netherite_shield.yellow": "黄色のネザライトの盾", "item.examplemod.netherite_shield.lime": "黄緑色のネザライトの盾", "item.examplemod.netherite_shield.green": "緑色のネザライトの盾", "item.examplemod.netherite_shield.light_blue": "空色のネザライトの盾", "item.examplemod.netherite_shield.cyan": "青緑色のネザライトの盾", "item.examplemod.netherite_shield.blue": "青色のネザライトの盾", "item.examplemod.netherite_shield.purple": "紫色のネザライトの盾", "item.examplemod.netherite_shield.magenta": "赤紫色のネザライトの盾", "item.examplemod.netherite_shield.pink": "桃色のネザライトの盾", "item.examplemod.netherite_shield.brown": "茶色のネザライトの盾", "item.examplemod.netherite_shield.white": "白色のネザライトの盾", "item.examplemod.netherite_shield.light_gray": "薄灰色のネザライトの盾", "item.examplemod.netherite_shield.gray": "灰色のネザライトの盾", "item.examplemod.netherite_shield.dark_gray": "濃灰色のネザライトの盾", "item.examplemod.netherite_shield.black": "黒色のネザライトの盾" } ===== 盾に旗の模様のサポートを追加する(1.14) ===== これは、ミックスインが関与する場所です。 まず、**gradle.properties** の fabric_shield_lib を変更します \\ fabric_shield_lib_version=1.4.5-1.14 \\ 次に行う必要があるのは、 //FabricShieldItem// を //FabricBannerShieldItem// に変更して、バナーで作成できるようにすることです。 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) ここで行う必要があるのは、単純なミックスインを追加することだけです。 初めての場合は、[[tutorial:mixin_registration|fabric.mod.json に mixin を登録する方法はこちら]] //__(必ず **client** ミックスインを作成してください)__// ''RendererMixin'' というクラスを作成し、次のように記述します: @Mixin (BuiltinModelItemRenderer.class) public class RendererMixin { } 次に、必要な ''Identifier'' 〔識別子〕を作成します。それらはテクスチャへのパスになり、2 番目のパスにはファイル名に **_nopattern** が追加されます。 @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"); } ここで、ミックスインの最も重要な部分に進みます。盾にバナーをレンダリングするメソッドを挿入します。 **注入を//cancellable = true//でマークすることを忘れないでください** @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 stack, CallbackInfo callbackInfo) { if (stack.getItem() == ExampleMod.NETHERITE_SHIELD)) { //The first parameter is taken from the method, while 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(); } } } これで複雑な作業はすべて完了です。既存のモデルを変更し、 ''nopattern'' テクスチャを追加し、テクスチャを以前に特定した場所に移動するだけです。 盾モデル ''netherite_shield.json'' では、親を変更してテクスチャを削除する必要があります。 { "parent":"fabricshieldlib:item/fabric_banner_shield", "overrides": [ { "predicate": { "blocking": 1 }, "model": "examplemod:item/netherite_shield_blocking" } ] } また、盾のブロックモデル ''netherite_shield_blocking.json'' を次のように変更する必要があります: { "parent":"fabricshieldlib:item/fabric_banner_shield_blocking" } この次のステップでは、 ''_base'' を現在の盾テクスチャに追加するため、''netherite_shield'' を ''netherite_shield_base'' に追加します。 次に、盾のテクスチャの ''nopattern'' バージョンを作成する必要があるため、''netherite_shield_base_nopattern''。バニラの盾の ''nopattern'' テクスチャを見ることをお勧めします。 次に、これらの両方のテクスチャを ''resources/assets//textures/entity'' に移動します。 最後に、 ''ja_jp.json'' で各盾のカラーのバリエーションの名前を追加する必要があります。 { "item.examplemod.netherite_shield": "ネザライトの盾", "item.examplemod.netherite_shield.red": "赤のネザライトの盾", "item.examplemod.netherite_shield.orange": "橙色のネザライトの盾", "item.examplemod.netherite_shield.yellow": "黄色のネザライトの盾", "item.examplemod.netherite_shield.lime": "黄緑色のネザライトの盾", "item.examplemod.netherite_shield.green": "緑色のネザライトの盾", "item.examplemod.netherite_shield.light_blue": "空色のネザライトの盾", "item.examplemod.netherite_shield.cyan": "青緑色のネザライトの盾", "item.examplemod.netherite_shield.blue": "青色のネザライトの盾", "item.examplemod.netherite_shield.purple": "紫色のネザライトの盾", "item.examplemod.netherite_shield.magenta": "赤紫色のネザライトの盾", "item.examplemod.netherite_shield.pink": "桃色のネザライトの盾", "item.examplemod.netherite_shield.brown": "茶色のネザライトの盾", "item.examplemod.netherite_shield.white": "白色のネザライトの盾", "item.examplemod.netherite_shield.light_gray": "薄灰色のネザライトの盾", "item.examplemod.netherite_shield.gray": "灰色のネザライトの盾", "item.examplemod.netherite_shield.dark_gray": "濃灰色のネザライトの盾", "item.examplemod.netherite_shield.black": "黒色のネザライトの盾" } これで盾が完成し、盾の模様がサポートされました!