おめでとう!前回のチュートリアルでカスタムの剣の作成方法を学習しました。友達が剣を手に入れたら、その剣から身を守りたいと想像してみてください。強すぎると普通の盾じゃダメ。カスタムの盾の作成方法を見てみましょう。
幸いなことに、 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/<filename>.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.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")); }); } }
そして今、ミックスインを手に入れます。心配はいりません。簡単です。
初めての場合は、 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/<modid>/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": "黒色のネザライトの盾" }
これは、ミックスインが関与する場所です。
まず、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")); }); } }
そして今、ミックスインを手に入れます。心配はいりません。簡単です。
初めての場合は、 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/<modid>/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": "黒色のネザライトの盾" }
これは、ミックスインが関与する場所です。
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")); }); } }
そして今、ミックスインを手に入れます。心配はいりません。簡単です。
初めての場合は、 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/<modid>/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": "黒色のネザライトの盾" }
これは、ミックスインが関与する場所です。
まず、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)
ここで行う必要があるのは、単純なミックスインを追加することだけです。
初めての場合は、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/<modid>/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": "黒色のネザライトの盾" }
これで盾が完成し、盾の模様がサポートされました!