Complete Bedrock resource pack conversion
Build and release Bedrock pack / release (push) Successful in 6s

This commit is contained in:
root
2026-08-02 08:27:33 +02:00
parent 75a594df5d
commit df3b190c8c
3 changed files with 166 additions and 10 deletions
+43 -7
View File
@@ -1,26 +1,62 @@
#!/usr/bin/env python3
"""Validate pack metadata, required assets, mappings, and archive contents."""
"""Validate metadata, references, and required binary assets in the pack."""
import json
import struct
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def load(path):
with path.open(encoding="utf-8") as stream:
return json.load(stream)
def assert_png(path, expected_size=None):
data = path.read_bytes()
assert data.startswith(b"\x89PNG\r\n\x1a\n"), f"not a PNG: {path}"
width, height = struct.unpack(">II", data[16:24])
if expected_size:
assert (width, height) == expected_size, f"unexpected PNG size for {path}: {(width, height)}"
manifest = load(ROOT / "manifest.json")
assert manifest["format_version"] == 2
assert manifest["header"]["uuid"] != manifest["modules"][0]["uuid"]
assert manifest["modules"][0]["type"] == "resources"
assert len(manifest["header"]["version"]) == 3
assert len(set(manifest["header"]["uuid"] for _ in [0])) == 1
assert manifest["header"]["min_engine_version"] >= [1, 21, 0]
assert_png(ROOT / "pack_icon.png", (64, 64))
textures = load(ROOT / "textures/item_texture.json")["texture_data"]
sound_defs = load(ROOT / "sounds/sound_definitions.json")["sound_definitions"]
mappings = load(ROOT / "geyser/mappings.json")
names = ("interior_shop0", "pawn_shop1", "food_mart2", "hat_shop3", "clothing_shop4", "jump_up5", "city_under_siege6")
names = (
"interior_shop0", "pawn_shop1", "food_mart2", "hat_shop3",
"clothing_shop4", "jump_up5", "city_under_siege6",
)
assert set(textures) == {f"friends_cmp:{name}" for name in names}
assert len(sound_defs) == len(names)
for entry in textures.values():
assert (ROOT / (entry["textures"] + ".png")).is_file()
for entry in sound_defs.values():
assert (ROOT / (entry["sounds"][0]["name"] + ".ogg")).is_file()
for name in names:
texture = textures[f"friends_cmp:{name}"]
texture_path = ROOT / (texture["textures"] + ".png")
assert texture_path.is_file(), texture_path
assert_png(texture_path, (16, 16))
sound = sound_defs[f"music_disc.{name}"]
sound_path = ROOT / (sound["sounds"][0]["name"] + ".ogg")
assert sound_path.is_file(), sound_path
assert sound_path.read_bytes()[:4] == b"OggS", f"not OGG: {sound_path}"
assert mappings["format_version"] == 2
assert len(mappings["items"]["minecraft:music_disc_13"][0]["definitions"]) == len(names)
for java_item in ("minecraft:music_disc_13", "minecraft:paper"):
definitions = mappings["items"][java_item][0]["definitions"]
assert len(definitions) == len(names), java_item
assert {entry["bedrock_identifier"] for entry in definitions} == set(textures)
for entry in definitions:
assert entry["bedrock_options"]["icon"] in textures
assert entry["predicate"]["property"] == "custom_model_data"
assert entry["predicate"]["value"] in names
assert_png(ROOT / "textures/environment/clouds.png", (1, 1))
print("Bedrock pack validation passed")