Minecraft Java Edition WorldEditチートシート

# はじめに
マイクラの地形や建築物を自動生成する方法は様々ありますが、細かな調整等で建築のクオリティを上げるにはどうしても手作業による編集が必須になります。

我々のようなエンジニアがコードを書いて自動生成しただけの建築作品よりも、クラフターと呼ばれるマイクラ職人が丁寧に装飾した建築作品の方が見た目に優れています。

では、マイクラ職人たちは一つ一つブロックを手作業で置いているのかと言われるとそうでもなく、建築の効率化ツールをうまく使っています。（例外として、Modなしサバイバルモードで建築をする強強クラフターもいますが）

この手作業をいかに効率化するための定番のツールが[WorldEdit](https://enginehub.org/worldedit)というModになります。

# WorldEditについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/723e7f2f-6245-35d9-3cd0-eae161e7abd6.png)

WorldEditは、マイクラModの一つで、大量のブロックを効率的に編集したり、構造物を作成したりするための機能を提供します。具体的には、ブロックの追加、削除、置換、コピー、ペーストなどの操作が可能で、これによりプレイヤーは手作業でブロックを配置するよりもずっと早く、大規模な建築物や地形を作成することができます。


このWorldEditはマイクラのチャット欄にシェルコマンドのようなコマンド入力することが基本操作となります。この記事ではそのコマンドをひたすら列挙する個人メモになります。

この時点でまったくイメージが湧かない人は、下記のチュートリアル動画がとても参考になります。

https://www.youtube.com/playlist?list=PLnpFYogdx9GVqaJGlovgxkSsgKUkArrmB

また、WorldEditを使用する前にマイクラのブロックデータについての前提知識がある方が、より柔軟に使いこなせます。

[ブロック名一覧（名前空間ID）](https://minecraft.fandom.com/ja/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%80%A4/Java_Edition/%E5%B9%B3%E5%9D%A6%E5%8C%96%E5%89%8D/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AFID)

[ブロック状態（blockstate）について](https://minecraft.fandom.com/ja/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E7%8A%B6%E6%85%8B)



:::note warn
 コマンド群の振り分けは独自的なものです。個人的にあまり使用しないコマンドはここには記載してないので、より詳しく知りたい方は[公式ドキュメント](https://worldedit.enginehub.org/en/latest/commands/)を確認してください。
:::

# セレクター操作系
 WorldEditの操作の基本となるセレクターを操作するコマンド群

#### プレイヤーの位置を開始位置に選択
```bash
//pos1
```

#### プレイヤーの位置を終了位置に選択
```bash
//pos2
```

#### 任意の座標を開始位置に選択（pos2の終了位置も同様）
```bash
//pos1 <x,y,z>
```
※座標指定はスペースではなくカンマ区切り

#### プレイヤーが見ているブロックを開始位置に選択
```bash
//hpos1
```
#### プレイヤーが見ているブロックを終了位置に選択
```bash
//hpos2
```
#### 選択を解除
```bash
//desel
```
#### 選択領域を移動
```bash
//shift　<方向> <移動量>
```
方向の指定は`North`、`South`、`East`、`West`、`Up`、`Down`、`forward`、`back`など
`forward`、`back`はプレイヤーの向きに基づく
方向をしていなかった場合は`forward`になる
移動量を指定しなかった場合は1になる

#### 木の斧を入手（左クリックで//hpos1。右クリックで//hpos2）
```bash
//wand
```
#### プレイヤーが持っているツールを領域選択用のツールにセットする
```bash
//selwand
```
#### 選択領域に存在する各ブロックをパーセンテージで表示する

```bash
//distr
```
#### 選択領域の特定のブロックの数を数える
```bash
//count <ブロック名>
```
#### 選択領域の範囲を広げる

```bash
//expand <方向>　<移動量>
```

#### 選択領域の範囲を上下最大まで広げる

```bash
//expand vert
```

#### 選択領域の範囲を狭める

```bash
//contract <方向>　<移動量>
```


#### 選択領域の範囲を全方向狭める

```bash
//inset <狭める量>
```



#### 選択領域内の情報を表示する

```bash
//size
```



# セレクターのモード切り替え

#### 立方体セレクター（デフォルトはこれ）


```bash
//sel cuboid
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/d352d189-d3a5-c656-3fea-28809bba0262.png)

#### 立方体セレクター（視点位置、終了位置を変更するとその分領域が拡張する）

```bash
//sel extend
```

#### 多角形セレクター

```bash
//sel poly
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/68985843-77b0-f37d-4ac1-8b4f33833045.png)


#### 椿円体セレクター

```bash
//sel ellipsoid
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/762a0412-4073-cbb6-fc6a-78731ff5a22f.png)
#### 球セレクター


```bash
//sel sphere
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/6541135e-71b0-97d1-5717-7961a1495d7b.png)


#### 円柱セレクター

```bash
//sel cyl
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/26de8d31-768d-4bdb-3606-7e60b42b8016.png)

#### 凸多面体セレクター

```bash
//sel convex
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575765/8c82411a-a0e3-6938-9c58-f82966c8399e.png)


# セレクターによる編集系
選択領域内で編集を実行するコマンド群

#### 選択領域内全てに任意のブロックを設置する

```bash
//set <ブロック名>
```

#### 選択領域内全てに特定のブロックをランダムで配置する
例（草ブロックを2割、土ブロックを3割、石ブロックを5割で設置）

```bash
//set 20%grass_block,30%dirt,50%stone
```

#### 選択領域内全てに看板を設置する

```bash
//set "oak_sign[rotation=0]|1行目の文字|2行目の文字"
```

#### 選択領域内のブロックの上に任意のブロックを設置する

```bash
//overlay <ブロック名>
```

#### 選択領域内の中心に任意のブロックを設置する

```bash
//center <ブロック名>
```

#### 選択領域内の開始位置から終了位置まで直線上に任意のブロックを設置する

```bash
//line <ブロック名>
```

 

#### 選択位置を通る曲線状に任意のブロックを設置

```bash
//curve <ブロック名>
```
※凸多面体セレクターの時のみ

#### 選択領域内に任意のブロックで壁を作る

```bash
//walls <ブロック名>
```

#### 選択領域内に任意のブロックで外枠を覆う

```bash
//outline <ブロック名>
```

#### 選択領域内の構造物を中空にする

```bash
//hollow <厚さ>
```

#### 選択領域内の指定したブロックを任意のブロックに置き換える

```bash
//replace <対象のブロック名> <置換するブロック名>
```
<対象のブロック名>の頭に`^`をつけると、ブロック状態を維持したまま置換することができる。階段やフェンスを置換するときに便利。

例(シラカバのフェンスをアカシアのフェンスに状態を維持したまま置換)
```
//replace birch_fence ^acacia_fence
```

#### 選択領域内のブロックを変形(正方向の建築物を斜め方向に変換したいとき)

```bash
//deform rotate(x,z,<ラジアン>)
```

#### 選択領域内のブロックを移動

```bash
//move <方向> <移動量>
```
※方向を指定しなかった場合はプレイヤーの向いてる方向に移動する。移動量を指定しなかった場合は１ブロック分移動する。
選択領域も移動する場合はコマンドの末尾に`-s`
空気ブロックを無視する場合はコマンドの末尾に`-a`

#### 選択領域内のブロックを繰り返す（複製する）

```bash
//stack <方向> <移動量>
```
※オプション等は`//move`と同様なので省略

#### 選択領域内を再生成する

```bash
//regen
```




# クリップボード操作系

一般的なOSのクリップボードのことではなく、WorldEdit内部で使用されるブロックデータが保存されている一時メモリのようなもの。

#### 選択領域をコピー

```bash
//copy
```
[エンティティ](https://minecraft.fandom.com/ja/wiki/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3?so=search)も含めてコピーする時は、コマンドの末尾に`-e
`
#### 選択領域を切り取り

```bash
//cut
```

#### クリップボードを貼り付け

```bash
//paste
```
貼り付けの起点は//copyや//cutコマンド時のプレイヤーの相対座標となる(これを理解してないと期待通りの位置にうまく貼り付けできない)
[参考リンク](https://worldedit.enginehub.org/en/latest/usage/clipboard/
)


エンティティも一緒に貼り付ける場合はコマンドの末尾に`-e`
空気ブロックを除外して貼り付ける場合はコマンドの末尾に`-a`




#### クリップボードの内容を回転

```bash
//rotate <Y軸角度> <X軸角度>
```

#### クリップボードの内容を反転

```bash
//flip <反転する方向>
```

#### クリップボードの内容をschemファイルとして保存

```bash
//schematic save <ファイル名>
```

上書き保存する場合はコマンドの末尾に`-f`

#### schemファイルの読み込み

```bash
//schematic load <ファイル名>
```

schemファイルの保存、読み込みの操作は機動構成フォルダの`config/worldedit/schematics`ディレクトリを参照している。schemファイルはMinecraftで使用される特殊なファイル形式の一つで、ブロックの構造を保存し、別の場所や別のサーバーに複製するためのもの。このファイルにより別のワールドに建築物を移動することが可能になる。

#### クリップボードの内容を削除

```bash
/clearclipboard
```

#### クリップボードの起点の切り替え

```bash
/toggleplace
```
貼り付ける時の起点を現在位置とするか、選択範囲のpos1とするか切り替える

# 生成系、削除系
基本的にはプレイヤーを中心として実行されるため、こちらはセレクターを必要としない。

#### 任意のブロックで埋める

```bash
//fill <ブロック名> <範囲> <深さ>
```

#### 水で埋める

```bash
//fill water <範囲> <深さ>
```
海を作るのに便利

#### 水を吸う（削除する）

```bash
//drain <範囲>
```

#### 水流を水源にする

```bash
//fixwater <範囲>
```

#### 近くのブロックを置き換える

```bash
/replacenear <範囲> <対象のブロック名> <置換するブロック名>
```

#### プレイヤーの近くの任意のブロックを削除

```bash
/removenear <対象のブロック名> <半径>
```

#### プレイヤーの頭上のブロックを削除

```bash
/removeabove <範囲> <高さ>
```

#### プレイヤの足元のブロックを削除

```bash
/removebelow　<範囲> <深さ>
```

#### 森林を生成

```bash
//forest <森林タイプ> <範囲>
```

#### 草ブロックの上に草花を生成

```bash
//flora <範囲>
```

# ツールコマンド

プレイヤーが手に持っているアイテムに効果を割り当てるコマンド群。



#### 情報ツール
ブロックに対して右クリックすることで、ブロック名やブロック状態を確認できる。

```bash
/info
```

#### 植林ツール
右クリックすることで、任意の木を生成できる。

```bash
/tree　<木の種類>
```

#### 置換ツール
ブロックに対して右クリックすることで、コマンドで指定したブロックに置き換える。ちなみにブロックに対して左クリックすれば置換するブロックに再セットできる。

```bash
/repl <ブロック名>
```

#### サイクラーツール


```bash
/cycler
```
いわゆる[デバック棒](https://minecraft.fandom.com/ja/wiki/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%A3%92)。右クリックでブロック状態を変更。左クリックで切り替える状態プロパティを選択。

#### ツールの効果を解除する。

```bash
/none
```

# ブラシコマンド
プレイヤーが手に持っているアイテムをブラシツールにするコマンド群。右クリックで使用する。


#### 球体ブラシをセット

```bash
//brush sphere <ブロック名> <半径> 
```

`//br`でも可

```bash
//br sphere <ブロック名> <半径> 
```

#### クリップボードブラシをセット

```bash
//brush clipboard
```

#### 重力ブラシをセット

```bash
//brush gravity <ブロック名> <半径>
```

#### ブラシ効果を空気ブロックのみ対象にする

```bash
/mask air
```

#### ブラシ効果を空気ブロック以外のブロックを対象にする

```bash
/mask !air
```

#### ブラシ効果を特定のブロック以外を対象にする

```bash
/mask !<ブロック名>
```

## ユーティリティ
プレイヤーを操作するコマンド群



#### 目の前の壁をすり抜ける

```bash
/thru
```

#### プレイヤーが見ているブロックの上にテレポートする

```bash
/jumpto
```

#### ブロックから抜け出す（プレイヤーがブロックに埋もれたとき。）

```bash
/unstuck
```

または
```bash
/!
```

# その他コマンド

#### 編集を巻き戻す
※ただし、10回前までしか戻れない

```bash
//undo
```

#### 編集をやり直す
※こちらも10回まで

```bash
//redo
```

# -m フラグについて

コマンドの末尾に`-m`フラグを指定することで、編集操作を特定のブロックに絞り込むことが

例）選択領域内の石ブロックのみを移動させる場合

```bash
//move up 3 -m stone　
```
カンマ区切りによる複数選択もできる
```
//move up 3 -m stone,dirt,grass_block
```

論理否定演算子による指定も可能（特定のブロック以外を指定する）
例）石ブロック以外を移動

```bash
//move up 3 -m !stone
```

# 便利な hand 変数

`hand`は、ブロック名を入力する代わりにプレイヤーが持っているブロックを指定することができる

例) 選択領域内全てのにプレイヤーが持っているブロックをセット

```bash
//set hand
```

例) 選択領域内の石ブロックをプレイヤーが持っているブロックに置き換える

