ブログタイトル

今回もScratchとは関係ない記事です。

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

なるべく小学生高学年ぐらいでわかるように図解していきたいと思います。

前回に引き続き、IntelliJ IDEAをつかって作っていきます。
Forgeのバージョンは1.8.9です。 

IntelliJ IDEAでマイクラModding-たべもの追加編-

まずどこにプログラムするの?

前回、マイクラのクライアントを起動するところまでやりましたが
実際にModdingするには、どこにプログラムを書けばいいのでしょうか?

実は環境構築したときに「ExampleMod(イグザンプルモッド)」というファイルがはいってます。
前回クライアントを起動したときもこれを実行してたんですね。

WS0034
(クリックで画像拡大)

まず左側のプロジェクトビューのなかから
「src」というフォルダを探してクリックします。
そしてsrcから順に src\main\java\com\example\examplemod\
のフォルダを開いていくと、「ExampleMod.java」というファイルがあるので
それをダブルクリックして開きます。

すると右側のウィンドウにExampleModのプログラムが表示されました。
ターミナルで「runClient」したときにログにメッセージを出すサンプルコードです。

このサンプルと同じように、MODのプログラムは「src」フォルダの「java」フォルダ以下に作る必要があります。



パッケージを作ってみる

とりあえず、今ある「ExampleMod」は消してしまいましょう。
「com.example.examlpemod」のフォルダを右クリックして出たメニューから
「Delete(デリート)」をクリック
WS0035
(クリックで画像拡大)

Deleteできたら、あたらしく自分のパッケージをつくっていきましょう。
このパッケージのなかに自分のつくったModのプログラムを追加していきます。
Scratchでいうところのプロジェクトみたいなものです。(だいぶちがうけど)

WS0039
(クリックで画像拡大)

まず「java」のフォルダを右クリックして
右クリックメニューのなかから「New(ニュー)」→「Package(パッケージ)」をえらびます。

WS0037
(クリックで画像拡大)

パッケージのなまえを決めます。
パッケージ名はかぶらないようにドメイン名(Webサイトのアドレス)をつける慣習があるようです。

うちのブログのドメインをつかって「jp.blog.LogicLab」という名前にしてみました。
名前はかぶらなければ何でもいいので、好きな名前を付けて下さい。

このパッケージ名の「.」のぶんだけフォルダの階層が下がっていきます。
「jp/blog/LogicLab」というふうにフォルダが作られます。

WS0041
(クリックで画像拡大)

パッケージができたら、そのパッケージを右クリックして
「New」→「Java Class(ジャバクラス)」をえらびます。

WS0042

クラス名をつけます。このクラスはメインクラス(いろんなアイテムとかを管理するプログラム)にするので
アイテム名じゃなく、MODの名前をつけます。
「TaroMod」とか、好きな名前を付けて下さい。

WS0043

すると、「jp.blog.LogicLab」のパッケージの中に
「LogicLab.java」が作られました。

パッケージ名やクラス名は自動で入ってますね。



インポートしてみよう

さて、javaは色んな機能をインポートして使います。
インポートって追加するってことです。

import...と打っていってもいいですが
もっと簡単にインポートすることができます。

WS0045
(クリックで画像拡大)

パッケージ名が書かれた下に
「@Mod」と打ってみて下さい。するとModというワードに対する候補が出てきます。
一番上の「Mod(net.minecraftforge.fml.common)」という候補が
えらばれた状態で「エンターキー」を押してみて下さい。

WS0046

すると、このクラスを自動でインポートしてくれるのです!

ちなみにこのクラスはどこにあるかというと
このExternal Librariesというところを開くとはいってます。
WS0047
forgesrc~~のなかのnet.minecraftforge.fml.common.Mod ですね
まぁいちいち確認しなくてもいいんですが。

つづいてこんなかんじでかいてみましょう。


これでMODのIDやMODの名前・バージョンなどを設定できます。
ぜったいにいるのはMODIDだけで、あとは省略することもできます。

これでrunしてみましょう。
WS0050
 前回と同じように右上のさんかくボタンを押します。

 WS0051
マイクラが起動するので、「Mods」のところをクリックしてみましょう。

WS0052
すると、モッドリストのところに、自分がつくったModが現れます。
クリックするとModの名前やバージョンがでていますね。 

ただ赤字でなにやら怒られていますね。
こういう時は自分で翻訳サイトなどをみて調べてみましょう。
習ったことのある単語も多いと思います。 

No mod information found
モッド 情報 見つからない

って書いてあります。
その下に「mcmod.info」ファイルって書いてありますね。

いちどクライアントを閉じて、プロジェクトにもどりましょう。

WS0053
(クリックで画像拡大)

「java」フォルダのしたに
「resources(リソースィズ)」というフォルダがありますね。
このなかに「mcmod.info」というファイルがありますのでクリックします。

