マインクラフトのMCPI関係を調べる

Minecraft Raspberry Pi Edition

Raspberry Piには、無料のマインクラフトのRespberry Pi Editionがプリインストールされていてすぐに遊ぶことができます。また、Pythonから操作もできます。

https://www.raspberrypi.org/learning/getting-started-with-minecraft-pi/worksheet/

http://www.stuffaboutcode.com/p/minecraft-api-reference.html

Raspberry Juice Mod

https://github.com/zhuowei/RaspberryJuice

PC版のマインクラフトで、Respberry Pi版と同じようにするには、サーバー(Bukkit)を立てる必要がありました。

Raspberry Jam Mod

サーバー構築などをせず、通常のマインクラフトで、WindowsやMacからPythonで操作できるようにしたのが、Raspberry Jam Modです。これは通常のModと同じでJarファイルを配置して、あとはPythonスクリプトでクライアントライブラリーが用意されているので、これを使ってコーディングするだけです。

mcpi

Pythonはスクリプト言語なので、Raspberry Jam Modについているクライアントライブラリーを見ると、mcpiディレクトリーにモジュール一式があり、ソースコードを含めていろいろなことが分かります。

ここのテキストファイルなどを見るとmcpi_protocolの存在が分かります。何かPythonに依存している実装ではなく、FTPやHTTPのように簡単なプロトコルが用意されていて、それでソケット通信を行っています。

使いたいプログラミング言語でこのライブラリーを実装すれば、マインクラフトと通信できます。

Raspberry Piの場合は、Java用ライブラリーもバンドルされているようです。

http://www.stuffaboutcode.com/2013/01/raspberry-pi-minecraft-api-basics.html

Github

Githubを見ると関係がありそうなレポジトリーがいくつか見つかったので、ここに情報を残しておきます。

https://github.com/brooksc/mcpipy

https://github.com/salimfadhley/dojo-minecraft/tree/master/mcpi/api/java

https://github.com/kbsriram/mcpiapi – マインクラフト1.7.10向けのRaspberry Jam Modと同様のライブラリーです。

https://github.com/bleroy/minecraft.client – Raspberry Jm ModのC#クライアントライブラリー

 

 

 

マインクラフトのDラッチの回路図を書く

マインクラフトは、リピーターをロックさせる仕組みで簡単にDフリップフロップ回路が作成できますが、今回はより理解を深めるため、マインクラフトの回路図から、実世界のDラッチの回路図を書いて確認します。

マインクラフトの回路の信号方向 でも書きましたが、以下のようなマインクラフトの回路図は、レッドストーントーチにより信号の方向性が生まれるので注意する必要があります。

上部がDラッチ

https://www26.atwiki.jp/minecraft/pages/26.html 引用

 

 

真理値表

C D Q ~Q
 0  0  0
 0  1  1
 1  0  保持
 1  1  保持

www.falstad.comで書いたDラッチの回路図

http://tinyurl.com/j46pcvm

Logisimで書いたDラッチの回路図

まとめ

真理値表通りに動くのでたぶんこの回路図であっていると思います。マインクラフトの回路図から、実世界で使われる回路図にしてみました。ポイントとしては、レッドストーントーチが指向性を持つので、その先のワイヤーが交差する箇所で、単純に分配しているのか、OR回路になって1つのワイヤーになるのかをしっかり確認することです。

 

 


マインクラフトの回路の信号方向

マインクラフトではレッドストーントーチとブロックを組み合わせてNOT回路が作成できます。またこのような回路の場合、信号の流れが特定方向に固定されます。

https://www26.atwiki.jp/minecraft/pages/1037.html

Aから~Q側へ信号が流れそうですが、黄色いブロックについているレッドストーントーチがあるため、Aから~Q側には流れません。回路図で書くと以下になります。

真理値表

A B Q ~Q
 0  0  1  0
 0  1  0  1
 1  0  1  0
 1  1  1  1

 

Dフリップフロップ回路を作成するときに、このような構造が出てきます。

 


マインクラフトでDラッチ

Dフリップフロップ回路はデータを保存できるので、複数並べるとレジスターになります。最新のマインクラフトではレッドストーン回路のリピーターで信号を止めることができるため、これで先ずはDラッチ回路を作ってみます。

 

2bitのレジスター

参考資料

https://www26.atwiki.jp/minecraft/pages/26.html#id_c8183ecb

 

Dラッチ回路

画像のようにリピーターを交差するような感じで配置します。

リピーターをこのように並べると、以下Gif画像のように信号が伝わらないように遮断棒がでてきます。

右上のリピーターに、棒が表示される

左側のリピーターのように棒が横たわると、リピーター上を信号が伝わらなくなります。

遮断棒が下りているので、スイッチを押しても信号が伝わらない。

もう一度、リピーターを見てみましょう。リピーターは、レッドストーントーチで出来ています。遮断機が下りて、左のスイッチからの信号が伝わらなくなります。ですが、リピーターのレッドストーントーチは、以前の状態を保持しているので、出力も以前の状態になります。現在のスイッチの変更は関係なくなります。これは遮断機が下りた時の状態を保持している事になります。

つまり、これを並べるとメモリーやレジスターになります。

リピーター上のレッドストーントーチが遮断機が下りても、前の状態を保持

黄色いブロックにレッドストーントーチを横につけてNOT回路を作っていますが、これは、クロックを表す側のリピーターがONになったときに、(=Highになったとき)に、状態を保持するためです。これをハイレベルエッジと言います。

マインクラフトではまだわかりませんが、現実世界のハードウェアでは、このレベルエッジを適宜切り替えて使っているそうです。

 

まとめ

マインクラフトでDラッチ回路を作成しました。次回はDフリップフロップ回路を作って、クロック入力の立ち上がり時のみ入力状態が反映され、それ以外では保持されるようにしてみます。

 

マインクラフトのレッドストーン回路でマルチプレクサー

今回は、マインクラフトで組み合わせ回路のマルチプレクサーを作りました。2bitの信号を切り替えるだけですが、マインクラフトでは単純に回路図をレッドストーン回路で実現すると、1つ1つのブロックが多いため最適化する必要があるのが分かりました。

logisimで作ったマルチプレクサーの回路図
マインクラフトでマルチプレクサーを実装

画面キャプチャーのように、2ビットの切り替えだけでも何も考えずにブロックを配置するとこの大きさです。マインクラフトは、レッドストーンは15個分の信号しか伝わらないため、大きくすればするほどリピーターで調整する必要があります。

16ビットのマルチプレクサーを作るとなると、ブロックの並べ方をしっかり学ばないといけないようです。

 

マインクラフトのレッドストーンでXOR回路

マインクラフトのレッドーストーンで排他的論理和のXOR回路を作成しました。

 

http://minecraft.gamepedia.com/File:StandardLogicGates.png

 

今回作成した排他的論理和XOR回路

マインクラフトでは、レッドストーンとブロックを繋げてさらにレッドストーントーチを置くことでNOT回路になります。そして高低差をうまく使うことで小さなサイズで、XOR回路を作る事が可能です。

一度Logisimで、回路図を書いてみました。レッドストーン回路はどこが接続されているのかわかりづらいですが、以下のような回路図にしてしまうと分かりやすいです。また、XOR回路の出力にNOT回路を付けるとXNOR回路になります。

 


マインクラフトのBlockクラスのgetItemDroppedのテスト方法

マインクラフト1.11.2のModding(モド開発)のチュートリアルをやっていて問題なく実装はできたけどテストする方法が分からない場面に出くわしました。

テストが難しいケース

ワールド作成時にクリエイティブモードにすると、ブロックなどはドロップせずに消滅してしまいます。そのためこのモードでは、ブロックのドロップなどのテストができません。その場合サバイバルモードにすればよいのですが、ブロック強度がダイアモンドと同等にした場合、ダイアモンドのツルハシ(Pickaxe)がないため、ゲームで入手しなければなりません。また、サバイバルモードの場合、自作ブロックがないため見つける方法がありません。

解決方法

このような場合は、サバイバルモードで、チートコマンドを使ってツルハシとブロックを入手するのが良いです。

ダイアモンドのツルハシの入手方法

チート可能にしておいて、/を入力するとチャット欄が表示されるので、以下を入力します。diamond_ぐらいまで入力してタブキーを押すと補完候補が出てきます。

http://gamehackerblast.com/post-16636/

 

