マイクラ用のスクリプトを出力するスクリプトを作ってみた
概要
- MInecraft(以降,マイクラ) では,チートコマンドを使うことで好きな場所に好きなブロックを設置できる.
- このシステムを使い,羊毛などのカラフルなブロックを並べ, マイクラ上で絵を描きたい.
- ここで,チートコマンドについて,マイクラの ver 1.12 から実装された
function
システムを使うことで,スクリプト化できる. - 今回は「羊毛を並べるスクリプト(.mcfunction)」を「出力するスクリプト(.py)」を作成する.
また,今回対象とするマイクラのバージョンは1.13.1
である.
1.12
と1.13
ではコマンドやfunctionの仕様が少し違うので,
今回の内容は1.12
に対応しない.
コマンドで羊毛ブロックを設置する
マイクラでは,以下のコマンドで好きな場所に好きなブロックを設置できる.
/setblock <x> <y> <z> <ブロックID>
この形式はver 1.12
でも有効である.しかし,1.12
と1.13
ではブロックID
が異なる.
わかりにくいかもしれないが,以下のサイトに両バージョンのブロックIDが載っている.
上に示したコマンドの<x> <y> <z>
でブロックを設置したい座標を指定する.座標を指定する方法には絶対座標と相対座標の2種類がある.
- 絶対座標
絶対座標(100, 100, 100)に白の羊毛ブロックを設置するコマンドは以下の様になる.
/setblock 100 100 100 minecraft:white_wool
- 相対座標
相対座標を指定する時は,各xyzの値に~
を付ける. 例えば,プレイヤーの2ブロック上に白の羊毛ブロックを設置するコマンドは以下の様になる.
/setblock ~ ~2 ~ minecraft:white_wool
マイクラでスクリプトを実行する
スクリプトについて
マイクラでは,以下の様にファイルに記述されたスクリプトを実行するシステムがある.
setblock ~-1 ~6 ~ minecraft:white_wool setblock ~0 ~6 ~ minecraft:orange_wool setblock ~1 ~6 ~ minecraft:magenta_wool
スクリプトを実行するためには以下4点に注意する必要がある.
- 各コマンドの先頭に
\(スラッシュ)
は記述してはいけない - ファイル名はアルファベット(≠マルチバイト)とし,拡張子は
.mcfunction
とする - ファイルはBOMなしUTF-8 (UTF-8N) で記述する
- マイクラのワールドの初期状態はスクリプトを実行できる設定になっておらず,一手間かけなければならない.
スクリプトを実行できるようにする
以下のサイトを参考にした.1.12
のバージョン用のことも書いてあってとてもいい.
hollys-command-lecture.hatenablog.com
スクリプトを実行できるようにするために, 以下のディレクトリについて,
minecraft/saves/(ワールド名)/datapacks
以下の様にファイルとディレクトリを追加する.
- utt/pack.mcmeta
このファイルには以下の内容をUTF-8N
で記述する.
{ "pack": { "pack_format": 1, "description": "datapack" } }
- utt/data/uttscripts/functions/
このディレクトリにfunc.mcfunction
などのファイルを配置する.
上記パスの青字で示したディレクトリは任意の文字列でいい.ただし,マルチバイトは不可.
また,青字で示したディレクトリの内,uttscripts
の方はスクリプトを呼び出す際に入力する文字列になるので,
わかりやすい文字列の方がいい.
以下はfunc.mcfunction
スクリプトを呼び出すコマンドの例.
/function uttscripts:func
スクリプト(.mcfunction)を出力するスクリプト(.py)を作成
描画したいエリアの縦と横のサイズを変数で指定し, そのサイズのエリアを羊毛で埋めるスクリプトを作成した.
細かい説明はめんどうなのでとりあえずコードを載せます.
micrablock_name.py
各羊毛ブロックのIDを格納した配列を定義
wool = [ 'minecraft:white_wool', 'minecraft:orange_wool', 'minecraft:magenta_wool', 'minecraft:light_blue_wool', 'minecraft:yellow_wool', 'minecraft:lime_wool', 'minecraft:pink_wool', 'minecraft:gray_wool', 'minecraft:light_gray_wool', 'minecraft:cyan_wool', 'minecraft:purple_wool', 'minecraft:blue_wool', 'minecraft:brown_wool', 'minecraft:green_wool', 'minecraft:red_wool', 'minecraft:black_wool' ]
make_micrafunc_test.py
import os import micrablock_name as block_name funcdir_path = 'functions' funcfile_path = '{0}/func50.mcfunction'.format(funcdir_path) canvas_width = 50 canvas_height = 50 block_num = len(block_name.wool) transform = { 'x': -(canvas_width//2), 'y': canvas_height+3 } def get_block_name (x, y): return block_name.wool[(canvas_width*y + x)%block_num] def get_command (x, y): tx = x + transform['x'] ty = -y + transform['y'] return 'setblock ~{0} ~{1} ~ {2}'.format(tx, ty, get_block_name(x, y)) commands = [get_command(x, y) for y in range(canvas_height) for x in range(canvas_width)] with open(funcfile_path, 'w', encoding='utf-8') as f: [f.write('{0}\n'.format(c)) for c in commands]
出力したスクリプト(.mcfunction)を実行
↓の5種類の大きさで羊毛を敷き詰める処理を実行してみた。
- 3×3
- 10×10
- 20×20
- 50×50
- 100×100
上記処理を実行したのはMacbookProでGPUの拡張もしていないのでゲームに適したパソコンではない. 普通にマイクラをプレイするだけでもめっちゃ熱がこもる.
しかし,100×100の大きさの描画にもゲームが重くなることなく 1瞬で処理が終わったので, ブロックを敷き詰める処理はそこまで重い処理ではないことがわかる.
感想
今回は元々以下を調査したいという狙いがあった.
マイクラの最新バージョン(1.13.1
)でスクリプトの実行が可能であることがわかり,
また,100×100のサイズでブロックを敷き詰める(10000回のコマンド実行)処理が実行できることがわかり,
今回の目的を無事達成できた.
次は,前回と前々回で作ったプログラムを利用し,任意の画像をマイクラ上で描画できるようにしたい.