mirror of
https://github.com/horizon-rust/horizon.git
synced 2026-11-07 02:56:17 -10:00
Enforce generation write heights during below-zero upgrades
This commit is contained in:
1 parent
e755a5920a
commit
b1505adc54
9 files changed
+402
-8
No files matched your search
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"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,
|
||||
"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": "4ee4d485771cfaf8313aa57032ca38727d8e7c97a109a24319bfc4f63d599a23",
|
||||
"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": "16c308731788d69676669afc9289a235b44f3c5e1c62b04deba799c4a6d1f745",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/test_worldgen_parity.py": "b40972ab2ad222aa6d77537cc36b434a217baa1f1b56bbaad945d6e12fe776af",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "dc370d5fdde37238c3e4820046f11c3201020406a4edfa1308257c13edbdcda4",
|
||||
"Cargo.lock": "7307d0c887364db36d327685ecf0671b75305e31e5ba5fbdcdbb15eaf156d20e",
|
||||
"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/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": "4e556a5896b893fbb73bf2e2b8e70601a8374f58b9f4f5f3730e99916a846e3a",
|
||||
"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/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": "18d51343c00ad3a551d02f6ddfa37d1be23d481e1861ce6299d0a66991bc7074",
|
||||
"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": "b8fb9fb80a66a851d916f07f15df1a40b6cc95b49e71aaec4d4b4107f13d9f9f",
|
||||
"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": "e45a2b5ddb147b8783fe3ba71ea533d50c86609b03e610ad25b4a215ca1ef371"
|
||||
},
|
||||
"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": "91ae8c67dae0e0de2d6ada1c36f154a5df73feb07e4bc3af8a09d2062a04e859",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "91ae8c67dae0e0de2d6ada1c36f154a5df73feb07e4bc3af8a09d2062a04e859",
|
||||
"matched_output_lines": 29247433
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "91ae8c67dae0e0de2d6ada1c36f154a5df73feb07e4bc3af8a09d2062a04e859",
|
||||
"matched_output_lines": 29247433
|
||||
}
|
||||
],
|
||||
"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."
|
||||
}
|
||||
@@ -2,12 +2,12 @@ use horizon_core::random::{LegacyRandom, RandomSource, WorldgenRandom, Xoroshiro
|
||||
use horizon_world::worldgen::{
|
||||
anchor::WorldGenerationContext,
|
||||
block_feature::FeatureBlockBindings,
|
||||
feature::FeatureBlocks,
|
||||
feature::{FeatureBlocks, FeatureWorld},
|
||||
feature_graph::FeatureDefinition,
|
||||
feature_region::{RegionError, TerrainFeatureAccess, TerrainRegion},
|
||||
placement::{FeaturePlacer, PlacementContext, PlacementModifier},
|
||||
terrain::TerrainError,
|
||||
write_zone::GenerationWriteZone,
|
||||
write_zone::{GenerationWriteZone, UpgradeWriteHeight},
|
||||
};
|
||||
// Feature chains against a resident multi-chunk region.
|
||||
use horizon_core::position::ChunkPos;
|
||||
@@ -221,6 +221,9 @@ fn run(
|
||||
n(&zone[2]),
|
||||
));
|
||||
}
|
||||
if f["upgrading"].as_bool().unwrap() {
|
||||
world = world.with_upgrade_height(UpgradeWriteHeight::BELOW_ZERO);
|
||||
}
|
||||
placer.place_with_context(
|
||||
&modifiers,
|
||||
&mut world,
|
||||
@@ -247,6 +250,42 @@ fn run(
|
||||
}
|
||||
writeln!(out, "repeat {repeat}")?;
|
||||
}
|
||||
for y in [i32::MIN, -65, -64, -63, -1, 0, 1, 319, 320, i32::MAX] {
|
||||
for x in [0, 16] {
|
||||
let result = {
|
||||
let write = |region: &mut TerrainRegion<'_, Properties<'_>>,
|
||||
p: [i32; 3],
|
||||
state: BlockStateId,
|
||||
flags: i32|
|
||||
-> Result<bool, RegionError> {
|
||||
writeln!(out, "write {} {} {} {} {flags}", p[0], p[1], p[2], state.0)
|
||||
.map_err(TerrainError::from)?;
|
||||
let result = reject == 0;
|
||||
if result {
|
||||
region.set_block_worldgen(p, state)?;
|
||||
}
|
||||
writeln!(out, "written {result}").map_err(TerrainError::from)?;
|
||||
Ok(result)
|
||||
};
|
||||
let mut world = TerrainFeatureAccess::new(&mut region, write);
|
||||
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(),
|
||||
2,
|
||||
)?
|
||||
};
|
||||
writeln!(out, "heightwrite {x} {y} {result}")?;
|
||||
}
|
||||
}
|
||||
for command in f["tick_commands"].as_array().unwrap() {
|
||||
let kind = command[0].as_str().unwrap();
|
||||
let id = n(&command[1]) as u32;
|
||||
@@ -450,6 +489,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
zone.contains_block(horizon_core::position::BlockPos::new(x, i32::MIN, z))
|
||||
)?;
|
||||
}
|
||||
let heights: Value = serde_json::from_str(&fs::read_to_string(dir.join("heights.json"))?)?;
|
||||
for row in heights.as_array().unwrap() {
|
||||
let y = n(&row[2]);
|
||||
writeln!(
|
||||
out,
|
||||
"heightgate {} true {}",
|
||||
UpgradeWriteHeight::new(n(&row[0]), n(&row[1])).contains(y),
|
||||
UpgradeWriteHeight::BELOW_ZERO.contains(y)
|
||||
)?;
|
||||
}
|
||||
for line in fs::read_to_string(dir.join("inputs.txt"))?.lines() {
|
||||
fixture(
|
||||
&serde_json::from_str(line)?,
|
||||
|
||||
@@ -378,6 +378,7 @@ 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>,
|
||||
}
|
||||
impl<'a, 'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'a, 'r, B, F> {
|
||||
pub fn new(region: &'a mut TerrainRegion<'r, B>, write: F) -> Self {
|
||||
@@ -385,14 +386,20 @@ impl<'a, 'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'a, 'r, B, F> {
|
||||
region,
|
||||
write,
|
||||
write_zone: None,
|
||||
upgrade_height: None,
|
||||
}
|
||||
}
|
||||
/// Apply the horizontal write radius before invoking mutation policy/effects.
|
||||
/// Upgrading-world vertical restrictions remain the owning world's policy.
|
||||
pub fn with_write_zone(mut self, zone: super::write_zone::GenerationWriteZone) -> Self {
|
||||
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.
|
||||
pub fn with_upgrade_height(mut self, height: super::write_zone::UpgradeWriteHeight) -> Self {
|
||||
self.upgrade_height = Some(height);
|
||||
self
|
||||
}
|
||||
}
|
||||
impl<'r, B: TerrainBlockStates, F> TerrainFeatureAccess<'_, 'r, B, F>
|
||||
where
|
||||
@@ -409,6 +416,12 @@ where
|
||||
}) {
|
||||
return Ok(false);
|
||||
}
|
||||
if self
|
||||
.upgrade_height
|
||||
.is_some_and(|height| !height.contains(position[1]))
|
||||
{
|
||||
return Ok(false);
|
||||
}
|
||||
(self.write)(self.region, position, state, flags)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,3 +20,26 @@ impl GenerationWriteZone {
|
||||
self.contains_chunk(position.chunk())
|
||||
}
|
||||
}
|
||||
|
||||
/// The center chunk's generation height while an upgrade is active. Normal
|
||||
/// generation has no vertical write-policy gate (storage bounds are separate).
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub struct UpgradeWriteHeight {
|
||||
min_y: i32,
|
||||
max_y: i32,
|
||||
}
|
||||
impl UpgradeWriteHeight {
|
||||
pub const BELOW_ZERO: Self = Self {
|
||||
min_y: -64,
|
||||
max_y: -1,
|
||||
};
|
||||
pub fn new(min_y: i32, height: i32) -> Self {
|
||||
Self {
|
||||
min_y,
|
||||
max_y: min_y.wrapping_add(height).wrapping_sub(1),
|
||||
}
|
||||
}
|
||||
pub fn contains(self, y: i32) -> bool {
|
||||
y >= self.min_y && y <= self.max_y
|
||||
}
|
||||
}
|
||||
@@ -243,3 +243,50 @@ fn query_bindings_reject_foreign_registries_and_preserve_resolved_tag_snapshot()
|
||||
assert!(region.water_at([-1, 16, 0]).unwrap());
|
||||
assert!(region.fluid_state([0, 0, 0]).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upgrade_height_rejects_mutations_before_callbacks_but_preserves_reads_and_ticks() {
|
||||
use horizon_world::worldgen::write_zone::{GenerationWriteZone, UpgradeWriteHeight};
|
||||
use std::cell::Cell;
|
||||
let registry = registry();
|
||||
let mut chunk =
|
||||
TerrainChunk::new(ChunkPos::new(0, 0), -64, 128, ®istry, Properties).unwrap();
|
||||
let stone = registry.default_state("minecraft:stone").unwrap();
|
||||
chunk.set_block_worldgen(0, 0, 0, stone).unwrap();
|
||||
let mut region =
|
||||
TerrainRegion::new(vec![chunk], WorldGenerationContext::new(-64, 128, 0)).unwrap();
|
||||
let calls = Cell::new(0);
|
||||
{
|
||||
let write = |region: &mut TerrainRegion<'_, Properties>, p, state, _| {
|
||||
calls.set(calls.get() + 1);
|
||||
region.set_block_worldgen(p, state)?;
|
||||
Ok(true)
|
||||
};
|
||||
let mut world = TerrainFeatureAccess::new(&mut region, write)
|
||||
.with_write_zone(GenerationWriteZone::new(ChunkPos::new(0, 0), 0))
|
||||
.with_upgrade_height(UpgradeWriteHeight::BELOW_ZERO);
|
||||
assert!(!world.set_block([0, 0, 0], stone, 2).unwrap());
|
||||
assert!(!world.destroy_block_without_entity([0, 0, 0], true).unwrap());
|
||||
assert!(!world.set_block([0, -65, 0], stone, 2).unwrap());
|
||||
assert!(!world.set_block([16, -1, 0], stone, 2).unwrap());
|
||||
assert_eq!(calls.get(), 0);
|
||||
assert_eq!(world.block_state([0, 0, 0]).unwrap(), stone);
|
||||
world.schedule_block_tick([0, 0, 0], stone, 1).unwrap();
|
||||
assert!(world.set_block([0, -1, 0], stone, 2).unwrap());
|
||||
assert!(
|
||||
world
|
||||
.destroy_block_without_entity([0, -1, 0], true)
|
||||
.unwrap()
|
||||
);
|
||||
assert_eq!(calls.get(), 2);
|
||||
}
|
||||
assert_eq!(region.block([0, 0, 0]).unwrap(), stone);
|
||||
assert_eq!(region.chunk(0, 0).unwrap().block_ticks().count(), 1);
|
||||
let write = |_: &mut TerrainRegion<'_, Properties>, _, _, _| {
|
||||
calls.set(calls.get() + 1);
|
||||
Ok(true)
|
||||
};
|
||||
let mut world = TerrainFeatureAccess::new(&mut region, write);
|
||||
assert!(world.set_block([0, i32::MAX, 0], stone, 2).unwrap());
|
||||
assert_eq!(calls.get(), 3);
|
||||
}
|
||||
@@ -833,3 +833,21 @@ all-target Clippy pass. Collection order is normalized; Rust exposes borrowed or
|
||||
owned data instead of unrestricted Java aliases. Entity construction from NBT,
|
||||
complete serializers, active entity behavior and resident chunk lifecycle
|
||||
integration remain pending.
|
||||
|
||||
## Upgrading-world write heights
|
||||
|
||||
Feature access can now enforce the upgrading center chunk's generation height
|
||||
before invoking its write callback. Below-zero proto-chunk upgrades use Y = -64
|
||||
through -1, inclusive. Ordinary generation has no vertical policy gate; storage
|
||||
bounds remain separate. Reads and tick scheduling keep their existing behavior,
|
||||
and generation-time destruction shares the write guard.
|
||||
|
||||
The [upgrade-height comparison](../benchmarks/rust-feature-region-upgrade-height-2026-10-06/scoped-parity.json)
|
||||
matches **29,247,433 lines per reference JAR**, including **10,098 height cases**,
|
||||
20,125 horizontal zone cases and all 192 resident fixtures. The reference calls
|
||||
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.
|
||||
@@ -42,6 +42,10 @@ public final class VanillaFeatureRegionOracle {
|
||||
String[] names={"centerChunkX","centerChunkZ","writeRadius"};int[] values={x,z,radius};
|
||||
for(int i=0;i<names.length;i++){var field=net.minecraft.server.level.WorldGenRegion.class.getDeclaredField(names[i]);field.setAccessible(true);field.setInt(world,values[i]);}
|
||||
}
|
||||
private static void center(NativeDestruction world,ProtoChunk chunk)throws ReflectiveOperationException {
|
||||
var field=net.minecraft.server.level.WorldGenRegion.class.getDeclaredField("center");field.setAccessible(true);field.set(world,chunk);
|
||||
}
|
||||
private static BelowZeroRetrogen retrogen(){return BelowZeroRetrogen.CODEC.parse(JsonOps.INSTANCE,JsonParser.parseString("{\"target_status\":\"minecraft:features\"}")).getOrThrow();}
|
||||
private static ProtoChunk chunk(Map<ChunkPos,ProtoChunk> chunks,int x,int z) {
|
||||
var chunk=chunks.get(new ChunkPos(x>>4,z>>4));if(chunk==null)throw new IllegalArgumentException("missing region chunk");return chunk;
|
||||
}
|
||||
@@ -96,6 +100,16 @@ public final class VanillaFeatureRegionOracle {
|
||||
var row=value.getAsJsonArray();setWriteZone(zoneWorld,row.get(0).getAsInt(),row.get(1).getAsInt(),row.get(2).getAsInt());
|
||||
int x=row.get(3).getAsInt(),z=row.get(4).getAsInt();out.println("zone "+chunkZone.invoke(zoneWorld,x,z)+" "+zoneWorld.isWithinWriteZone(new BlockPos(x,Integer.MIN_VALUE,z)));
|
||||
}
|
||||
var heightChunk=new ProtoChunk(new ChunkPos(0,0),UpgradeData.EMPTY,LevelHeightAccessor.create(-64,384),factory,null);
|
||||
center(zoneWorld,heightChunk);setWriteZone(zoneWorld,0,0,0);
|
||||
var upgrade=retrogen();
|
||||
for(var value:JsonParser.parseString(Files.readString(dir.resolve("heights.json"))).getAsJsonArray()) {
|
||||
var row=value.getAsJsonArray();int y=row.get(2).getAsInt();var p=new BlockPos(0,y,0);
|
||||
boolean interval=LevelHeightAccessor.create(row.get(0).getAsInt(),row.get(1).getAsInt()).isInsideBuildHeight(y);
|
||||
heightChunk.setBelowZeroRetrogen(null);boolean normal=zoneWorld.ensureCanWrite(p);
|
||||
heightChunk.setBelowZeroRetrogen(upgrade);boolean upgrading=zoneWorld.ensureCanWrite(p);
|
||||
out.println("heightgate "+interval+" "+normal+" "+upgrading);
|
||||
}
|
||||
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>();
|
||||
@@ -139,6 +153,7 @@ public final class VanillaFeatureRegionOracle {
|
||||
case "setBlock"->{
|
||||
var p=(BlockPos)values[0];var state=(BlockState)values[1];int flags=(Integer)values[2];
|
||||
if(!f.get("write_zone").isJsonNull()&&!destroyer[0].isWithinWriteZone(p))yield false;
|
||||
if(!destroyer[0].ensureCanWrite(p))yield false;
|
||||
out.println("write "+p.getX()+" "+p.getY()+" "+p.getZ()+" "+Block.getId(state)+" "+flags);
|
||||
int call=calls[0]++;if(call==fail)throw new IllegalArgumentException("injected write failure");
|
||||
boolean result=reject==0||call%reject!=0;
|
||||
@@ -148,6 +163,9 @@ public final class VanillaFeatureRegionOracle {
|
||||
default->throw new AssertionError("unexpected world method "+method);
|
||||
});
|
||||
destroyer[0]=destruction(world);
|
||||
var centerChunk=chunks.get(new ChunkPos(0,0));
|
||||
if(f.get("upgrading").getAsBoolean())centerChunk.setBelowZeroRetrogen(upgrade);
|
||||
center(destroyer[0],centerChunk);setWriteZone(destroyer[0],0,0,Integer.MAX_VALUE);
|
||||
if(!f.get("write_zone").isJsonNull()){var zone=f.getAsJsonArray("write_zone");setWriteZone(destroyer[0],zone.get(0).getAsInt(),zone.get(1).getAsInt(),zone.get(2).getAsInt());}
|
||||
var modifiers=new ArrayList<PlacementModifier>();for(var value:f.getAsJsonArray("placement"))modifiers.add(PlacementModifier.CODEC.parse(JsonOps.INSTANCE,value).getOrThrow());
|
||||
var placer=new FeaturePlacer(world,generator);
|
||||
@@ -160,6 +178,10 @@ public final class VanillaFeatureRegionOracle {
|
||||
}
|
||||
out.println("repeat "+repeat);
|
||||
}
|
||||
for(int y:new int[]{Integer.MIN_VALUE,-65,-64,-63,-1,0,1,319,320,Integer.MAX_VALUE})for(int x:new int[]{0,16}) {
|
||||
calls[0]=0;boolean result=world.setBlock(new BlockPos(x,y,0),Blocks.STONE.defaultBlockState(),2);
|
||||
out.println("heightwrite "+x+" "+y+" "+result);
|
||||
}
|
||||
for(var raw:f.getAsJsonArray("tick_commands")){
|
||||
var command=raw.getAsJsonArray();String kind=command.get(0).getAsString();int id=command.get(1).getAsInt();var xyz=command.get(2).getAsJsonArray();var p=new BlockPos(xyz.get(0).getAsInt(),xyz.get(1).getAsInt(),xyz.get(2).getAsInt());int delay=command.get(3).getAsInt();
|
||||
out.println("tickrequest "+kind+" "+id);
|
||||
|
||||
@@ -15,6 +15,7 @@ class FeatureRegionCorpusTests(unittest.TestCase):
|
||||
self.assertTrue(all(any(v['type'] == 'spring_feature' for v in f['features']) for f in fixtures))
|
||||
self.assertTrue(all([v['active'] for v in f['features'] if v['type'] == 'end_podium'] == [False, True] for f in fixtures))
|
||||
self.assertEqual({None if f['write_zone'] is None else tuple(f['write_zone']) for f in fixtures}, {None, (0, 0, 0), (1, 1, 0), (-1, -1, 1), (0, 0, -1)})
|
||||
self.assertEqual({f['upgrading'] for f in fixtures}, {False, True})
|
||||
self.assertEqual({f['worldgen'] for f in fixtures}, {False, True})
|
||||
self.assertEqual({f['legacy'] for f in fixtures}, {False, True})
|
||||
self.assertEqual({f['stage'] for f in fixtures}, {'empty', 'terrain'})
|
||||
|
||||
@@ -49,7 +49,7 @@ def corpus(facts):
|
||||
for reject in [0,3]:
|
||||
for placement in chains:
|
||||
for worldgen in [False,True]:
|
||||
yield {'write_zone':[None,[0,0,0],[1,1,0],[-1,-1,1],[0,0,-1]][fixture_index%5],'probe_states':list(range(fixture_index,len(facts['states']),192)),'worldgen':worldgen,'legacy':legacy,'seed':seed,'stage':stage,'fail':fail,'reject':reject,'placement':placement,'features':features,'tick_commands':ticks,'game_time':9223372036854775807 if worldgen else -9223372036854775808,'tick_order':9223372036854775803 if legacy else -9223372036854775808}
|
||||
yield {'upgrading':fixture_index%3==0,'write_zone':[None,[0,0,0],[1,1,0],[-1,-1,1],[0,0,-1]][fixture_index%5],'probe_states':list(range(fixture_index,len(facts['states']),192)),'worldgen':worldgen,'legacy':legacy,'seed':seed,'stage':stage,'fail':fail,'reject':reject,'placement':placement,'features':features,'tick_commands':ticks,'game_time':9223372036854775807 if worldgen else -9223372036854775808,'tick_order':9223372036854775803 if legacy else -9223372036854775808}
|
||||
fixture_index+=1
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ def main():
|
||||
tested_sources=base.source_hashes(sources)
|
||||
classes=build/"classes";classes.mkdir(exist_ok=True)
|
||||
def run(command,name):
|
||||
with (build/(name+".log")).open("w",encoding="utf-8") as log:base.run(list(map(str,command)),stdout=log,stderr=subprocess.STDOUT)
|
||||
with (build/(name+".log")).open("w",encoding="utf-8") as log:subprocess.run(list(map(str,command)),cwd=lab.ROOT,check=True,timeout=3600,stdout=log,stderr=subprocess.STDOUT)
|
||||
dependency_path=os.pathsep.join(map(str,libraries))
|
||||
run(["javac","--release",lock["minecraft"]["java_major"],"-proc:none","-cp",str(jars["server"])+os.pathsep+dependency_path,"-d",classes,oracle,helper,placement_helper],"compile-java")
|
||||
def java(side,mode,path):
|
||||
@@ -100,7 +100,12 @@ def main():
|
||||
rng=random.Random(0x574f524c445a4f4e45)
|
||||
for _ in range(10000):zones.append([rng.randrange(-2**31,2**31) for _ in range(5)])
|
||||
zone_inputs=build/'zones.json';zone_inputs.write_text(json.dumps(zones,separators=(',',':')))
|
||||
fixture_paths=[zone_inputs,inputs,build/"tags.json",build/"fluid-tags.json",build/"facts-client.json",build/"facts-server.json"]
|
||||
heights=[]
|
||||
for min_y,height in [(-64,64),(-64,384),(0,256),(2147483647,1),(-2147483648,0),(0,-1),(-2147483648,-1)]:
|
||||
for y in [-2147483648,-2147483647,-65,-64,-63,-1,0,1,255,256,319,320,2147483646,2147483647]:heights.append([min_y,height,y])
|
||||
for _ in range(10000):heights.append([rng.randrange(-2**31,2**31) for _ in range(3)])
|
||||
height_inputs=build/'heights.json';height_inputs.write_text(json.dumps(heights,separators=(',',':')))
|
||||
fixture_paths=[height_inputs,zone_inputs,inputs,build/"tags.json",build/"fluid-tags.json",build/"facts-client.json",build/"facts-server.json"]
|
||||
tested_fixtures=base.source_hashes(fixture_paths)
|
||||
run(["cargo","build","--release","-p","horizon-world","--example","feature_region_fixture"],"compile-rust")
|
||||
metadata=json.loads(subprocess.check_output(["cargo","metadata","--no-deps","--format-version","1"],cwd=lab.ROOT,text=True))
|
||||
@@ -115,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),"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),"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 construction, upgrading-world vertical write restrictions, 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. 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."}
|
||||
|
||||
lab.write_json(report_path,report);print(f"Scoped feature-region parity passed: {report_path}")
|
||||
|
||||
|
||||
Reference in new issue
Block a user