3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

「ヤジが飛んでくるマインクラフト」DeepLearningで適当テキスト生成 ~modで動かす~

Last updated at Posted at 2020-02-25

DeepLearningの力を借りて、マイクラのプレイ中、ゲームに関係のある文章を読み上げてくれるソフトを作った。

↓こんなやつ
でもミニ.gif

実際に遊んでいる動画

1つの記事にまとめるのが困難なため、いくつかの記事に分けます。
ここでは、アプリケーション部分について説明します。

↓他の記事

やりたいこと

マインクラフトで、近くにゾンビがいるか判定。
ゾンビがいたら、ゾンビに関連する文章を表示。

(文章そのものを用意するところは別の記事へ)

マインクラフトmod

マインクラフトは有志の方が制作した、modというものがある。
mod を使えば、かなり自由にゲームを改造することができる。

MCreator を使えば、すぐにmod制作が始められる。
簡単な変更なら、コードすら書く必要がない。

Python プログラムを組み込みたい

マインクラフト mod は Java で書かれている。

  • Java あまり分からない。
  • DeepLearningのモデルも動かしたいので、Python が使いたい。

Raspberry Jam Mod(mcpi)

Pythonからマインクラフトを一部操作できる。
いろんなことができる。
しかし、ゲーム情報を取得する部分は微妙。

Python と Java で通信

mcpiのコードを見てみる。
Socket通信でやりとりしているらしい。
ポートを指定してごにょごにょするらしい。

近くにゾンビがいるかどうか調べる

ようやく、modの実装。
MCreator1.9.1 を使用した。

MCreator で新しいワークスペースを作ると mod の雛形が作成される。

  • GUIで、新しいコマンドを作れる。空のコマンドを作成。

    • hogehogeCommandExecuted みたいなやつの、executeProcedure関数に書く。
  • やりたいことを別の関数に詰め込む。

    • Socketを準備
    • 継続して、データを取得・送信・受信
  • コマンド実行時に、別のプロセスで、作った関数を実行するようにする。

ゲーム内情報取得

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 を使わない環境構築が面倒で、出来ていない。
ガチガチにコーディングしようと思うと不便な気がするので、どうにかしたい。

マインクラフトはかなり可能性を秘めているので、みんなもやってみてほしい。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?