DeepLearningの力を借りて、マイクラのプレイ中、ゲームに関係のある文章を読み上げてくれるソフトを作った。
1つの記事にまとめるのが困難なため、いくつかの記事に分けます。
ここでは、アプリケーション部分について説明します。
↓他の記事
やりたいこと
マインクラフトで、近くにゾンビがいるか判定。
ゾンビがいたら、ゾンビに関連する文章を表示。
(文章そのものを用意するところは別の記事へ)
マインクラフトmod
マインクラフトは有志の方が制作した、modというものがある。
mod を使えば、かなり自由にゲームを改造することができる。
MCreator を使えば、すぐにmod制作が始められる。
簡単な変更なら、コードすら書く必要がない。
Python プログラムを組み込みたい
マインクラフト mod は Java で書かれている。
- Java あまり分からない。
- DeepLearningのモデルも動かしたいので、Python が使いたい。
Raspberry Jam Mod(mcpi)
Pythonからマインクラフトを一部操作できる。
いろんなことができる。
しかし、ゲーム情報を取得する部分は微妙。
Python と Java で通信
mcpiのコードを見てみる。
Socket通信でやりとりしているらしい。
ポートを指定してごにょごにょするらしい。
-
Python側は mcpi の Connectionクラスを改造
-
Java側は ゴリ押しで書く
近くにゾンビがいるかどうか調べる
ようやく、modの実装。
MCreator1.9.1 を使用した。
MCreator で新しいワークスペースを作ると mod の雛形が作成される。
-
GUIで、新しいコマンドを作れる。空のコマンドを作成。
- hogehogeCommandExecuted みたいなやつの、
executeProcedure
関数に書く。
- hogehogeCommandExecuted みたいなやつの、
-
やりたいことを別の関数に詰め込む。
- Socketを準備
- 継続して、データを取得・送信・受信
-
コマンド実行時に、別のプロセスで、作った関数を実行するようにする。
- mod 素人(+Java素人)なので、mod と切り分けたかった。
- 脳死で、Thread とかいうのを使ってみる。
ゲーム内情報取得
Minecraft mc = Minecraft.getMinecraft()
WorldClient world = mc.world;
List<Entity> entities = world.getEntities(Entity.class, (entity)->!entity.isInvisible());
これで、ワールド内で透明でない敵mobや動物mobが取得できる。
Entity player = world.getEntityByID(mc.player.getEntityId());
そして、プレイヤーのインスタンスもとる。
String minecraftData;
for (Entity e: entities) {
if (e.getDistance(player) < 8.0f) {
minecraftData += e.getName() + ",";
}
}
getDistance
で Entity 同士の距離が分かる。
近くにいる Entity の名前をgetName
で取得して、送信用の文字列に加えている。
表示
マインクラフト内のチャットに文字を出す。
MinecraftServer mcserv;
mcserv.getPlayerList().sendMessage(new TextComponentString("hogehoge"));
参考になりそうなサイト
mod で気をつけること
バージョンによって少しずつ、ライブラリの仕様が異なる。
ライブラリのソースは、MCreatorからでも見られる。分かる人は直接読んでみてもいいと思う。
文字列を用意する。
あらかじめ、どのオブジェクトに関係のある文か分けてあるので、mod からのデータを元にランダムに選ぶ。
その文章の先頭単語を生成モデルに入れて、文を生成してみた。
詳しくは別記事参照。
おまけ
表示するだけでは、味気ない。
ゆっくりに喋らせてみた。
簡単に、こんな感じでやった(windows)。
subprocess.call("start C:\hoge\softalk\SofTalk.exe /R: /W: "+"読ませたい文章", shell=True)
まとめ
マインクラフトのmodは有名なので、解説記事が充実しているかと思ったが、そうでもなかった。
MCreator を使わない環境構築が面倒で、出来ていない。
ガチガチにコーディングしようと思うと不便な気がするので、どうにかしたい。
マインクラフトはかなり可能性を秘めているので、みんなもやってみてほしい。