ゆっくり開発

開発したい時に開発するブログ

マイクラ用のスクリプトを出力するスクリプトを作ってみた

概要

  • MInecraft(以降,マイクラ) では,チートコマンドを使うことで好きな場所に好きなブロックを設置できる.
  • このシステムを使い,羊毛などのカラフルなブロックを並べ, マイクラ上で絵を描きたい.
  • ここで,チートコマンドについて,マイクラの ver 1.12 から実装されたfunctionシステムを使うことで,スクリプト化できる.
  • 今回は「羊毛を並べるスクリプト(.mcfunction)」を「出力するスクリプト(.py)」を作成する.

また,今回対象とするマイクラのバージョンは1.13.1である.
1.121.13ではコマンドやfunctionの仕様が少し違うので, 今回の内容は1.12に対応しない.

コマンドで羊毛ブロックを設置する

イクラでは,以下のコマンドで好きな場所に好きなブロックを設置できる.

/setblock <x> <y> <z> <ブロックID>

この形式はver 1.12でも有効である.しかし,1.121.13ではブロックIDが異なる.
わかりにくいかもしれないが,以下のサイトに両バージョンのブロックIDが載っている.

minecraftitemids.com

上に示したコマンドの<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. イクラでコマンドをスクリプト化できるのか
  2. 大きな範囲でブロックを敷き詰める処理は実行できるのか (できないなら,どの範囲までならできそうか)

イクラの最新バージョン(1.13.1)でスクリプトの実行が可能であることがわかり, また,100×100のサイズでブロックを敷き詰める(10000回のコマンド実行)処理が実行できることがわかり, 今回の目的を無事達成できた.

次は,前回と前々回で作ったプログラムを利用し,任意の画像をマイクラ上で描画できるようにしたい.