ブログタイトル


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

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

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

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

IntelliJ IDEAでマイクラModding-チャットメッセージ編-

食べたときに「うまい」と言わせたい

前回、食べ物をついかするチュートリアルをやりましたが、
今回はそのたべものを食べたときに「うまい」と言わせるプログラムです。

文字を出す方法を検索すると
チャットに文字を出力する という記事が引っかかったので
ここを参考につくってみます。

まず「食べたとき」をどうやって知ればいいんでしょうか?

WS0073
 (クリックして拡大)

毎度おなじみになってますが、forgeSrcのソースをみてみましょう。
今回作ったフライドポテトは、このnet.minecraft.item.ItemFoodクラスを継承していますから
このなかにヒントがあるはずです。

forgeSrcのなかからフォルダをあけていって net/minecraft/item/ItemFoodのファイルを
さがしてクリックして下さい。

ItemFoodのファイルを開いたら中を見てみましょう。
「onItemUseFinish(アイテムを使い終わった)」 か「onFoodEaten(フードを食べた)」がつかえそうですね。

今回はonFoodEatenを使ってみることにします。



まずはこんな感じにして試してみましょう。
もうほんとに「うまい」って言わせてるだけですね。

これで「Run」してみましょう!
シンプルなコードなのでうまくいくはずです。

WS0074
食べた結果がこれ。
完全に文字化けしてますね。

□□□とかの文字化けじゃないので、文字コード系の文字化けですね。


日本語の文字化けを直すには

文字化けで検索してもぜんぜんひっかからないので困ってたんですが
MinecraftForge導入手順に書いてありました。
ファイル自体をUTF8で保存していても
コンパイルをUTF8でやってないとダメってことみたいです。

  • ソースファイル内に日本語が記述されている場合は、「build.gradle」に以下を追加。
tasks.withType(Jar) {compileJava.options.encoding = 'UTF-8'}

このとおりにやってみましょう。
WS0076
 (クリックで拡大)

まずプロジェクトビューのなかからbuild.gradleをさがして中を見てみましょう。
(タブがmyDevという名前になっていますが、これで開けてます)

そして前述のtasks.withType~っていうコードを
どこかに追加して下さい。どこでもいいっぽいです。

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

WS0078
じゃん!
「うまい」
「うまい」
って2回でています。1回しか食べていないのに。

これはこれで、おいしさがにじみ出ているのでいいんですが
連続で食べたときにチャットログがすごいことになりそうです。

チャットログに2回表示されるのをなおすには

さて、なぜ2回表示されるかと言うことですが
しらべてみると「サーバ側」と「クライアント側」で1回ずつこのプログラムを実行しているので
2回しゃべってしまう ということがわかりました。

そういえば、メインのソースコードにも
if (event.getSide().isClient()) もしクライアントだったら… っていう記述がありましたよね。
これをフライドポテトでもやればいいのです。

ってフライドポテトeventもってないし!
とおもってたら、wikiにこんなことがかいてありました。
クライアント, サーバーのコード統一化によるModのUniversal化
if (!world.isRemote)
{
    ....
}

このworld.isRemoteとはすなわち,

  • クライアントがサーバーに接続しているワールドならtrue
  • それ以外はfalse

これだー!
日本語wikiは何気に充実してるくせに、検索になかなか引っかかってくれないので曲者ですw
英語で検索して解決した後「if (!world.isRemote)」で検索したらトップに出てくるし…

ともかく、これをつかってサーバとクライアントの処理分けをしましょう。

こんなかんじにしてみました。

@SideOnly(Side.CLIENT) と書いてクライアント専用にします。
そしてさっきのworld.isRemoteで処理分けします。

これで「Run」してみましょう!
こんどこそ1回だけ「うまい」と言うはずです!

WS0079
やったー!
これで完成です。



今回はシンプルな内容だったので、簡単でしたね。
でもこれたんたんと書いてますけど、調べるのにめっちゃ時間かかりましたw

みんなもっと「失敗例」も書いてくれると助かるんだけどな~って思いました。

出来上がりのソースコードもありがたいんだけど
つまづいたときにこうしたよって記事が少ないんですよね。
こういうのは英語で質問考えて検索する方が見つかりやすいという……

もしみなさんがmoddingしてつまづいたことがあったら
ぜひその情報もどこかにUPしてくれたらなって思います。
匿名ブログとかでもいいですし。


ではまた次回!
次回はブロックの追加やりますよ~