ワールドボーダーを、Chunky が実際に焼き終わった範囲に追随させる Forge MOD(Minecraft 1.20.1・サーバ専用)。
プレイヤーが未生成の土地へ出ると、その場でチャンク生成が走る。地形MODを重ねた構成では 1チャンクの生成が重く、参加直後に数十秒サーバが止まる。
Chunky で事前生成しておいても、焼けた範囲の外へ出られては同じことが起きる。 ボーダーを「焼けた範囲」の内側に置き続ければ、遊んでいる最中に生成が起こらない。
この MOD は Chunky の進捗を受け取り、ボーダーをそこへ追随させる。
Chunky の進捗イベント(world / chunks / complete)
↓
半径 = 8 × √(焼けたチャンク数) ※ concentric(中心から輪を広げる順)が前提
↑ ⚠ **この前提は機械が確かめる**(下記)
↓
ボーダー = 半径 − 余白(view-distance + 2 チャンク)
↓
ネザー = オーバーワールド ÷ 8
ワールドの容量が予算(既定 45GB)を超えたら、事前生成を一時停止する。
- Chunky(必須。進捗を受け取る相手)
pattern=concentricで走らせること。⚠region順だと「ここまで焼けた」と言える瞬間が 完走時しか無く、進捗から半径を出せない- 次元ごとに独立したボーダーを持つには World Border Fixer 等が要る (バニラのボーダーは全次元で1つ)
実運用で踏んだ失敗の対策が入っている。数字にはすべて理由がある(詳細はコードの注記)。
| なぜ | |
|---|---|
| 完走したタスクには 5% の割引を掛けない | 掛けたままだと焼き終わってもボーダーが手前で止まる |
| 64ブロック以内の差では動かさない | 目標が毎回わずかにズレるので、動かし続けてしまう |
| 根拠ゼロで縮めない | 「測れなかった」と「焼けていない」は別物。遊べていた範囲が突然閉じる |
| 下限128 はスポーン周辺の内側 | 大きくすると「生成済みの場所にしか行けない」が破れる |
| ネザーは常に ÷8 ちょうど | ポータルの行き先が丸められるのを、どちら向きにも防ぐ |
| 余白は view-distance から出す | ボーダーに立つと view-distance ぶんが配られる=生成される |
止めるのは cancel ではなく pause |
cancel だと進捗が消えて再開できない |
判断は BorderPlan に切り出してある。 Minecraft も Chunky も出てこないので、
サーバを起動せずに机上で確かめられる。
元々はサーバの外で動く運用スクリプトだった。RCON で繋ぎ、サーバのログを正規表現で読んで
進捗を得ていた。Chunky が ChunkyAPI で進捗を公開していると気づいて中へ移した。
外に居たせいで抱えていた厄介事は、中に入れば全部消える。
- ログを正規表現で読む → イベントを受け取るだけ
- ログは再起動で切り替わるので region ファイルのヘッダを自前で読んでいた → 進捗は届く
- 前のワールドの残骸タスクを弾く仕掛け → そもそも読まない
- RCON →
level.getWorldBorder().setSize() - 実行環境に Python があるかを気にしていた → 依存が消える
常駐の寿命も正しくなる。 外部の常駐は「落ちても黙って止まる」という不具合を抱えるが、 ボーダーを更新する必要があるのはサーバが動いている間だけなので、 MOD の中の定期処理なら寿命がぴったり一致する。
| 作りたてのワールドを閉じる | 直径 59,999,968 → 256 |
| 焼けるにつれて広がる | 1,779チャンク→321 / 2,158→386 / 2,573→451 / 3,025→516 |
| ネザーが常に 1/8 | OW 581 / ネザー 72 |
| 再起動をまたぐ | 581 → 646 → 720(縮まない) |
| 完走で割引が外れる | 4,225チャンク・完走 → 720 |
⚠ 未確認: 予算に達したときの停止(試験で再現できていない)/ プレイヤーが居る間の挙動(Chunky Autopause が止めたとき)。
MIT
書いてあるだけでは守られない。 2026-08-18 に実際に破った——ワールドを作り直したあと
chunky start を焼き順の指定なしで叩き、region(領域ファイル単位)で走った。
⚠ 遠くから先に焼かれるので 8 × √チャンク数 が嘘の半径になり、
ボーダーが未生成の土地まで開いていた(中心から 1,488 ブロック先を焼いている状態)。
py worlds/world-3/dev/verify/check_chunky_order.py # 判定する
py worlds/world-3/dev/verify/check_chunky_order.py --self-test # 道具自身を対照で試す
⚠ 設定ファイルの pattern= を見てはいけない——走行中は古い値のままで、
実際に concentric で走っていたのに region と書いてあった。
この道具は実際に焼いている座標から判定する(concentric なら
max(|x|, |z|) ≒ √(焼けたチャンク数) / 2)。
server/play_ctl.py status が自動で回すので、遊び用サーバの様子を見るたびに鳴る。