====== 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": "黒色のネザライトの盾"
}
これで盾が完成し、盾の模様がサポートされました!