するとmodidやらnameやらを設定しているようす。
ここでID・名前・MODの説明・作った人 などを設定してみましょう。

MODIDはさっきのプログラムとあわせておきます。

こんなかんじにしました。
これでもういちど「Run」してみましょう。

WS0054
 こんどはちゃんと表示されました。バージョンが2種類でてるのは
build.gradleの中のバージョンが出てるからなんですが
めんどいので割愛します。 わかるひとはbuild.gradleの中を見てみてね~



アイテムをついかしてみよう

長くなってしまいましたが、いよいよアイテムを追加していきます。
まず、アイテムクラスを作成するので
さきほど 「LogicLab.java」を作ったのと同じように
パッケージの中にアイテムクラスを作成します。

WS0056

ジャガイモに使い道がないので、フライドポテトにしたいと思います。
「FriedPotato(フライドポテト)」というクラスを作ります。

クラス名は単語のはじめを大文字にするみたいなきまりがあるっぽいです。

クラスができたら「FriedPotato」のファイルをひらいて・・・
WS0057
 最初は
public class FriedPotato{
}
ってなってると思いますが、このフライドポテトのあとに
extends ItemFoodと打ちます。

ItemFoodを打つと、候補がでるので一番上のItemFoodをインポートして下さい。

この extends っていうのは、ItemFoodクラスを継承するよってことです。
ItemFoodの機能が使えるクラスになったということです。

この継承元のクラスのことを(この場合はItemFoodクラス)スーパークラスって言います。
スーパーサイヤ人みたいなものです。

親クラス(悟空)の子クラス(悟飯)だからスーパーサイヤ人になれる力を継承している
みたいなかんじです。 

さて、脱線しましたが続きです。
このItemFoodのなかに、こんな感じで書いていきます。



とちゅう、「CreativeTabs」のところで「net.minecraft.creativetab.CreativeTabs」をインポートしてくださいね。


super(30, 30, false);
これはItemFoodクラスにあるItemFoodメソッドを使うってことです。
WS0058
(クリックで画像拡大)

External Librariesから、forge→net.minecraft.itemのなかのItemFoodクラスを見ると
こんなかんじになっていますね。

引数で順番に、amount(満腹量)saturation(隠し満腹度)isWolfFood(オオカミが食べられるか?)
をわたします。

setCreativeTabはアイテムクラスのメソッド(アイテムフードクラスがアイテムクラスを継承してる)
クリエイティブタブをどこにするか設定します。
フードなので「CreativeTabs.tabFood」にします。

setUnlocalizedNameでアイテムの名前を設定します。(アイテムクラス)

setMaxStackSizeはスタックできる数です。(アイテムクラス)

setAlwaysEdibleでお腹がすいてなくても食べられるようになります(アイテムフードクラス)
これは外した方がいいと思いますけど、デバッグのときにお腹いっぱいだとこまるので
今はつけておきます。

これでフライドポテトクラスは完成です。


さて、メインクラスにもどったら、こんなふうにコードを追加してみましょう。


まずアイテム型のフライドポテトのオブジェクトをつくります。
オブジェクトのなまえははじめは小文字で書きます。クラスと区別するためです。

つぎにpreInit(FMLPreInitializationEvent event)で初期化の前処理をします。

GameRegistry.registerItem(friedPotato, "friedpotato")で
ゲームレジストリにアイテムを追加します。
オブジェクトと名前を引数で渡します。

if (event.getSide().isClient()) で、サーバとクライアントの処理分けをします。
今回はクライアントをつくってるので、このなかに処理を書きます。

ModelLoader.setCustomModelResourceLocationで
テクスチャのリソース(アイテムの画像)がどこにあるかの名前を設定します。
この設定場所はあとで説明します。
リソースのなまえは「全部小文字」にします。

参考記事はこちら:1.8のブロックの追加



レシピをついかしてみよう

アイテムオブジェクトを作っただけでは、マイクラの世界に登場しないので レシピで作れるようにしましょう。
レシピの追加は、 preInit(プレイニット)したあとの、初期化処理init(イニット)で行います。



init(FMLInitializationEvent event) のなかで、
GameRegistry.addRecipeってやってますね。

addRecipeは名前の通り、レシピをついかするメソッド。
引数に、このレシピでできるオブジェクト名「friedPotato」と
できる数(今回は8個)を設定します。

"   ",
" P ",
"   ",

ってなってる部分がレシピです。今回は固定レシピです。
いちばん上はからっぽ(スペース3つ)
中央はスペース・じゃがいも・スペース
いちばん下はからっぽ(スペース3つ)
にしました。

WS0060

この状態です。(36個もいらないけど)

このPは、'P', Items.potatoって書くことで Pはじゃがいものことだよ~って設定します。
ニンジンにしたかったらItems.carrotって書きます。
Items.まで打つと候補がでるので見つけやすいと思います。
ブロックの時はBlocks.でさがします。
WS0059

