今回追加するアイテム

化石の鉱石を作ります。

掘ると「頭の化石」と骨が手に入ります。(こちらはルートテーブルのファイルをいじって設定します)
頭の化石をクラフトすることで、UHCでおなじみの「頭」を作ることができます。
シングルプレイでの頭の入手方法を考えた結果、こうなりました。
ブロック・アイテムの追加
まず鉱石となるブロックと、掘ったときのアイテムを追加しておきます。
作り方は以前の記事を参考にしてください。
ブロック:
www.umagame.info
アイテム:
www.umagame.info
と言いたいところですが、ブロックの方のコードに少し問題があります。

これは鉱石のブロックのクラスです。Propertiesのところに「setRequiresTool」というメソッドを追加します。
これを追加すると、ブロックを採集する際に適正ツールが必要になります。
これを忘れると、素手で壊してもドロップする、という状態になってしまいます。(もちろん、バニラの木材ブロックのように素手で壊しても良いブロックなら記述する必要はありません)


こんな感じです。(ブロックのソースコードは下記)
鉱石の生成の設定
生成クラス
それでは鉱石の生成の設定をしていきます。

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

名前は「world」にします。

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

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

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

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

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

メインクラス(UHCItemsMod.java)でEventBusのaddListenerを呼び出します。
これでGenerationクラスのgenerateOresメソッドが呼び出されるようになります。
起動して確認

新しくワールドを作成して、スペクテイターモードで探してみます。
見えにくいですが、スクショ内には2つ化石の鉱石があります。
ルートテーブル
次にルートテーブルを設定します。
今回は頭の化石1個と、骨0~2個がドロップするようにします。
今回はjsonファイルを生成することができるサイト(misode.github.io)を利用します。

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

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

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

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

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

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

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

貼り付けます。

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

このように頭が1個と、ランダムで骨が出てきたらOKです。
経験値の設定
鉱石を壊したときに、経験値を得られるようにします。

経験値の設定は簡単で、継承クラスをBlockからOreBlockに変更して「getExperience」メソッドをオーバーライドするだけです。
経験値の量は2~3にしました。(石炭が0~2、ダイヤとエメラルドが3~7、ラピスとネザークォーツが2~5です)

起動して確認します。
コードはこちら。(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