Synchronize registered effect particles, invisibility and glowing state
This commit is contained in:
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"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)",
|
||||
"fixtures": 16004,
|
||||
"registered_effects": 40,
|
||||
"constant_factories": 6,
|
||||
"fastutil_sha256": {
|
||||
".local/minecraft/26.3/libraries/server/it/unimi/dsi/fastutil/8.5.18/fastutil-8.5.18.jar": "9094ae67d01d0ad246f886f11ad557fc2e79c72cbf3feed83e1512a8ae90a74a"
|
||||
},
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaEffectSyncOracle.java": "902874b424adb4e7d6513e7ef155118f1e5cfe79714cadb57780c20c6c27fc8b",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaEffectParticlesOracle.java": "1905f08ef1419e5216ef606bfb4ec54315cd51b5b57f63017df675911ecc2159",
|
||||
"tools/test_effect_sync_parity.py": "c6f2287a192e26e222e8d283e17e1f7e19a4b49e4a91e4859057e7eab723b4c2",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"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/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"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": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"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/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"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/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "2beafc1d0c8c1097ab2d8088c5cc2558b2664e43f5a57c563e19a5227dab9509",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "79ecb6b4d7a044dc98e5552c53a5ac2724545b1c1cec4d797eb52576728e3480",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "a9743971581af86d926eeba42004d932caf83382c470dd98bf613cb9c417db58",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "828a4649fec3e9bda2dfe20aced8c95922c697321de2be4127bd4e5712ecbb7c",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"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": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"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": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"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/effect_sync_fixture.rs": "136ab405a6c6c48917d7c64a99c355fdef20bd4ef5a30ed189c9e893a9202b57"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-effect-sync-parity/inputs.txt": "6eed505f2525c3d4caeffa6c76c3bd9a24345ef943887fe53fb55542341896f4",
|
||||
".local/rust-effect-sync-parity/catalog.json": "2b730e565607d129893554ca3eeeacbf0e62642f10b5d8c63fa9006d0a32325e",
|
||||
".local/rust-effect-sync-parity/catalog-client.json": "aea19525e4604710fad3b0a9c7ce60deb625f76cd89f63106377bf454fc82d30",
|
||||
".local/rust-effect-sync-parity/catalog-server.json": "aea19525e4604710fad3b0a9c7ce60deb625f76cd89f63106377bf454fc82d30",
|
||||
".local/rust-effect-sync-parity/inputs-client.txt": "7e8f8c784b7311546044ab1bd630d1f6e3c597291879f82c23b36f0b02020a01",
|
||||
".local/rust-effect-sync-parity/inputs-server.txt": "7e8f8c784b7311546044ab1bd630d1f6e3c597291879f82c23b36f0b02020a01"
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "77a362132ddd1e1ceed64a60cca065011295f8eeadad128e2b68a0fd71b7862b",
|
||||
"matched_output_lines": 2754744,
|
||||
"rust_output_sha256": "77a362132ddd1e1ceed64a60cca065011295f8eeadad128e2b68a0fd71b7862b"
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "77a362132ddd1e1ceed64a60cca065011295f8eeadad128e2b68a0fd71b7862b",
|
||||
"matched_output_lines": 2754744,
|
||||
"rust_output_sha256": "77a362132ddd1e1ceed64a60cca065011295f8eeadad128e2b68a0fd71b7862b"
|
||||
}
|
||||
],
|
||||
"scope": "Inherited native LivingEntity effect particle/invisibility/glowing synchronization, dirty clearing, Entity shared byte flags and actual SynchedEntityData mixed byte/boolean/particle-list storage. All 40 registered effects use exporter-checked inherited pure factories: fresh identity-bearing colored options or registry-constant simple options. Tests active-map order, particle option identities/list equality, ambient/visible flags, server/client glowing branches, repeated virtual lookups, captured data objects, reentrant data packing/writes, callback map mutations and failure prefixes. Replays each JVM holder hashes/identities. Custom impure particle factories, particle rendering/transport, full effect tick integration and complete gameplay/platform builds remain outside this gate."
|
||||
}
|
||||
@@ -0,0 +1,307 @@
|
||||
{
|
||||
"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)",
|
||||
"fixtures": 7842,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaSyncedBytesOracle.java": "db5fd583900168ee962dec3d1712d1bd4c2e300b10fda0e880427805345e039b",
|
||||
"tools/test_synced_bytes_parity.py": "506e437e8a3d2fe1993acb68d52765cf599d793e41be177692e5669f92e3ae52",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"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/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"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": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"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/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"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/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "2beafc1d0c8c1097ab2d8088c5cc2558b2664e43f5a57c563e19a5227dab9509",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "79ecb6b4d7a044dc98e5552c53a5ac2724545b1c1cec4d797eb52576728e3480",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "a9743971581af86d926eeba42004d932caf83382c470dd98bf613cb9c417db58",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "828a4649fec3e9bda2dfe20aced8c95922c697321de2be4127bd4e5712ecbb7c",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"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": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"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": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"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/synced_bytes_fixture.rs": "3f422e3a1dcb6815cf90a765ad3d42a2126352523a8b5d369249e8809c688b2d"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-synced-bytes-parity/inputs.txt": "114892687b60fa881c44ef391250db430852e4f221bc28406983c204dbf00364"
|
||||
},
|
||||
"rust_output_sha256": "0faa1e20a530ac978ebb54b68731242ce7212aee21bb4c5c3782e79a11dcbdf4",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "0faa1e20a530ac978ebb54b68731242ce7212aee21bb4c5c3782e79a11dcbdf4",
|
||||
"matched_output_lines": 572100
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "0faa1e20a530ac978ebb54b68731242ce7212aee21bb4c5c3782e79a11dcbdf4",
|
||||
"matched_output_lines": 572100
|
||||
}
|
||||
],
|
||||
"scope": "Actual byte SynchedEntityData values and inherited LivingEntity using-item/offhand queries plus protected flag writes. Covers every initial byte, signed masks, ordered dirty/default output, assignment, reentrant flag/data writes, callback packing and failures before dirty marking. Rust shares a typed scalar implementation with existing synchronized floats. Heterogeneous serializer maps, entity schema/network codecs and full item-use/gameplay integration remain pending."
|
||||
}
|
||||
@@ -0,0 +1,307 @@
|
||||
{
|
||||
"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)",
|
||||
"fixtures": 3019,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaSyncedFloatsOracle.java": "567a871ed82ad0c0d1fef6f84cc2a68732ddae9110a9926c659af77933c6f61d",
|
||||
"tools/test_synced_floats_parity.py": "64a2a3ef6c4ab63fcfd18fb3cd0442e2bbe2249481cbf7899aeadb3b6b61256f",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"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/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"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": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"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/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"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/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "2beafc1d0c8c1097ab2d8088c5cc2558b2664e43f5a57c563e19a5227dab9509",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "79ecb6b4d7a044dc98e5552c53a5ac2724545b1c1cec4d797eb52576728e3480",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "a9743971581af86d926eeba42004d932caf83382c470dd98bf613cb9c417db58",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "828a4649fec3e9bda2dfe20aced8c95922c697321de2be4127bd4e5712ecbb7c",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"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": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"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": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"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/synced_floats_fixture.rs": "71858a47a15cb62eb8b53dfb507d6e2e96d23dda04b84bdd660b49301eeb9757"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-synced-floats-parity/inputs.txt": "22904cc4d2748db510a0a5935c1024fb2d8d5bc9ce994b414cf6d265d6ca60c9"
|
||||
},
|
||||
"rust_output_sha256": "80bb47d39c2d89981b03a0dd25715fcf9ab6d3f41671e9074f3a143b0bc78c2b",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "80bb47d39c2d89981b03a0dd25715fcf9ab6d3f41671e9074f3a143b0bc78c2b",
|
||||
"matched_output_lines": 554909
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "80bb47d39c2d89981b03a0dd25715fcf9ab6d3f41671e9074f3a143b0bc78c2b",
|
||||
"matched_output_lines": 554909
|
||||
}
|
||||
],
|
||||
"scope": "Actual SynchedEntityData Float fields: boxed equality, forced updates, callback-before-dirty flags, ordered dirty/default extraction, received assignment including duplicates, partial unknown-ID/observer failures, batch callbacks and reentrant set/assign/pack. Native table gaps are untouched default dummy Float items; tested keys are explicit configured IDs. Other serializers, type-mismatch errors, wire codecs and player absorption integration remain pending."
|
||||
}
|
||||
@@ -0,0 +1,455 @@
|
||||
use horizon_world::{
|
||||
active_effects::ActiveEffects,
|
||||
effect_particles::{Catalog, EffectValue, Particle},
|
||||
effect_sync::{self as sync, EffectSyncWorld, Presence},
|
||||
java_hash_map::JavaKey,
|
||||
status_effect::{Details, EffectInstance},
|
||||
synced_values::{DataError, DataValue, Observer, SyncedValues},
|
||||
};
|
||||
use serde_json::Value;
|
||||
use std::{
|
||||
cmp::Ordering,
|
||||
fs,
|
||||
io::{self, Write},
|
||||
path::Path,
|
||||
sync::Arc,
|
||||
};
|
||||
type Result<T, E = &'static str> = std::result::Result<T, E>;
|
||||
#[derive(Clone)]
|
||||
struct Key {
|
||||
id: usize,
|
||||
hash: i32,
|
||||
identity: i32,
|
||||
name: String,
|
||||
}
|
||||
impl PartialEq for Key {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.id == other.id
|
||||
}
|
||||
}
|
||||
impl Eq for Key {}
|
||||
impl JavaKey for Key {
|
||||
fn java_hash(&self) -> i32 {
|
||||
self.hash
|
||||
}
|
||||
fn tie_break(&self, other: &Self) -> Ordering {
|
||||
if self.identity <= other.identity {
|
||||
Ordering::Less
|
||||
} else {
|
||||
Ordering::Greater
|
||||
}
|
||||
}
|
||||
}
|
||||
type Storage = ActiveEffects<Key>;
|
||||
type Data = SyncedValues<EffectValue>;
|
||||
struct World<'a> {
|
||||
keys: Vec<Key>,
|
||||
catalog: &'a Catalog,
|
||||
tables: [Data; 2],
|
||||
flags: u8,
|
||||
particles: u8,
|
||||
ambient: u8,
|
||||
data: usize,
|
||||
client: bool,
|
||||
tag: bool,
|
||||
calls: i64,
|
||||
op: Value,
|
||||
pool: Vec<EffectInstance<Key>>,
|
||||
particle_pool: Vec<Particle>,
|
||||
out: &'a mut dyn Write,
|
||||
}
|
||||
impl World<'_> {
|
||||
fn particle_ref(&mut self, particle: &Particle) -> String {
|
||||
let id = self
|
||||
.particle_pool
|
||||
.iter()
|
||||
.position(|p| p.same_reference(particle))
|
||||
.unwrap_or_else(|| {
|
||||
self.particle_pool.push(particle.clone());
|
||||
self.particle_pool.len() - 1
|
||||
});
|
||||
let p = particle.data();
|
||||
format!(
|
||||
"{id}:{}:{}",
|
||||
p.kind,
|
||||
p.color.map_or("none".into(), |v| v.to_string())
|
||||
)
|
||||
}
|
||||
fn value(&mut self, value: &EffectValue) -> String {
|
||||
match value {
|
||||
EffectValue::Flags(v) => format!("flags:{v}"),
|
||||
EffectValue::Ambient(v) => format!("ambient:{v}"),
|
||||
EffectValue::Particles(v) => format!(
|
||||
"particles:[{}]",
|
||||
v.iter()
|
||||
.map(|p| self.particle_ref(p))
|
||||
.collect::<Vec<_>>()
|
||||
.join(",")
|
||||
),
|
||||
}
|
||||
}
|
||||
fn packed(&mut self, values: Option<Vec<DataValue<EffectValue>>>) -> String {
|
||||
match values {
|
||||
None => "none".into(),
|
||||
Some(v) if v.is_empty() => "empty".into(),
|
||||
Some(v) => v
|
||||
.iter()
|
||||
.map(|v| format!("{}={}", v.id, self.value(&v.value)))
|
||||
.collect::<Vec<_>>()
|
||||
.join("|"),
|
||||
}
|
||||
}
|
||||
fn controls(&mut self, s: &mut Storage, c: &Value) {
|
||||
if let Some(v) = c["data"].as_u64() {
|
||||
self.data = v as usize;
|
||||
}
|
||||
if let Some(v) = c["client"].as_bool() {
|
||||
self.client = v;
|
||||
}
|
||||
if let Some(v) = c["tag"].as_bool() {
|
||||
self.tag = v;
|
||||
}
|
||||
if let Some(v) = c["dirty"].as_bool() {
|
||||
s.dirty = v;
|
||||
}
|
||||
}
|
||||
fn event(&mut self, s: &mut Storage, name: impl AsRef<str>) -> Result<()> {
|
||||
let call = self.calls;
|
||||
self.calls += 1;
|
||||
writeln!(self.out, "event {call} {}", name.as_ref()).unwrap();
|
||||
if call == self.op["fail"].as_i64().unwrap() {
|
||||
return Err("callback");
|
||||
}
|
||||
if call == self.op["mutate"].as_i64().unwrap() {
|
||||
self.controls(s, &self.op["changes"].clone());
|
||||
for action in self.op["actions"].as_array().unwrap().clone() {
|
||||
self.raw(s, &action)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn raw(&mut self, s: &mut Storage, op: &Value) -> Result<()> {
|
||||
let target = op["target"].as_u64().unwrap() as usize;
|
||||
let key = op["key"].as_u64().unwrap() as usize;
|
||||
let slot = op["pool"].as_u64().unwrap() as usize;
|
||||
match op["mode"].as_str().unwrap() {
|
||||
"put" => {
|
||||
s.entries
|
||||
.put(self.keys[key].clone(), self.pool[slot].clone());
|
||||
}
|
||||
"drop" => {
|
||||
s.entries.remove(&self.keys[key]);
|
||||
}
|
||||
"clear" => s.entries.clear(),
|
||||
"details" => {
|
||||
let mut e = self.pool[slot].write();
|
||||
e.details.visible = op["visible"].as_bool().unwrap();
|
||||
e.details.ambient = op["ambient"].as_bool().unwrap();
|
||||
}
|
||||
"controls" => self.controls(s, &op["changes"]),
|
||||
"flags" => self.store(
|
||||
s,
|
||||
target,
|
||||
self.flags,
|
||||
EffectValue::Flags(op["flags"].as_u64().unwrap() as u8),
|
||||
)?,
|
||||
"ambient" => self.store(
|
||||
s,
|
||||
target,
|
||||
self.ambient,
|
||||
EffectValue::Ambient(op["ambient"].as_bool().unwrap()),
|
||||
)?,
|
||||
"pack" => {
|
||||
let values = self.tables[target].take_dirty();
|
||||
let text = self.packed(values);
|
||||
writeln!(self.out, "packed {target} {text}").unwrap();
|
||||
}
|
||||
"defaults" => {
|
||||
let values = self.tables[target].non_default();
|
||||
let text = self.packed(values);
|
||||
writeln!(self.out, "defaults {target} {text}").unwrap();
|
||||
}
|
||||
mode => panic!("raw mode {mode}"),
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn store(&mut self, s: &mut Storage, data: usize, id: u8, value: EffectValue) -> Result<()> {
|
||||
// Fixture callbacks can inspect/pack/reenter the same table. Mirror the
|
||||
// actual item during the observer, then keep its captured identity.
|
||||
let mut table = self.tables[data].clone();
|
||||
let result = table.set(
|
||||
id,
|
||||
value,
|
||||
false,
|
||||
&mut Callback {
|
||||
world: self,
|
||||
storage: s,
|
||||
data,
|
||||
},
|
||||
);
|
||||
self.tables[data] = table;
|
||||
result.map_err(|e| match e {
|
||||
DataError::Observer(e) => e,
|
||||
_ => panic!("registered data IDs"),
|
||||
})
|
||||
}
|
||||
fn state(&mut self, s: &Storage) {
|
||||
writeln!(
|
||||
self.out,
|
||||
"state {} {} {} {} {}",
|
||||
self.data, self.client, self.tag, s.dirty, self.calls
|
||||
)
|
||||
.unwrap();
|
||||
let entries = s
|
||||
.entries
|
||||
.entries()
|
||||
.map(|(k, e)| {
|
||||
format!(
|
||||
"{}={}",
|
||||
k.id,
|
||||
self.pool.iter().position(|v| v.same_reference(e)).unwrap()
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
.join(",");
|
||||
writeln!(self.out, "effects {entries}").unwrap();
|
||||
for (i, e) in self.pool.iter().enumerate() {
|
||||
let e = e.read();
|
||||
writeln!(
|
||||
self.out,
|
||||
"instance {i} {} {}",
|
||||
e.details.visible, e.details.ambient
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
let mut ids = [self.flags, self.particles, self.ambient];
|
||||
ids.sort_unstable();
|
||||
for i in 0..2 {
|
||||
writeln!(self.out, "data {i} {}", self.tables[i].is_dirty()).unwrap();
|
||||
for id in ids {
|
||||
let value = self.tables[i].get(id).unwrap();
|
||||
let value = self.value(&value);
|
||||
writeln!(
|
||||
self.out,
|
||||
"field {id} {value} {} {}",
|
||||
self.tables[i].item_dirty(id).unwrap(),
|
||||
self.tables[i].is_default(id).unwrap()
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
struct Callback<'a, 'b> {
|
||||
world: &'a mut World<'b>,
|
||||
storage: &'a mut Storage,
|
||||
data: usize,
|
||||
}
|
||||
impl Observer<EffectValue> for Callback<'_, '_> {
|
||||
type Error = &'static str;
|
||||
fn updated(&mut self, data: &mut Data, id: u8) -> Result<()> {
|
||||
self.world.tables[self.data] = data.clone();
|
||||
let result = self.world.event(self.storage, format!("updated {id}"));
|
||||
*data = self.world.tables[self.data].clone();
|
||||
result
|
||||
}
|
||||
}
|
||||
impl EffectSyncWorld<Key> for World<'_> {
|
||||
type Error = &'static str;
|
||||
type Data = usize;
|
||||
type Level = ();
|
||||
fn data(&self) -> usize {
|
||||
self.data
|
||||
}
|
||||
fn store_particles(
|
||||
&mut self,
|
||||
s: &mut Storage,
|
||||
data: usize,
|
||||
particles: Arc<[Particle]>,
|
||||
) -> Result<()> {
|
||||
self.store(s, data, self.particles, EffectValue::Particles(particles))
|
||||
}
|
||||
fn store_ambient(&mut self, s: &mut Storage, data: usize, ambient: bool) -> Result<()> {
|
||||
self.store(s, data, self.ambient, EffectValue::Ambient(ambient))
|
||||
}
|
||||
fn particle(&self, key: &Key, ambient: bool) -> Result<Particle> {
|
||||
Ok(self.catalog.create(&key.name, ambient).unwrap())
|
||||
}
|
||||
fn has_effect(&mut self, s: &mut Storage, kind: Presence) -> Result<bool> {
|
||||
let name = match kind {
|
||||
Presence::Invisibility => "minecraft:invisibility",
|
||||
Presence::Glowing => "minecraft:glowing",
|
||||
};
|
||||
self.event(s, format!("has {name}"))?;
|
||||
Ok(s.has(self.keys.iter().find(|k| k.name == name).unwrap()))
|
||||
}
|
||||
fn level(&mut self, s: &mut Storage) -> Result<()> {
|
||||
self.event(s, "level")
|
||||
}
|
||||
fn is_client(&mut self, s: &mut Storage, _: ()) -> Result<bool> {
|
||||
self.event(s, "client")?;
|
||||
Ok(self.client)
|
||||
}
|
||||
fn glowing_tag(&self) -> bool {
|
||||
self.tag
|
||||
}
|
||||
fn write_glowing_tag(&mut self, tag: bool) {
|
||||
self.tag = tag;
|
||||
}
|
||||
fn read_flags(&self, data: usize) -> Result<u8> {
|
||||
match self.tables[data].get(self.flags).unwrap() {
|
||||
EffectValue::Flags(v) => Ok(v),
|
||||
_ => panic!("flags type"),
|
||||
}
|
||||
}
|
||||
fn write_flags(&mut self, s: &mut Storage, data: usize, flags: u8) -> Result<()> {
|
||||
self.store(s, data, self.flags, EffectValue::Flags(flags))
|
||||
}
|
||||
fn get_flag(&mut self, s: &mut Storage, bit: i32) -> Result<bool> {
|
||||
self.event(s, format!("get-flag {bit}"))?;
|
||||
sync::shared_flag(self, bit)
|
||||
}
|
||||
fn set_flag(&mut self, s: &mut Storage, bit: i32, value: bool) -> Result<()> {
|
||||
self.event(s, format!("set-flag {bit} {value}"))?;
|
||||
sync::set_shared_flag(s, self, bit, value)
|
||||
}
|
||||
fn set_invisible(&mut self, s: &mut Storage, value: bool) -> Result<()> {
|
||||
self.event(s, format!("invisible {value}"))?;
|
||||
self.set_flag(s, 5, value)
|
||||
}
|
||||
fn currently_glowing(&mut self, s: &mut Storage) -> Result<bool> {
|
||||
self.event(s, "glowing")?;
|
||||
sync::currently_glowing(s, self)
|
||||
}
|
||||
fn remove_particles(&mut self, s: &mut Storage) -> Result<()> {
|
||||
self.event(s, "remove-particles")?;
|
||||
sync::remove_particles(s, self)
|
||||
}
|
||||
fn update_invisibility(&mut self, s: &mut Storage) -> Result<()> {
|
||||
self.event(s, "invisibility")?;
|
||||
sync::update_invisibility(s, self)
|
||||
}
|
||||
}
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let args: Vec<_> = std::env::args().collect();
|
||||
let dir = Path::new(&args[1]);
|
||||
let metadata: Value = serde_json::from_str(&fs::read_to_string(dir.join("catalog.json"))?)?;
|
||||
let catalog = Catalog::from_json(&metadata)?;
|
||||
let flags = metadata["schema"]["flags"].as_u64().unwrap() as u8;
|
||||
let ambient = metadata["schema"]["ambient"].as_u64().unwrap() as u8;
|
||||
let particles = metadata["schema"]["particles"].as_u64().unwrap() as u8;
|
||||
let mut out = io::BufWriter::new(fs::File::create(dir.join(format!("rust-{}.txt", args[2])))?);
|
||||
for line in fs::read_to_string(dir.join(format!("inputs-{}.txt", args[2])))?.lines() {
|
||||
let f: Value = serde_json::from_str(line)?;
|
||||
let keys: Vec<_> = metadata["effects"]
|
||||
.as_array()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(id, d)| Key {
|
||||
id,
|
||||
hash: f["hashes"][id].as_i64().unwrap() as i32,
|
||||
identity: f["identities"][id].as_i64().unwrap() as i32,
|
||||
name: d["id"].as_str().unwrap().into(),
|
||||
})
|
||||
.collect();
|
||||
let pool = f["pool"]
|
||||
.as_array()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.map(|e| {
|
||||
EffectInstance::new(
|
||||
keys[e["effect"].as_u64().unwrap() as usize].clone(),
|
||||
Details {
|
||||
duration: 200,
|
||||
amplifier: e["amplifier"].as_i64().unwrap() as i32,
|
||||
ambient: e["ambient"].as_bool().unwrap(),
|
||||
visible: e["visible"].as_bool().unwrap(),
|
||||
show_icon: true,
|
||||
},
|
||||
None,
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
let tables = std::array::from_fn(|i| {
|
||||
Data::new(&[
|
||||
DataValue {
|
||||
id: flags,
|
||||
value: EffectValue::Flags(f["flags"][i].as_u64().unwrap() as u8),
|
||||
},
|
||||
DataValue {
|
||||
id: ambient,
|
||||
value: EffectValue::Ambient(f["ambient"][i].as_bool().unwrap()),
|
||||
},
|
||||
DataValue {
|
||||
id: particles,
|
||||
value: EffectValue::Particles(Arc::from([])),
|
||||
},
|
||||
])
|
||||
.unwrap()
|
||||
});
|
||||
let mut w = World {
|
||||
keys,
|
||||
catalog: &catalog,
|
||||
tables,
|
||||
flags,
|
||||
particles,
|
||||
ambient,
|
||||
data: 0,
|
||||
client: false,
|
||||
tag: false,
|
||||
calls: 0,
|
||||
op: Value::Null,
|
||||
pool,
|
||||
particle_pool: vec![],
|
||||
out: &mut out,
|
||||
};
|
||||
let mut storage = Storage::default();
|
||||
w.controls(&mut storage, &f["controls"]);
|
||||
for op in f["setup"].as_array().unwrap() {
|
||||
w.raw(&mut storage, op).unwrap();
|
||||
}
|
||||
for op in f["ops"].as_array().unwrap() {
|
||||
w.op = op.clone();
|
||||
w.calls = 0;
|
||||
let result = match op["mode"].as_str().unwrap() {
|
||||
"dirty-update" => sync::update_dirty(&mut storage, &mut w).map(|()| "ok".into()),
|
||||
"invisibility" => w.update_invisibility(&mut storage).map(|()| "ok".into()),
|
||||
"particles" => {
|
||||
sync::synchronize_particles(&mut storage, &mut w).map(|()| "ok".into())
|
||||
}
|
||||
"glowing-update" => {
|
||||
sync::update_glowing(&mut storage, &mut w).map(|()| "ok".into())
|
||||
}
|
||||
"remove-particles" => w.remove_particles(&mut storage).map(|()| "ok".into()),
|
||||
"glowing" => w.currently_glowing(&mut storage).map(|v| v.to_string()),
|
||||
"glow-tag" => {
|
||||
sync::set_glowing_tag(&mut storage, &mut w, op["flag"].as_bool().unwrap())
|
||||
.map(|()| "ok".into())
|
||||
}
|
||||
"invisible" => w
|
||||
.set_invisible(&mut storage, op["flag"].as_bool().unwrap())
|
||||
.map(|()| "ok".into()),
|
||||
"get-flag" => w
|
||||
.get_flag(&mut storage, op["bit"].as_i64().unwrap() as i32)
|
||||
.map(|v| v.to_string()),
|
||||
"set-flag" => w
|
||||
.set_flag(
|
||||
&mut storage,
|
||||
op["bit"].as_i64().unwrap() as i32,
|
||||
op["flag"].as_bool().unwrap(),
|
||||
)
|
||||
.map(|()| "ok".into()),
|
||||
"all-ambient" => Ok(sync::all_ambient(&storage).to_string()),
|
||||
_ => w.raw(&mut storage, op).map(|()| "ok".into()),
|
||||
};
|
||||
writeln!(
|
||||
w.out,
|
||||
"result {}",
|
||||
result.unwrap_or_else(|e| format!("error {e}"))
|
||||
)?;
|
||||
w.state(&storage);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
//! Pinned registered MobEffect particle factories and native option identity.
|
||||
use crate::{DATA_VERSION, compression::invalid, synced_values::SyncedValue};
|
||||
use serde_json::Value;
|
||||
use std::{collections::BTreeMap, io, sync::Arc};
|
||||
|
||||
pub const AMBIENT_ALPHA: u8 = 38;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ParticleData {
|
||||
pub kind: String,
|
||||
pub color: Option<u32>,
|
||||
}
|
||||
/// ColorParticleOption and SimpleParticleType use object equality. Cloning an
|
||||
/// option retains that object; constructing a color option creates a new one.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Particle(Arc<ParticleData>);
|
||||
impl Particle {
|
||||
pub fn data(&self) -> &ParticleData {
|
||||
&self.0
|
||||
}
|
||||
pub fn same_reference(&self, other: &Self) -> bool {
|
||||
Arc::ptr_eq(&self.0, &other.0)
|
||||
}
|
||||
}
|
||||
impl PartialEq for Particle {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.same_reference(other)
|
||||
}
|
||||
}
|
||||
impl Eq for Particle {}
|
||||
|
||||
enum Factory {
|
||||
Color(u32),
|
||||
Constant(Particle),
|
||||
}
|
||||
pub struct Catalog {
|
||||
effects: BTreeMap<String, Factory>,
|
||||
}
|
||||
impl Catalog {
|
||||
/// The native exporter verifies inherited factories, captured arguments,
|
||||
/// option classes and identity. No recovered game assets are embedded here.
|
||||
pub fn from_json(value: &Value) -> io::Result<Self> {
|
||||
if value["data_version"].as_i64() != Some(i64::from(DATA_VERSION))
|
||||
|| value["ambient_alpha"].as_u64() != Some(u64::from(AMBIENT_ALPHA))
|
||||
{
|
||||
return Err(invalid("effect particle catalog version mismatch"));
|
||||
}
|
||||
let mut effects = BTreeMap::new();
|
||||
let mut simple = BTreeMap::<String, Particle>::new();
|
||||
for item in value["effects"]
|
||||
.as_array()
|
||||
.ok_or_else(|| invalid("missing effects"))?
|
||||
{
|
||||
let id = identifier(&item["id"])?;
|
||||
let factory = match item["factory"].as_str() {
|
||||
Some("color") => Factory::Color(color(&item["color"])?),
|
||||
Some("constant") => {
|
||||
let p = &item["particle"];
|
||||
let kind = identifier(&p["type"])?;
|
||||
if !p["color"].is_null() {
|
||||
return Err(invalid("expected registered simple constant particle"));
|
||||
}
|
||||
let particle = simple
|
||||
.entry(kind.clone())
|
||||
.or_insert_with(|| Particle(Arc::new(ParticleData { kind, color: None })))
|
||||
.clone();
|
||||
Factory::Constant(particle)
|
||||
}
|
||||
_ => return Err(invalid("unknown registered particle factory")),
|
||||
};
|
||||
if effects.insert(id, factory).is_some() {
|
||||
return Err(invalid("duplicate effect particle definition"));
|
||||
}
|
||||
}
|
||||
Ok(Self { effects })
|
||||
}
|
||||
pub fn contains(&self, effect: &str) -> bool {
|
||||
self.effects.contains_key(effect)
|
||||
}
|
||||
/// Actual registered factories are pure: only the ambient flag changes a
|
||||
/// colored option. Constant options retain their registry object identity.
|
||||
pub fn create(&self, effect: &str, ambient: bool) -> Option<Particle> {
|
||||
Some(match self.effects.get(effect)? {
|
||||
Factory::Color(color) => Particle(Arc::new(ParticleData {
|
||||
kind: "minecraft:entity_effect".into(),
|
||||
color: Some(
|
||||
(u32::from(if ambient { AMBIENT_ALPHA } else { 255 }) << 24)
|
||||
| (color & 0xffffff),
|
||||
),
|
||||
})),
|
||||
Factory::Constant(particle) => particle.clone(),
|
||||
})
|
||||
}
|
||||
}
|
||||
fn identifier(value: &Value) -> io::Result<String> {
|
||||
let name = value
|
||||
.as_str()
|
||||
.ok_or_else(|| invalid("expected particle identifier"))?;
|
||||
let canonical =
|
||||
crate::identifier::Identifier::parse(name).map_err(|e| invalid(format!("{e:?}")))?;
|
||||
if canonical.to_string() != name {
|
||||
return Err(invalid("noncanonical particle identifier"));
|
||||
}
|
||||
Ok(name.into())
|
||||
}
|
||||
fn color(value: &Value) -> io::Result<u32> {
|
||||
value
|
||||
.as_u64()
|
||||
.and_then(|v| u32::try_from(v).ok())
|
||||
.ok_or_else(|| invalid("invalid particle color"))
|
||||
}
|
||||
|
||||
/// The three synchronized value kinds used for living effect presentation.
|
||||
/// Lists compare element object identity, including repeated fresh colors.
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub enum EffectValue {
|
||||
Flags(u8),
|
||||
Ambient(bool),
|
||||
Particles(Arc<[Particle]>),
|
||||
}
|
||||
impl SyncedValue for EffectValue {
|
||||
fn native_equal(&self, other: &Self) -> bool {
|
||||
self == other
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
//! Living effect particle, invisibility and glowing synchronization.
|
||||
use crate::{active_effects::ActiveEffects, effect_particles::Particle, java_hash_map::JavaKey};
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum Presence {
|
||||
Invisibility,
|
||||
Glowing,
|
||||
}
|
||||
|
||||
pub trait EffectSyncWorld<H: JavaKey + Clone> {
|
||||
type Error;
|
||||
type Data: Copy;
|
||||
type Level: Copy;
|
||||
/// Direct entityData field access, retaining the selected object.
|
||||
fn data(&self) -> Self::Data;
|
||||
fn store_particles(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
data: Self::Data,
|
||||
particles: Arc<[Particle]>,
|
||||
) -> Result<(), Self::Error>;
|
||||
fn store_ambient(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
data: Self::Data,
|
||||
ambient: bool,
|
||||
) -> Result<(), Self::Error>;
|
||||
/// Actual registered factories are pure and cannot mutate the active map.
|
||||
fn particle(&self, effect: &H, ambient: bool) -> Result<Particle, Self::Error>;
|
||||
fn has_effect(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
kind: Presence,
|
||||
) -> Result<bool, Self::Error>;
|
||||
fn level(&mut self, effects: &mut ActiveEffects<H>) -> Result<Self::Level, Self::Error>;
|
||||
fn is_client(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
level: Self::Level,
|
||||
) -> Result<bool, Self::Error>;
|
||||
fn glowing_tag(&self) -> bool;
|
||||
fn write_glowing_tag(&mut self, value: bool);
|
||||
fn read_flags(&self, data: Self::Data) -> Result<u8, Self::Error>;
|
||||
fn write_flags(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
data: Self::Data,
|
||||
flags: u8,
|
||||
) -> Result<(), Self::Error>;
|
||||
fn get_flag(&mut self, _: &mut ActiveEffects<H>, bit: i32) -> Result<bool, Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
shared_flag(self, bit)
|
||||
}
|
||||
fn set_flag(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
bit: i32,
|
||||
value: bool,
|
||||
) -> Result<(), Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
set_shared_flag(effects, self, bit, value)
|
||||
}
|
||||
fn set_invisible(
|
||||
&mut self,
|
||||
effects: &mut ActiveEffects<H>,
|
||||
value: bool,
|
||||
) -> Result<(), Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
self.set_flag(effects, 5, value)
|
||||
}
|
||||
fn currently_glowing(&mut self, effects: &mut ActiveEffects<H>) -> Result<bool, Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
currently_glowing(effects, self)
|
||||
}
|
||||
fn remove_particles(&mut self, effects: &mut ActiveEffects<H>) -> Result<(), Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
remove_particles(effects, self)
|
||||
}
|
||||
fn update_invisibility(&mut self, effects: &mut ActiveEffects<H>) -> Result<(), Self::Error>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
update_invisibility(effects, self)
|
||||
}
|
||||
}
|
||||
pub fn all_ambient<H: JavaKey + Clone>(effects: &ActiveEffects<H>) -> bool {
|
||||
effects.entries.entries().all(|(_, e)| {
|
||||
let e = e.read();
|
||||
!e.details.visible || e.details.ambient
|
||||
})
|
||||
}
|
||||
pub fn synchronize_particles<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<(), W::Error> {
|
||||
// Registered factories have no world/map access. Their native stream pass
|
||||
// therefore preserves this order without a structural mutation callback.
|
||||
let particles = effects
|
||||
.entries
|
||||
.entries()
|
||||
.filter_map(|(_, e)| {
|
||||
let e = e.read();
|
||||
e.details
|
||||
.visible
|
||||
.then(|| world.particle(&e.effect, e.details.ambient))
|
||||
})
|
||||
.collect::<Result<Arc<[_]>, _>>()?;
|
||||
let data = world.data();
|
||||
world.store_particles(effects, data, particles)?;
|
||||
let data = world.data();
|
||||
let ambient = all_ambient(effects);
|
||||
world.store_ambient(effects, data, ambient)
|
||||
}
|
||||
pub fn remove_particles<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<(), W::Error> {
|
||||
let data = world.data();
|
||||
world.store_particles(effects, data, Arc::from([]))
|
||||
}
|
||||
pub fn update_invisibility<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<(), W::Error> {
|
||||
if effects.entries.is_empty() {
|
||||
world.remove_particles(effects)?;
|
||||
return world.set_invisible(effects, false);
|
||||
}
|
||||
let invisible = world.has_effect(effects, Presence::Invisibility)?;
|
||||
world.set_invisible(effects, invisible)?;
|
||||
synchronize_particles(effects, world)
|
||||
}
|
||||
pub fn shared_flag<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
world: &W,
|
||||
bit: i32,
|
||||
) -> Result<bool, W::Error> {
|
||||
let flags = i32::from(world.read_flags(world.data())? as i8);
|
||||
Ok(flags & 1i32.wrapping_shl(bit as u32) != 0)
|
||||
}
|
||||
pub fn set_shared_flag<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
bit: i32,
|
||||
value: bool,
|
||||
) -> Result<(), W::Error> {
|
||||
let flags = i32::from(world.read_flags(world.data())? as i8);
|
||||
let mask = 1i32.wrapping_shl(bit as u32);
|
||||
let value = if value { flags | mask } else { flags & !mask } as u8;
|
||||
let data = world.data();
|
||||
world.write_flags(effects, data, value)
|
||||
}
|
||||
pub fn currently_glowing<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<bool, W::Error> {
|
||||
let level = world.level(effects)?;
|
||||
if !world.is_client(effects, level)? && world.has_effect(effects, Presence::Glowing)? {
|
||||
return Ok(true);
|
||||
}
|
||||
// Entity's base body repeats the virtual level/client lookups.
|
||||
let level = world.level(effects)?;
|
||||
if world.is_client(effects, level)? {
|
||||
world.get_flag(effects, 6)
|
||||
} else {
|
||||
Ok(world.glowing_tag())
|
||||
}
|
||||
}
|
||||
pub fn set_glowing_tag<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
value: bool,
|
||||
) -> Result<(), W::Error> {
|
||||
world.write_glowing_tag(value);
|
||||
let glowing = world.currently_glowing(effects)?;
|
||||
world.set_flag(effects, 6, glowing)
|
||||
}
|
||||
pub fn update_glowing<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<(), W::Error> {
|
||||
let glowing = world.currently_glowing(effects)?;
|
||||
if world.get_flag(effects, 6)? != glowing {
|
||||
world.set_flag(effects, 6, glowing)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
pub fn update_dirty<H: JavaKey + Clone, W: EffectSyncWorld<H>>(
|
||||
effects: &mut ActiveEffects<H>,
|
||||
world: &mut W,
|
||||
) -> Result<(), W::Error> {
|
||||
if effects.dirty {
|
||||
world.update_invisibility(effects)?;
|
||||
update_glowing(effects, world)?;
|
||||
effects.dirty = false;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -13,6 +13,8 @@ pub mod stored_consume;
|
||||
pub mod attribute_health;
|
||||
pub mod attribute_updates;
|
||||
pub mod live_attribute_updates;
|
||||
pub mod effect_particles;
|
||||
pub mod effect_sync;
|
||||
pub mod attributes;
|
||||
pub mod block_collision;
|
||||
pub mod block_collision_scan;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//! Homogeneous synchronized scalar fields with native callback/dirty ordering.
|
||||
//! Mixed serializers, packet codecs and complete entity schemas are separate.
|
||||
//! Synchronized typed values with native callback/dirty ordering.
|
||||
//! Serializer codecs and complete entity schemas are separate.
|
||||
use crate::compression::invalid;
|
||||
use std::{fmt, io};
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
@@ -45,16 +45,21 @@ pub trait Observer<T: SyncedValue = f32> {
|
||||
}
|
||||
}
|
||||
/// Equality used by the corresponding boxed native serializer value.
|
||||
pub trait SyncedValue: Copy {
|
||||
fn native_equal(self, other: Self) -> bool;
|
||||
pub trait SyncedValue: Clone {
|
||||
fn native_equal(&self, other: &Self) -> bool;
|
||||
}
|
||||
impl SyncedValue for f32 {
|
||||
fn native_equal(self, other: Self) -> bool {
|
||||
fn native_equal(&self, other: &Self) -> bool {
|
||||
self.to_bits() == other.to_bits() || (self.is_nan() && other.is_nan())
|
||||
}
|
||||
}
|
||||
impl SyncedValue for u8 {
|
||||
fn native_equal(self, other: Self) -> bool {
|
||||
fn native_equal(&self, other: &Self) -> bool {
|
||||
self == other
|
||||
}
|
||||
}
|
||||
impl SyncedValue for bool {
|
||||
fn native_equal(&self, other: &Self) -> bool {
|
||||
self == other
|
||||
}
|
||||
}
|
||||
@@ -64,8 +69,8 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
.iter()
|
||||
.map(|v| Entry {
|
||||
id: v.id,
|
||||
initial: v.value,
|
||||
value: v.value,
|
||||
initial: v.value.clone(),
|
||||
value: v.value.clone(),
|
||||
dirty: false,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
@@ -84,7 +89,7 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
.map_err(|_| id)
|
||||
}
|
||||
pub fn get(&self, id: u8) -> Result<T, u8> {
|
||||
Ok(self.entries[self.index(id)?].value)
|
||||
Ok(self.entries[self.index(id)?].value.clone())
|
||||
}
|
||||
pub fn is_dirty(&self) -> bool {
|
||||
self.dirty
|
||||
@@ -94,7 +99,7 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
}
|
||||
pub fn is_default(&self, id: u8) -> Result<bool, u8> {
|
||||
let e = &self.entries[self.index(id)?];
|
||||
Ok(e.initial.native_equal(e.value))
|
||||
Ok(e.initial.native_equal(&e.value))
|
||||
}
|
||||
pub fn set<O: Observer<T>>(
|
||||
&mut self,
|
||||
@@ -104,7 +109,7 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
observer: &mut O,
|
||||
) -> Result<(), DataError<O::Error>> {
|
||||
let index = self.index(id).map_err(DataError::UnknownId)?;
|
||||
if force || !value.native_equal(self.entries[index].value) {
|
||||
if force || !value.native_equal(&self.entries[index].value) {
|
||||
self.entries[index].value = value;
|
||||
observer.updated(self, id).map_err(DataError::Observer)?;
|
||||
self.entries[index].dirty = true;
|
||||
@@ -121,7 +126,7 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
) -> Result<(), DataError<O::Error>> {
|
||||
for v in values {
|
||||
let index = self.index(v.id).map_err(DataError::UnknownId)?;
|
||||
self.entries[index].value = v.value;
|
||||
self.entries[index].value = v.value.clone();
|
||||
observer.updated(self, v.id).map_err(DataError::Observer)?;
|
||||
}
|
||||
observer.assigned(self, values).map_err(DataError::Observer)
|
||||
@@ -137,7 +142,7 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
e.dirty = false;
|
||||
values.push(DataValue {
|
||||
id: e.id,
|
||||
value: e.value,
|
||||
value: e.value.clone(),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -147,10 +152,10 @@ impl<T: SyncedValue> SyncedValues<T> {
|
||||
let values: Vec<_> = self
|
||||
.entries
|
||||
.iter()
|
||||
.filter(|e| !e.initial.native_equal(e.value))
|
||||
.filter(|e| !e.initial.native_equal(&e.value))
|
||||
.map(|e| DataValue {
|
||||
id: e.id,
|
||||
value: e.value,
|
||||
value: e.value.clone(),
|
||||
})
|
||||
.collect();
|
||||
if values.is_empty() {
|
||||
|
||||
@@ -1254,3 +1254,35 @@ Dimension rebuilding and waypoint-manager internals remain controlled, and
|
||||
passenger lists are empty in this combined fixture. Full active-effect lifecycle
|
||||
and particle/invisibility synchronization, player absorption storage and complete
|
||||
gameplay/platform integration remain unfinished.
|
||||
|
||||
## Registered effect presentation synchronization
|
||||
|
||||
Effect synchronization now builds the visible particle list in active-map order,
|
||||
updates invisibility and ambient state, and preserves the server/client glowing
|
||||
branches and shared flags. It retains each selected synchronized-data object and
|
||||
clears effect dirtiness only after both visibility and glowing updates succeed.
|
||||
Removing the particle list leaves the ambient field unchanged, matching vanilla.
|
||||
|
||||
The registry exporter verifies all **40 effect factories**: **34** create fresh
|
||||
colored options, while **six** return constant simple particles. Colored options
|
||||
use native object identity, so equal colors in newly created lists still trigger
|
||||
updates. Constant options retain identity. Synchronized storage now supports
|
||||
shared list values as well as scalar fields, preserving callback and dirty-flag
|
||||
ordering.
|
||||
|
||||
The [effect synchronization comparison](../benchmarks/rust-effect-sync-2026-10-07/scoped-parity.json)
|
||||
matches **2,754,744 lines per reference JAR**, including repeated updates,
|
||||
ambient/visible combinations, callback map changes, captured data objects,
|
||||
reentrant writes/packing and failure prefixes. The
|
||||
[byte](../benchmarks/rust-effect-sync-2026-10-07/synced-bytes-regression.json) and
|
||||
[float](../benchmarks/rust-effect-sync-2026-10-07/synced-floats-regression.json)
|
||||
storage regressions also pass against both JARs. Library and affected fixture
|
||||
Clippy checks pass, and all world targets compile.
|
||||
|
||||
The registered factories have no world access; the exporter verifies their
|
||||
inherited implementation and captured arguments. This permits an immutable map
|
||||
traversal during particle creation. Custom impure factories remain outside this
|
||||
binding. Rendering, transport, full entity lifecycle integration and playable
|
||||
macOS, Linux and Windows gameplay remain unfinished. In this pinned version,
|
||||
`LivingEntity.updateDataBeforeSync` invokes dirty effect synchronization; it is a
|
||||
separate phase from `tickEffects`.
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
package dev.horizonlab.parity;
|
||||
|
||||
import com.google.gson.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.nio.file.*;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.particles.*;
|
||||
import net.minecraft.world.effect.*;
|
||||
|
||||
/** Exports and checks the pinned registry's inherited, pure particle factories. */
|
||||
public final class VanillaEffectParticlesOracle {
|
||||
static Field field(Class<?> c, String name) throws Exception {
|
||||
var f = c.getDeclaredField(name); f.setAccessible(true); return f;
|
||||
}
|
||||
static JsonObject particle(ParticleOptions p) throws Exception {
|
||||
var result = new JsonObject();
|
||||
result.addProperty("type", BuiltInRegistries.PARTICLE_TYPE.getKey(p.getType()).toString());
|
||||
if (p.getClass() == ColorParticleOption.class) {
|
||||
result.addProperty("color", Integer.toUnsignedLong(field(ColorParticleOption.class, "color").getInt(p)));
|
||||
} else if (!(p instanceof SimpleParticleType)) throw new AssertionError("unsupported registered particle: " + p.getClass());
|
||||
return result;
|
||||
}
|
||||
static JsonObject export() throws Exception {
|
||||
var root = new JsonObject();
|
||||
root.addProperty("data_version", net.minecraft.SharedConstants.getCurrentVersion().dataVersion().version());
|
||||
int alpha = field(MobEffect.class, "AMBIENT_ALPHA").getInt(null);
|
||||
if (alpha != 38) throw new AssertionError("ambient alpha changed");
|
||||
root.addProperty("ambient_alpha", alpha);
|
||||
var definitions = new JsonArray();
|
||||
for (var effect : BuiltInRegistries.MOB_EFFECT) {
|
||||
var holder = BuiltInRegistries.MOB_EFFECT.wrapAsHolder(effect);
|
||||
if (effect.getClass().getMethod("createParticleOptions", MobEffectInstance.class).getDeclaringClass() != MobEffect.class)
|
||||
throw new AssertionError("registered factory override requires inspection: " + effect.getClass());
|
||||
// MobEffect's two constructors assign their sole captured argument
|
||||
// to a final factory. The pinned bytecode uses only that argument
|
||||
// and the ordinary instance's ambient flag; it has no world access.
|
||||
Object factory = field(MobEffect.class, "particleFactory").get(effect);
|
||||
Field[] captures = factory.getClass().getDeclaredFields();
|
||||
if (captures.length != 1) throw new AssertionError("factory capture layout changed");
|
||||
captures[0].setAccessible(true);
|
||||
Object captured = captures[0].get(factory);
|
||||
var def = new JsonObject(); def.addProperty("id", holder.getRegisteredName());
|
||||
if (captured instanceof Integer color) {
|
||||
def.addProperty("factory", "color"); def.addProperty("color", Integer.toUnsignedLong(color));
|
||||
} else if (captured instanceof ParticleOptions p) {
|
||||
if (!(p instanceof SimpleParticleType)) throw new AssertionError("constant option identity needs a new export schema");
|
||||
def.addProperty("factory", "constant"); def.add("particle", particle(p));
|
||||
} else throw new AssertionError("unexpected factory capture: " + captured);
|
||||
for (boolean ambient : new boolean[] {false, true}) {
|
||||
for (int amplifier : new int[] {0, 1, 127, 255}) {
|
||||
var instance = new MobEffectInstance(holder, 200, amplifier, ambient, true, true);
|
||||
var a = effect.createParticleOptions(instance); var b = effect.createParticleOptions(instance);
|
||||
if (captured instanceof Integer color) {
|
||||
int expected = ((ambient ? alpha : 255) << 24) | (color & 0xffffff);
|
||||
if (a.getClass() != ColorParticleOption.class || a.getType() != ParticleTypes.ENTITY_EFFECT
|
||||
|| field(ColorParticleOption.class, "color").getInt(a) != expected || a == b || a.equals(b))
|
||||
throw new AssertionError("color factory value/identity changed");
|
||||
} else if (a != captured || b != captured) throw new AssertionError("constant identity changed");
|
||||
}
|
||||
}
|
||||
definitions.add(def);
|
||||
}
|
||||
root.add("effects", definitions); return root;
|
||||
}
|
||||
public static void main(String[] args) throws Exception {
|
||||
net.minecraft.SharedConstants.tryDetectVersion(); net.minecraft.server.Bootstrap.bootStrap();
|
||||
Files.writeString(Path.of(args[0]), export().toString());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
package dev.horizonlab.parity;
|
||||
|
||||
import static dev.horizonlab.parity.VanillaEffectParticlesOracle.*;
|
||||
import com.google.gson.*;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.nio.file.*;
|
||||
import java.util.*;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.particles.ParticleOptions;
|
||||
import net.minecraft.world.effect.*;
|
||||
import net.minecraft.world.entity.*;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.network.syncher.*;
|
||||
|
||||
/** Inherited native effect synchronization and real heterogeneous entity data. */
|
||||
public final class VanillaEffectSyncOracle {
|
||||
static Object unsafe; static Method allocate, dirtyUpdate, particlesUpdate, glowingUpdate;
|
||||
static Field dataField, dirtyField, tagField, effectsField, visibleField, ambientField;
|
||||
static EntityDataAccessor<Byte> flagsKey;
|
||||
static EntityDataAccessor<Boolean> ambientKey;
|
||||
static EntityDataAccessor<List<ParticleOptions>> particlesKey;
|
||||
static Constructor<SynchedEntityData> dataCtor;
|
||||
static List<Holder<MobEffect>> keys = new ArrayList<>();
|
||||
static <T> T make(Class<T> c) throws Exception { return c.cast(allocate.invoke(unsafe, c)); }
|
||||
static Method method(String name) throws Exception { var m = LivingEntity.class.getDeclaredMethod(name); m.setAccessible(true); return m; }
|
||||
static void invoke(Method m, Actor actor) throws Exception { try { m.invoke(actor); } catch (InvocationTargetException e) { if (e.getCause() instanceof RuntimeException x) throw x; throw new AssertionError(e.getCause()); } }
|
||||
static final class Stop extends RuntimeException {}
|
||||
static final class Data {
|
||||
Actor actor; EffectLevel level; PrintWriter out; JsonObject op;
|
||||
SynchedEntityData[] tables = new SynchedEntityData[2];
|
||||
List<SynchedEntityData.DataItem<?>>[] items;
|
||||
Map<Holder<MobEffect>, MobEffectInstance> effects = new HashMap<>();
|
||||
List<MobEffectInstance> pool = new ArrayList<>();
|
||||
List<ParticleOptions> particles = new ArrayList<>();
|
||||
int data, calls; boolean client;
|
||||
String particleRef(ParticleOptions p) throws Exception {
|
||||
int id = -1; for (int i = 0; i < particles.size(); i++) if (particles.get(i) == p) { id = i; break; }
|
||||
if (id < 0) { id = particles.size(); particles.add(p); }
|
||||
var desc = particle(p);
|
||||
return id + ":" + desc.get("type").getAsString() + ":" + (desc.has("color") ? desc.get("color").getAsString() : "none");
|
||||
}
|
||||
String value(Object value) throws Exception {
|
||||
if (value instanceof Byte b) return "flags:" + Byte.toUnsignedInt(b);
|
||||
if (value instanceof Boolean b) return "ambient:" + b;
|
||||
if (value instanceof List<?> list) {
|
||||
var refs = new StringJoiner(","); for (var p : list) refs.add(particleRef((ParticleOptions)p));
|
||||
return "particles:[" + refs + "]";
|
||||
}
|
||||
throw new AssertionError(value);
|
||||
}
|
||||
String packed(List<SynchedEntityData.DataValue<?>> values) throws Exception {
|
||||
if (values == null) return "none";
|
||||
var result = new StringJoiner("|"); for (var v : values) result.add(v.id() + "=" + value(v.value()));
|
||||
return result.length() == 0 ? "empty" : result.toString();
|
||||
}
|
||||
void event(String name) {
|
||||
int call = calls++; out.println("event " + call + " " + name);
|
||||
if (call == op.get("fail").getAsInt()) throw new Stop();
|
||||
if (call == op.get("mutate").getAsInt()) {
|
||||
try { controls(op.getAsJsonObject("changes")); for (var action : op.getAsJsonArray("actions")) raw(action.getAsJsonObject()); }
|
||||
catch (RuntimeException e) { throw e; } catch (Exception e) { throw new AssertionError(e); }
|
||||
}
|
||||
}
|
||||
void controls(JsonObject c) throws Exception {
|
||||
if (c.has("data")) data = c.get("data").getAsInt();
|
||||
if (c.has("client")) client = c.get("client").getAsBoolean();
|
||||
if (c.has("tag")) tagField.setBoolean(actor, c.get("tag").getAsBoolean());
|
||||
if (c.has("dirty")) dirtyField.setBoolean(actor, c.get("dirty").getAsBoolean());
|
||||
dataField.set(actor, tables[data]);
|
||||
}
|
||||
void raw(JsonObject op) throws Exception {
|
||||
int target = op.get("target").getAsInt(), key = op.get("key").getAsInt(), slot = op.get("pool").getAsInt();
|
||||
switch (op.get("mode").getAsString()) {
|
||||
case "put": effects.put(keys.get(key), pool.get(slot)); break;
|
||||
case "drop": effects.remove(keys.get(key)); break;
|
||||
case "clear": effects.clear(); break;
|
||||
case "details": visibleField.setBoolean(pool.get(slot), op.get("visible").getAsBoolean()); ambientField.setBoolean(pool.get(slot), op.get("ambient").getAsBoolean()); break;
|
||||
case "controls": controls(op.getAsJsonObject("changes")); break;
|
||||
case "flags": tables[target].set(flagsKey, (byte)op.get("flags").getAsInt()); break;
|
||||
case "ambient": tables[target].set(ambientKey, op.get("ambient").getAsBoolean()); break;
|
||||
case "pack": out.println("packed " + target + " " + packed(tables[target].packDirty())); break;
|
||||
case "defaults": out.println("defaults " + target + " " + packed(tables[target].getNonDefaultValues())); break;
|
||||
default: throw new AssertionError(op);
|
||||
}
|
||||
}
|
||||
void state() throws Exception {
|
||||
out.println("state " + data + " " + client + " " + tagField.getBoolean(actor) + " " + dirtyField.getBoolean(actor) + " " + calls);
|
||||
var entries = new StringJoiner(","); for (var e : effects.entrySet()) entries.add(keys.indexOf(e.getKey()) + "=" + pool.indexOf(e.getValue()));
|
||||
out.println("effects " + entries);
|
||||
for (int i = 0; i < pool.size(); i++) out.println("instance " + i + " " + pool.get(i).isVisible() + " " + pool.get(i).isAmbient());
|
||||
for (int i = 0; i < 2; i++) {
|
||||
out.println("data " + i + " " + tables[i].isDirty());
|
||||
for (var item : items[i]) out.println("field " + item.getAccessor().id() + " " + value(item.getValue()) + " " + item.isDirty() + " " + item.isSetToDefault());
|
||||
}
|
||||
}
|
||||
}
|
||||
static final class Actor extends net.minecraft.world.entity.monster.zombie.Zombie {
|
||||
Data d; Actor() { super(null, null); }
|
||||
@Override protected void updateInvisibilityStatus() { d.event("invisibility"); super.updateInvisibilityStatus(); }
|
||||
@Override protected void removeEffectParticles() { d.event("remove-particles"); super.removeEffectParticles(); }
|
||||
@Override public boolean hasEffect(Holder<MobEffect> effect) { d.event("has " + effect.getRegisteredName()); return super.hasEffect(effect); }
|
||||
@Override public void setInvisible(boolean v) { d.event("invisible " + v); super.setInvisible(v); }
|
||||
@Override public boolean isCurrentlyGlowing() { d.event("glowing"); return super.isCurrentlyGlowing(); }
|
||||
@Override protected boolean getSharedFlag(int bit) { d.event("get-flag " + bit); return super.getSharedFlag(bit); }
|
||||
@Override protected void setSharedFlag(int bit, boolean v) { d.event("set-flag " + bit + " " + v); super.setSharedFlag(bit, v); }
|
||||
@Override public Level level() { d.event("level"); return d.level; }
|
||||
@Override public void onSyncedDataUpdated(EntityDataAccessor<?> key) { d.event("updated " + key.id()); }
|
||||
}
|
||||
static final class EffectLevel extends ServerLevel {
|
||||
Data d; EffectLevel() { super(null,null,null,null,null,null,false,0L,List.of(),false); }
|
||||
@Override public boolean isClientSide() { d.event("client"); return d.client; }
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void main(String[] args) throws Exception {
|
||||
net.minecraft.SharedConstants.tryDetectVersion(); net.minecraft.server.Bootstrap.bootStrap();
|
||||
for (var effect : BuiltInRegistries.MOB_EFFECT) keys.add(BuiltInRegistries.MOB_EFFECT.wrapAsHolder(effect));
|
||||
flagsKey = (EntityDataAccessor<Byte>)field(Entity.class,"DATA_SHARED_FLAGS_ID").get(null);
|
||||
ambientKey = (EntityDataAccessor<Boolean>)field(LivingEntity.class,"DATA_EFFECT_AMBIENCE_ID").get(null);
|
||||
particlesKey = (EntityDataAccessor<List<ParticleOptions>>)field(LivingEntity.class,"DATA_EFFECT_PARTICLES").get(null);
|
||||
Path dir = Path.of(args[1]);
|
||||
if (args[0].startsWith("export-")) {
|
||||
var catalog = export(); var schema = new JsonObject(); schema.addProperty("flags",flagsKey.id()); schema.addProperty("ambient",ambientKey.id()); schema.addProperty("particles",particlesKey.id()); catalog.add("schema",schema);
|
||||
Files.writeString(dir.resolve("catalog-" + args[0].substring(7) + ".json"),catalog.toString()); return;
|
||||
}
|
||||
if (Actor.class.getSuperclass().getMethod("setInvisible",boolean.class).getDeclaringClass() != Entity.class || Actor.class.getSuperclass().getMethod("isCurrentlyGlowing").getDeclaringClass() != LivingEntity.class) throw new AssertionError("actor overrides inspected base methods");
|
||||
var u=Class.forName("sun.misc.Unsafe"); unsafe=field(u,"theUnsafe").get(null); allocate=u.getMethod("allocateInstance",Class.class);
|
||||
dataField=field(Entity.class,"entityData"); dirtyField=field(LivingEntity.class,"effectsDirty"); tagField=field(Entity.class,"hasGlowingTag"); effectsField=field(LivingEntity.class,"activeEffects"); visibleField=field(MobEffectInstance.class,"visible"); ambientField=field(MobEffectInstance.class,"ambient");
|
||||
dirtyUpdate=method("updateDirtyEffects"); particlesUpdate=method("updateSynchronizedMobEffectParticles"); glowingUpdate=method("updateGlowingStatus");
|
||||
dataCtor=SynchedEntityData.class.getDeclaredConstructor(SyncedDataHolder.class,SynchedEntityData.DataItem[].class); dataCtor.setAccessible(true);
|
||||
try(var out=new PrintWriter(Files.newBufferedWriter(dir.resolve(args[0]+".txt")));var enriched=new PrintWriter(Files.newBufferedWriter(dir.resolve("inputs-"+args[0]+".txt")));var lines=Files.lines(dir.resolve("inputs.txt"))) {
|
||||
for(var line:(Iterable<String>)lines::iterator) {
|
||||
var f=JsonParser.parseString(line).getAsJsonObject(); var d=new Data();d.out=out;d.actor=make(Actor.class);d.actor.d=d;d.level=make(EffectLevel.class);d.level.d=d;
|
||||
effectsField.set(d.actor,d.effects);dirtyField.setBoolean(d.actor,true); d.items=(List<SynchedEntityData.DataItem<?>>[])new List<?>[2];
|
||||
for(int i=0;i<2;i++) {
|
||||
var a=new SynchedEntityData.DataItem<Byte>(flagsKey,(byte)f.getAsJsonArray("flags").get(i).getAsInt());var b=new SynchedEntityData.DataItem<Boolean>(ambientKey,f.getAsJsonArray("ambient").get(i).getAsBoolean());var c=new SynchedEntityData.DataItem<List<ParticleOptions>>(particlesKey,List.of());
|
||||
d.items[i]=new ArrayList<>(List.of(a,b,c));d.items[i].sort(Comparator.comparingInt(item->item.getAccessor().id()));
|
||||
var entries=new SynchedEntityData.DataItem<?>[Math.max(flagsKey.id(),Math.max(ambientKey.id(),particlesKey.id()))+1];for(int j=0;j<entries.length;j++)entries[j]=new SynchedEntityData.DataItem<Byte>(new EntityDataAccessor<Byte>(j,EntityDataSerializers.BYTE),(byte)0);for(var item:d.items[i])entries[item.getAccessor().id()]=item;
|
||||
d.tables[i]=dataCtor.newInstance(d.actor,entries);
|
||||
}
|
||||
for(var v:f.getAsJsonArray("pool")) {var e=v.getAsJsonObject();d.pool.add(new MobEffectInstance(keys.get(e.get("effect").getAsInt()),200,e.get("amplifier").getAsInt(),e.get("ambient").getAsBoolean(),e.get("visible").getAsBoolean(),true));}
|
||||
d.controls(f.getAsJsonObject("controls"));for(var v:f.getAsJsonArray("setup"))d.raw(v.getAsJsonObject());
|
||||
for(var v:f.getAsJsonArray("ops")) {d.op=v.getAsJsonObject();d.calls=0;String result="ok";var op=d.op;
|
||||
try {switch(op.get("mode").getAsString()) {
|
||||
case "dirty-update":invoke(dirtyUpdate,d.actor);break;case "invisibility":d.actor.updateInvisibilityStatus();break;case "particles":invoke(particlesUpdate,d.actor);break;case "glowing-update":invoke(glowingUpdate,d.actor);break;case "remove-particles":d.actor.removeEffectParticles();break;
|
||||
case "glowing":result=Boolean.toString(d.actor.isCurrentlyGlowing());break;case "glow-tag":d.actor.setGlowingTag(op.get("flag").getAsBoolean());break;case "invisible":d.actor.setInvisible(op.get("flag").getAsBoolean());break;
|
||||
case "get-flag":result=Boolean.toString(d.actor.getSharedFlag(op.get("bit").getAsInt()));break;case "set-flag":d.actor.setSharedFlag(op.get("bit").getAsInt(),op.get("flag").getAsBoolean());break;
|
||||
case "all-ambient":result=Boolean.toString(LivingEntity.areAllEffectsAmbient(d.effects.values()));break;
|
||||
default:d.raw(op);
|
||||
}}catch(Stop e){result="error callback";}out.println("result "+result);d.state();
|
||||
}
|
||||
var hashes=new JsonArray();var identities=new JsonArray();for(var key:keys){hashes.add(key.hashCode());identities.add(System.identityHashCode(key));}f.add("hashes",hashes);f.add("identities",identities);enriched.println(f);
|
||||
}
|
||||
if(out.checkError()||enriched.checkError())throw new IOException("cannot write native trace");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Compare registered effect particle/visibility synchronization and native data identity."""
|
||||
import argparse
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
from pathlib import Path
|
||||
import platform
|
||||
import random
|
||||
import struct
|
||||
import subprocess
|
||||
|
||||
try:
|
||||
from . import lab, test_rust_parity as base
|
||||
except ImportError:
|
||||
import lab
|
||||
import test_rust_parity as base
|
||||
|
||||
|
||||
def corpus(catalog):
|
||||
effects = catalog['effects']
|
||||
count = len(effects)
|
||||
invisibility = next(i for i, e in enumerate(effects) if e['id'] == 'minecraft:invisibility')
|
||||
glowing = next(i for i, e in enumerate(effects) if e['id'] == 'minecraft:glowing')
|
||||
constant = next(i for i, e in enumerate(effects) if e['factory'] == 'constant')
|
||||
color = next(i for i, e in enumerate(effects) if e['factory'] == 'color')
|
||||
|
||||
def op(mode, **kw):
|
||||
result = dict(mode=mode, target=0, key=0, pool=0, flags=0, bit=5, flag=True,
|
||||
ambient=False, visible=True, fail=-1, mutate=-1, changes={}, actions=[])
|
||||
result.update(kw)
|
||||
return result
|
||||
|
||||
def row(pool, setup, ops, **kw):
|
||||
result = dict(pool=pool, flags=[0, 64], ambient=[False, True], controls={}, setup=setup, ops=ops)
|
||||
result.update(kw)
|
||||
return result
|
||||
|
||||
def instance(effect, ambient=False, visible=True, amplifier=0):
|
||||
return dict(effect=effect, ambient=ambient, visible=visible, amplifier=amplifier)
|
||||
|
||||
for key in range(count):
|
||||
for ambient in [False, True]:
|
||||
for visible in [False, True]:
|
||||
yield row([instance(key, ambient, visible)], [op('put', key=key)],
|
||||
[op('dirty-update'), op('pack'), op('dirty-update'), op('controls', changes={'dirty': True}),
|
||||
op('dirty-update'), op('pack'), op('particles'), op('pack'), op('all-ambient'),
|
||||
op('details', ambient=not ambient, visible=not visible), op('invisibility'), op('pack'),
|
||||
op('remove-particles'), op('clear'), op('invisibility'), op('defaults')])
|
||||
for flags in range(256):
|
||||
for bit in [-2**31, -33, -1, 0, 5, 6, 7, 8, 31, 32, 63, 2**31-1]:
|
||||
for flag in [False, True]:
|
||||
yield row([], [], [op('set-flag', bit=bit, flag=flag), op('get-flag', bit=bit), op('pack')], flags=[flags, 255-flags])
|
||||
|
||||
pool = [instance(i, bool(i % 2), i % 3 != 0, i * 7) for i in range(count)]
|
||||
patterns = [[], [invisibility], [glowing], [constant], [color, constant, invisibility, glowing], list(range(count))]
|
||||
actions = [[], [op('clear')], [op('drop', key=invisibility), op('put', key=glowing, pool=glowing)],
|
||||
[op('details', pool=color, ambient=True, visible=True), op('put', key=color, pool=color)],
|
||||
[op('put', key=invisibility, pool=constant)], [op('pack')],
|
||||
[op('flags', flags=255), op('ambient', ambient=True)],
|
||||
[op('flags', target=1, flags=32), op('pack', target=1)]]
|
||||
for pattern_index, pattern in enumerate(patterns):
|
||||
setup = [op('put', key=key, pool=key) for key in pattern]
|
||||
for mode in ['dirty-update', 'invisibility', 'particles', 'glowing-update', 'glowing', 'glow-tag', 'remove-particles']:
|
||||
for at in range(-1, 24):
|
||||
yield row(pool, setup, [op(mode, fail=at), op('pack'), op('defaults'), op('dirty-update')], controls={'client': bool(pattern_index % 2)})
|
||||
for action in actions:
|
||||
yield row(pool, setup, [op(mode, mutate=at, changes={'data': 1, 'client': not bool(pattern_index % 2), 'tag': True, 'dirty': True}, actions=action),
|
||||
op('pack'), op('pack', target=1), op('dirty-update')], controls={'client': bool(pattern_index % 2)})
|
||||
rng = random.Random(0x4546464543545359)
|
||||
for _ in range(250):
|
||||
state = [instance(i, bool(rng.randrange(2)), bool(rng.randrange(2)), rng.choice([-1, 0, 1, 255, 256])) for i in range(count)]
|
||||
setup = [op('put', key=key, pool=key) for key in rng.sample(range(count), rng.randrange(count+1))]
|
||||
ops = []
|
||||
for _ in range(30):
|
||||
ops.append(op(rng.choice(['dirty-update', 'particles', 'invisibility', 'glowing-update', 'glow-tag', 'invisible',
|
||||
'put', 'drop', 'clear', 'details', 'pack', 'defaults', 'all-ambient', 'flags', 'ambient', 'controls']),
|
||||
key=rng.randrange(count), pool=rng.randrange(count), target=rng.randrange(2), flags=rng.randrange(256),
|
||||
ambient=bool(rng.randrange(2)), visible=bool(rng.randrange(2)), flag=bool(rng.randrange(2)),
|
||||
fail=rng.choice([-1, -1, -1, 0, 1, 2]), mutate=rng.choice([-1, -1, 0, 1, 2, 3]),
|
||||
changes={'data': rng.randrange(2), 'client': bool(rng.randrange(2)), 'tag': bool(rng.randrange(2)), 'dirty': bool(rng.randrange(2))}, actions=rng.choice(actions)))
|
||||
yield row(state, setup, ops, flags=[rng.randrange(256), rng.randrange(256)])
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--prepare', action='store_true')
|
||||
args = parser.parse_args()
|
||||
build = lab.LOCAL / 'rust-effect-sync-parity'
|
||||
build.mkdir(parents=True, exist_ok=True)
|
||||
report_path = build / 'report.json'
|
||||
report_path.unlink(missing_ok=True)
|
||||
if args.prepare:
|
||||
lab.prepare()
|
||||
lock, jars, libraries = base.verify_artifacts()
|
||||
oracle = lab.ROOT / 'mods/horizon/src/test/java/dev/horizonlab/parity/VanillaEffectSyncOracle.java'
|
||||
helper = oracle.with_name('VanillaEffectParticlesOracle.java')
|
||||
sources = [oracle, helper, Path(__file__),
|
||||
lab.ROOT / 'tools/test_rust_parity.py', lab.ROOT / 'tools/lab.py',
|
||||
lab.ROOT / 'Cargo.toml', lab.ROOT / 'Cargo.lock',
|
||||
lab.ROOT / 'crates/horizon-core/Cargo.toml', lab.ROOT / 'crates/horizon-world/Cargo.toml',
|
||||
*sorted((lab.ROOT / 'crates/horizon-core/src').rglob('*.rs')),
|
||||
*sorted((lab.ROOT / 'crates/horizon-world/src').rglob('*.rs')),
|
||||
lab.ROOT / 'crates/horizon-world/examples/effect_sync_fixture.rs']
|
||||
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)
|
||||
|
||||
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], 'compile-java')
|
||||
|
||||
def java(side, mode):
|
||||
run(['java', '-Xmx512M', '-cp', os.pathsep.join([str(classes), str(jars[side]), dependency_path]),
|
||||
'dev.horizonlab.parity.VanillaEffectSyncOracle', mode, build], mode)
|
||||
|
||||
for side in jars:
|
||||
java(side, 'export-' + side)
|
||||
catalog = json.loads((build / 'catalog-server.json').read_text())
|
||||
if catalog != json.loads((build / 'catalog-client.json').read_text()):
|
||||
raise AssertionError('Client/server effect particle catalogs differ')
|
||||
lab.write_json(build / 'catalog.json', catalog)
|
||||
fixtures = list(corpus(catalog))
|
||||
inputs = build / 'inputs.txt'
|
||||
inputs.write_text(''.join(json.dumps(row, separators=(',', ':')) + '\n' for row in fixtures), encoding='utf-8')
|
||||
fixture_paths = [inputs, build / 'catalog.json', build / 'catalog-client.json', build / 'catalog-server.json']
|
||||
tested_fixtures = base.source_hashes(fixture_paths)
|
||||
run(['cargo', 'build', '--release', '-p', 'horizon-world', '--example', 'effect_sync_fixture'], 'compile-rust')
|
||||
metadata = json.loads(subprocess.check_output(['cargo', 'metadata', '--no-deps', '--format-version', '1'], cwd=lab.ROOT, text=True))
|
||||
binary = Path(metadata['target_directory']) / 'release/examples' / ('effect_sync_fixture.exe' if os.name == 'nt' else 'effect_sync_fixture')
|
||||
references = []
|
||||
for side, jar in jars.items():
|
||||
java(side, side)
|
||||
enriched = build / f'inputs-{side}.txt'
|
||||
fixture_paths.append(enriched)
|
||||
tested_fixtures.update(base.source_hashes([enriched]))
|
||||
run([binary, build, side], 'rust-' + side)
|
||||
reference = build / f'{side}.txt'
|
||||
candidate = build / f'rust-{side}.txt'
|
||||
matched = base.compare(reference, candidate)
|
||||
references.append(dict(side=side, jar_sha256=lab.digest(jar, 'sha256'),
|
||||
output_sha256=lab.digest(reference, 'sha256'), matched_output_lines=matched,
|
||||
rust_output_sha256=lab.digest(candidate, 'sha256')))
|
||||
print(f'{side}: {matched:,} effect synchronization output lines match Rust', flush=True)
|
||||
base.ensure_sources_unchanged(sources, tested_sources)
|
||||
base.ensure_sources_unchanged(fixture_paths, tested_fixtures)
|
||||
report = dict(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(), fixtures=len(fixtures),
|
||||
registered_effects=len(catalog['effects']), constant_factories=sum(e['factory'] == 'constant' for e in catalog['effects']),
|
||||
fastutil_sha256={str(p.relative_to(lab.ROOT)): lab.digest(p, 'sha256') for p in libraries if 'fastutil' in str(p)},
|
||||
sources_sha256=tested_sources, fixtures_sha256=tested_fixtures, references=references,
|
||||
scope='Inherited native LivingEntity effect particle/invisibility/glowing synchronization, dirty clearing, Entity shared byte flags and actual SynchedEntityData mixed byte/boolean/particle-list storage. All 40 registered effects use exporter-checked inherited pure factories: fresh identity-bearing colored options or registry-constant simple options. Tests active-map order, particle option identities/list equality, ambient/visible flags, server/client glowing branches, repeated virtual lookups, captured data objects, reentrant data packing/writes, callback map mutations and failure prefixes. Replays each JVM holder hashes/identities. Custom impure particle factories, particle rendering/transport, full effect tick integration and complete gameplay/platform builds remain outside this gate.')
|
||||
lab.write_json(report_path, report)
|
||||
print(f'Scoped effect synchronization parity passed: {report_path}')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user