スケジュールティック
ScheduleTick
目次
スケジュールティックはピストンなどの遅延して動作するブロックの処理を行うための処理
これはブロック更新やブロックイベントなどと違ってワールドにチャンクNBTとして保存される
そのため、遅延中にワールドを終了しても再開後に動作する
構造#
| フィールド名 | 意味 |
|---|---|
| type | BlockかFluidか。これらは完全に別のインスタンスとして扱われる |
| pos | 座標 |
| triggerTick | 遅延を扱う |
| priority | 優先度(-3~+3) |
| subTickOrder | リセットされない予約番号のようなもの |
優先順#
priority#
同じtick内では優先度(priority)を元に実行の順番が決められる
priorityは以下の7種類に分かれており、値が小さいほど先に実行される(優先度が高い)
| 名前 | 値 |
|---|---|
| EXTREMELY_HIGH | -3 |
| VERY_HIGH | -2 |
| HIGH | -1 |
| NORMAL | 0 |
| LOW | 1 |
| VERY_LOW | 2 |
| EXTREMELY_LOW | 3 |
| 非 NORMAL な値はリピータとコンパレータで使用されており、その他はすべて NORMAL である |
- リピーターがブロック更新を受けたとき
- 出力元がリピーター or コンパレータの場合-> EXTREMELY_HIGH
- 上記に該当せず現在 ON (これからOFFにする)-> VERY_HIGH
- 上記に該当せず現在 OFF (これからONにする)-> HIGH
-
リピーターの自己再予約
短いパルスを受け取ったリピーターが自分でFFにする予約を入れる
これは VERY_HIGH になる。 -
コンパレータ
- 出力元がリピーター or コンパレータの場合-> HIGH
- その他の出力の場合 -> NORMAL
subTickOrder#
同じ tick で同じ priority の場合は subTickOrder によって実行順が決まる
これはワールドごとに持っている単調増加カウンタでリセットされない
つまり、数値が被ることがないのでこれによって最終的な順番を確実に決定できる
これはスケジュールティックが呼ばれた際に決まる値のため、同じ priority での実行順は実質的にブロック更新が届く順番ともいえる
重複排除#
同じ座標・同じブロックでは同時に一個しかスケジュールできない
2個目以降はすべて破棄される
再度スケジュール可能になるのは実行のためにスケジュールを取り出した時なので
tickが走った瞬間に再予約可能になる
処理フロー#
ブロック->液体の順に処理される
実行リストは実行する前に確定することに注意する
-
実行するリストを確定する。
処理するチャンクを優先度順に並べたキューを作成
チャンクのキューを順番にチェックする
チャンクが読み込み範囲外の場合はそのままにし、範囲内ならチャンク内のキューを参照する
チャンク内で優先度が1番高いキューを実行キューに入れる
優先度が2番目に高いキューと、次に優先度が高いチャンクの1番優先度が高いキューを比較して、前者が高いなら実行キューに入れる
->65536回の上限に達するか、すべてのキューを処理し終えるまで続ける
これによりチャンクに関わらずグローバルに「優先度が高い=実行が早い」キューが完成する
上限に達した場合はそれ以降は次のtickに回される -
実行
1で作成したキューを順番に実行する
実行するときにブロックがキューと変わっている場合は何も実行されずに次に行く
実行した瞬間に再予約可能な状態になる -
クリーンアップ
実行キューを空にする
今回実行したときに新しくスケジュールされた場合はこのタイミングで次のキューに入れる
保存とロード#
スケジュールはチャンクNBTに保存される
アンロード時は遅延のカウントダウンは進まず、再度ロードされた場合に残りの遅延から再開する
subTickOrder は保存されず、再ロード時に振りなおされる。これは再ロード時と同じtickに新規で予約されるものよりも先に振られるため、先に実行される