Apply live chunk-upgrade permissions and retained biome status

This commit is contained in:
Ludovic Marie committed 2026-10-06 19:31:11 +02:00
1 parent e8b66b83fc
commit 32ad4ba6aa
12 files changed
+734 -32

No files matched your search

@@ -0,0 +1,219 @@
{
"schema": 1,
"minecraft": "26.3",
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
"java": "openjdk 25.0.4.1 2026-08-18",
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
"block_states": 35723,
"direct_state_probes": 35723,
"write_zone_cases": 20125,
"upgrade_height_cases": 10098,
"upgrade_lifecycle_cases": 54,
"block_tag_files": 300,
"fixtures": 192,
"worldgen_random_modes": [
false,
true
],
"resident_chunks_per_fixture": 9,
"requested_placements": 3456,
"direct_tick_requests": 14784,
"sources_sha256": {
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFeatureRegionOracle.java": "3af9440fa50b0c42a23e9d65b394d214965b2c4af2c9cf7e58c5b4b0e56fb569",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaPlacementOracle.java": "12b1c46cc397755ef6827da777faef3e71c008cafa48403669c03ca2bdc3c7cb",
"tools/test_feature_region_parity.py": "dfbbdedb16a1989306060ea96cfeea1ab5ba8615e17117e172b7a5773d17bbf1",
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
"tools/test_worldgen_parity.py": "b40972ab2ad222aa6d77537cc36b434a217baa1f1b56bbaad945d6e12fe776af",
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
"Cargo.toml": "4f803d21656a1420555bee6369617ddc825219a2cf05f842a209b3f8eaa583ec",
"Cargo.lock": "b1674833e1d5e66032589eea75643bf1c1eb2f2d6503e79ff7da8efa1b6d21dc",
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
"crates/horizon-core/src/lib.rs": "47350edab5791f5074a54563ba98108818c5c6b1c5818a591388eab2ac9f5490",
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
"crates/horizon-world/src/block_collision.rs": "cec2af81d212d5eed7a2196e4cf0be2daf4cecf53248f78cc68f2190e4d83f9a",
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
"crates/horizon-world/src/dynamic_support.rs": "e799b31e5120cfdb04e0b342f2097d610ed98ef8c4be031620ee00368d82df59",
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
"crates/horizon-world/src/lib.rs": "2995b209aa3dc24cfcbba405cf8b97a398efbc0de97bb04ef2f51abb4cd2b84c",
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
"crates/horizon-world/src/registry/json.rs": "1eae82604d2b3377fd35aaa3a914a67e5af28f93923815a49e895b4d437433cd",
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
"crates/horizon-world/src/retrogen.rs": "516c2a1841583acf1f9aef161dee3d59c68dfda9b9f2a7c936be9823abbdbb77",
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
"crates/horizon-world/src/worldgen/biome_chunk.rs": "d6389c8d1adf900eb8f0e6c8833feafe43dc92d74e5c7ffa6f3950975529d624",
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
"crates/horizon-world/examples/feature_region_fixture.rs": "d65fe974a6d5a691d57690b0eafe28f90604268dda17c51d9d02c4dc35a9ae9f"
},
"fixtures_sha256": {
".local/rust-feature-region-parity/heights.json": "5a9a24cd8dcd081955f856df741a8e0eb34c84649d636947f474139d3ed30698",
".local/rust-feature-region-parity/zones.json": "1864a9cdc17816c12fc5e92cd6abd32e45d67615075c52e928872e041d84244c",
".local/rust-feature-region-parity/inputs.txt": "597236d7f85cfad764729c389bd71a1063d40587903ba3bd3ef86e4e3f9a481f",
".local/rust-feature-region-parity/tags.json": "36975358262568f32bf84778d63d9989a36e7394ed4796d70a34809a8f4a64f0",
".local/rust-feature-region-parity/fluid-tags.json": "f1e5eb6d22ea7effbb118a2282709cfdeef1bfae4516b775a55ad7a4df29d7d0",
".local/rust-feature-region-parity/facts-client.json": "1d24883ee807b0b71473f0bbf8ed548ddaf712148caeb3fcc7aa13ab973a97b0",
".local/rust-feature-region-parity/facts-server.json": "1d24883ee807b0b71473f0bbf8ed548ddaf712148caeb3fcc7aa13ab973a97b0"
},
"rust_output_sha256": "eacca412638854ec0ae4ff375b18ae63cae249f714d3b37f055fca62868faa8f",
"references": [
{
"side": "client",
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
"output_sha256": "eacca412638854ec0ae4ff375b18ae63cae249f714d3b37f055fca62868faa8f",
"matched_output_lines": 29248297
},
{
"side": "server",
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
"output_sha256": "eacca412638854ec0ae4ff375b18ae63cae249f714d3b37f055fca62868faa8f",
"matched_output_lines": 29248297
}
],
"scope": "Native FeaturePlacer and three basic block-writing features, a composed sequence of four configured fill layers, single-block replacements, scattered ore and water springs share a world proxy backed by nine actual ProtoChunks. Configured water, horizontal logs, air, out-of-height fills and ore/replacement rules test graph-to-region binding. Initial two-layer stone/dirt terrain, both pre-light heightmap groups, count/square/heightmap/layered modifier chains, repeated placements, direct and WorldgenRandom-wrapped random streams, missing-neighbor errors, rejected writes and injected partial failures are compared. Final complete raw sections, heightmap presence and packed words are compared alongside ordered feature writes, update flags, explicit height queries and subsequent random draws. Rust uses resident registry-backed chunks, lazy heightmap priming and a caller-supplied write callback; imported air/fluid facts and bundled block tags bind independently across authenticated JARs. The proxy supplies storage mutation and actual native default scheduleTick/createTick methods routed through WorldGenTickAccess into each ProtoChunk. Separate block/fluid queues, first-request deduplication, nondefault-state block identity, shared tick-order advancement on duplicates and missing-chunk errors, out-of-height requests and wrapped clock values are compared, including saved queue order and priorities. Active and inactive End podiums additionally exercise native WorldGenRegion.destroyBlock through a subclass transport overriding only block reads and writes; air short-circuit, rejected replacements and write failures retain the generation-time semantics. All block states are also written into resident chunks, queried through feature access, cleared and queried again; contained fluid identity/amount/falling/source/full flags, water-tag membership and every bundled block tag plus an absent tag are compared. Negative coordinates, chunk edges, outside-height and absent chunks are covered. Block/fluid query bindings are an immutable registry-checked shared snapshot. The native horizontal write-zone predicate is compared separately across chunk/block coordinates, negative radii and wrapped subtraction/absolute-value extremes, and gates feature callbacks in selected fixtures. Actual WorldGenRegion.ensureCanWrite also checks the center proto-chunk before/after installing native below-zero retrogen data, with extreme and boundary heights; the generic height interval is independently compared against LevelHeightAccessor. Region feature callbacks and direct accepted/rejected write probes apply the upgrade height before mutation. The Rust access object now reads live center-chunk retrogen metadata before each write. Fifty-four lifecycle cases pair all six pre-light stages with all nine nonempty upgrade targets; one access object observes target-completion cleanup, explicit removal, reinstallation and backward stage changes from accepted write callbacks. Neighbor upgrade state is independent. Actual native highest-generated status and ProtoChunk biome-read availability are compared before and after those sequences, including clamped extreme quart Y. Retrogen activation and the world write effects remain caller-owned. Actual WorldGenRegion construction, full retrogen biome resolution, POIs, block entities, postprocessing execution, lighting, block/fluid tick execution, complete feature registries and complete world generation remain outside this comparison."
}
@@ -0,0 +1,214 @@
{
"schema": 1,
"minecraft": "26.3",
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
"java": "openjdk 25.0.4.1 2026-08-18",
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
"block_states": 35723,
"block_tag_files": 300,
"fixtures": 138,
"operation_counts": {
"stage": 916,
"prime": 40,
"fill": 84,
"dump": 324,
"upgrade": 300,
"upgrade_info": 1082,
"replace_bedrock": 164,
"mask": 244
},
"sources_sha256": {
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaChunkStageOracle.java": "51ae4a6682be6301d0bb7d0a2caba6e5a214f2bcc4d84d767b93ded1e3a2e9bf",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
"tools/test_retrogen_chunk_parity.py": "800e0fd0e9d4bdad0c52f0a7c9cecbbf05398dacadff789b7781eb992b0199d1",
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
"tools/test_worldgen_parity.py": "b40972ab2ad222aa6d77537cc36b434a217baa1f1b56bbaad945d6e12fe776af",
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
"Cargo.toml": "4f803d21656a1420555bee6369617ddc825219a2cf05f842a209b3f8eaa583ec",
"Cargo.lock": "b1674833e1d5e66032589eea75643bf1c1eb2f2d6503e79ff7da8efa1b6d21dc",
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
"crates/horizon-core/src/lib.rs": "47350edab5791f5074a54563ba98108818c5c6b1c5818a591388eab2ac9f5490",
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
"crates/horizon-world/src/block_collision.rs": "cec2af81d212d5eed7a2196e4cf0be2daf4cecf53248f78cc68f2190e4d83f9a",
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
"crates/horizon-world/src/dynamic_support.rs": "e799b31e5120cfdb04e0b342f2097d610ed98ef8c4be031620ee00368d82df59",
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
"crates/horizon-world/src/lib.rs": "2995b209aa3dc24cfcbba405cf8b97a398efbc0de97bb04ef2f51abb4cd2b84c",
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
"crates/horizon-world/src/registry/json.rs": "1eae82604d2b3377fd35aaa3a914a67e5af28f93923815a49e895b4d437433cd",
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
"crates/horizon-world/src/retrogen.rs": "516c2a1841583acf1f9aef161dee3d59c68dfda9b9f2a7c936be9823abbdbb77",
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
"crates/horizon-world/src/worldgen/biome_chunk.rs": "d6389c8d1adf900eb8f0e6c8833feafe43dc92d74e5c7ffa6f3950975529d624",
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
"crates/horizon-world/examples/chunk_stage_fixture.rs": "6817bb3800d3752962fbc28951b938770fb6086d410ccdd488e7c7adf55170f9"
},
"fixtures_sha256": {
".local/rust-retrogen-chunk-parity/inputs.txt": "8d997d6967e791b0f804f003c6d16a991904f54094abeca8db4f9315aa3c3160",
".local/rust-retrogen-chunk-parity/tags.json": "36975358262568f32bf84778d63d9989a36e7394ed4796d70a34809a8f4a64f0",
".local/rust-retrogen-chunk-parity/facts-client.json": "1d24883ee807b0b71473f0bbf8ed548ddaf712148caeb3fcc7aa13ab973a97b0",
".local/rust-retrogen-chunk-parity/facts-server.json": "1d24883ee807b0b71473f0bbf8ed548ddaf712148caeb3fcc7aa13ab973a97b0"
},
"rust_output_sha256": "6012a86e482f4ce50e62403dbc37cf1d8b98dea4e9c10661c29532a55af4cb68",
"references": [
{
"side": "client",
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
"output_sha256": "6012a86e482f4ce50e62403dbc37cf1d8b98dea4e9c10661c29532a55af4cb68",
"matched_output_lines": 3028057
},
{
"side": "server",
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
"output_sha256": "6012a86e482f4ce50e62403dbc37cf1d8b98dea4e9c10661c29532a55af4cb68",
"matched_output_lines": 3028057
}
],
"scope": "Native ProtoChunk below-zero metadata installation/removal, pre-light persisted-stage assignments and target completion cleanup, normal/upgrading generation heights, highest-generated status from retained targets versus current persisted stages, actual BelowZeroRetrogen.replaceOldBedrock and applyBedrockMask. Mixed resident states, legacy five-layer bedrock bands, signed/chunk-relative coordinates, partial vertical overlap, masks with empty/single/sparse/all/out-of-footprint bits, repeated operations, preprimed/stale/missing heightmaps, and clearing under changed generation bounds are compared. Complete raw sections and selected packed heightmaps are checked after each mutation phase. All nine nonempty targets are paired with all six pre-light stages, including installation after an already-advanced status, repeated assignments, backward transitions and explicit removal. Data codecs have a separate comparison. Save-dirty notifications, post-light stages, structure restrictions, biome retention, automatic generation scheduling and complete world/gameplay parity remain outside this comparison."
}
@@ -117,11 +117,12 @@ fn fixture(
let (min_y, height) = chunk.height_for_generation();
writeln!(
out,
"upgrade_info {} {} {min_y} {height}",
"upgrade_info {} {} {min_y} {height} {}",
chunk.is_upgrading(),
chunk
.below_zero_retrogen()
.map_or("none", |data| data.target_status().name())
.map_or("none", |data| data.target_status().name()),
chunk.highest_generated_status().name()
)?;
}
"replace_bedrock" => {
@@ -13,10 +13,12 @@ use horizon_world::worldgen::{
use horizon_core::position::ChunkPos;
use horizon_world::{
DATA_VERSION,
chunk_status::ChunkStatus,
fluid::FluidKind,
heightmap::{HeightmapState, HeightmapType},
nbt::Tag,
registry::{BlockRegistry, BlockStateId},
retrogen::BelowZeroRetrogen,
worldgen::{
tags::TagDefinitions,
terrain::{PreLightChunkStage, TerrainBlockStates, TerrainChunk},
@@ -126,6 +128,88 @@ fn fixture(
),
}
}
// Reuse one feature access object while successful callbacks change the center.
fn upgrade_lifecycle(
registry: &BlockRegistry,
states: &[State],
out: &mut impl Write,
) -> Result<(), Box<dyn std::error::Error>> {
use horizon_world::worldgen::biome_chunk::{BiomeChunk, BiomeRegion};
let biomes = BiomeRegion::new(
(0..2)
.map(|x| BiomeChunk::new(ChunkPos::new(x, 0), -64, 128, ()).unwrap())
.collect(),
0,
)?;
let stone = registry.default_state("minecraft:stone").unwrap();
for stage in PreLightChunkStage::ALL {
for target in ChunkStatus::ALL.into_iter().skip(1) {
writeln!(out, "lifecycle {} {}", stage.status().name(), target.name())?;
let mut chunks = Vec::new();
for x in 0..2 {
let mut chunk =
TerrainChunk::new(ChunkPos::new(x, 0), -64, 128, registry, Properties(states))?;
chunk.set_generation_stage(stage);
chunk.set_below_zero_retrogen(Some(BelowZeroRetrogen::new(target, vec![])?));
chunks.push(chunk);
}
let mut region = TerrainRegion::new(chunks, WorldGenerationContext::new(-64, 128, 0))?;
for pass in 0..2 {
for x in 0..2 {
writeln!(
out,
"lifecycle_status {pass} {x} {} {}",
region.chunk(x, 0)?.highest_generated_status().name(),
region.noise_biome(&biomes, [x * 4, i32::MAX, 0]).is_ok()
)?;
}
if pass != 0 {
break;
}
let write = |region: &mut TerrainRegion<'_, Properties<'_>>,
_: [i32; 3],
_: BlockStateId,
flags: i32|
-> Result<bool, RegionError> {
let chunk = region.chunk_mut(0, 0)?;
match flags {
1 => chunk.set_generation_stage(PreLightChunkStage::Features),
2 => chunk.set_below_zero_retrogen(Some(
BelowZeroRetrogen::new(target, vec![]).unwrap(),
)),
3 => chunk.set_below_zero_retrogen(None),
4 => chunk.set_generation_stage(stage),
_ => {}
}
Ok(true)
};
let mut world = TerrainFeatureAccess::new(&mut region, write)
.with_write_zone(GenerationWriteZone::new(ChunkPos::new(0, 0), 1))
.with_upgrade_center(ChunkPos::new(0, 0))?;
for (x, y, flags) in [
(16, 0, 0),
(16, -1, 1),
(16, 0, 0),
(0, -64, 3),
(16, 0, 2),
(16, 0, 0),
(0, -1, 4),
(16, 0, 0),
(0, -65, 0),
(0, -1, 3),
(16, i32::MAX, 0),
] {
writeln!(
out,
"lifecycle_write {x} {y} {flags} {}",
world.set_block([x, y, 0], stone, flags)?
)?;
}
}
}
}
Ok(())
}
fn run(
f: &Value,
registry: &BlockRegistry,
@@ -172,6 +256,11 @@ fn run(
f["tick_order"].as_i64().unwrap(),
)
.with_block_bindings(bindings)?;
if f["upgrading"].as_bool().unwrap() {
region
.chunk_mut(0, 0)?
.set_below_zero_retrogen(Some(BelowZeroRetrogen::new(ChunkStatus::Features, vec![])?));
}
let blocks = FeatureBlocks::from_registry(registry)?;
let features = f["features"]
.as_array()
@@ -214,16 +303,14 @@ fn run(
writeln!(out, "written {result}").map_err(TerrainError::from)?;
Ok(result)
};
let mut world = TerrainFeatureAccess::new(&mut region, write);
let mut world = TerrainFeatureAccess::new(&mut region, write)
.with_upgrade_center(ChunkPos::new(0, 0))?;
if let Some(zone) = f["write_zone"].as_array() {
world = world.with_write_zone(GenerationWriteZone::new(
ChunkPos::new(n(&zone[0]), n(&zone[1])),
n(&zone[2]),
));
}
if f["upgrading"].as_bool().unwrap() {
world = world.with_upgrade_height(UpgradeWriteHeight::BELOW_ZERO);
}
placer.place_with_context(
&modifiers,
&mut world,
@@ -267,16 +354,14 @@ fn run(
writeln!(out, "written {result}").map_err(TerrainError::from)?;
Ok(result)
};
let mut world = TerrainFeatureAccess::new(&mut region, write);
let mut world = TerrainFeatureAccess::new(&mut region, write)
.with_upgrade_center(ChunkPos::new(0, 0))?;
if let Some(zone) = f["write_zone"].as_array() {
world = world.with_write_zone(GenerationWriteZone::new(
ChunkPos::new(n(&zone[0]), n(&zone[1])),
n(&zone[2]),
));
}
if f["upgrading"].as_bool().unwrap() {
world = world.with_upgrade_height(UpgradeWriteHeight::BELOW_ZERO);
}
world.set_block(
[x, y, 0],
registry.default_state("minecraft:stone").unwrap(),
@@ -499,6 +584,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
UpgradeWriteHeight::BELOW_ZERO.contains(y)
)?;
}
upgrade_lifecycle(&registry, &states, &mut out)?;
for line in fs::read_to_string(dir.join("inputs.txt"))?.lines() {
fixture(
&serde_json::from_str(line)?,
@@ -6,7 +6,7 @@ use super::{
biome_chunk::{BiomeRegion, BiomeRegionError},
feature::FeatureWorld,
placement::{LayerBlock, PlacementContext, PlacementQueryError},
terrain::{PreLightChunkStage, TerrainBlockStates, TerrainChunk, TerrainError},
terrain::{TerrainBlockStates, TerrainChunk, TerrainError},
};
use crate::{
fluid::FluidKind,
@@ -195,7 +195,8 @@ impl<'r, B: TerrainBlockStates> TerrainRegion<'r, B> {
}
/// Level-style biome lookup checks the selected chunk's generation status
/// before reading its palette. Raw biome storage remains independently
/// accessible for generation itself. Below-zero retrogen is not modeled.
/// accessible for generation itself. Retained upgrade status permits reading
/// old biomes before the new generation reaches the biome stage.
pub fn biome_at<'b, T: Clone>(
&self,
biomes: &'b BiomeRegion<T>,
@@ -209,10 +210,7 @@ impl<'r, B: TerrainBlockStates> TerrainRegion<'r, B> {
quart: [i32; 3],
) -> Result<&'b T, RegionError> {
let chunk = self.chunk(quart[0] >> 2, quart[2] >> 2)?;
if !matches!(
chunk.generation_stage(),
PreLightChunkStage::Biomes | PreLightChunkStage::Terrain | PreLightChunkStage::Features
) {
if chunk.highest_generated_status() < crate::chunk_status::ChunkStatus::Biomes {
return Err(RegionError::BiomesNotGenerated([
quart[0] >> 2,
quart[2] >> 2,
@@ -378,7 +376,12 @@ pub struct TerrainFeatureAccess<'a, 'r, B: TerrainBlockStates, F> {
region: &'a mut TerrainRegion<'r, B>,
write: F,
write_zone: Option<super::write_zone::GenerationWriteZone>,
upgrade_height: Option<super::write_zone::UpgradeWriteHeight>,
upgrade_height: UpgradeHeightPolicy,
}
enum UpgradeHeightPolicy {
Unrestricted,
Fixed(super::write_zone::UpgradeWriteHeight),
Center(horizon_core::position::ChunkPos),
}
impl<'a, 'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'a, 'r, B, F> {
pub fn new(region: &'a mut TerrainRegion<'r, B>, write: F) -> Self {
@@ -386,7 +389,7 @@ impl<'a, 'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'a, 'r, B, F> {
region,
write,
write_zone: None,
upgrade_height: None,
upgrade_height: UpgradeHeightPolicy::Unrestricted,
}
}
/// Apply the horizontal write radius before invoking mutation policy/effects.
@@ -394,12 +397,23 @@ impl<'a, 'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'a, 'r, B, F> {
self.write_zone = Some(zone);
self
}
/// Restrict writes to the upgrading center chunk's generation height.
/// The owning lifecycle supplies this only while an upgrade is active.
/// Use an explicit height interval. For live generation lifecycle state,
/// prefer `with_upgrade_center`, which observes changes made by callbacks.
pub fn with_upgrade_height(mut self, height: super::write_zone::UpgradeWriteHeight) -> Self {
self.upgrade_height = Some(height);
self.upgrade_height = UpgradeHeightPolicy::Fixed(height);
self
}
/// Read the resident center chunk's upgrade state before each write. The
/// target chunk's upgrade state does not select the region's write height.
/// Horizontal write radius is configured independently with `with_write_zone`.
pub fn with_upgrade_center(
mut self,
center: horizon_core::position::ChunkPos,
) -> Result<Self, RegionError> {
self.region.chunk(center.x, center.z)?;
self.upgrade_height = UpgradeHeightPolicy::Center(center);
Ok(self)
}
}
impl<'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'_, 'r, B, F>
where
@@ -416,10 +430,18 @@ where
}) {
return Ok(false);
}
if self
.upgrade_height
.is_some_and(|height| !height.contains(position[1]))
{
let height = match self.upgrade_height {
UpgradeHeightPolicy::Unrestricted => None,
UpgradeHeightPolicy::Fixed(height) => Some(height),
UpgradeHeightPolicy::Center(center) => {
let chunk = self.region.chunk(center.x, center.z)?;
chunk.is_upgrading().then(|| {
let (min_y, height) = chunk.height_for_generation();
super::write_zone::UpgradeWriteHeight::new(min_y, height)
})
}
};
if height.is_some_and(|height| !height.contains(position[1])) {
return Ok(false);
}
(self.write)(self.region, position, state, flags)
@@ -251,6 +251,15 @@ impl<'r, B: TerrainBlockStates> TerrainChunk<'r, B> {
pub fn generation_stage(&self) -> PreLightChunkStage {
self.stage
}
/// Retained old terrain may already have completed stages that the new
/// below-zero generation has not reached. Biome reads use this status.
pub fn highest_generated_status(&self) -> crate::chunk_status::ChunkStatus {
self.below_zero_retrogen
.as_ref()
.map_or(self.stage.status(), |data| {
self.stage.status().max(data.target_status())
})
}
/// Changing status alone does not prime or clear any heightmaps. Native
/// persisted-status assignment also permits earlier statuses. Reaching an
/// installed upgrade target clears its metadata; save-dirty tracking is separate.
@@ -290,3 +290,98 @@ fn upgrade_height_rejects_mutations_before_callbacks_but_preserves_reads_and_tic
assert!(world.set_block([0, i32::MAX, 0], stone, 2).unwrap());
assert_eq!(calls.get(), 3);
}
#[test]
fn live_center_upgrade_policy_observes_callback_transitions() {
use horizon_world::{chunk_status::ChunkStatus, retrogen::BelowZeroRetrogen};
let registry = registry();
let mut chunks = Vec::new();
for x in 0..2 {
let mut chunk =
TerrainChunk::new(ChunkPos::new(x, 0), -64, 128, &registry, Properties).unwrap();
chunk.set_below_zero_retrogen(Some(
BelowZeroRetrogen::new(ChunkStatus::Features, vec![]).unwrap(),
));
chunks.push(chunk);
}
let mut region = TerrainRegion::new(chunks, WorldGenerationContext::new(-64, 128, 0)).unwrap();
let mut calls = Vec::new();
{
let write = |region: &mut TerrainRegion<'_, Properties>, p, _, flags| {
calls.push((p, flags));
let center = region.chunk_mut(0, 0)?;
match flags {
1 => center.set_generation_stage(PreLightChunkStage::Features),
2 => center.set_below_zero_retrogen(Some(
BelowZeroRetrogen::new(ChunkStatus::Full, vec![]).unwrap(),
)),
3 => center.set_below_zero_retrogen(None),
_ => {}
}
Ok(true)
};
let mut world = TerrainFeatureAccess::new(&mut region, write)
.with_upgrade_center(ChunkPos::new(0, 0))
.unwrap();
assert!(!world.set_block([16, 0, 0], BlockStateId(2), 1).unwrap());
assert!(world.set_block([16, -1, 0], BlockStateId(2), 1).unwrap());
// The neighbor remains upgrading, but only the center selects the gate.
assert!(world.set_block([16, 0, 0], BlockStateId(2), 2).unwrap());
assert!(!world.set_block([16, 0, 0], BlockStateId(2), 3).unwrap());
assert!(world.set_block([16, -64, 0], BlockStateId(2), 3).unwrap());
assert!(
world
.set_block([16, i32::MAX, 0], BlockStateId(2), 0)
.unwrap()
);
}
assert_eq!(calls.len(), 4);
assert!(!region.chunk(0, 0).unwrap().is_upgrading());
assert!(region.chunk(1, 0).unwrap().is_upgrading());
assert!(
TerrainFeatureAccess::new(&mut region, ())
.with_upgrade_center(ChunkPos::new(2, 0))
.is_err()
);
}
#[test]
fn retained_upgrade_status_allows_old_biome_reads() {
use horizon_world::{
chunk_status::ChunkStatus,
retrogen::BelowZeroRetrogen,
worldgen::biome_chunk::{BiomeChunk, BiomeRegion},
};
let registry = registry();
let position = ChunkPos::new(-1, 1);
let biomes =
BiomeRegion::new(vec![BiomeChunk::new(position, -64, 128, 7).unwrap()], 0).unwrap();
for stage in PreLightChunkStage::ALL {
for target in ChunkStatus::ALL.into_iter().skip(1) {
let mut chunk = TerrainChunk::new(position, -64, 128, &registry, Properties).unwrap();
chunk.set_generation_stage(stage);
chunk.set_below_zero_retrogen(Some(BelowZeroRetrogen::new(target, vec![]).unwrap()));
let mut region =
TerrainRegion::new(vec![chunk], WorldGenerationContext::new(-64, 128, 0)).unwrap();
for y in [i32::MIN, -16, 0, 15, i32::MAX] {
let result = region.noise_biome(&biomes, [-1, y, 4]);
if stage.status() >= ChunkStatus::Biomes || target >= ChunkStatus::Biomes {
assert_eq!(*result.unwrap(), 7);
} else {
assert!(matches!(
result,
Err(RegionError::BiomesNotGenerated([-1, 1]))
));
}
}
region
.chunk_mut(-1, 1)
.unwrap()
.set_below_zero_retrogen(None);
assert_eq!(
region.noise_biome(&biomes, [-1, 0, 4]).is_ok(),
stage.status() >= ChunkStatus::Biomes
);
}
}
}
+27 -3
View File
@@ -852,9 +852,10 @@ matches **29,247,433 lines per reference JAR**, including **10,098 height cases*
actual `WorldGenRegion.ensureCanWrite` with a native ProtoChunk before and after
installing below-zero upgrade data. Direct write probes cover boundary and extreme
heights, ordinary/upgrading modes and horizontal rejection. Five focused Rust
region tests, all-target Clippy and both Python fixture tests pass. Upgrade
activation, target-status cleanup, old-bedrock replacement, hole masking, biome
retention and the complete generation lifecycle remain pending.
region tests, all-target Clippy and both Python fixture tests passed for that
checkpoint. Subsequent work below adds resident upgrade metadata, cleanup,
bedrock transformations and live center-chunk write policy. Automatic upgrade
activation, biome retention and the complete generation lifecycle remain pending.
## Chunk-status identities and metadata
@@ -897,3 +898,26 @@ masking, partial vertical overlap, empty sections and changed generation bounds.
World-crate tests and all-target Clippy pass. Save-dirty notifications, post-light
transitions, biome retention, structure restrictions, automatic generation
scheduling and full saved-world/gameplay integration remain pending.
## Live upgrade permissions and retained biome status
Feature access can bind a resident center chunk and read its upgrade state before
every write. Successful callbacks that complete, remove or reinstall an upgrade
affect the next write through the same access object. The destination chunk's
upgrade state does not select this region-wide height gate. Explicit fixed-height
policies remain available for callers that need a supplied interval.
Resident chunks also expose vanilla's highest generated status: the later of
their current persisted stage and retained upgrade target. Region biome reads use
this status, allowing access to old biomes while below-zero regeneration is still
at an earlier stage. Removing upgrade metadata restores the persisted-stage gate.
The [live region comparison](../benchmarks/rust-live-upgrade-region-2026-10-06/scoped-parity.json)
matches **29,248,297 lines per reference JAR**, extending the 192 resident fixtures
with **54 lifecycle cases**. It compares native write permission, highest status
and actual ProtoChunk biome-read availability across all six pre-light stages and
nine nonempty upgrade targets. The [retained-status comparison](../benchmarks/rust-retained-upgrade-status-2026-10-06/scoped-parity.json)
also matches **3,028,057 lines per JAR** across 138 upgrade fixtures. Seven focused
region tests, all-target Clippy and the region corpus test pass. These checks do
not yet cover the biome resolver's cave-biome retention, structure restrictions,
automatic scheduling or complete saved-world integration.
@@ -40,7 +40,7 @@ public final class VanillaChunkStageOracle {
switch(op) {
case "stage"->{String name=a.get(1).getAsString();chunk.setPersistedStatus(STAGES.get(name));out.println("stage "+name);}
case "upgrade"->{chunk.setBelowZeroRetrogen(a.get(1).isJsonNull()?null:upgrade(a.get(1).getAsString(),a.get(2).getAsJsonArray()));out.println("upgrade");}
case "upgrade_info"->{var data=chunk.getBelowZeroRetrogen();var bounds=chunk.getHeightAccessorForGeneration();out.println("upgrade_info "+chunk.isUpgrading()+" "+(data==null?"none":data.targetStatus().getName())+" "+bounds.getMinY()+" "+bounds.getHeight());}
case "upgrade_info"->{var data=chunk.getBelowZeroRetrogen();var bounds=chunk.getHeightAccessorForGeneration();out.println("upgrade_info "+chunk.isUpgrading()+" "+(data==null?"none":data.targetStatus().getName())+" "+bounds.getMinY()+" "+bounds.getHeight()+" "+chunk.getHighestGeneratedStatus().getName());}
case "replace_bedrock"->{BelowZeroRetrogen.replaceOldBedrock(chunk);out.println("replace_bedrock");}
case "mask"->{upgrade("full",a.get(1).getAsJsonArray()).applyBedrockMask(chunk);out.println("mask");}
case "fill"->{var states=a.get(1).getAsJsonArray();int salt=a.get(2).getAsInt();for(int y=0;y<height;y++)for(int z=0;z<16;z++)for(int x=0;x<16;x++)chunk.setBlockState(new BlockPos((cx<<4)+x,min+y,(cz<<4)+z),Block.stateById(states.get((x+3*y+5*z+salt)%states.size()).getAsInt()),3);out.println("fill");}
@@ -73,6 +73,37 @@ public final class VanillaFeatureRegionOracle {
for(var tag:tags){try{bits.append(world.getBlockState(p).is(TagKey.create(Registries.BLOCK,Identifier.parse(tag)))?'1':'0');}catch(RuntimeException error){bits.append('E');}}
out.println("tags "+bits);
}
private static void upgradeLifecycle(PalettedContainerFactory factory, PrintWriter out)throws ReflectiveOperationException {
var stages=new ChunkStatus[]{ChunkStatus.EMPTY,ChunkStatus.STRUCTURE_STARTS,ChunkStatus.STRUCTURE_REFERENCES,ChunkStatus.BIOMES,ChunkStatus.TERRAIN,ChunkStatus.FEATURES};
var targets=new ChunkStatus[]{ChunkStatus.STRUCTURE_STARTS,ChunkStatus.STRUCTURE_REFERENCES,ChunkStatus.BIOMES,ChunkStatus.TERRAIN,ChunkStatus.FEATURES,ChunkStatus.INITIALIZE_LIGHT,ChunkStatus.LIGHT,ChunkStatus.SPAWN,ChunkStatus.FULL};
for(var stage:stages)for(var target:targets) {
out.println("lifecycle "+stage.getName()+" "+target.getName());
var data=BelowZeroRetrogen.CODEC.parse(JsonOps.INSTANCE,JsonParser.parseString("{\"target_status\":\""+target.getName()+"\"}")).getOrThrow();
var chunks=new ProtoChunk[2];
for(int x=0;x<2;x++) {
var chunk=new ProtoChunk(new ChunkPos(x,0),UpgradeData.EMPTY,LevelHeightAccessor.create(-64,128),factory,null);
chunk.setPersistedStatus(stage);chunk.setBelowZeroRetrogen(data);chunks[x]=chunk;
}
var world=destruction(null);center(world,chunks[0]);setWriteZone(world,0,0,1);
for(int pass=0;pass<2;pass++) {
for(int x=0;x<2;x++) {
boolean readable;try{chunks[x].getNoiseBiome(x*4,Integer.MAX_VALUE,0);readable=true;}catch(IllegalStateException error){readable=false;}
out.println("lifecycle_status "+pass+" "+x+" "+chunks[x].getHighestGeneratedStatus().getName()+" "+readable);
}
if(pass!=0)break;
for(int[] step:new int[][]{{16,0,0},{16,-1,1},{16,0,0},{0,-64,3},{16,0,2},{16,0,0},{0,-1,4},{16,0,0},{0,-65,0},{0,-1,3},{16,Integer.MAX_VALUE,0}}) {
boolean accepted=world.ensureCanWrite(new BlockPos(step[0],step[1],0));
if(accepted)switch(step[2]) {
case 1->chunks[0].setPersistedStatus(ChunkStatus.FEATURES);
case 2->chunks[0].setBelowZeroRetrogen(data);
case 3->chunks[0].setBelowZeroRetrogen(null);
case 4->chunks[0].setPersistedStatus(stage);
}
out.println("lifecycle_write "+step[0]+" "+step[1]+" "+step[2]+" "+accepted);
}
}
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
if(args[0].equals("export")){VanillaHeightmapOracle.main(args);return;}
@@ -110,6 +141,7 @@ public final class VanillaFeatureRegionOracle {
heightChunk.setBelowZeroRetrogen(upgrade);boolean upgrading=zoneWorld.ensureCanWrite(p);
out.println("heightgate "+interval+" "+normal+" "+upgrading);
}
upgradeLifecycle(factory,out);
for(var line:Files.readAllLines(dir.resolve("inputs.txt"))) {
var f=JsonParser.parseString(line).getAsJsonObject();long seed=f.get("seed").getAsLong();
var features=new ArrayList<Feature>();
+2 -2
View File
@@ -120,9 +120,9 @@ def main():
base.ensure_sources_unchanged(sources,tested_sources);base.ensure_sources_unchanged(fixture_paths,tested_fixtures)
report={"schema":1,"minecraft":lock["minecraft"]["version"],"manifest_sha1":lock["minecraft"]["manifest_sha1"],"platform":platform.platform(),
"java":subprocess.check_output(["java","--version"],text=True).splitlines()[0],"rustc":subprocess.check_output(["rustc","--version"],text=True).strip(),
"block_states":len(facts["states"]),"direct_state_probes":sum(len(f["probe_states"]) for f in fixtures),"write_zone_cases":len(zones),"upgrade_height_cases":len(heights),"block_tag_files":len(tags),"fixtures":len(fixtures),"worldgen_random_modes":[False,True],"resident_chunks_per_fixture":9,"requested_placements":sum(len(f["features"])*2 for f in fixtures),"direct_tick_requests":sum(len(f["tick_commands"]) for f in fixtures),
"block_states":len(facts["states"]),"direct_state_probes":sum(len(f["probe_states"]) for f in fixtures),"write_zone_cases":len(zones),"upgrade_height_cases":len(heights),"upgrade_lifecycle_cases":54,"block_tag_files":len(tags),"fixtures":len(fixtures),"worldgen_random_modes":[False,True],"resident_chunks_per_fixture":9,"requested_placements":sum(len(f["features"])*2 for f in fixtures),"direct_tick_requests":sum(len(f["tick_commands"]) for f in fixtures),
"sources_sha256":tested_sources,"fixtures_sha256":tested_fixtures,"rust_output_sha256":lab.digest(build/"rust.txt","sha256"),"references":references,
"scope":"Native FeaturePlacer and three basic block-writing features, a composed sequence of four configured fill layers, single-block replacements, scattered ore and water springs share a world proxy backed by nine actual ProtoChunks. Configured water, horizontal logs, air, out-of-height fills and ore/replacement rules test graph-to-region binding. Initial two-layer stone/dirt terrain, both pre-light heightmap groups, count/square/heightmap/layered modifier chains, repeated placements, direct and WorldgenRandom-wrapped random streams, missing-neighbor errors, rejected writes and injected partial failures are compared. Final complete raw sections, heightmap presence and packed words are compared alongside ordered feature writes, update flags, explicit height queries and subsequent random draws. Rust uses resident registry-backed chunks, lazy heightmap priming and a caller-supplied write callback; imported air/fluid facts and bundled block tags bind independently across authenticated JARs. The proxy supplies storage mutation and actual native default scheduleTick/createTick methods routed through WorldGenTickAccess into each ProtoChunk. Separate block/fluid queues, first-request deduplication, nondefault-state block identity, shared tick-order advancement on duplicates and missing-chunk errors, out-of-height requests and wrapped clock values are compared, including saved queue order and priorities. Active and inactive End podiums additionally exercise native WorldGenRegion.destroyBlock through a subclass transport overriding only block reads and writes; air short-circuit, rejected replacements and write failures retain the generation-time semantics. All block states are also written into resident chunks, queried through feature access, cleared and queried again; contained fluid identity/amount/falling/source/full flags, water-tag membership and every bundled block tag plus an absent tag are compared. Negative coordinates, chunk edges, outside-height and absent chunks are covered. Block/fluid query bindings are an immutable registry-checked shared snapshot. The native horizontal write-zone predicate is compared separately across chunk/block coordinates, negative radii and wrapped subtraction/absolute-value extremes, and gates feature callbacks in selected fixtures. Actual WorldGenRegion.ensureCanWrite also checks the center proto-chunk before/after installing native below-zero retrogen data, with extreme and boundary heights; the generic height interval is independently compared against LevelHeightAccessor. Region feature callbacks and direct accepted/rejected write probes apply the upgrade height before mutation. Retrogen activation remains caller-owned. Actual WorldGenRegion construction, full retrogen replacement/masking and biome behavior, POIs, block entities, postprocessing execution, lighting, block/fluid tick execution, complete feature registries and complete world generation remain outside this comparison."}
"scope":"Native FeaturePlacer and three basic block-writing features, a composed sequence of four configured fill layers, single-block replacements, scattered ore and water springs share a world proxy backed by nine actual ProtoChunks. Configured water, horizontal logs, air, out-of-height fills and ore/replacement rules test graph-to-region binding. Initial two-layer stone/dirt terrain, both pre-light heightmap groups, count/square/heightmap/layered modifier chains, repeated placements, direct and WorldgenRandom-wrapped random streams, missing-neighbor errors, rejected writes and injected partial failures are compared. Final complete raw sections, heightmap presence and packed words are compared alongside ordered feature writes, update flags, explicit height queries and subsequent random draws. Rust uses resident registry-backed chunks, lazy heightmap priming and a caller-supplied write callback; imported air/fluid facts and bundled block tags bind independently across authenticated JARs. The proxy supplies storage mutation and actual native default scheduleTick/createTick methods routed through WorldGenTickAccess into each ProtoChunk. Separate block/fluid queues, first-request deduplication, nondefault-state block identity, shared tick-order advancement on duplicates and missing-chunk errors, out-of-height requests and wrapped clock values are compared, including saved queue order and priorities. Active and inactive End podiums additionally exercise native WorldGenRegion.destroyBlock through a subclass transport overriding only block reads and writes; air short-circuit, rejected replacements and write failures retain the generation-time semantics. All block states are also written into resident chunks, queried through feature access, cleared and queried again; contained fluid identity/amount/falling/source/full flags, water-tag membership and every bundled block tag plus an absent tag are compared. Negative coordinates, chunk edges, outside-height and absent chunks are covered. Block/fluid query bindings are an immutable registry-checked shared snapshot. The native horizontal write-zone predicate is compared separately across chunk/block coordinates, negative radii and wrapped subtraction/absolute-value extremes, and gates feature callbacks in selected fixtures. Actual WorldGenRegion.ensureCanWrite also checks the center proto-chunk before/after installing native below-zero retrogen data, with extreme and boundary heights; the generic height interval is independently compared against LevelHeightAccessor. Region feature callbacks and direct accepted/rejected write probes apply the upgrade height before mutation. The Rust access object now reads live center-chunk retrogen metadata before each write. Fifty-four lifecycle cases pair all six pre-light stages with all nine nonempty upgrade targets; one access object observes target-completion cleanup, explicit removal, reinstallation and backward stage changes from accepted write callbacks. Neighbor upgrade state is independent. Actual native highest-generated status and ProtoChunk biome-read availability are compared before and after those sequences, including clamped extreme quart Y. Retrogen activation and the world write effects remain caller-owned. Actual WorldGenRegion construction, full retrogen biome resolution, POIs, block entities, postprocessing execution, lighting, block/fluid tick execution, complete feature registries and complete world generation remain outside this comparison."}
lab.write_json(report_path,report);print(f"Scoped feature-region parity passed: {report_path}")
+1 -1
View File
@@ -89,7 +89,7 @@ def main():
"java":subprocess.check_output(["java","--version"],text=True).splitlines()[0],"rustc":subprocess.check_output(["rustc","--version"],text=True).strip(),
"block_states":len(facts["states"]),"block_tag_files":len(tags),"fixtures":len(fixtures),"operation_counts":dict(Counter(op[0] for fixture in fixtures for op in fixture["ops"])),
"sources_sha256":tested_sources,"fixtures_sha256":tested_fixtures,"rust_output_sha256":lab.digest(build/"rust.txt","sha256"),"references":references,
"scope":"Native ProtoChunk below-zero metadata installation/removal, pre-light persisted-stage assignments and target completion cleanup, normal/upgrading generation heights, actual BelowZeroRetrogen.replaceOldBedrock and applyBedrockMask. Mixed resident states, legacy five-layer bedrock bands, signed/chunk-relative coordinates, partial vertical overlap, masks with empty/single/sparse/all/out-of-footprint bits, repeated operations, preprimed/stale/missing heightmaps, and clearing under changed generation bounds are compared. Complete raw sections and selected packed heightmaps are checked after each mutation phase. All nine nonempty targets are paired with all six pre-light stages, including installation after an already-advanced status, repeated assignments, backward transitions and explicit removal. Data codecs have a separate comparison. Save-dirty notifications, post-light stages, structure restrictions, biome retention, automatic generation scheduling and complete world/gameplay parity remain outside this comparison."}
"scope":"Native ProtoChunk below-zero metadata installation/removal, pre-light persisted-stage assignments and target completion cleanup, normal/upgrading generation heights, highest-generated status from retained targets versus current persisted stages, actual BelowZeroRetrogen.replaceOldBedrock and applyBedrockMask. Mixed resident states, legacy five-layer bedrock bands, signed/chunk-relative coordinates, partial vertical overlap, masks with empty/single/sparse/all/out-of-footprint bits, repeated operations, preprimed/stale/missing heightmaps, and clearing under changed generation bounds are compared. Complete raw sections and selected packed heightmaps are checked after each mutation phase. All nine nonempty targets are paired with all six pre-light stages, including installation after an already-advanced status, repeated assignments, backward transitions and explicit removal. Data codecs have a separate comparison. Save-dirty notifications, post-light stages, structure restrictions, biome retention, automatic generation scheduling and complete world/gameplay parity remain outside this comparison."}
lab.write_json(report_path,report);print(f"Scoped retrogen-chunk parity passed: {report_path}")