ブログタイトルMOD

Moddingにもだいぶ慣れてきたというかた、
農作物を追加してマイクラファーム生活を充実させてみませんか?
今回はトマトを植えて収穫できるまでのModdingチュートリアルです。

IntelliJ IDEAをつかって作っていきます。
Forgeのバージョンは1.8.9です。 

農作物は、1.9になって仕様がけっこうかわってるので
最後に1.9のソースもUPしたいと思います。

先生じゃなくて画像作ってる人が書いてるので
プログラミングはあんまり…な感じですが、がんばります!

環境構築がまだのかたはこちら
デザイナがマイクラのmodをつくる-環境構築編-

mod初心者のかたは、このへんから試してみて下さい
デザイナがマイクラのmodをつくる -たべもの追加編- 

自分でイスとか作りたい人はこちら
IntelliJ IDEAでマイクラmodding-自作モデル追加編-



IntelliJ IDEAでマイクラModding-農作物追加編-

まずは普通のアイテムトマトをつくる

アイテムトマトの作り方は、前回の記事とほとんど同じです。
tomato
こんなトマトを作りたいと思います。

まずはsrc/main/javaフォルダの中の、自分のパッケージ名のフォルダの上で
右クリックして、あたらしいjavaを作ります。
WS0102

ファイルの名前は「ItemTomato」(アイテムトマト)にしました。
前回まで何も考えずに名前つけてたのですが、
ソースみた先生にちゃんとした名前つけろとおこられたので、ちゃんとした名前にしました。

そして、このファイルの中に、こんな感じのソースをかきます。

アイテムトマトをそのまま植えたいので、ItemSeedFood(アイテムシードフード)クラスを継承します。
このクラスは種でもあり、食べ物でもあるアイテムです。

まずはトマトだけ表示させるテストなので
super(30, 30, Blocks.potatoes,Blocks.farmland);
の部分の、何を植えるか?の引数は、ブロックトマトではなくポテトにしています。あとで変更します。

つぎにアイテムトマトのモデルも追加しましょう。
WS0117
resources(リソースィズ)のなかのmodels(モデルズ)のなかのitem(アイテム)のなかに
tomato.jsonを追加します。

jsonファイルの中身はこんな感じ。テクスチャの名前以外は、フライドポテトと一緒です。


そして、textures(テクスチャーズ)の中に、トマトの画像を入れましょう。

さらに、メインのjavaにオブジェクトを追加して、ワールドに登場させましょう。



これで一度、トマトが表示されるか試してみます。
WS0118
ジャン!

でました。でも植えてみると…
WS0119
ポテトになります。
これはさっきItemTomato.javaでポテトを植えるように設定したからですね。

これでアイテムトマトの追加は完了です。
今度はブロックトマト(植わっている状態のトマト)を作っていきましょう。


地面に植える用のブロックトマトをつくる

つぎは、地面に植わっているトマトを表示するために BlockTomato.javaというのを作ります。
ItemTomato.javaと同じフォルダに作ります。

そしてソースはこんな感じにします。



植わっている植物ブロックを作るには「BlockCrops」というクラスを継承します。

今回のトマトは、種を使わないので、成長しきっていない時に収穫(getSeed)しても
トマトがでてきます。なのでgetSeedでreturn itemTomatoとします。

getCropは作物を収穫するときですね。
こちらも当然トマトがとれますので、同じようにreturn itemTomatoとします。

とりあえずこれだけで試してみましょう。
メインのソースにblockTomatoを追加します。



★ItemTomato.javaにわたす引数をblockTomatoにしたいので
newするときは、「blockTomato」の後に「itemTomato」を作るようにしましょう。

そして、先ほどの「ItemTomato.java」で仮にポテトにしておいた部分を
super(30, 30, LogicLab.blockTomato,Blocks.farmland);
blockTomatoに変えましょう。


成長段階にあわせたjsonをつくる

さあ、めんどいリソース追加作業のはじまりです。
ブロックは、もともとのリソースが多いのに加え、
今回は成長段階にあわせたjsonファイルとテクスチャ画像が必要になります。

リソースの置き場所はこんなかんじです。
WS0120

今回は0から3までの4段階にしましたが、最高で8段階まで作ることができます。
tomatos_stage_0stage0
tomatos_stage_1stage1
tomatos_stage_2stage2
tomatos_stage_3stage3

こちらが0から3までの画像です。

そしてニンジンのjsonを参考にしてtomato.jsonを作っていきます。
WS0121
ニンジンのstage0のjsonがこんな感じです。
このcropというのを継承して、テクスチャを指定しています。

んでcrop.jsonはというと、こんな感じ
WS0122
このtextureの#cropってなってる部分が
carrotでいうとblocks/carrot_stage_0に置き換わるんですね。

ではこれを参考に、stage0からstage3までのjsonを作っていきます。
WS0123
もうファイルの作り方は大丈夫だと思いますが。
modelsのblockフォルダで右クリック → New → Fileをえらんで

WS0124
jsonファイルを作りましょう!


そしてjsonファイルの中身をこのようにします。
ほかのjsonファイルも、「tomatos_stage_0」この部分の数字が変わるだけですので
stage1からstage3までのjsonファイルも、数字を変えて同じように作りましょう。

つぎに、blockstateフォルダの中に入れるjsonファイルを作ります。
blockstateフォルダで右クリック → New → Fileをえらんで
「tomatos.json」というファイルを作ります。

そして、「carrots.json」を参考にして、tomatos.jsonの中身をこんなふうにしました。

このage(エイジ) というのが成長段階です。
0から7までの8段階ありますが、同じモデルを表示することで4段階に調節しています。
このへんの成長段階は自由に設定しましょう。

あとは、テクスチャフォルダに、stage0からstage3までのpngファイルを入れれば
リソースの追加作業は完了です。

いちど「Run」して確認してみましょう。
WS0125
うーむ。
出たのはいいですが、思ってたのとちがいます。
お花みたいにテクスチャをクロスに表示させたかったのですが。


テクスチャをクロスに表示させる

というわけで、お花のjsonファイルを見てみます。
WS0126
ピンクチューリップのjson。
どうやら、block/cropの部分をblock/crossにすれば良いだけのようです。

tomatos_stage0~stage3までのjsonファイルをこのように書きかえました。

これでもう一度「Run」して確認してみましょう。
WS0127
こんどはワサーっと生えずに、ちゃんと1本の苗になっています。
テクスチャがクロスになりましたね。


ふんだら消えるようにする

ふつうの農作物は、ジャンプするなどして畑じゃなくなった場所にははえずに消えてしまいますよね?
このトマトはどうなっているかというと
WS0128
ふんで畑じゃなくなっても元気に生えています。
これでいいならいいんですが、せっかくなのでちゃんと農作物っぽく
畑じゃなくなったら消える(アイテムにもどる)ようにプログラムしてみましょう。

srcの「BlockTomato.java」にプログラムを追加します。


BlockCopsの中にある「canBlockStay」というのがつかえそうです。
canBlockStay(キャンブロックステイ)はその名の通り、ブロックがそこにとどまれるかどうかを判定します。

WS0142

で、このcanBlockStayでは、光が当たっているか・空が見えるか・植物が育つことができる土壌か
などを調べて、ブロックがとどまれる環境ならTrueを返します。

ただ、畑かどうかという判定がこのなかには含まれていないので
Trueが帰ってきた後、さらに畑かどうかを判定します。

IBlockState soil = p_canBlockStay_1_.getBlockState(p_canBlockStay_2_.down());
この部分で、自分のブロックの一つ下のブロックをとってきます。 (トマトブロックの下なので地面ですね)

この地面がBlocks.farmland(畑)ならTrueを返します。
畑でなければFalseを返し、このブロックは存在できなくなります。

これで、「Run」して試してみましょう。
WS0143

このように、畑ではなくなったところはBlock状態のトマトは消えるようになりました。


これで作物追加編はおしまいです。
いろんな作物MODを作ってみて下さいね~。

1.9用の農作物追加ソースはこちらです。
こちらはとくにかいせつしませんが、1.9の方は参考にしてみて下さい。