シアトル生活はじめました

20年以上すんだ東海岸から西海岸に引っ越してきました。MicrosoftのUniversal Storeで働いてます。

マインクラフトで巨大な構造物を「どーん!」と一発作成できるようにする。ついでにJavaScriptプログラミングも学んじゃう

MODプラグインを利用できるSpigotマインクラフトサーバーを立てたんだけど、そもそもどういう目的だったのか・・・

前置き

やはり、ブロックをひとつひとつ積んでワールドを作るのは非常に時間がかかるわけです。うちの娘たちなんかは「作ること」そのものが喜びなんで、全然気にせずにコツコツと巨大な建物やオブジェなんかを作ってるけど、大人の私としては「どーん!」とやりたいわけ。そもそも娘たちはそんなことが可能とえ知らない。マイクラ遊びを新しい次元で楽しむにはMODしかないでしょ~、ってことでのSpigotサーバーを導入したわけ。

ワールドの作成用のプラグインだけど、調べたらWorldEdit というのが人気で有名。独自のコマンド体系を使ってマウスでお絵かきするみたいに世界を削ったり作ったり出来るらしい。うん、悪くない。

そして別にScriptCraftというのも見つけた。こちらはWorldEditよりも下層の「プログラミング」レベルで、建物を作ったりする以外にもいろんなことが出来る。コマンド体系はJavaScriptそのもの(Node.jsと同じエンジンだとかなんとか・・)。

娘たちにIT教育熱心な私としては ScriptCraft で自然と楽しみながらJavaScriptの構文などに触れてもらえれば一石二鳥なわけで、ここはWorldEditは無かったことにしてScriptCraftで行くことに!

前置きその2 既存のワールドの移動

これはすでに子供たちが建物を作り始めていたワールドを別のサーバーにコピーするやり方の説明。必要ないなら飛ばしてね。

ワールドのデータは world という名前のフォルダーに入ってます(驚きました?)

f:id:watanabe_tsuyoshi:20150614063228p:plain

うちの場合、バニラのサーバーで遊び始めてたんで、そっちのサーバーのフォルダーをマルっとコピーしてくるだけ。ただ、コピー先のSpigotのサーバー側にも同じ名前のフォルダーが当然ある。その際は二つの選択肢がある。

コピー先の world フォルダーの名前を別のに変える。私はこれで行きました。world_old という名前に変更してからコピー。

もう一つはコピーする段階でコピーする world を world2 などの名前に変更して名前衝突回避。この場合、サーバーにworld ではなく world2をロードしてもらうように設定を変更します。その設定ファイルが

server.properties

その中で level-name=world という行を見つけて、level-name=world2 にすればよい。

world_nether と world_the_end は、コピー元に存在してなかったんでスルーした。

ScriptCraftプラグインをインストールする

さて本題。

と言ってもインストールの手順は極めて簡単。

マインクラフトサーバーのフォルダーに、plugins というフォルダーがある。そこに任意のプラグインのファイルをコピーして、サーバーを再スタートするだけ。

ScriptCraftのプラグインはGitHubにある。

そこから scriptcraft.jar をダウンロードする。

f:id:watanabe_tsuyoshi:20150614064401p:plain

ブラウザーからだと、右クリックでURLを保存して、wgetする。

wget https://github.com/walterhiggins/ScriptCraft/releases/download/3.1.8/scriptcraft.jar

他のプラグインに関しても全く同じ。要はプラグインのjarがネットのどこにあるか、が分かれば後は簡単。

サーバー再起動後、クライエントで接続してみると・・・

f:id:watanabe_tsuyoshi:20150614065312p:plain

scriptcraft のコマンドが有効になっているのが確認出来ますね♪

ScriptCraftで、どーん!

じゃぁいったいどういうことが出来るのか・・・

例えばゴールドのブロックでできた(幅6、高さ4、奥行き8)の箱を作るには box関数を呼び出せばよい。

はい、どーん!

/js box(blocks.gold, 6, 4, 8)

f:id:watanabe_tsuyoshi:20150614065415p:plain

box()関数の亜種、box0() は後ろに「0」が付いている。中身がない状態を示します。

なので、空洞状態の箱もどーん!

/js box0(blocks.iron, 6, 4, 8)

部屋の壁作りが捗るョ!

f:id:watanabe_tsuyoshi:20150614065519p:plain

こういうの、手作りだと大変。大きいのになると数時間の作業になる。

ScriptCraftなら大きさを気にせずに一瞬で完成・・

さらに、中身が詰まった状態の円柱をどーん!

/js cylinder(blocks.cobblestone, 4, 8)

高さを8ブロックじゃなく100とかにすればスカイツリーとかも割と簡単にできちゃいそうです。

f:id:watanabe_tsuyoshi:20150614065530p:plain

もちろん中身のない円柱(パイプ)も、どーん!

/js cylinder0(blocks.iron, 4, 8)

素材は鉄に変えてみた。

f:id:watanabe_tsuyoshi:20150614065540p:plain

prisum()関数で階段みたいなのも作れる

/js prism(blocks.glass, 10, 8, 10)

f:id:watanabe_tsuyoshi:20150614065552p:plain

 お約束の、中身がないバージョン。屋根作りが捗る!!

/js prism0(blocks.glass, 10, 8, 10)

f:id:watanabe_tsuyoshi:20150614065601p:plain

 ものの2・3分でこんな感じで構造物を建設できます。

下のスクショでは、sphare()関数で作った球体が見える。

f:id:watanabe_tsuyoshi:20150614065615p:plain

 ちなみに、構造体を消し去りたい場合は、ブロックの種類として「air(空気)」を選ぶ。

下は小さな山を部屋のように削った様子。

/js box(blocks.air, 10, 10, 10)

f:id:watanabe_tsuyoshi:20150614070727p:plain

そして極め付けは、

/js new castle()

とすれば、サーバーにあるcastleというスクリプトが実行されて、完成された構造物がどーん!っと出現する(実際にはちょっと時間かかるけどね・・)

おそらくネットにはいろんなscriptcraftのスクリプトがあるんじゃないかな、まだ探してないけど。

 

f:id:watanabe_tsuyoshi:20150614065630p:plain

他に何かできる?

 まだ使ってないけれど、Droneという機能があって、これはまさに今世間をお騒がせしているドローンのように、3次元空間の中をまるでドローンが移動するようにプログラムすることができ、その場所でそれぞれブロックを生成することができる。3次元カーソルと理解しても差し支えない。

ドローンの動作とブロック生成を鎖のように繋げることで、複雑な構造を一行で作成できたりする。

ScirptCraftのAPIがあって、それによるといろんなイベントにフックを設置できるらしい。例えば、ユーザーがゲームに参加するたびに「Welcome!」といったようなメッセージを表示させたり、なんてのは数行のスクリプトで済んでしまう。

ScriptCraft/API-Reference.md at master · walterhiggins/ScriptCraft · GitHub

JavaScriptの機能を総動員してすごいものが作れますし、実際に有名なマインクラフトサーバーではそうやって実装されているものだと思います(確認はしてないけど)

 というわけで、遊びながらプログラミング感覚も自然に身に付くなんて素敵だと思いません?