自作ブロック生成方法

まずは、F3キーでデバッグ情報を表示して、XYZまたはBlockで座標を確認します。次に、/setblockコマンドでブロック出現先を指定し、以下のようにminecraft:で既存のブロックを指定するか、modidを入力してタブキーで補完するかでブロックが指定できます。

以下は、tutというmodidで、tut_blockという自作ブロックのコマンド例です。

これで、作成したブロックを出現させることができます。あとは、getItemDroppedのコード内にブレイクポイントを立てて実行すあれば補足できます。

自作ブロックを/setblockコマンドで出現させたところ

以下は、ダイアのつるはしで殴って、ブロックをアイテムに変えたところです。この時に、Block#getItemDroppedが呼び出され、ブロックがソースコードで指定したアイテムに変わります。

 

ソースコード

ソースコード自体は、難しいことはしていません。

 

マインクラフトのMod開発環境をバッチファイルなしでIntelliJで用意する方法

IntelliJはGradleに対応しているので、マインクラフトのModを開発する場合は、Powershellでバッチファイルを実行する必要はありません。すべてIntelliJをクリックするだけで出来るので手軽に開発環境を作ってしまいましょう。この記事では、開発環境の構築、実行、デバッグ方法、ホットリロードを説明します。

前提条件

以下をインストール済み

  • JDK (なるべく新しいもの)
  • IntelliJ IDEA 2016.3.4

いくつか用語と開発ツールの解説

IntelliJ  (インテリジェイ) Javaの開発環境

FORGE MDK – マインクラフトのModを開発するときの土台になる開発ライブラリー

Maven(メイベン) – Javaの依存関係解決ツール

Gradle(グラドル) – Javaのプロジェクト管理ツール

Javaとメモ帳で開発するのは面倒なので、IntelliJという強力な開発環境を使います。マインクラフトのMod(モド)で遊んだことがある人は知っているかもしれませんが、Modは大抵FORGE(フォージ)を土台にしています。そのためFORGEの開発者向けのMDK (minecraft development kitの略?)を使います。

またプロジェクトを管理するのに、Gradle(グラドル)という開発ツールを使っています。これがさらに内部でMaven(メイベン)という依存関係解決ツールを使っています。開発中はほとんど意識しませんがとりあえずこんな感じで動いています。

 

MDKの展開とワークスペース作成

