LoginSignup
0
0

More than 1 year has passed since last update.

MinecraftでMODを開発したい#3

Posted at

MinecraftでMODの開発をします
試行錯誤を書いていくだけのものになります

概要

特殊な機能を持たないブロックの追加

動作環境 2021/05/12

Version
Mac OS Big Sur 11.1
IntelliJ IDEA 2021.1.1
AdoptOpenJDK (HotSpot) 1.8.0_282
Minecraft 1.16.5
Forge 36.1.0

目次

  • プログラムの記述
  • Block Stateの記述
  • ブロックモデルの記述
  • アイテムモデルの記述
  • テクスチャの配置
  • 翻訳設定
  • ルートテーブルの記述
  • 確認

プログラムの記述

src/main/java/com/ドメイン名/examplemod/ExampleMod.java
package com.tntmodders.examplemod;

import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
@Mod(ExampleMod.MOD_ID)
public class ExampleMod {
    public static final String MOD_ID = "examplemod";

    public ExampleMod() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        Blocks.register(modEventBus);
        Items.register(modEventBus);
    }

    public static class Blocks {
        private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID);
        public static final RegistryObject<Block> EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(AbstractBlock.Properties
                .of(Material.METAL, MaterialColor.METAL)
                .requiresCorrectToolForDrops()
                .strength(5.0F, 6.0F)
                .sound(SoundType.METAL)
                .harvestTool(ToolType.PICKAXE)
                .harvestLevel(1)
        ));

        public static void register(IEventBus eventBus) {
            BLOCKS.register(eventBus);
        }
    }

    public static class Items {
        private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID);
        public static final RegistryObject<Item> EXAMPLE_BLOCK = ITEMS.register("example_block", () -> new BlockItem(Blocks.EXAMPLE_BLOCK.get(), new Item.Properties()
                .tab(ItemGroup.TAB_BUILDING_BLOCKS)));
        public static final RegistryObject<Item> EXAMPLE_INGOT = ITEMS.register("example_ingot", () -> new Item(new Item.Properties()
                .tab(ItemGroup.TAB_MATERIALS)));

        public static void register(IEventBus eventBus) {
            ITEMS.register(eventBus);
        }
    }
}

BLOCKS.register("example_block", ...)でブロックの登録名を指定
ブロックIDはexamplemod:example_blockとなります。

BlockクラスのインスタンスはMinecraftのブロックの種類を表す
硬さや爆破耐性など、ブロックの種類によって変わる性質を保持

AbstractBlock.Properties.of(Material.METAL, MaterialColor.METAL)で、燃えるかどうかなどの基本的な性質をまとめたMaterialと、地図上の表示色であるMaterialColorを指定

requiresCorrectToolForDropsで、ブロックを回収するために適切な道具が必要であると設定

strength(5.0F, 6.0F)でブロックの硬さと爆破耐性を指定
第一引数は硬さで、数値が大きいほど壊すために時間がかかる
第二引数は爆破耐性で、数値が大きいほど爆発で壊れにくくなる

sound(SoundType.METAL)でブロックの設置、破壊、上を歩いた時などに発生する音の種類を指定

harvestTool(ToolType.PICKAXE)でブロックを回収するための適正な道具の種類を指定
斧(AXE)、ツルハシ(PICKAXE)、シャベル(SHOVEL)、クワ(HOE)の中から選ぶ
指定しない場合は、どの道具を使っても早く壊せなくなる

harvestLevel(1)でブロックを回収するために必要な道具の素材水準を指定
初期値は-1で、0が木か金、1が石、2が鉄、3がダイヤモンドの道具を要求

BlockItemは、プレイヤーのインベントリの中にある時など、アイテムとしてのブロックを表すクラス
ほとんどのブロックは破壊されると対応するアイテムをドロップし、対応するアイテムを右クリックするとブロックをワールドに設置する
このような対応関係を示すための、Itemを継承したクラス

tab(ItemGroup.TAB_BUILDING_BLOCKS)で通常のアイテムと同様に、クリエイティブタブを指定します。今回は「建築ブロック」タブを指定

Block Stateの記述

src/main/resources/assets/examplemod/blockstates/example_block.json
{
  "variants": {
    "": {
      "model": "examplemod:block/example_block"
    }
  }
}

ブロックの状態とモデルとの対応をJSONで記述
今回は状態を扱わないので、モデルを1つ指定

ブロックモデルの記述

src/main/resources/assets/examplemod/models/block/example_block.json
{
  "parent": "minecraft:block/cube_all",
  "textures": {
    "all": "examplemod:block/example_block"
  }
}

今回は正六面体のフルブロックで全面同じテクスチャを使う

アイテムモデルの記述

src/main/resources/assets/examplemod/models/item/example_block.json
{
  "parent": "examplemod:block/example_block"
}

今回はブロックのモデルを指定

テクスチャの配置

src/main/resources/assets/examplemod/textures/blockのファイル構造を構築
そこにブロックの各面に表示される16×16ピクセルのpng画像ファイルexample_block.pngを配置する

翻訳設定

英語翻訳
src/main/resources/assets/examplemod/lang/en_us.json
{
"block.examplemod.example_block": "Block of Example",
"item.examplemod.example_item": "Example Item"
}

日本語翻訳
src/main/resources/assets/examplemod/lang/ja_jp.json
{
"block.examplemod.example_block": "お試しブロック",
"item.examplemod.example_item": "お試しアイテム"
}

ルートテーブルの記述

src/main/resources/data/examplemod/loot_tables/blocks/example_block.json
{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "examplemod:example_block"
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion"
        }
      ]
    }
  ]
}

ブロックを適正な道具で破壊した際にドロップするアイテムをJSONで記述
今回は常にお試しアイテムをアイテムとして1つドロップするよう指定
フォルダ名が複数形なので注意

"condition": "minecraft:survives_explosion"により、他のブロックと同様、爆発により壊された時に1/(爆発力)の確率でアイテムをドロップするようになる

確認

スクリーンショット 2021-05-13 18.14.28.png
スクリーンショット 2021-05-13 18.14.57.png

ブロックとして確認できたが、ドロップはしなかった

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0