User Tools

Site Tools


ja:tutorial:shield

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/<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.17+)

1.18 ではなく 1.17 を使用している場合は、gradle.properties の fabric_shield_lib_version を次のように変更してください:

fabric_shield_lib_version=1.4.5-1.17

これは、ミックスインが関与する場所です。

最初に行う必要があるのは、FabricShieldItemFabricBannerShieldItem に変更して、バナーで作成できるようにすることです。

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 {
 
}

次に、必要な SpriteidentifierShieldEntityModel を作成します。 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_shieldnetherite_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": "黒色のネザライトの盾"
}

盾に旗の模様のサポートを追加する(1.16)

これは、ミックスインが関与する場所です。

まず、gradle.properties の fabric_shield_lib を変更します。

fabric_shield_lib_version=1.4.5-1.16


次に行う必要があるのは、 FabricShieldItemFabricBannerShieldItem に変更して、バナーで作成できるようにすることです。

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 {
 
}

次に、必要な SpriteidentifierShieldEntityModel を作成します。 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_shieldnetherite_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": "黒色のネザライトの盾"
}

盾に旗の模様のサポートを追加する(1.15)

これは、ミックスインが関与する場所です。

First, change the fabric_shield_lib in gradle.properties

fabric_shield_lib_version=1.4.5-1.15


次に行う必要があるのは、 FabricShieldItemFabricBannerShieldItem に変更して、バナーで作成できるようにすることです。

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 {
 
}

次に、必要な SpriteidentifierShieldEntityModel を作成します。 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": "黒色のネザライトの盾"
}

盾に旗の模様のサポートを追加する(1.14)

これは、ミックスインが関与する場所です。

まず、gradle.properties の fabric_shield_lib を変更します

fabric_shield_lib_version=1.4.5-1.14


次に行う必要があるのは、 FabricShieldItemFabricBannerShieldItem に変更して、バナーで作成できるようにすることです。

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_shieldnetherite_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": "黒色のネザライトの盾"
}

これで盾が完成し、盾の模様がサポートされました!

ja/tutorial/shield.txt · Last modified: 2022/08/20 07:37 by 127.0.0.1