```bash
//replace stone hand
```

# カスタムコマンドを作れるCraftScript

CraftScriptはJavaScriptで独自のWorldEditコマンドを作成することができる機能。
正確にはJavaScriptのコードをJavaのクラスへと変換する[Rhino](https://www.wikiwand.com/en/Rhino_(JavaScript_engine))を用いて、WorldEdit APIをJavaScriptで実行することができる。しかし、実際に書くときはJavaの知識もある程度は必要。


スクリプト実行の構文

```bash
/cs <JavaScriptファイル名> <カスタム引数>
```

CraftScriptを実行するには[公式ドキュメント]()によると、下記の下準備が必要

- [Rhino JavaScript エンジン](https://github.com/mozilla/rhino/releases)をダウンロードする。
- ダウンロードしたファイルの名前を `js.jar`に変更する
- `js.jar`をMinecraftの起動構成フォルダの`config/worldedit`のディレクトリの中に入れる。
- `config/worldedit`ディレクトリに`craftscripts`フォルダを作成。このなかにJavaScriptファイルを設置し、コマンドで呼び出すことで処理を実行できる。

コード例

```js
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);
```

上記のコードによる実行コマンド（プレイヤーの足元に赤い羊毛ブロックをセットする）

```bash
/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も紹介します。

:::note warn
WorldEdit含め、Modの利用は原則として自己責任でお願いします。
:::

動作環境：ver1.19-fabric

## WorldEdit CUI

https://www.curseforge.com/minecraft/mc-mods/worldeditcui-fabric

セレクターを可視化するMod。これがないとセレクターがどの範囲を選択しているのかがわからないのでほぼ必須。



## Scroll for WorldEdit

https://github.com/hf02/scroll-for-worldedit

マウスのホイールスクロールによるセレクターの操作が可能になる。
これのおかげで個人的に`//stack`、`//move`、`//shift`、`//contract`、`//expand`コマンドを直接入力することは少ない。 



## FastAsyncWorld

https://github.com/IntellectualSites/FastAsyncWorldEdit

こちらはサーバーブラグインなので、マルチプレイ限定。大量のブロック編集処理を高速化したり`//undo`コマンドの10回制限を解除できる。

## Pick Block Pro

https://www.curseforge.com/minecraft/mc-mods/pick-block-pro

プレイヤーが見ているブロックのブロック名をクリップボード（OSの方）にコピペができるMod



例えばブロック名（名前空間ID）がわからないときは/infoコマンドによる情報ツールで確認できるが、入力がいちいちめんどくさい。コマンドの入力の手間を省くなら、せめてコピペできるようにしたい。

デバックキー`F3 + H`により高度な表示をオンにすることでインベントリ画面でブロック名を確認することもできる。
また、デバックキー`F3 + I`でプレイヤーが見ているブロックデータをクリップボードにコピペできる。ただし、下記のようにsetblockコマンドの構文でコピーされるので、少々使いにくい

```bash
/setblock -53 -61 79 minecraft:grass_block[snowy=false]
```

上記のModを使えばブロック名のみをクリップボードにコピペしてくれる。

## Command Macros

https://www.curseforge.com/minecraft/mc-mods/command-macros

任意のコマンドを特定のキーに割り当てられるMod



例えば`//undo` コマンドをCutrl + Zキーに割り当てれば直感的に使いやすくなる

## JS macros
https://www.curseforge.com/minecraft/mc-mods/jsmacros

Minecraftのゲーム内でJavaScriptを実行するためのMod。ゲーム内で起こるさまざまなイベントに対応する自動化スクリプトを書くことができる。Mod開発をするほどでもない簡易的なスクリプトであればこのModだけで済む。スクリプトの実行は、特定のキーに割り当てることもできる。

通常のコマンドであればコマンドブロックやmcfunctionを使用すれば一括のコマンド実行やループ処理が可能であるが、WorldEditのコマンドの場合はそれができない。このmodを使用することで、JavaScriptでWorldEditのコマンドをループ処理でかける。

とはいっても、より高度なブロック編集操作を行う場合はCraftScriptで書いた方が良いので、こちらは個人的にはコマンドの入力する手間を省くのに使う。

たとえば選択領域をschemファイルとして直接保存する場合は下記のように書いておけば一発のキーで済む

```js
Chat.say('//copy -m !air');
Chat.say('//schematic save hoge -f');
```

また、下記の処理を書いて特定のキーに割り当てれば、プレイヤーが見ているブロックをプレイヤーが持っているブロックに置き換える処理ができ、//replaceコマンドが楽になる

```js
// プレイヤーが見ているブロックデータを取得（30ブロック先まで）
const data = Player.rayTraceBlock(30, false).getId().toString();

// プレイヤーが見ているブロックをプレイヤーが持っているブロックに変える
Chat.say('//replace ' + data + ' hand');
```

APIドキュメント

https://jsmacros.wagyourtail.xyz/?/libraries.html

## Tweakeroo

https://www.curseforge.com/minecraft/mc-mods/tweakeroo

マイクラのゲーム内の様々な要素を微調整できるMod。クリエイティブのflyモードの移動速度を早めることができるので、広範囲のブロックをセレクターで選択するときに便利。また、マイクラのチャットは一度閉じてしまうと、入力中のコマンドは消えてしまうが、このmodの設定によりコマンドの入力途中を保持することもできる。

参考動画

https://www.youtube.com/watch?v=wCyBQOLDq3Q&list=PLc1JHlscjWncegLG9lnA_DJNLW36SFt4S&index=33



https://www.youtube.com/watch?v=Xn3SKA5gluw&list=PLc1JHlscjWncegLG9lnA_DJNLW36SFt4S&index=35