Skip to content

test: B2永続化spike(保存形式の検証とfixture) - #66

Open
Yuru-Yurufu wants to merge 1 commit into
mainfrom
spike/b2-persistence
Open

Yuru-Yurufu wants to merge 1 commit into
mainfrom
spike/b2-persistence

Conversation

@Yuru-Yurufu

Copy link
Copy Markdown
Owner

概要

beta.4 Stage 1の B2永続化spike です。ダブルハーフの中のハーフ1枚ずつを、バージョン付きのNBTと相互に変換するcodecを作りました。Minecraft 1.21.1で方針どおりに動くかをGameTestで確かめています。

ゲームの動きは変えていません。 codecはgametest側(配布jarに入らない)にだけ置いています。本番のBlock Entityへの組み込みは、このspikeのレビュー後にStage 6で行います。

変更

  • gametest/persistence/ComponentStateCodec:書き込みと読み込み
    • 書き込み:NbtHelper.fromBlockState で書き、ハーフ自身の状態でないpropertyは取り除きます。取り除くのは TYPE、縦の FACING、SNOWY、DISTANCE、WATERLOGGED、is_double です。
    • 読み込みでは、先に次を確認します。通ったものだけを NbtHelper.toBlockState に渡します。
      • id
      • 登録されているか
      • BlockTriple の形(横か縦か)
      • 各property
    • 形式は追加型です。旧形式の positive_slab.id、negative_slab.id、axis もそのまま書くので、今のSlabeeでも読めます。
    • 縦の軸は、容器の axis に1回だけ保存します。
  • gametest/persistence/Diagnostics:診断ログの件数を、一定時間ごとに上限で抑えます。
  • PersistenceSpikeGameTests:21件
  • ModBlockMap:読み取り専用の isMappedSlab と isMappedVerticalSlab を追加しました。main側の変更はこれだけです。

確かめたこと(テスト)

  • 新形式の往復:横、縦X、縦Z
  • property所有権
    • 雪の草ハーフの SNOWY は保存しません。
    • 葉の PERSISTENT は保存し、DISTANCE と WATERLOGGED は保存しません。
    • 保存データに type が書かれていても、スロットから決めた値を使います。
  • 壊れたデータ
    • propertyだけが不正なら、そのpropertyだけdefaultにします。
    • 次の場合は、その側のハーフだけを失います。
      • id が消えている、または壊れている
      • ハーフでないブロック、または形の違うハーフ
    • 残った側はSingle化します(縦はスロットの向きのまま)。両方失えばairです。
  • 旧形式
    • 今のSlabeeが書く id だけのNBTを読めます。
    • 縦は、NBTの axis を移行の入力にします。壊れていれば外側のBlockStateの軸、それもなければXです。
  • 新形式で軸が食い違ったら、外側のBlockStateを正として診断します。
  • 未来の version で保存されたデータは、一緒に書かれている旧形式で読みます。
  • 今のBlock Entityとの互換
    • 今のBEが保存したNBTを、新しい読み手で読めます。
    • 今のBEも、新形式のNBTを正しく読めます。
  • 診断ログの件数の上限と、抑えた件数のまとめ表示

./gradlew runGametest:41件すべて通過(うち新規21件)。./gradlew build も通っています。

Stage 6へ持ち越す気づき

  • NbtHelper.toBlockState は、未知のidで黙ってairを返します。不正なproperty値はログに出すだけです。そのため、事前の検査が必要です。また、Identifier.of は壊れたidで例外になるので tryParse を使います。
  • 今のSlabeeのハーフには、ハーフ自身が持つpropertyがまだありません。そのため所有権の確認は、テスト用の対応表でvanillaの葉を使いました。
  • 旧形式を読むときの扱いが変わります。今は、壊れたidを既定のハーフに置き換えます。新しい読み手では、その側を失います(決定どおり)。
  • dirt_path_slab → dirt_slab はゲームのルールなので、codecには入れていません。
  • 横の旧形式にある facing は、今のコードでも使われていないので読んでいません。

レビューのお願い

この方針でよければ、B2のgateを通過として、Stage 6の本実装を進められます。

🤖 Generated with Claude Code

Prove the versioned, filtered NbtHelper path for Double halves without
wiring it into the Block Entities: registry and BlockTriple validation,
property ownership, legacy ID-only reads, per-half loss and
singleization, axis migration rules, and rate-limited diagnostics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant