はじめに
マイクラの地形や建築物を自動生成する方法は様々ありますが、細かな調整等で建築のクオリティを上げるにはどうしても手作業による編集が必須になります。
我々のようなエンジニアがコードを書いて自動生成しただけの建築作品よりも、クラフターと呼ばれるマイクラ職人が丁寧に装飾した建築作品の方が見た目に優れています。
では、マイクラ職人たちは一つ一つブロックを手作業で置いているのかと言われるとそうでもなく、建築の効率化ツールをうまく使っています。(例外として、Modなしサバイバルモードで建築をする強強クラフターもいますが)
この手作業をいかに効率化するための定番のツールがWorldEditというModになります。
WorldEditについて
WorldEditは、マイクラModの一つで、大量のブロックを効率的に編集したり、構造物を作成したりするための機能を提供します。具体的には、ブロックの追加、削除、置換、コピー、ペーストなどの操作が可能で、これによりプレイヤーは手作業でブロックを配置するよりもずっと早く、大規模な建築物や地形を作成することができます。
このWorldEditはマイクラのチャット欄にシェルコマンドのようなコマンド入力することが基本操作となります。この記事ではそのコマンドをひたすら列挙する個人メモになります。
この時点でまったくイメージが湧かない人は、下記のチュートリアル動画がとても参考になります。
また、WorldEditを使用する前にマイクラのブロックデータについての前提知識がある方が、より柔軟に使いこなせます。
コマンド群の振り分けは独自的なものです。個人的にあまり使用しないコマンドはここには記載してないので、より詳しく知りたい方は公式ドキュメントを確認してください。
セレクター操作系
WorldEditの操作の基本となるセレクターを操作するコマンド群
プレイヤーの位置を開始位置に選択
//pos1
プレイヤーの位置を終了位置に選択
//pos2
任意の座標を開始位置に選択(pos2の終了位置も同様)
//pos1 <x,y,z>
※座標指定はスペースではなくカンマ区切り
プレイヤーが見ているブロックを開始位置に選択
//hpos1
プレイヤーが見ているブロックを終了位置に選択
//hpos2
選択を解除
//desel
選択領域を移動
//shift <方向> <移動量>
方向の指定はNorth
、South
、East
、West
、Up
、Down
、forward
、back
など
forward
、back
はプレイヤーの向きに基づく
方向をしていなかった場合はforward
になる
移動量を指定しなかった場合は1になる
木の斧を入手(左クリックで//hpos1。右クリックで//hpos2)
//wand
プレイヤーが持っているツールを領域選択用のツールにセットする
//selwand
選択領域に存在する各ブロックをパーセンテージで表示する
//distr
選択領域の特定のブロックの数を数える
//count <ブロック名>
選択領域の範囲を広げる
//expand <方向> <移動量>
選択領域の範囲を上下最大まで広げる
//expand vert
選択領域の範囲を狭める
//contract <方向> <移動量>
選択領域の範囲を全方向狭める
//inset <狭める量>
選択領域内の情報を表示する
//size
セレクターのモード切り替え
立方体セレクター(デフォルトはこれ)
//sel cuboid
立方体セレクター(視点位置、終了位置を変更するとその分領域が拡張する)
//sel extend
多角形セレクター
//sel poly
椿円体セレクター
//sel ellipsoid
球セレクター
//sel sphere
円柱セレクター
//sel cyl
凸多面体セレクター
//sel convex
セレクターによる編集系
選択領域内で編集を実行するコマンド群
選択領域内全てに任意のブロックを設置する
//set <ブロック名>
選択領域内全てに特定のブロックをランダムで配置する
例(草ブロックを2割、土ブロックを3割、石ブロックを5割で設置)
//set 20%grass_block,30%dirt,50%stone
選択領域内全てに看板を設置する
//set "oak_sign[rotation=0]|1行目の文字|2行目の文字"
選択領域内のブロックの上に任意のブロックを設置する
//overlay <ブロック名>
選択領域内の中心に任意のブロックを設置する
//center <ブロック名>
選択領域内の開始位置から終了位置まで直線上に任意のブロックを設置する
//line <ブロック名>
選択位置を通る曲線状に任意のブロックを設置
//curve <ブロック名>
※凸多面体セレクターの時のみ
選択領域内に任意のブロックで壁を作る
//walls <ブロック名>
選択領域内に任意のブロックで外枠を覆う
//outline <ブロック名>
選択領域内の構造物を中空にする
//hollow <厚さ>
選択領域内の指定したブロックを任意のブロックに置き換える
//replace <対象のブロック名> <置換するブロック名>
<対象のブロック名>の頭に^
をつけると、ブロック状態を維持したまま置換することができる。階段やフェンスを置換するときに便利。
例(シラカバのフェンスをアカシアのフェンスに状態を維持したまま置換)
//replace birch_fence ^acacia_fence
選択領域内のブロックを変形(正方向の建築物を斜め方向に変換したいとき)
//deform rotate(x,z,<ラジアン>)
選択領域内のブロックを移動
//move <方向> <移動量>
※方向を指定しなかった場合はプレイヤーの向いてる方向に移動する。移動量を指定しなかった場合は1ブロック分移動する。
選択領域も移動する場合はコマンドの末尾に-s
空気ブロックを無視する場合はコマンドの末尾に-a
選択領域内のブロックを繰り返す(複製する)
//stack <方向> <移動量>
※オプション等は//move
と同様なので省略
選択領域内を再生成する
//regen
クリップボード操作系
一般的なOSのクリップボードのことではなく、WorldEdit内部で使用されるブロックデータが保存されている一時メモリのようなもの。
選択領域をコピー
//copy
エンティティも含めてコピーする時は、コマンドの末尾に-e
選択領域を切り取り
//cut
クリップボードを貼り付け
//paste
貼り付けの起点は//copyや//cutコマンド時のプレイヤーの相対座標となる(これを理解してないと期待通りの位置にうまく貼り付けできない)
参考リンク
エンティティも一緒に貼り付ける場合はコマンドの末尾に-e
空気ブロックを除外して貼り付ける場合はコマンドの末尾に-a
クリップボードの内容を回転
//rotate <Y軸角度> <X軸角度>
クリップボードの内容を反転
//flip <反転する方向>
クリップボードの内容をschemファイルとして保存
//schematic save <ファイル名>
上書き保存する場合はコマンドの末尾に-f
schemファイルの読み込み
//schematic load <ファイル名>
schemファイルの保存、読み込みの操作は機動構成フォルダのconfig/worldedit/schematics
ディレクトリを参照している。schemファイルはMinecraftで使用される特殊なファイル形式の一つで、ブロックの構造を保存し、別の場所や別のサーバーに複製するためのもの。このファイルにより別のワールドに建築物を移動することが可能になる。
クリップボードの内容を削除
/clearclipboard
クリップボードの起点の切り替え
/toggleplace
貼り付ける時の起点を現在位置とするか、選択範囲のpos1とするか切り替える
生成系、削除系
基本的にはプレイヤーを中心として実行されるため、こちらはセレクターを必要としない。
任意のブロックで埋める
//fill <ブロック名> <範囲> <深さ>
水で埋める
//fill water <範囲> <深さ>
海を作るのに便利
水を吸う(削除する)
//drain <範囲>
水流を水源にする
//fixwater <範囲>
近くのブロックを置き換える
/replacenear <範囲> <対象のブロック名> <置換するブロック名>
プレイヤーの近くの任意のブロックを削除
/removenear <対象のブロック名> <半径>
プレイヤーの頭上のブロックを削除
/removeabove <範囲> <高さ>
プレイヤの足元のブロックを削除
/removebelow <範囲> <深さ>
森林を生成
//forest <森林タイプ> <範囲>
草ブロックの上に草花を生成
//flora <範囲>
ツールコマンド
プレイヤーが手に持っているアイテムに効果を割り当てるコマンド群。
情報ツール
ブロックに対して右クリックすることで、ブロック名やブロック状態を確認できる。
/info
植林ツール
右クリックすることで、任意の木を生成できる。
/tree <木の種類>
置換ツール
ブロックに対して右クリックすることで、コマンドで指定したブロックに置き換える。ちなみにブロックに対して左クリックすれば置換するブロックに再セットできる。
/repl <ブロック名>
サイクラーツール
/cycler
いわゆるデバック棒。右クリックでブロック状態を変更。左クリックで切り替える状態プロパティを選択。
ツールの効果を解除する。
/none
ブラシコマンド
プレイヤーが手に持っているアイテムをブラシツールにするコマンド群。右クリックで使用する。
球体ブラシをセット
//brush sphere <ブロック名> <半径>
//br
でも可
//br sphere <ブロック名> <半径>
クリップボードブラシをセット
//brush clipboard
重力ブラシをセット
//brush gravity <ブロック名> <半径>
ブラシ効果を空気ブロックのみ対象にする
/mask air
ブラシ効果を空気ブロック以外のブロックを対象にする
/mask !air
ブラシ効果を特定のブロック以外を対象にする
/mask !<ブロック名>
ユーティリティ
プレイヤーを操作するコマンド群
目の前の壁をすり抜ける
/thru
プレイヤーが見ているブロックの上にテレポートする
/jumpto
ブロックから抜け出す(プレイヤーがブロックに埋もれたとき。)
/unstuck
または
/!
その他コマンド
編集を巻き戻す
※ただし、10回前までしか戻れない
//undo
編集をやり直す
※こちらも10回まで
//redo
-m フラグについて
コマンドの末尾に-m
フラグを指定することで、編集操作を特定のブロックに絞り込むことが
例)選択領域内の石ブロックのみを移動させる場合
//move up 3 -m stone
カンマ区切りによる複数選択もできる
//move up 3 -m stone,dirt,grass_block
論理否定演算子による指定も可能(特定のブロック以外を指定する)
例)石ブロック以外を移動
//move up 3 -m !stone
便利な hand 変数
hand
は、ブロック名を入力する代わりにプレイヤーが持っているブロックを指定することができる
例) 選択領域内全てのにプレイヤーが持っているブロックをセット
//set hand
例) 選択領域内の石ブロックをプレイヤーが持っているブロックに置き換える
//replace stone hand
カスタムコマンドを作れるCraftScript
CraftScriptはJavaScriptで独自のWorldEditコマンドを作成することができる機能。
正確にはJavaScriptのコードをJavaのクラスへと変換するRhinoを用いて、WorldEdit APIをJavaScriptで実行することができる。しかし、実際に書くときはJavaの知識もある程度は必要。
スクリプト実行の構文
/cs <JavaScriptファイル名> <カスタム引数>
CraftScriptを実行するには公式ドキュメントによると、下記の下準備が必要
- Rhino JavaScript エンジンをダウンロードする。
- ダウンロードしたファイルの名前を
js.jar
に変更する -
js.jar
をMinecraftの起動構成フォルダのconfig/worldedit
のディレクトリの中に入れる。 -
config/worldedit
ディレクトリにcraftscripts
フォルダを作成。このなかにJavaScriptファイルを設置し、コマンドで呼び出すことで処理を実行できる。
コード例
importPackage(Packages.com.sk89q.worldedit.world.block);
// 引数のチェック
context.checkArgs(1, 1, '<block>');
// 第一引数のブロックIDを取得
var block = context.getBlock(argv[1]);
// セッションの作成
const sess = context.remember();
// プレイヤーの足元に特定のブロックを設置
sess.setBlock(player.getBlockOn().toVector().toBlockPoint(), block);
上記のコードによる実行コマンド(プレイヤーの足元に赤い羊毛ブロックをセットする)
/cs sample red_wool
WorldEdit の操作はセッション単位で管理されるため、新たに何かを変更する前に、セッションを開始する必要がある。セッションはプレイヤーの操作(ブロックの追加、削除など)を追跡し、それに基づいて「元に戻す」や「やり直す」などの操作を可能にする。なので、スクリプト実行後は//undo
コマンドで元に戻すことができる。
開発者ドキュメント
https://worldedit.enginehub.org/en/latest/api/
WorldEdit API Java ドキュメント
https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/7.2.0/
WorldEditをより使いやすくするMod
WorldEdit単体でも便利ですが、ついでに別のModも紹介します。
WorldEdit含め、Modの利用は原則として自己責任でお願いします。
動作環境:ver1.19-fabric
WorldEdit CUI
セレクターを可視化するMod。これがないとセレクターがどの範囲を選択しているのかがわからないのでほぼ必須。
Scroll for WorldEdit
マウスのホイールスクロールによるセレクターの操作が可能になる。
これのおかげで個人的に//stack
、//move
、//shift
、//contract
、//expand
コマンドを直接入力することは少ない。
FastAsyncWorld
こちらはサーバーブラグインなので、マルチプレイ限定。大量のブロック編集処理を高速化したり//undo
コマンドの10回制限を解除できる。
Pick Block Pro
プレイヤーが見ているブロックのブロック名をクリップボード(OSの方)にコピペができるMod
例えばブロック名(名前空間ID)がわからないときは/infoコマンドによる情報ツールで確認できるが、入力がいちいちめんどくさい。コマンドの入力の手間を省くなら、せめてコピペできるようにしたい。
デバックキーF3 + H
により高度な表示をオンにすることでインベントリ画面でブロック名を確認することもできる。
また、デバックキーF3 + I
でプレイヤーが見ているブロックデータをクリップボードにコピペできる。ただし、下記のようにsetblockコマンドの構文でコピーされるので、少々使いにくい
/setblock -53 -61 79 minecraft:grass_block[snowy=false]
上記のModを使えばブロック名のみをクリップボードにコピペしてくれる。
Command Macros
任意のコマンドを特定のキーに割り当てられるMod
例えば//undo
コマンドをCutrl + Zキーに割り当てれば直感的に使いやすくなる
JS macros
Minecraftのゲーム内でJavaScriptを実行するためのMod。ゲーム内で起こるさまざまなイベントに対応する自動化スクリプトを書くことができる。Mod開発をするほどでもない簡易的なスクリプトであればこのModだけで済む。スクリプトの実行は、特定のキーに割り当てることもできる。
通常のコマンドであればコマンドブロックやmcfunctionを使用すれば一括のコマンド実行やループ処理が可能であるが、WorldEditのコマンドの場合はそれができない。このmodを使用することで、JavaScriptでWorldEditのコマンドをループ処理でかける。
とはいっても、より高度なブロック編集操作を行う場合はCraftScriptで書いた方が良いので、こちらは個人的にはコマンドの入力する手間を省くのに使う。
たとえば選択領域をschemファイルとして直接保存する場合は下記のように書いておけば一発のキーで済む
Chat.say('//copy -m !air');
Chat.say('//schematic save hoge -f');
また、下記の処理を書いて特定のキーに割り当てれば、プレイヤーが見ているブロックをプレイヤーが持っているブロックに置き換える処理ができ、//replaceコマンドが楽になる
// プレイヤーが見ているブロックデータを取得(30ブロック先まで)
const data = Player.rayTraceBlock(30, false).getId().toString();
// プレイヤーが見ているブロックをプレイヤーが持っているブロックに変える
Chat.say('//replace ' + data + ' hand');
APIドキュメント
Tweakeroo
マイクラのゲーム内の様々な要素を微調整できるMod。クリエイティブのflyモードの移動速度を早めることができるので、広範囲のブロックをセレクターで選択するときに便利。また、マイクラのチャットは一度閉じてしまうと、入力中のコマンドは消えてしまうが、このmodの設定によりコマンドの入力途中を保持することもできる。
参考動画