ブロックアップデート
BlockUpdate
Also: BU / NU / SU / NeighborUpdate / ShapeUpdate / ブロック更新 / 形状変化
Contents
ブロックが設置されたり破壊された際にはその周辺にブロックの更新が行われる
これを通称「ブロックアップデート」と呼び、以下の4つに大別される
- ブロック更新(NeighborUpdate)
- 形状更新(ShapeUpdate)
- コンパレータ更新
- 配置/除去フック
それぞれのブロックアップデートにはフラグが設定されておりビットで管理される
| ビット値 | 名称 | 意味 |
|---|---|---|
| 1 | UPDATE_NEIGHBORS | ブロックの周囲6面に対してブロック更新を行う |
| 2 | UPDATE_CLIENTS | クライアントに送信する |
| 4 | UPDATE_INVISIBLE | クライアントでレンダリングの更新を行わない |
| 8 | UPDATE_IMMEDIATE | クライアントで即座に再描画する |
| 16 | UPDATE_KNOWN_SHAPE | 形状更新を行わない |
| 32 | UPDATE_SUPPRESS_DROPS | ドロップを出さない |
| 64 | UPDATE_MOVE_BY_PISTON | ピストンによる移動 |
| 128 | UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE | レッドストーンへの形状更新をスキップする |
| 256 | UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS | ブロックエンティティの中身のドロップなどをスキップする |
| 512 | UPDATE_SKIP_ON_PLACE | onPlaceを呼ばない |
更新順序#
ブロック更新と形状更新で順序が違う
ブロック更新#
西->東->下->上->北->南
形状更新#
西->東->北->南->下->上
更新連鎖(Update Chain)の展開#
実質的に、いわゆる深さ優先探索というものになっている。(1.15+)
例えば UPDATE_NEIGHBORS を行った際に、西側と東側に連鎖する更新がある場合は先に西に更新が送られる
このとき、西側の周囲6面にも連鎖する更新があった場合はその更新を行い、そこから波及する更新もすべて追い切った後に東側の更新を行う
更新連鎖の回数の上限は、ブロック更新の場合は max-chained-neighbor-updates で決まっておりデフォルトは 1000000 、それ以上はログを出してからスキップされる
形状更新の連鎖の場合は updateLimit で決まり、デフォルトは512。こちらも超えるとスキップされる
準接続(QC)の仕組み#
ピストンやドロッパー/ディスペンサーは自分の周囲6面と上1マスの周囲6マスの信号を見に行く
しかしこれはブロック更新を受け取ったときにチェックするため、ブロック更新を与えずに信号を設置した場合に「ブロック更新を受け取った時に動き出す」状態を作り出すことができる
これを「準接続(QC,Quasi-Connectivity)」という
ブロック更新と形状更新#
更新ごとの反応するブロック#
ブロック更新に反応するブロック
- ピストン、ドロッパー、ディスペンサーなど
- リピータ、コンパレータなど
形状更新にのみ反応するブロック
- 砂や砂利などの落下するブロック
- 草・花・苗など
- オブザーバー(向いてる面から来た更新のみ)
コンパレータ更新に反応するブロック
- コンパレータ(コンテナの中身)