うまげーむさん

ゲームの情報を主に投稿します。

【マインクラフト Modding】1.16での自作Modの作り方 #8 鉱石の追加・ルートテーブル

はじめに

どうも。

個人的な事情により、これからの投稿頻度が低くなります。(週1~2ぐらいになります)

前回:

www.umagame.info

今回追加するアイテム

f:id:Umagame:20210124144256p:plain

化石の鉱石を作ります。

f:id:Umagame:20210124150732p:plain

掘ると「頭の化石」と骨が手に入ります。(こちらはルートテーブルのファイルをいじって設定します)

頭の化石をクラフトすることで、UHCでおなじみの「頭」を作ることができます。

シングルプレイでの頭の入手方法を考えた結果、こうなりました。

ブロック・アイテムの追加

まず鉱石となるブロックと、掘ったときのアイテムを追加しておきます。

作り方は以前の記事を参考にしてください。

ブロック:

www.umagame.info

アイテム:

www.umagame.info

と言いたいところですが、ブロックの方のコードに少し問題があります。

f:id:Umagame:20210124190244p:plain

これは鉱石のブロックのクラスです。Propertiesのところに「setRequiresTool」というメソッドを追加します。

これを追加すると、ブロックを採集する際に適正ツールが必要になります。

これを忘れると、素手で壊してもドロップする、という状態になってしまいます。(もちろん、バニラの木材ブロックのように素手で壊しても良いブロックなら記述する必要はありません)

f:id:Umagame:20210124182211p:plain

f:id:Umagame:20210124182251p:plain

こんな感じです。(ブロックのソースコードは下記)

鉱石の生成の設定

生成クラス

それでは鉱石の生成の設定をしていきます。

f:id:Umagame:20210124182216p:plain

まず、新しくパッケージを作ります。

f:id:Umagame:20210124182219p:plain

名前は「world」にします。

f:id:Umagame:20210124182221p:plain

新しくクラスを作ります。「Generation」(生成)という名前にしました。

f:id:Umagame:20210124182225p:plain

まず、このprivateメソッドをコピペしてください。(コードは下記)

これを呼び出すことで鉱石の生成の設定をゲームに追加することができます。(今回は追加する鉱石が一つなのでprivateメソッドなしでも構いませんが、複数の鉱石を追加する場合はこの方法のほうが効率が良いです)

f:id:Umagame:20210124182228p:plain

新しくpublicのメソッドを作ります。ここでさっき作った「genetateOre」を呼び出します。

f:id:Umagame:20210124182233p:plain

if文を使って「バイオームがNETHER(ネザー)またはTHEEND(エンド)でないとき」に鉱石を生成するように設定します。(要するにオーバーワールド内のみ)

f:id:Umagame:20210124182237p:plain

generateOreを呼び出します。引数を一つずつ説明します。

まず最初のbuilder(BiomeGenerationSettingsBuilder)ですが、これはevent(BiomeLoadingEvent)のgetGenerationで得られるものを指定します。

state(BlockState)は、生成される鉱石ブロックのBlockStateです。(.get().getDefaultState()で得ることができます)

veinSize(int)は鉱脈の大きさです。これは鉄鉱石と同じ9にしました。(石炭は17、金は9、ダイヤとRSは8、ラピスは7になっています)

rangeは鉱石が生成される範囲です。Y=0~Y=range-1の範囲になります。(こちらも鉄鉱石とおなじ64にしました)

画像では見切れていますが最後の引数がamountPerChunkです。これは1チャンクに生成される量です。(こちらも鉄鉱石とおなじ20。石炭は20、金は2、RSは8になっています)

コードはこちら。(Generation.java

package com.umagame.uhcitemsmod.world;

import com.umagame.uhcitemsmod.init.BlockInit;

import net.minecraft.block.BlockState;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStage;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.OreFeatureConfig;
import net.minecraftforge.common.world.BiomeGenerationSettingsBuilder;
import net.minecraftforge.event.world.BiomeLoadingEvent;

public class Generation {

	public static void generateOres(final BiomeLoadingEvent event) {
		if(!(event.getCategory().equals(Biome.Category.NETHER) || event.getCategory().equals(Biome.Category.THEEND))) {
			generateOre(event.getGeneration(), BlockInit.FOSSIL_ORE_BLOCK.get().getDefaultState(),
					9, 64, 20);
		}
	}

	private static void generateOre(BiomeGenerationSettingsBuilder builder, BlockState state,int veinSize, int range, int amountPerChunk) {
		builder.withFeature(GenerationStage.Decoration.UNDERGROUND_ORES,
				Feature.ORE.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.BASE_STONE_OVERWORLD,
						state, veinSize)).range(range).square().func_242731_b(amountPerChunk));
	}

}

addListener

f:id:Umagame:20210124182240p:plain

メインクラス(UHCItemsMod.java)でEventBusのaddListenerを呼び出します。

これでGenerationクラスのgenerateOresメソッドが呼び出されるようになります。

起動して確認

f:id:Umagame:20210124182244p:plain

新しくワールドを作成して、スペクテイターモードで探してみます。

見えにくいですが、スクショ内には2つ化石の鉱石があります。

ルートテーブル

次にルートテーブルを設定します。

今回は頭の化石1個と、骨0~2個がドロップするようにします。

今回はjsonファイルを生成することができるサイト(misode.github.io)を利用します。

f:id:Umagame:20210124185105p:plain

まず、「Type」のところをminecraft:blockにします。

f:id:Umagame:20210124185110p:plain

そして「Pools」の+をクリックします。

f:id:Umagame:20210124185115p:plain

「Name」のところを骨(minecraft:bone)に設定します。

f:id:Umagame:20210124185119p:plain

「Rolls」を「Range」に設定します。これは0~2個のように、設定された範囲の中で数がランダムで決まる設定です。

f:id:Umagame:20210124185122p:plain

最小と最大の値を設定します。

f:id:Umagame:20210124185127p:plain

最後に右上のCopyをクリックしてクリップボードにコピーします。

f:id:Umagame:20210124182324p:plain

新しくルートテーブルのjsonファイルを作成します。

f:id:Umagame:20210124182327p:plain

貼り付けます。

f:id:Umagame:20210124182331p:plain

minecraft:stoneとなっていた部分を頭の化石(uhcitems:fossilized_head)に変えておきます。

ルートテーブルの設定はこれで完了です。

コードはこちら。(fossil_ore.json

{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "uhcitems:fossilized_head"
        }
      ]
    },
    {
      "rolls": {
        "min": 0,
        "max": 2
      },
      "entries": [
        {
          "type": "minecraft:item",
          "name": "minecraft:bone"
        }
      ]
    }
  ]
}

起動して確認 その2

f:id:Umagame:20210124182335p:plain

このように頭が1個と、ランダムで骨が出てきたらOKです。

経験値の設定

鉱石を壊したときに、経験値を得られるようにします。

f:id:Umagame:20210124190020p:plain

経験値の設定は簡単で、継承クラスをBlockからOreBlockに変更して「getExperience」メソッドをオーバーライドするだけです。

経験値の量は2~3にしました。(石炭が0~2、ダイヤとエメラルドが3~7、ラピスとネザークォーツが2~5です)

f:id:Umagame:20210124182348p:plain

起動して確認します。

コードはこちら。(FossilOreBlock.java

package com.umagame.uhcitemsmod.block;

import java.util.Random;

import net.minecraft.block.OreBlock;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.common.ToolType;

public class FossilOreBlock extends OreBlock{

	public FossilOreBlock() {
		super(Properties.create(Material.ROCK)
				.hardnessAndResistance(3,3)
				.harvestTool(ToolType.PICKAXE)
				.harvestLevel(1)
				.setRequiresTool()
				.sound(SoundType.STONE));
	}

	@Override
	public int getExperience(Random rand) {
		return MathHelper.nextInt(rand, 2, 3);
	}
}

さいごに

今回はここまでです。

最初にも言ったように、投稿頻度が少なくなるので次回はしばらくお待ち下さい。

次回はツールを予定しています。

次回:

www.umagame.info