アイテムのIDはマインクラフトwiki:アイテムIDなどで調べられます。

この状態で「Run」を押して実行してみましょう。


クラフトで真ん中にジャガイモを置いて・・・
ジャン!
WS0061
フライドポテトじゃなくて、ピンクと黒のへんなブロックがあらわれました。
それもそのはず、まだ「フライドポテトの絵」をリソースに追加していないからです。

クライアントを閉じて、つぎはテクスチャなどのリソースを追加していきましょう。



リソースを追加してみよう

アイテムやブロックの素材のことをリソースといいます。
リソースは、リソースフォルダに追加していきます。

■フォルダの追加

まずリソースフォルダを右クリックして「new」→「Derectry」をクリックします。
WS0063
(クリックで拡大)

WS0064
New Directoryで
「assets.logiclab」とします。このlogiclabの部分がMODのIDになります。
全部小文字で書きます。

WS0062
(クリックして拡大)

assets.logiclabのフォルダができたらそのなかにさらにフォルダを
作っていきます。まだ使わないフォルダもあるんですが
あとでブロックとかも追加していくので、まとめてフォルダを作っておきます。

このリソースをおくフォルダの場所と名前はゲンミツに決められているので
タイプミスのないように慎重につくっていきましょう。
とくにmodelsのなかのフォルダは「item」なのに
texturesのなかのフォルダは「items」になっていますので注意

置き場所はこちらを参考にしてください。

■画像の追加

フォルダが全部できたら、素材をフォルダにいれていきましょう。
まず画像ファイル(16×16のpng)を用意します。

 friedpotato

名前はプレイニットの
ModelLoader.setCustomModelResourceLocation 
この部分で設定したのと同じ名前にしておきましょう。
今回の場合だと「friedpotato.png」ですね。

この画像ファイルを、「textures」フォルダのなかの「items」フォルダの中に入れます。


■モデルファイルの追加

つづいてモデルファイルを作っていきましょう。
モデルファイルの中には、どのテクスチャを使うかや
1人称視点・3人称視点での表示設定などが書かれているファイルになります。

「models」フォルダのなかの「item」フォルダを右クリックして
「New」→「File」をえらびます。

WS0065
ファイル名は、これもModelLoader.setCustomModelResourceLocation で設定した名前。
「friedpotato.json」とします。全部小文字です。

こんへんの大文字小文字にだまされて結構なやまされたので注意。
リソース追加したのにテクスチャが表示されないのは
「フォルダの名前がまちがっている」か「ファイルの名前がまちがっている」 が多いです。

jsonファイルができたらダブルクリックして開きます。
そして中にこのように書きます。


texturesでテクスチャの場所を指定。
thirdpersonが3人称視点の設定。
firstpersonが1人称視点の設定です。

アイテムのサイズ感とかは実際にみてみないとわからないので
このへんの設定は、ためしつつ変えてみて下さい。

WS0066
(クリックで拡大)

この記事内でたびたび紹介してますが
ForgeSrc内の設定ファイルを見るのが結局は参考になると思います。

assetsフォルダ以下に、マイクラでつかわれているアイテムのjsonファイルがあるので
自分のイメージに近いものを探して設定するのがいいと思います。


■日本語化ファイルの追加

つぎに「Lang」ファイルを設定しましょう。
Langファイルはランゲージファイルのことで、追加したアイテムの日本語名を設定することができます。
べつに英語名ででてきてOKなときは、ランゲージファイルはいりません。

「lang」フォルダを右クリックして
「New」→「File」をえらびます。
WS0067
 日本語ファイルを作りたいので「ja_JP.lang」という名前にします。

そして、このファイルを開いて、中にこのように書きます。



1行目は空白にしましょうって書いてたので空白にします。
でも空白入れなくても動きましたけどね。ナゾです。

ここは小文字じゃないので注意です。

これでリソースの設定は全て終わりました。


■動かしてみる

「Run」で起動してみましょう。
 WS0068
おお~。できてます。
ちゃんとジャガイモからフライドポテトになってますね。

つぎに食べてみましょう。
うん、ちゃんと食べれてます。

つぎに3人称視点をチェックしてみましょう。
WS0069
 でか!!!!!!!!

ポテトめっちゃでかいですね。
これはjsonファイルを設定し直した方がいいでしょう。

forgeSrcのpotato.jsonファイルを参考に、以下のように直してみました。



これでもういちど「Run」して試してみましょう。

WS0071
ふむ、いい感じじゃないでしょうか。
手にも埋まってないですし、大きさもちょうどいいですね。


かんせいです!
長かったですね、お疲れさまでした! 

食べたときに「うまい!」って言わしたいので、言わせたんですが
ちょっとアイテム追加の記事があまりに長くなりすぎたので
いったんここで休憩にします~

チャットウィンドウに表示するのは次回やりますね。