Minecraft FORGE(http://files.minecraftforge.net/) にMdkアイコンがあるのでダウンロードして展開します。現時点では、1.11.2-13.20.0.2228が推奨(Recommended)でした。

展開して中を確認するとbuild.gradleファイルがあります。これがプロジェクト管理ファイルになります。

IntelliJを起動して、ダイアログが表示されたら[Import Project]で以下の[Select File or Directory to Import]ダイアログを表示して、build.gradleを選択します。

インポートの設定ダイアログが表示されますがそのままでよいです。

もしダイアログが出てこない場合は、IntelliJの[File]->[Open…]からbuild.gradleを開いても問題ないです。

これでプロジェクトが読み込まれます。

プロジェクトの初期化

setupDecompWorkspaceタスクの実行

IntelliJの右側にGradleアイコンが縦に表示されているので、クリックして一覧を表示し、以下画面のようにsetupDecompWorkspaceを右クリックして、Runで実行します。

最近のパソコンなら30秒ぐらいで終わるはずです。ビルド中はアイコンがくるくる回っていますが、終わると秒数が表示されます。以下のような感じです。

genIintellijRunsの実行

IntelliJの場合は、もう一つgenIntellijRunsタスクを実行します

「プロジェクトを再読み込みしますか?」と聞かれるのでYesをクリックします。

これで環境構築は完了です。


マインクラフトをIntelliJから実行

いままでと同様に、runClientタスクを右クリックで実行します。これは開発中ソースコードをビルドして、Modを有効にしてマインクラフトを起動します。

タイトル画面のModsボタンからMod List画面に行くと、Example Modが読み込まれているのが分かります。名前を変更していないのでExample Modのままです。

停止方法

IntelliJの下部分に実行中のタスクが表示されるので、そこの赤い資格のボタンで停止できます。

コンソールログ

IntelliJでコンソールログを表示するには、以下のアイコンをクリックします。

あとは、以下のように、右の縦のメニュー[1.Project]から、画像のように、src/main/java/com.example.examplemod/ExampleModを開くとここから開発が始められます。画像ファイルなどは、すぐ下のresourcesに入れていくことになりますが、ルールがあるのでちゃんと調べる必要があります。

 

デバッグとホットリロード

マインクラフトの開発中は、デバッグモードでマインクラフトを起動します。

デバッグモードで起動

デバッグモードでマインクラフトを起動する場合は、以下のようにDebugをクリックするだけです。

ホットリロード

ソースコードを修正したらすぐに反映されます。やり方は何かしらソースコードを修正して、メニューの[Build]からBuild Moduleをクリックすればよいです。

今リロードしますか?毎回聞かれるので、慣れたら、チェックボックスを入れて次回以降は表示しないようにしておきましょう。

リロードがうまくいった場合は、以下のステータスが表示されます。

 

サンプルソースコード

IntelliJのConsoleにログを出力するサンプルです。hello tick!!!の文字を変えたりしてホットリロードを確認してみてください。

 

配布

GradleタブのTasks/build/buildを右クリックして実行するとbuildタスクが実行され、build/libs/modid-1.0.jarが作成されるのでこれを配布すればよいようです。

 

まとめ

IntelliJでマインクラフト1.11.2のMod開発環境を構築しました。

 

参考資料

1.11.2のMod作成チュートリアル

1.11はまだほとんどありませんが以下が参考になりそうです。またYoutubeでもチュートリアルを作っている方がいるようです。

http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/2790483-1-11-2-forge-minecraft-forge-modding-tutorials-up

マインクラフトとRaspberry Jam Modでプログラミング01

マインクラフトでRaspberry Jam Modを使ってPythonでプログラミングをしたので、ニコニコ動画に動画をアップロードしました。

http://www.nicovideo.jp/watch/sm30628433

 

Wordpressにニコニコ動画を組み込むことはできないのでしょうか?方法が分かりません。

Minecraft1.11.2にRaspberry Jam Modの動作確認

この記事は、Minecraft1.11.2にRaspberry Jam Modをインストール の続きです。Raspberry Jam Modをインストールしたので、動作確認をします。

Minecraftからサンプルスクリプトを実行

Minecraftで/(スラッシュ)記号を入力すると、入力欄が表示されるので、そこで以下を入力してエンターキーを押します。

/pyはコマンドで、donutはPythonスクリプトファイルのです。これで前回コピーした、mcpipy\donut.pyをMinecraftから実行します。

mcpipyフォルダーにdonut.pyがある

 

/py donutと入力
エンターキーを押したら、ガラスの大きなドーナツが作られた!

これで、ドーナツができました。

WindowsからMinecraftを操作する

F3+Pキーで、一時停止を無効化

今度はWindowsからMinecraftを操作します。Alt+TabキーでWindowの切り替えができますが、フォーカスが外れると一時停止するので、F3+Pを同時押しして、府フォーカスが外れてもそのまま動作させるようにします。元に戻す場合はもう一度F3+Pを押せばよいです。またF3キーのみを押すとデバック情報が表示されます。

デバッグ情報は以下が参考になります。

http://minecraft-ja.gamepedia.com/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E7%94%BB%E9%9D%A2

世界の再作成

ドーナツのように大きな構造物を作った場合は、一度タイトル画面に戻って、ワールド選択画面で、[Re-Create]ボタンでまっさらの状態にできます。

サンプルスクリプトhelloworld.pyを実行

PowerShellでサンプルスクリプトのフォルダーに移動して、helloworld.pyを実行します。するとマインクラフトでHelloWorld!と表示されます。

powershellでpythonを実行

 

helloworld.pyをちょっと修正して実行した画面

helloworld.pyサンプルスクリプトを見てみると、チャットに、”Hello world!”と表示し、自分の下にダイアモンドブロックを作成しているのが分かります。

 

たしかに自分の下の位置にダイアモンドがあった!

 

まとめ

Minecraft1.11.2にRaspberry Jam Modをインストール 」で、Modをインストールして、今回は、Minecraftから動かしたり、Windowsからも動かしてみました。Raspberry Jam Modはパソコンから操作できるのでいろんなことが出来そうです。