Skip to content

Repository files navigation

Border Keeper

ワールドボーダーを、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 も出てこないので、 サーバを起動せずに机上で確かめられる。

なぜ MOD なのか

元々はサーバの外で動く運用スクリプトだった。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

⚠ 前提(concentric)が守られているかを確かめる

書いてあるだけでは守られない。 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 が自動で回すので、遊び用サーバの様子を見るたびに鳴る。

About

ワールドボーダーを Chunky が実際に焼き終わった範囲に追随させる Forge MOD(1.20.1・サーバ専用)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages